From 63ba91cc8c0c99ea489efe31ca9bf8404326c84d Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期一, 19 一月 2026 18:39:50 +0800
Subject: [PATCH] 429 【主界面】自动挂机-补充自动挑战自动任务 装备记录部分

---
 Main/System/Equip/EquipModel.cs        |   12 +
 Main/System/Main/EquipRecordManager.cs |  237 ++++++++++++++++++++++++---------------
 Main/System/Main/EquipRecordCell.cs    |   48 +++++++
 Main/System/Main/EquipRecordWin.cs     |   37 +++++-
 Main/System/Main/EquipRecordItem.cs    |   14 ++
 Main/System/Main/AutoFightWin.cs       |    9 +
 6 files changed, 250 insertions(+), 107 deletions(-)

diff --git a/Main/System/Equip/EquipModel.cs b/Main/System/Equip/EquipModel.cs
index ab0c807..dfc55e2 100644
--- a/Main/System/Equip/EquipModel.cs
+++ b/Main/System/Equip/EquipModel.cs
@@ -305,18 +305,20 @@
             Debug.LogWarning("绌挎埓瑁呭锛屽悜鏈嶅姟鍣ㄨ姹�");
         }
 
-        //鍦ㄨ褰曢攢姣佹垨鏇挎崲鍓嶇殑瑁呭
+        //璁板綍閿�姣佹垨鏇挎崲鍓嶇殑瑁呭
         if ((opType == 1 || opType == 2) && !itemIndexList.IsNullOrEmpty())
         {
             foreach (var index in itemIndexList)
             {
-                var oldEquip = PackManager.Instance.GetItemByIndex(PackType.Equip, index);
-                EquipRecordManager.Instance.oldEquipDic[index] = oldEquip;
+                ItemModel newEquip = PackManager.Instance.GetItemByIndex(PackType.DropItem, index);
+                if (newEquip == null)
+                    continue;
+                int equipPlace = newEquip.config.EquipPlace - 1;
+                ItemModel oldEquip = PackManager.Instance.GetItemByIndex(PackType.Equip, equipPlace);
+                EquipRecordManager.Instance.AddRecord(opType, newEquip, oldEquip);
             }
         }
-
         GameNetSystem.Instance.SendInfo(pack);
-
     }
 
     /// <summary>
diff --git a/Main/System/Main/AutoFightWin.cs b/Main/System/Main/AutoFightWin.cs
index f9472f8..f16f046 100644
--- a/Main/System/Main/AutoFightWin.cs
+++ b/Main/System/Main/AutoFightWin.cs
@@ -32,7 +32,7 @@
 
     [SerializeField] Toggle autoFinishTaskToggle;
     [SerializeField] Button autoFinishTaskTipBtn;
-
+    [SerializeField] Button recordBtn;
     bool isOpenCostScroll = false;
     bool isOpenSpeedScroll = false;
     bool isOpenTryChallengeScroll = false;
@@ -49,7 +49,7 @@
 
         autoFinishTaskTipBtn.AddListener(() =>
         {
-            DislayTip("AutoFight16",autoFinishTaskTipBtn.transform.position);
+            DislayTip("AutoFight16", autoFinishTaskTipBtn.transform.position);
         });
 
         changeCostBtn.AddListener(() =>
@@ -119,6 +119,11 @@
             isOpenTryChallengeScroll = false;
             tryChallengeArrow.transform.localRotation = Quaternion.Euler(0, 0, 0);
         });
+
+        recordBtn.SetListener(() =>
+        {
+            UIManager.Instance.OpenWindow<EquipRecordWin>();
+        });
     }
 
     protected override void OnPreOpen()
diff --git a/Main/System/Main/EquipRecordCell.cs b/Main/System/Main/EquipRecordCell.cs
index 4270e19..e7d2ee7 100644
--- a/Main/System/Main/EquipRecordCell.cs
+++ b/Main/System/Main/EquipRecordCell.cs
@@ -1,13 +1,57 @@
+using System.Collections.Generic;
 using UnityEngine;
