| using System;  | 
| using System.Collections.Generic;  | 
| using System.Linq;  | 
| using System.Text;  | 
| using UnityEngine;  | 
|   | 
| namespace vnxbqy.UI  | 
| {  | 
|       | 
|     public class FlashRushToBuyModel : Model,IBeforePlayerDataInitialize,IPlayerLoginOk,IOpenServerActivity  | 
|     {  | 
|         StoreModel storeModel { get { return ModelCenter.Instance.GetModel<StoreModel>(); } }  | 
|         HeavenBattleModel battleModel { get { return ModelCenter.Instance.GetModel<HeavenBattleModel>(); } }  | 
|         public string AlreadyOpenSaleTimeRecord = "";  | 
|         public override void Init()  | 
|         {  | 
|             OperationTimeHepler.Instance.operationStartEvent += OperationStartEvent;  | 
|             OperationTimeHepler.Instance.operationEndEvent += OperationEndEvent;  | 
|             OperationTimeHepler.Instance.operationAdvanceEvent += OperationAdvanceEvent;  | 
|             OpenServerActivityCenter.Instance.Register(14, this);  | 
|         }  | 
|   | 
|         public void OnBeforePlayerDataInitialize()  | 
|         {  | 
|             fullSeverBuyInfoDict.Clear();  | 
|         }  | 
|   | 
|         public void OnPlayerLoginOk()  | 
|         {  | 
|             AlreadyOpenSaleTimeRecord = StringUtility.Contact("AlreadyOpenSaleTimeRecord",PlayerDatas.Instance.baseData.PlayerID);  | 
|             PlayerPrefs.DeleteKey(AlreadyOpenSaleTimeRecord);  | 
|             GetAlreadyOpenSaleTime();  | 
|             UpdateRedpoint();  | 
|         }  | 
|   | 
|         public override void UnInit()  | 
|         {  | 
|             OperationTimeHepler.Instance.operationStartEvent -= OperationStartEvent;  | 
|             OperationTimeHepler.Instance.operationEndEvent -= OperationEndEvent;  | 
|             OperationTimeHepler.Instance.operationAdvanceEvent -= OperationAdvanceEvent;  | 
|         }  | 
|   | 
|         public bool IsOpen  | 
|         {  | 
|             get  | 
|             {  | 
|                 var operation = GetOperationFlashRushToBuy();  | 
|                 if (operation != null)  | 
|                 {  | 
|                     return operation.SatisfyOpenCondition();  | 
|                 }  | 
|                 return false;  | 
|             }  | 
|         }  | 
|   | 
|         public bool priorityOpen  | 
|         {  | 
|             get  | 
|             {  | 
|                 return flashRushToBuyRedpoint.state == RedPointState.Simple;  | 
|             }  | 
|         }  | 
|   | 
|         public bool IsAdvance  | 
|         {  | 
|             get  | 
|             {  | 
|                 return OperationTimeHepler.Instance.SatisfyAdvanceCondition(Operation.FlashRushToBuy);  | 
|             }  | 
|         }  | 
|   | 
|         public void SetDefaultSelectSaleTime()  | 
|         {  | 
|             OperationFlashRushToBuy operation = GetOperationFlashRushToBuy();  | 
|             int seconds = 0;  | 
|             if (presentFlashShop != null)  | 
|             {  | 
|                 int buyState = operation.GetBuyTimeState(TimeUtility.ServerNow,presentFlashShop.dayIndex,presentFlashShop.timeIndex, out seconds);  | 
|                 if(buyState != 1)  | 
|                 {  | 
|                     return;  | 
|                 }  | 
|             }  | 
|             OperationTime operationTime;  | 
|             OperationFlashRushToBuy.FlashSaleShop saleShop = null;  | 
|             var flashRushToBuySate = GetActivityState(out seconds, out operationTime, out saleShop);  | 
|             if(flashRushToBuySate != FlashRushToBuySate.End)  | 
|             {  | 
|                 presentFlashShop = saleShop;  | 
|             }  | 
|             else  | 
|             {  | 
|                 presentFlashShop = null;  | 
|             }  | 
|         }  | 
|   | 
|         public event Action UpdatePresentFlashShopCloseEvent;  | 
|         public void PresentFlashShopActivityClose()  | 
|         {  | 
|             SetDefaultSelectSaleTime();  | 
|             if (UpdatePresentFlashShopCloseEvent != null)  | 
|             {  | 
|                 UpdatePresentFlashShopCloseEvent();  | 
|             }  | 
|         }  | 
|   | 
|         public void ResetFlashShop()  | 
|         {  | 
|             presentFlashShop = null;  | 
|         }  | 
|   | 
|         #region 本地数据处理  | 
|         public OperationFlashRushToBuy.FlashSaleShop presentFlashShop { get; private set; }  | 
|         public event Action UpdateSelectSaleTimeEvent;  | 
|         public void UpdateSelectFlashSaleTime(int dayIndex,int timeIndex)  | 
|         {  | 
|             presentFlashShop = null;  | 
|             OperationFlashRushToBuy operation = GetOperationFlashRushToBuy();  | 
|             if(operation != null)  | 
|             {  | 
|                 OperationFlashRushToBuy.FlashSaleShop flashShop;  | 
|                 operation.TryGetFlashShop(dayIndex, timeIndex, out flashShop);  | 
|                 presentFlashShop = flashShop;  | 
|                 if(UpdateSelectSaleTimeEvent != null)  | 
|                 {  | 
|                     UpdateSelectSaleTimeEvent();  | 
|                 }  | 
|             }  | 
|         }  | 
|   | 
|         public OperationFlashRushToBuy GetOperationFlashRushToBuy()  | 
|         {  | 
|             OperationBase operationBase;  | 
|             if (OperationTimeHepler.Instance.TryGetOperationTime(Operation.FlashRushToBuy, out operationBase))  | 
|             {  | 
|                 return operationBase as OperationFlashRushToBuy;  | 
|             }  | 
|   | 
|             return null;  | 
|         }  | 
|         #endregion  | 
|   | 
|         #region 协议  | 
|         public event Action UpdateAllAppointmentEvent;  | 
|         public event Action<int> UpdateAppointmentEvent;  | 
|         public void UpdateFlashSaleAppointmentInfo(HAA18_tagMCFlashSaleAppointmentInfo appointmentInfo)  | 
|         {  | 
|   | 
|             var operation = GetOperationFlashRushToBuy();  | 
|             if (operation == null) return;  | 
|             if (operation.ActNum != appointmentInfo.ActNum)  | 
|             {  | 
|                 return;  | 
|             }  | 
|   | 
|             if (appointmentInfo.IsAll == 1)  | 
|             {  | 
|                 for (int j = 0; j < operation.flashShops.Count; j++)  | 
|                 {  | 
|                     var saleItems = operation.flashShops[j].items;  | 
|                     for (int k = 0; k < saleItems.Length; k++)  | 
|                     {  | 
|                         saleItems[k].isAppointment = 0;  | 
|                     }  | 
|                 }  | 
|             }  | 
|     | 
|             for (int i = 0; i < appointmentInfo.GoodsCount; i++)  | 
|             {  | 
|                 var saleItemInfo = appointmentInfo.GoodsList[i];  | 
|                 if (appointmentInfo.GoodsCount < 2   | 
|                     && saleItemInfo.State == 1  | 
|                     && appointmentInfo.IsAll != 1)  | 
|                 {  | 
|                     SysNotifyMgr.Instance.ShowTip("FlashRushToBuy1");  | 
|                 }  | 
|                 for (int j = 0; j < operation.flashShops.Count; j++)  | 
|                 {  | 
|                     var saleItems = operation.flashShops[j].items;  | 
|                     for (int k = 0; k < saleItems.Length; k++)  | 
|                     {  | 
|                        if (saleItems[k].shopGuid == saleItemInfo.GoodsMark)  | 
|                         {  | 
|   | 
|                             if(saleItems[k].isAppointment != saleItemInfo.State)  | 
|                             {  | 
|                                 saleItems[k].isAppointment = saleItemInfo.State;  | 
|                                 if(UpdateAppointmentEvent != null && appointmentInfo.IsAll != 1)  | 
|                                 {  | 
|                                     UpdateAppointmentEvent((int)saleItemInfo.GoodsMark);  | 
|                                 }  | 
|                             }  | 
|                         }  | 
|                     }  | 
|                 }  | 
|             }  | 
|             if(appointmentInfo.IsAll == 1)  | 
|             {  | 
|                 if (UpdateAllAppointmentEvent != null)  | 
|                 {  | 
|                     UpdateAllAppointmentEvent();  | 
|                 }  | 
|             }  | 
|   | 
|         }  | 
|   | 
|         public event Action<int>UpdateFullSeverBuyEvent;  | 
|         private Dictionary<int, int> fullSeverBuyInfoDict = new Dictionary<int, int>();  | 
|           | 
|         public void UpdateFullSeverBuyInfo(HA906_tagGCStoreServerBuyCntInfo buyCntInfo)  | 
|         {  | 
|             ModelCenter.Instance.GetModel<HolidayFlashRushToBuyModel>().UpdateFullSeverBuyInfo(buyCntInfo);  | 
|             for (int i = 0; i < buyCntInfo.Count; i++)  | 
|             {  | 
|                 var info = buyCntInfo.InfoList[i];  | 
|                 if(!fullSeverBuyInfoDict.ContainsKey((int)info.GoodsID))  | 
|                 {  | 
|                     fullSeverBuyInfoDict.Add((int)info.GoodsID,(int)info.BuyCnt);  | 
|                 }  | 
|                 else  | 
|                 {  | 
|                     fullSeverBuyInfoDict[(int)info.GoodsID] = (int)info.BuyCnt;  | 
|                 }  | 
|                 if (UpdateFullSeverBuyEvent != null)  | 
|                 {  | 
|                     UpdateFullSeverBuyEvent((int)info.GoodsID);  | 
|                 }  | 
|             }  | 
|         }  | 
|         public int GetFullServerBuyCntById(int goodsId)  | 
|         {  | 
|             int buyCnt = 0;  | 
|             fullSeverBuyInfoDict.TryGetValue(goodsId,out buyCnt);  | 
|             return buyCnt;  | 
|         }  | 
|   | 
|         /// <summary>  | 
|         ///  限时抢购预约  | 
|         /// </summary>  | 
|         public void SendFlashSaleAppointment(int shopGuid,int state)  | 
|         {  | 
|             var operation = GetOperationFlashRushToBuy();  | 
|             if (operation == null) return;  | 
|             CAA05_tagCMFlashSaleAppointment appointment = new CAA05_tagCMFlashSaleAppointment();  | 
|             appointment.GoodsID = (uint)shopGuid;  | 
|             appointment.State = (byte)state;  | 
|             appointment.ActNum = (byte)operation.ActNum;  | 
|             GameNetSystem.Instance.SendInfo(appointment);  | 
|         }  | 
|         #endregion  | 
|   | 
|         /// <summary>  | 
|         /// 获得限时抢购活动状态  | 
|         /// </summary>  | 
|         /// <param name="seconds"></param>  | 
|         /// <returns></returns>  | 
|         public FlashRushToBuySate GetActivityState(out int seconds,out OperationTime operationTime,out OperationFlashRushToBuy.FlashSaleShop saleShop)  | 
|         {  | 
|             seconds = 0;  | 
|             saleShop = null;  | 
|             operationTime = default(OperationTime);  | 
|             var operation = GetOperationFlashRushToBuy();  | 
|             if (!IsOpen || operation == null) return FlashRushToBuySate.NoOpen;  | 
|   | 
|             int openState = 0;  | 
|             int endState = 0;  | 
|             int openSeconds = 0;  | 
|             int endSeconds = 0;  | 
|             for(int i = 0; i < operation.flashShops.Count;i++)  | 
|             {  | 
|                 OperationFlashRushToBuy.FlashSaleShop openSaleShop = operation.flashShops[i];  | 
|                 operationTime = operation.times[openSaleShop.timeIndex];  | 
|                 openState = operation.GetBuyTimeState(TimeUtility.ServerNow, openSaleShop.dayIndex, openSaleShop.timeIndex, out openSeconds);  | 
|                 if(openState != 1)  | 
|                 {  | 
|                     saleShop = openSaleShop;  | 
|                     break;  | 
|                 }  | 
|             }  | 
|             if(operation.flashShops.Count > 0)  | 
|             {  | 
|                 OperationFlashRushToBuy.FlashSaleShop endSaleShop = operation.flashShops[operation.flashShops.Count - 1];  | 
|                 endState = operation.GetBuyTimeState(TimeUtility.ServerNow, endSaleShop.dayIndex, endSaleShop.timeIndex, out endSeconds);  | 
|             }  | 
|               | 
|             switch(openState)  | 
|             {  | 
|                 case -1:  | 
|                     seconds = openSeconds;  | 
|                     return FlashRushToBuySate.InAdvance;  | 
|                 case 0:  | 
|                     return FlashRushToBuySate.Begining;  | 
|             }  | 
|   | 
|             switch(endState)  | 
|             {  | 
|                 case -1:  | 
|                     return FlashRushToBuySate.Begining;  | 
|                 case 0:  | 
|                     return FlashRushToBuySate.Begining;  | 
|                 case 1:  | 
|                     return FlashRushToBuySate.End;  | 
|                 default:  | 
|                     return FlashRushToBuySate.NoOpen;  | 
|             }  | 
|         }  | 
|   | 
|         public bool CheckIsPush(out OperationFlashRushToBuy.FlashSaleShop saleShop)  | 
|         {  | 
|             int seconds = 0;  | 
|             OperationTime operationTime;  | 
|             saleShop = null;  | 
|             var buyState = GetActivityState(out seconds,out operationTime,out saleShop);  | 
|             switch (buyState)  | 
|             {  | 
|                 case FlashRushToBuySate.NoOpen:  | 
|                     break;  | 
|                 case FlashRushToBuySate.InAdvance:  | 
|                     if(saleShop != null && seconds <= 180)  | 
|                     {  | 
|                        for(int i = 0; i < saleShop.items.Length; i++)  | 
|                         {  | 
|                             if(saleShop.items[i].isAppointment == 1)  | 
|                             {  | 
|                                 return true;  | 
|                             }  | 
|                         }  | 
|                     }  | 
|                     break;  | 
|                 case FlashRushToBuySate.Begining:  | 
|                     if (saleShop != null)  | 
|                     {  | 
|                         for (int i = 0; i < saleShop.items.Length; i++)  | 
|                         {  | 
|                             var saleItem = saleShop.items[i];  | 
|                             if(GetSellSate(saleItem) == 0)  | 
|                             {  | 
|                                 return true;  | 
|                             }  | 
|                         }  | 
|                     }  | 
|                     break;  | 
|                 case FlashRushToBuySate.End:  | 
|                     break;  | 
|             }  | 
|             return false;  | 
|         }  | 
|   | 
|         /// <summary>  | 
|         /// 0 秒杀 1 已买到 2 已抢光  | 
|         /// </summary>  | 
|         /// <returns></returns>  | 
|         private int GetSellSate(OperationFlashRushToBuy.FlashSaleItem saleItem)  | 
|         {  | 
|             var buyInfo = storeModel.GetBuyShopLimit((uint)saleItem.shopId);  | 
|             var buyCount = 0;  | 
|             int fullRemainNum = saleItem.fullServerLimitNum - GetFullServerBuyCntById(saleItem.shopId);  | 
|             if (buyInfo != null)  | 
|             {  | 
|                 buyCount = buyInfo.BuyCnt;  | 
|             }  | 
|             if (buyCount >= saleItem.limitNum)  | 
|             {  | 
|                 return 1;  | 
|             }  | 
|   | 
|             if (fullRemainNum <= 0)  | 
|             {  | 
|                 return 2;  | 
|             }  | 
|             return 0;  | 
|         }  | 
|   | 
|         private void OperationEndEvent(Operation type, int state)  | 
|         {  | 
|             if (type == Operation.FlashRushToBuy && state == 0)  | 
|             {  | 
|                 UpdateRedpoint();  | 
|                 if (onStateUpdate != null)  | 
|                 {  | 
|                     onStateUpdate(14);  | 
|                 }  | 
|             }  | 
|         }  | 
|   | 
|         private void OperationAdvanceEvent(Operation type)  | 
|         {  | 
|             if (type == Operation.FlashRushToBuy)  | 
|             {  | 
|                 if (onStateUpdate != null)  | 
|                 {  | 
|                     onStateUpdate(14);  | 
|                 }  | 
|             }  | 
|         }  | 
|   | 
|         private void OperationStartEvent(Operation type, int state)  | 
|         {  | 
|             if (type == Operation.FlashRushToBuy && state == 0)  | 
|             {  | 
|                 UpdateRedpoint();  | 
|                 if (onStateUpdate != null)  | 
|                 {  | 
|                     onStateUpdate(14);  | 
|                 }  | 
|             }  | 
|         }  | 
|   | 
|         public void SetDayRemind()  | 
|         {  | 
|             if (flashRushToBuyRedpoint.state == RedPointState.Simple)  | 
|             {  | 
|                 SetAlreadyOpenSaleTime();  | 
|                 UpdateRedpoint();  | 
|             }  | 
|         }  | 
|          | 
|         public Redpoint flashRushToBuyRedpoint = new Redpoint(MainRedDot.REDPOINT_OPENSERVER, 20914);  | 
|   | 
|         public event Action<int> onStateUpdate;  | 
|         public void SetAlreadyOpenSaleTime()  | 
|         {  | 
|             int seconds = 0;  | 
|             OperationTime operationTime;  | 
|             OperationFlashRushToBuy.FlashSaleShop saleShop = null;  | 
|             var buyState = GetActivityState(out seconds, out operationTime, out saleShop);  | 
|             if(buyState == FlashRushToBuySate.Begining)  | 
|             {  | 
|                 int key = saleShop.dayIndex * 100 + saleShop.timeIndex;  | 
|                 if (!flashSaleShops.Contains(key))  | 
|                 {  | 
|                     flashSaleShops.Add(key);  | 
|                 }  | 
|             }  | 
|         }  | 
|   | 
|         public List<int> flashSaleShops = new List<int>();  | 
|         public List<int> GetAlreadyOpenSaleTime()  | 
|         {  | 
|             int[] saveKeys = LocalSave.GetIntArray(AlreadyOpenSaleTimeRecord);  | 
|             flashSaleShops.Clear();  | 
|             if(saveKeys != null)  | 
|             {  | 
|                 for(int i = 0; i < saveKeys.Length; i++)  | 
|                 {  | 
|                     flashSaleShops.Add(saveKeys[i]);  | 
|                 }  | 
|             }  | 
|             return flashSaleShops;  | 
|         }  | 
|   | 
|         private void UpdateRedpoint()  | 
|         {  | 
|             flashRushToBuyRedpoint.state = RedPointState.None;  | 
|             int seconds = 0;  | 
|             OperationTime operationTime;  | 
|             OperationFlashRushToBuy.FlashSaleShop saleShop = null;  | 
|             var buyState = GetActivityState(out seconds, out operationTime, out saleShop);  | 
|             if(buyState == FlashRushToBuySate.Begining)  | 
|             {  | 
|                 int key = saleShop.dayIndex * 100 + saleShop.timeIndex;  | 
|                 if(!flashSaleShops.Contains(key))  | 
|                 {  | 
|                     flashRushToBuyRedpoint.state = RedPointState.Simple;  | 
|                 }  | 
|             }  | 
|              | 
|         }  | 
|   | 
|         public enum FlashRushToBuySate  | 
|         {  | 
|             NoOpen, //活动未开启  | 
|             InAdvance,//提前  | 
|             Begining, //活动中  | 
|             End, //结束  | 
|         }  | 
|     }  | 
| }  |