using Mogafa.App.Assets; using Mogafa.App.Assets.EventIntercepts; using Mogafa.App.LogEvents; using Mogafa.App.LogEvents.Intercepts; using Mogafa.Common.Utils; using Mogafa.Common; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; namespace DidabuCloud.Unity.Core { public class DidabuCoreConfig : MogafaBase { public DidabuCoreConfig() { object obj = new EventCounterConfiguration(); obj = new AbGroupEvent(); obj = new AssetChangedEventConfiguration(); obj = new AbGroupDto(); obj = new AbGroupConfigurationDto(); obj = new AbGroupControlDataDto(); obj = new AbGroupValueConfigurationDto(); obj = new AssetStatisticalPeriodConfigurationDto(); EventCounters = new List(); AbGroupEvents = new List(); AssetChangedEvents = new List(); DidabuEvents = new List(); AbGroups = new List(); AbGroupConfigurations = new List(); AbGroupControlDatas = new List(); AssetStatisticalPeriods = new List(); } [JsonProperty("id")] public long Id; [JsonProperty("appId")] public long AppId; [JsonProperty("eventCounters")] public List EventCounters; [JsonProperty("abGroupEvents")] public List AbGroupEvents; [JsonProperty("assetChangedEvents")] public List AssetChangedEvents; [JsonProperty("didabuEvents")] public List DidabuEvents; [JsonProperty("enabledEvents")] public List EnabledEvents; [JsonProperty("controlData")] public string ControlData; [JsonProperty("controlDataVersion")] public int ControlDataVersion; [JsonProperty("assetEventParameterName")] public string AssetEventParameterName; [JsonProperty("userAbGroups")] public List AbGroups; [JsonProperty("abGroups")] public List AbGroupConfigurations; [JsonProperty("abGroupControlDatas")] public List AbGroupControlDatas; [JsonProperty("invitationCode")] public string InvitationCode; [JsonProperty("assetStatisticalPeriods")] public List AssetStatisticalPeriods; [JsonProperty("countryCode")] public string CountryCode; [JsonProperty("isBanned")] public bool IsBanned; public List GetEnabledEvents(string logEventReporterProvider) { if(EnabledEvents == null) { return new List(); } var events = EnabledEvents.FirstOrDefault(e=>e.Name == logEventReporterProvider); if(events == null) { return new List(); } return events.Events; } public List GetPeriodicAssets(string assetCode, long utcNow) { var periodicAssets = new List(); if (AssetStatisticalPeriods == null || AssetStatisticalPeriods.Count == 0) { return periodicAssets; } try { foreach (var periodConfig in AssetStatisticalPeriods) { var expression = periodConfig.PeriodStartExpression; var twoParts = expression.Split("@".ToArray(), StringSplitOptions.RemoveEmptyEntries); var day = 0; var isWeek = true; if (!int.TryParse(twoParts[0], out int startMinutes)) { Logger.LogError($"config expression error:{expression}"); continue; } if (twoParts.Length >= 2) { isWeek = twoParts[1].StartsWith("wd"); var dayString = twoParts[1].Substring(2); if (!int.TryParse(dayString, out day)) { Logger.LogError($"config expression error:{expression}"); continue; } } var time = new DateTime(utcNow*10000 + 621355968000000000, DateTimeKind.Utc).ToUniversalTime(); var minutes = time.Hour * 60 + time.Minute; var endMinutes = startMinutes + periodConfig.PeriodDuration; var periodStartTime = new DateTime(time.Year, time.Month, time.Day, 0, 0, 0, DateTimeKind.Utc); if(day != 0) { if (isWeek) { var dayOfWeek = (int)time.DayOfWeek; if(dayOfWeek == 0) { dayOfWeek = 7; } periodStartTime = periodStartTime.AddDays(day - dayOfWeek); if (day > dayOfWeek) { periodStartTime = periodStartTime.AddDays(-7); } } else { var dayOfMonth = time.Day; periodStartTime = periodStartTime.AddDays(day - dayOfMonth); if(day > dayOfMonth) { periodStartTime = periodStartTime.AddMonths(-1); } } } periodStartTime = periodStartTime.AddMinutes(startMinutes); var periodEndTime = periodStartTime.AddMinutes(periodConfig.PeriodDuration); if (periodEndTime >= time && time >= periodStartTime) { periodicAssets.Add(new UserPeriodicAsset { AssetCode = assetCode, AssetDeltaValue = 0, EndTime = (periodEndTime.ToUniversalTime().Ticks - 621355968000000000) / 10000, StartTime = (periodStartTime.ToUniversalTime().Ticks - 621355968000000000)/10000, IsPeriodEnded = false, PeriodCode = periodConfig.Code }); } } } catch(Exception ex) { Logger.LogError($"Get periodic asset config error:{ex.Message}"); } return periodicAssets; } } public class EventCounterConfigurationDto { public EventCounterConfigurationDto() { CountList = new List(); } [JsonProperty("name")] public string Name; [JsonProperty("countList")] public List CountList; } public class AbGroupEventConfigurationDto { public AbGroupEventConfigurationDto() { EventNames = new List(); } [JsonProperty("name")] public string Name; [JsonProperty("value")] public string Value; [JsonProperty("eventNames")] public List EventNames; } public class AssetChangedEventConfigurationDto { public AssetChangedEventConfigurationDto() { Values = new List(); } [JsonProperty("assetCode")] public string AssetCode; [JsonProperty("eventName")] public string EventName; [JsonProperty("values")] public List Values; } public class AbGroupConfigurationDto { public AbGroupConfigurationDto() { Values = new List(); } [JsonProperty("name")] public string Name; [JsonProperty("values")] public List Values; [JsonProperty("defaultValue")] public string DefaultValue; [JsonProperty("strategyName")] public string StrategyName; [JsonProperty("lastModifyTime")] public long LastModifyTime; } public class AbGroupValueConfigurationDto { public AbGroupValueConfigurationDto() { } [JsonProperty("value")] public string Value; [JsonProperty("strategyValue")] public string StrategyValue; } public class AbGroupValueWeight : IWeighable { public AbGroupValueConfigurationDto Value { get; set; } public int Weight { get; set; } } public class AbGroupControlDataDto { public AbGroupControlDataDto() { } [JsonProperty("abGroupName")] public string AbGroupName; [JsonProperty("abGroupValue")] public string AbGroupValue; [JsonProperty("controlData")] public string ControlData; } public class AssetStatisticalPeriodConfigurationDto { public AssetStatisticalPeriodConfigurationDto() { } [JsonProperty("code")] public string Code; [JsonProperty("description")] public string Description; [JsonProperty("periodDuration")] public long PeriodDuration; /// /// 周期开始时间点的表达式,目前支持格式如下: /// mins @md1 mins @wd2 /// 其中mins是每天从零点开始的分钟数 /// md是每月的第几天,md1就是每月1日,md28就是每月28日 /// wd是每个星期几,wd1就是每周一,wd7就是每周日 /// 如果没有 @符号及后面内容,默认表示每天 /// [JsonProperty("periodStartExpression")] public string PeriodStartExpression; } public class EnabledEvent { [JsonProperty("name")] public string Name; [JsonProperty("events")] public List Events; } }