-
+using System;
 public class EquipRecordCell : MonoBehaviour
 {
     [SerializeField] EquipRecordItem fromEquip;
     [SerializeField] EquipRecordItem toEquip;
     [SerializeField] ImageEx imgWear;
     [SerializeField] ImageEx imgDecompose;
-    public void Display(int index)
+    [SerializeField] TextEx txtFightPoint;
+    [SerializeField] TextEx txtTime;
+    public void Display(int index, List<EquipRecordManager.EquipRecordData> list)
     {
+        if (list == null || index >= list.Count || index < 0)
+            return;
+        var data = list[index];
+        int state = GetState(data);
+        if (state == 0)
+        {
+            fromEquip.SetActive(false);
+            toEquip.SetActive(false);
+            imgWear.SetActive(false);
+            imgDecompose.SetActive(false);
+        }
+        else
+        {
+            fromEquip.SetActive(state == 1 || state == 2 || state == 3);
+            toEquip.SetActive(state == 1);
+            imgDecompose.SetActive(state == 2);
+            imgWear.SetActive(state == 3);
+            fromEquip.Display(state == 1 ? data.oldEquip : data.newEquip);
+            toEquip.Display(data.newEquip);
+        }
+        txtFightPoint.text = StringUtility.Concat("+", UIHelper.ReplaceLargeNum(data.fightPower));
+        txtTime.text = GetTime(data.timestamp);
+    }
 
+    // 0-涓嶆樉绀� 1-浜ゆ崲 2-鍒嗚В 3-棣栨绌胯澶�
+    private int GetState(EquipRecordManager.EquipRecordData data)
+    {
+        if (data == null || data.newEquip == null)
+            return 0;
+        if (data.oldEquip == null)
+            return 3;
+        if (data.recordType == (int)EquipRecordManager.EquipOPType.Equip)
+            return 1;
+        if (data.recordType == (int)EquipRecordManager.EquipOPType.Decompose)
+            return 2;
+        return 0;
+    }
+
+    private string GetTime(int timestamp)
+    {
+        DateTime dateTime = TimeUtility.GetTime((uint)timestamp);
+        return dateTime.ToString("MM-dd HH:mm:ss");
     }
 }
\ No newline at end of file
diff --git a/Main/System/Main/EquipRecordItem.cs b/Main/System/Main/EquipRecordItem.cs
index 0438d5a..3aacc9d 100644
--- a/Main/System/Main/EquipRecordItem.cs
+++ b/Main/System/Main/EquipRecordItem.cs
@@ -11,6 +11,20 @@
     [SerializeField] TextEx txtLV;
     public void Display(EquipRecordManager.EquipDetail detail)
     {
+        if (detail == null || !ItemConfig.HasKey(detail.itemId))
+            return;
+        var config = ItemConfig.Get(detail.itemId);
 
+        string name = config.ItemName;
+        int quality = config.ItemColor;
+        string IconKey = config.IconKey;
+        imgEquip.SetOrgSprite(IconKey);
+        txtName.text = UIHelper.AppendColor(quality, name, true, 1);
+        txtQualityName.text = UIHelper.GetQualityNameWithColor(quality, Language.Get("L1039"));
+        itemNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(quality);
+        qualityNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(quality);
+        txtLV.text = Language.Get("L1113", detail.lv);
+        imgQuality.SetSprite("equipQuality" + quality);
     }
+
 }
\ No newline at end of file
diff --git a/Main/System/Main/EquipRecordManager.cs b/Main/System/Main/EquipRecordManager.cs
index 4451e85..1098e08 100644
--- a/Main/System/Main/EquipRecordManager.cs
+++ b/Main/System/Main/EquipRecordManager.cs
@@ -6,64 +6,11 @@
 public class EquipRecordManager : GameSystemManager<EquipRecordManager>
 {
     private List<EquipRecordData> recordList = new List<EquipRecordData>();
-    public Dictionary<int, ItemModel> oldEquipDic = new Dictionary<int, ItemModel>();
-
-    /// <summary>
-    /// 璋冭瘯鐢細閬嶅巻杈撳嚭鎵�鏈夎澶囪褰曠殑璇︾粏淇℃伅锛堝崟鏉og锛�
-    /// </summary>
-    public void DebugLogAllRecords()
-    {
-        var sb = new System.Text.StringBuilder();
-        sb.AppendLine($"=== 瑁呭璁板綍鎬绘暟: {recordList.Count} | 鏃ц澶囧瓧鍏告潯鐩暟: {oldEquipDic.Count} ===");
-
-        for (int i = 0; i < recordList.Count; i++)
-        {
-            var record = recordList[i];
-            sb.AppendLine($"--- 璁板綍 {i + 1} ---");
-            sb.AppendLine($"璁板綍ID: {record.recordId} | 鏃堕棿: {TimeUtility.GetTime((uint)record.timestamp)} | 绫诲瀷: {record.recordType}");
-
-            // 鏂拌澶囪鎯�
-            if (record.newEquip != null)
-            {
-                sb.AppendLine($"[鏂拌澶嘳 ID:{record.newEquip.itemId} | 鍚嶇О:{record.newEquip.itemName} | 寮哄寲:{record.newEquip.level} | 璇勫垎:{record.newEquip.score} | 閮ㄤ綅:{record.newEquip.equipPlace} | 鎴樺姏:{record.newEquip.fightPower} | GUID:{record.newEquip.guid}");
-            }
-            else
-            {
-                sb.AppendLine($"[鏂拌澶嘳 鏃犳暟鎹�");
-            }
-
-            // 鏃ц澶囪鎯�
-            if (record.oldEquip != null)
-            {
-                sb.AppendLine($"[鏃ц澶嘳 ID:{record.oldEquip.itemId} | 鍚嶇О:{record.oldEquip.itemName} | 寮哄寲:{record.oldEquip.level} | 璇勫垎:{record.oldEquip.score} | 閮ㄤ綅:{record.oldEquip.equipPlace} | 鎴樺姏:{record.oldEquip.fightPower} | GUID:{record.oldEquip.guid}");
-            }
-            else
-            {
-                sb.AppendLine($"[鏃ц澶嘳 鏃犳暟鎹�");
-            }
-
-            sb.AppendLine(); // 绌鸿鍒嗛殧
-        }
-
-        // 鏃ц澶囧瓧鍏�
-        sb.AppendLine("=== 鏃ц澶囧瓧鍏歌鎯� ===");
-        foreach (var kvp in oldEquipDic)
-        {
-            sb.AppendLine($"Key:{kvp.Key} | Value:ItemModel(itemId={kvp.Value?.itemId}, guid={kvp.Value?.guid})");
-        }
-
-        UnityEngine.Debug.Log(sb.ToString());
-    }
-
-
-
-    private int maxCnt;
+    public int maxCnt;
     public override void Init()
     {
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEventOnRelogin;
         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
-        // 鐩戝惉瑁呭鎿嶄綔缁撴灉
-        EquipModel.Instance.OnEquipOPResultAction += OnEquipOPResult;
 
         var config = FuncConfigConfig.Get("AutoGuaji1");
         maxCnt = int.Parse(config.Numerical5);
@@ -73,14 +20,12 @@
     {
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEventOnRelogin;
         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk;
-        EquipModel.Instance.OnEquipOPResultAction -= OnEquipOPResult;
     }
 
 
 
     private void OnBeforePlayerDataInitializeEventOnRelogin()
     {
-
     }
 
     private void OnPlayerLoginOk()
@@ -99,28 +44,29 @@
     private void LoadRecords()
     {
         var json = LocalSave.GetString(Key);
-        if (!string.IsNullOrEmpty(json))
+        if (string.IsNullOrEmpty(json))
+        {
+            recordList = new List<EquipRecordData>();
+            return;
+        }
+
+        try
         {
             recordList = JsonMapper.ToObject<List<EquipRecordData>>(json);
+            // 鎺掑簭瑙勫垯锛氭椂闂存埑灏忕殑闈犲墠锛屾椂闂存埑鐩稿悓鍒欑储寮曞皬鐨勯潬鍓�
+            recordList.Sort((a, b) =>
+            {
+                int timeCompare = a.timestamp.CompareTo(b.timestamp);
+                if (timeCompare != 0)
+                    return timeCompare;
+                return 0;
+            });
         }
-    }
-
-    /// <summary>
-    /// 瑁呭鎿嶄綔缁撴灉鍥炶皟 - 璁板綍瑁呭鍙樺寲
-    /// </summary>
-    /// <param name="isDone">鏄惁鎴愬姛鏇存崲</param>
-    /// <param name="equipIndex">瑁呭鏍忕储寮�</param>
-    private void OnEquipOPResult(bool isDone, int equipIndex)
-    {
-        if (equipIndex < 0) return;
-
-        // 鑾峰彇鏂拌澶囧拰鏃ц澶囦俊鎭�
-        var newEquip = PackManager.Instance.GetItemByIndex(PackType.Equip, equipIndex);
-        if (newEquip == null) return;
-
-        // 鑾峰彇琚浛鎹㈢殑瑁呭锛堥渶瑕佷粠鍏朵粬鍦版柟璁板綍锛�
-        // 杩欓噷闇�瑕侀厤鍚� EquipModel 鐨� OnEquipResult 璁板綍琚浛鎹㈢殑瑁呭
-        // ...
+        catch (Exception ex)
+        {
+            Debug.LogError($"鍔犺浇瑁呭璁板綍澶辫触: {ex.Message}");
+            recordList = new List<EquipRecordData>();
+        }
     }
 
     /// <summary>
@@ -133,43 +79,152 @@
         var detail = new EquipDetail
         {
             itemId = item.itemId,
-            level = item.GetUseDataFirstValue(22),
-            equipPlace = item.config.EquipPlace,
+            lv = item.GetUseDataFirstValue(22),
             guid = item.guid,
         };
         return detail;
     }
 
+    public List<EquipRecordData> GetRecordList(bool isSort = false)
+    {
+        if (recordList == null)
+        {
+            return null;
+        }
+        if (isSort)
+        {
+            // 鎺掑簭瑙勫垯锛氭椂闂存埑灏忕殑闈犲墠锛屾椂闂存埑鐩稿悓鍒欑储寮曞皬鐨勯潬鍓�
+            recordList.Sort((a, b) =>
+            {
+                int timeCompare = a.timestamp.CompareTo(b.timestamp);
+                if (timeCompare != 0)
+                    return timeCompare;
+                return 0;
+            });
+        }
+        return recordList;
+    }
 
+    public event Action OnUpdateRecordListEvent;
 
+    public void AddRecord(int recordType, ItemModel newEquip, ItemModel oldEquip)
+    {
+        if (newEquip == null)
+            return;
+        long showFightPower = FightPowerManager.Instance.GetFightPowerChange(newEquip);
+        // 鏂拌澶囨垬鍔涗綆浜庢棫瑁呭鎴樺姏锛屼笉鍏佽娣诲姞
+        if (showFightPower <= 0)
+            return;
 
+        var newDetail = GetEquipDetail(newEquip);
+        var oldDetail = GetEquipDetail(oldEquip);
 
+        if (recordList == null)
+            return;
+
+        // 閬嶅巻鐜版湁璁板綍锛屾鏌ユ槸鍚﹀瓨鍦ㄥ尮閰嶇殑璁板綍锛堜笉闄愬埗椤哄簭锛�
+        foreach (var existingRecord in recordList)
+        {
+            if (IsSameRecord(existingRecord, newDetail, oldDetail))
+            {
+                // 鎵惧埌鍖归厤鐨勮褰曪紝涓嶆坊鍔�
+                return;
+            }
+        }
+
+        var record = new EquipRecordData
+        {
+            recordType = (int)recordType,
+            newEquip = GetEquipDetail(newEquip),
+            oldEquip = GetEquipDetail(oldEquip),
+            fightPower = showFightPower,
+            timestamp = TimeUtility.AllSeconds,
+        };
+
+        if (recordList.Count >= maxCnt)
+        {
+            // 绉婚櫎鏈�鏃╁姞鍏ョ殑璁板綍锛堟帓搴忓悗绗竴涓級
+            recordList.RemoveAt(0);
+        }
+
+        recordList.Add(record);
+        SaveRecords();
+        OnUpdateRecordListEvent?.Invoke();
+    }
+
+    /// <summary>
+    /// 鍒ゆ柇涓ゆ潯璁板綍鏄惁涓�鑷达紙涓嶉檺鍒� new/old 椤哄簭锛�
+    /// </summary>
+    private bool IsSameRecord(EquipRecordData existingRecord, EquipDetail newDetail, EquipDetail oldDetail)
+    {
+        // 鍙傛暟鏍¢獙
+        if (newDetail == null && oldDetail == null)
+            return true;
+        if (existingRecord == null)
+            return true;
+
+        // 璁$畻鍚勫瓧娈垫槸鍚︿负 null
+        bool newIsNull = IsNullOrEmptyGuid(newDetail);
+        bool oldIsNull = IsNullOrEmptyGuid(oldDetail);
+        bool recordNewIsNull = IsNullOrEmptyGuid(existingRecord.newEquip);
+        bool recordOldIsNull = IsNullOrEmptyGuid(existingRecord.oldEquip);
+
+        // 濡傛灉涓よ竟閮戒负绌猴紝鍒欒涓虹浉鍚�
+        if (newIsNull && oldIsNull && recordNewIsNull && recordOldIsNull)
+            return true;
+
+        // 濡傛灉鍙湁涓�杈逛负绌猴紝鍒欎笉鍚�
+        if (newIsNull != recordNewIsNull || oldIsNull != recordOldIsNull)
+            return false;
+
+        // 妫�鏌ラ『搴忔槸鍚﹀尮閰�
+        bool orderMatch = IsGuidMatch(existingRecord.newEquip, newDetail) &&
+                          IsGuidMatch(existingRecord.oldEquip, oldDetail);
+
+        // 妫�鏌ラ『搴忔槸鍚︾浉鍙�
+        bool reverseMatch = IsGuidMatch(existingRecord.newEquip, oldDetail) &&
+                            IsGuidMatch(existingRecord.oldEquip, newDetail);
+
+        return orderMatch || reverseMatch;
+    }
+
+    // 鍒ゆ柇瑁呭璇︽儏鏄惁涓� null 鎴� guid 涓虹┖
+    private bool IsNullOrEmptyGuid(EquipDetail detail)
+    {
+        return detail == null || string.IsNullOrEmpty(detail.guid);
+    }
+
+    // 姣旇緝涓や釜瑁呭璇︽儏鐨� guid 鏄惁鐩哥瓑锛堝畨鍏ㄦ瘮杈冿紝閬垮厤 null 寮傚父锛�
+    private bool IsGuidMatch(EquipDetail a, EquipDetail b)
+    {
+        // 浠讳竴瀵硅薄涓� null 鍒欎笉鍖归厤
+        if (a == null || b == null)
+            return false;
+
+        return a.guid == b.guid;
+    }
 
     // 瑁呭璁板綍鏁版嵁绫诲瀷
     public class EquipRecordData
     {
-        public string recordId;              // 璁板綍鍞竴ID
-        public long timestamp;               // 鏃堕棿鎴�
-        public RecordType recordType;        // 璁板綍绫诲瀷
+        public int recordType;        // 璁板綍绫诲瀷
         public EquipDetail newEquip;         // 鏂拌澶囪鎯�
         public EquipDetail oldEquip;         // 鏃ц澶囪鎯�
-
+        public long fightPower;                 // 鎴樺姏宸�
+        public int timestamp;               // 鏃堕棿鎴�
     }
 
     public class EquipDetail
     {
-        public int itemId;                   // 鐗╁搧閰嶇疆ID
-        public string itemName;              // 鐗╁搧鍚嶇О
-        public int level;                    // 寮哄寲绛夌骇
-        public int score;                    // 瑁呭璇勫垎
-        public int equipPlace;               // 瑁呭閮ㄤ綅
-        public long fightPower;              // 鎴樺姏
-        public string guid;                  // 瑁呭鍞竴ID
+        public string guid;                     // 瑁呭鍞竴ID
+        public int itemId;                      // 鐗╁搧ID
+        public int lv;                          // 绛夌骇
     }
 
-    public enum RecordType
+
+    public enum EquipOPType
     {
-        Equip = 0,        // 瑁呭
-        Decompose = 1     // 鍒嗚В
+        Decompose = 1,     // 鍒嗚В
+        Equip = 2,        // 瑁呭
     }
 }
\ No newline at end of file
diff --git a/Main/System/Main/EquipRecordWin.cs b/Main/System/Main/EquipRecordWin.cs
index 32efaa3..fb9dd74 100644
--- a/Main/System/Main/EquipRecordWin.cs
+++ b/Main/System/Main/EquipRecordWin.cs
@@ -1,33 +1,56 @@
+using System;
+using System.Collections.Generic;
 using UnityEngine;
 
 public class EquipRecordWin : UIBase
 {
     [SerializeField] ScrollerController scroller;
-
+    [SerializeField] TextEx txtTip;
+    EquipRecordManager manager { get { return EquipRecordManager.Instance; } }
     protected override void OnPreOpen()
     {
+
         scroller.OnRefreshCell += OnRefreshCell;
-        CreateScroller();
+        manager.OnUpdateRecordListEvent += OnUpdateRecordListEvent;
+        txtTip.text = Language.Get("AutoFight17", manager.maxCnt);
+        scroller.lockType = EnhanceLockType.KeepVertical;
+        CreateScroller(isSort: true, isjump: true);
     }
 
     protected override void OnPreClose()
     {
         scroller.OnRefreshCell -= OnRefreshCell;
+        manager.OnUpdateRecordListEvent -= OnUpdateRecordListEvent;
+    }
+
+    private void OnUpdateRecordListEvent()
+    {
+        CreateScroller();
     }
 
     private void OnRefreshCell(ScrollerDataType type, CellView cell)
     {
         var _cell = cell.GetComponent<EquipRecordCell>();
-        _cell?.Display(cell.index);
+        _cell?.Display(cell.index, list);
     }
-    private void CreateScroller()
+    List<EquipRecordManager.EquipRecordData> list;
+
+    private void CreateScroller(bool isSort = false, bool isjump = false)
     {
         scroller.Refresh();
-
-        for (int i = 0; i < 20; i++)
+        list = manager.GetRecordList(isSort);
+        if (list != null)
         {
-            scroller.AddCell(ScrollerDataType.Header, i);
+            for (int i = list.Count - 1; i >= 0; i--)
+            {
+                scroller.AddCell(ScrollerDataType.Header, i);
+            }
         }
         scroller.Restart();
+        if (isjump)
+        {
+            scroller.JumpIndex(0);
+        }
+
     }
 }
\ No newline at end of file

--
Gitblit v1.8.0