/// <summary> /// Здесь лучше всего писать бизнес-логику, оперируя только объектом данных. /// </summary> protected override void PreApplyToControls() { SQLWhereLanguageDef ld = SQLWhereLanguageDef.LanguageDef; if (Context.User.IsInRole("Продавец") && this.DataObject == null) { // Определяем текущего пользователя var currentUser = Context.User.Identity.Name; IDataService ds = DataServiceProvider.DataService; var lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Продавец), "ПродавецL"); lcs.LimitFunction = ld.GetFunction(ld.funcEQ, new VariableDef(ld.StringType, Information.ExtractPropertyPath <Продавец>(x => x.Логин)), currentUser); var manager = ds.LoadObjects(lcs)[0] as Продавец; // Устанавливаем текущего продавца в поле заказа this.DataObject = new Заказ(); this.DataObject.ТорговаяТочка = manager.ТорговаяТочка; ctrlТорговаяТочка.Enabled = false; } ctrlСтрокаЗаказа.AddLookUpSettings(Information.ExtractPropertyPath <СтрокаЗаказа>(r => r.Продукт), new LookUpSetting { LimitFunction = ld.GetFunction(ld.funcEQ, new VariableDef(ld.StringType, Information.ExtractPropertyPath <Продукт>(r => r.Статус)), "В продаже"), ColumnsSort = new ColumnsSortDef[] { new ColumnsSortDef("Код", SortOrder.Asc) } }); if (DataObject.Состояние == СостояниеЗаказа.Оплаченный) { ctrlСостояние.Enabled = false; } }
/// <summary> /// Конструктор формы /// </summary> public RoleE() : base("Sec_AgentL") { _languageDef = SQLWhereLanguageDef.LanguageDef; Function limitIsUser = _languageDef.GetFunction(_languageDef.funcEQ, new VariableDef(_languageDef.BoolType, "IsUser"), true); LoadingCustomizationStruct lcsAllUsers = new LoadingCustomizationStruct(null); lcsAllUsers.LoadingTypes = new[] { typeof(Agent) }; lcsAllUsers.LimitFunction = limitIsUser; lcsAllUsers.View = Information.GetView("Sec_AgentL", typeof(Agent)); _allUsers = BridgeToDS.GetDataService().LoadObjects(lcsAllUsers).Cast <Agent>().ToList(); Function limitIsRole = _languageDef.GetFunction(_languageDef.funcEQ, new VariableDef(_languageDef.BoolType, "IsRole"), true); LoadingCustomizationStruct lcsAllRoles = new LoadingCustomizationStruct(null); lcsAllRoles.LoadingTypes = new[] { typeof(Agent) }; lcsAllRoles.LimitFunction = limitIsRole; lcsAllRoles.View = Information.GetView("Sec_RolesL", typeof(Agent)); _allRoles = BridgeToDS.GetDataService().LoadObjects(lcsAllRoles).Cast <Agent>().ToList(); Function limitIsClass = _languageDef.GetFunction(_languageDef.funcEQ, new VariableDef(_languageDef.BoolType, "IsClass"), true); LoadingCustomizationStruct lcsAllClasses = new LoadingCustomizationStruct(null); lcsAllClasses.LoadingTypes = new[] { typeof(Subject) }; lcsAllClasses.LimitFunction = limitIsClass; lcsAllClasses.View = Information.GetView("Sec_SubjectL", typeof(Subject)); _allClasses = BridgeToDS.GetDataService().LoadObjects(lcsAllClasses).Cast <Subject>().ToList(); }
public void GetExistingVariableNamesNotFoundFunctionParametersExceptionTest() { var exception = Record.Exception(() => { var obj = new MasterClass() { StringMasterProperty = "prop", IntMasterProperty = 666 }; SQLWhereLanguageDef langdef = SQLWhereLanguageDef.LanguageDef; Function lf2 = langdef.GetFunction( langdef.funcNOT, langdef.GetFunction(langdef.funcEQ, new VariableDef(langdef.GuidType, "MasterClass"), obj.DetailClass)); }); Assert.IsType(typeof(FunctionalLanguageDef.NotFoundFunctionParametersException), exception); }
public void GetObjectIndexesWithPksTest() { foreach (IDataService dataService in DataServices) { // Arrange. SQLDataService ds = dataService as SQLDataService; var createdBear1 = new Медведь(); createdBear1.ЦветГлаз = "Косолапый Мишка 1"; ds.UpdateObject(createdBear1); LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), Медведь.Views.МедведьL); SQLWhereLanguageDef langDef = SQLWhereLanguageDef.LanguageDef; Function findFunction = langDef.GetFunction(langDef.funcLike, new VariableDef(langDef.StringType, Information.ExtractPropertyPath <Медведь>(m => m.ЦветГлаз)), createdBear1.ЦветГлаз); // Act. IDictionary <int, string> result = ds.GetObjectIndexesWithPks(lcs, findFunction, 101); // Assert. Assert.Equal(1, result.Count); Assert.True(result[1].IndexOf("{") > -1); Console.WriteLine(result[1]); } }
/// <summary> /// Удалить все блокировки текущего юзера (какие есть в базе). /// В качестве сервиса данных используется переданный сервис данных. /// <param name="dataService">Сервис данных.</param> /// </summary> public static void ClearAllUserLocks(IDataService dataService) { var ds = dataService ?? DataServiceProvider.DataService; // убиваем все блокировки, оставшиеся с предыдущих времен SQLWhereLanguageDef lg = SQLWhereLanguageDef.LanguageDef; var vd = new VariableDef(lg.GetObjectTypeForNetType(typeof(string)), "UserName"); Function func = lg.GetFunction( lg.funcEQ, vd, GetUserName() + (UseMachineNameInKey ? " @ " + Environment.MachineName : string.Empty)); var lcs1 = new LoadingCustomizationStruct(0); var view = new View(typeof(LockData), View.ReadType.WithRelated); lcs1.Init(null, func, new[] { typeof(LockData) }, view, null); DataObject[] arr = ds.LoadObjects(lcs1); foreach (DataObject obj in arr) { obj.SetStatus(ObjectStatus.Deleted); } ds.UpdateObjects(ref arr); }
/// <summary> /// Здесь лучше всего писать бизнес-логику, оперируя только объектом данных. /// </summary> protected override void PreApplyToControls() { SQLWhereLanguageDef langdef = SQLWhereLanguageDef.LanguageDef; Function lf = langdef.GetFunction(langdef.funcEQ, new VariableDef(langdef.StringType, Information.ExtractPropertyName <Сотрудник>(x => x.Должность)), EnumCaption.GetCaptionFor(Должность.Менеджер)); ctrlСотрудник.LimitFunction = lf; }
public void FunctionalLanguageDefGetFunctionExceptionTest() { var exception = Xunit.Record.Exception(() => { FunctionalLanguageDef langDef = new SQLWhereLanguageDef(); var result = langDef.GetFunction("functionString"); }); Assert.IsType(typeof(FunctionalLanguageDef.NotFoundFunctionBySignatureException), exception); }
public void FunctionalLanguageDefGetFunctionException1Test() { var exception = Xunit.Record.Exception(() => { SQLWhereLanguageDef langDef = SQLWhereLanguageDef.LanguageDef; var result = langDef.GetFunction(langDef.funcEQ, new object[] { null }); }); Assert.IsType(typeof(NullReferenceException), exception); }
protected virtual void SetLimitFuncion(Function limitFunction, LoadingCustomizationStruct lcs) { if (lcs.LimitFunction != null) { // Для поддержки цепочного вызова Where необходимо объединить переданное ограничение с уже существующим. lcs.LimitFunction = langdef.GetFunction(langdef.funcAND, lcs.LimitFunction, limitFunction); } else { lcs.LimitFunction = limitFunction; } }
/// <summary> /// Обычный Page_Load ASP.NET /// </summary> /// <param name="sender">Sender object</param> /// <param name="e">Event Args</param> protected void Page_Load(object sender, EventArgs e) { SQLWhereLanguageDef languageDef = SQLWhereLanguageDef.LanguageDef; Function limit = languageDef.GetFunction(languageDef.funcEQ, new VariableDef(languageDef.BoolType, "IsClass"), true); WebObjectListView1.LimitFunction = limit; WebObjectListView1.View = Information.GetView("Sec_SubjectL", typeof(Subject)); WebObjectListView1.EditPage = "~//forms//Security//Class//ClassE.aspx"; WOLVSettApplyer wsa = new WOLVSettApplyer(); wsa.SettingsApply(WebObjectListView1); }
public static string CreateLf(string[] ordKeys, string lfKey) { if (string.IsNullOrEmpty(lfKey)) { lfKey = Guid.NewGuid().ToString("B"); } SQLWhereLanguageDef langdef = SQLWhereLanguageDef.LanguageDef; var clientKeys = new List <object> { new VariableDef( langdef.GuidType, SQLWhereLanguageDef.StormMainObjectKey) }; clientKeys.AddRange(ordKeys); Function lf = langdef.GetFunction(langdef.funcNOT, langdef.GetFunction(langdef.funcIN, clientKeys.ToArray())); LimitFunctionsHolder.PersistLimitFunction(lfKey, lf); return(lfKey); }
public void TestEqualsExpressionWithObjectParameter() { // Arrange. var testProvider = new TestQueryProvider <LinqProviderTestDataObject>(); object value = "{72FCA622-A01E-494C-BE1C-0821178594FB}"; new Query <LinqProviderTestDataObject>(testProvider).Where(o => o.ObjectProperty == value).ToArray(); Expression queryExpression = testProvider.InnerExpression; SQLWhereLanguageDef langDef = SQLWhereLanguageDef.LanguageDef; Function expected = langDef.GetFunction(langDef.funcEQ, new VariableDef(langDef.StringType, nameof(LinqProviderTestDataObject.ObjectProperty)), value); // Act. LoadingCustomizationStruct actual = LinqToLcs.GetLcs(queryExpression, typeof(LinqProviderTestDataObject)); // Assert. Assert.Equal(expected, actual.LimitFunction); }
// *** Start programmer edit section *** (Period CustomMembers) /// <summary> /// Загрузить вложенные периоды. /// </summary> /// <param name="pВложенныеПериоды"></param> public void LoadВложенныеПериоды(System.Collections.ArrayList pВложенныеПериоды) { IDataService ds = DataServiceProvider.DataService; LoadingCustomizationStruct lcs = new LoadingCustomizationStruct(null); lcs.View = Information.GetView("PeriodL", typeof(Period)); lcs.LoadingTypes = new Type[] { typeof(Period) }; SQLWhereLanguageDef langdef = SQLWhereLanguageDef.LanguageDef; ICSSoft.STORMNET.FunctionalLanguage.Function lf = langdef.GetFunction(langdef.funcEQ, new VariableDef(langdef.NumericType, "Ierarhiia"), this.__PrimaryKey); lcs.LimitFunction = lf; ICSSoft.STORMNET.DataObject[] tmpПериоды = ds.LoadObjects(lcs); foreach (Period dobject in tmpПериоды) { pВложенныеПериоды.Add(dobject); ((Period)dobject).LoadВложенныеПериоды(pВложенныеПериоды); } }
public void GetObjectIndexesWithPksOrderingTest() { foreach (IDataService dataService in DataServices) { //TODO: Fix OracleDataService error. if (dataService is OracleDataService) { continue; } // Arrange. SQLDataService ds = dataService as SQLDataService; SQLWhereLanguageDef langDef = SQLWhereLanguageDef.LanguageDef; List <DataObject> dataObjects = new List <DataObject>(); bool isMssql = dataService.GetType() == typeof(MSSQLDataService) || dataService.GetType().IsSubclassOf(typeof(MSSQLDataService)); // MSSQL в отличие от других хранилищ имеет свой формат сортировки гуидов. Для его поддержки приходится пользоваться специальным типом SqlGuid. List <SqlGuid> keysMssqlList = new List <SqlGuid>(); List <Guid> keysPostgresList = new List <Guid>(); // Создадим 1000 медведей. int objectsCount = 1000; for (int i = 0; i < objectsCount; i++) { // Для простоты анализа проблем с данными, если они возникнут, выдадим ненастоящие последовательные гуиды. byte[] bytes = new byte[16]; BitConverter.GetBytes(i).CopyTo(bytes, 0); var pk = new Guid(bytes); if (isMssql) { keysMssqlList.Add(pk); } else { keysPostgresList.Add(pk); } var createdBear = new Медведь { __PrimaryKey = pk, ЦветГлаз = "Косолапый Мишка " + i, Вес = i }; dataObjects.Add(createdBear); } DataObject[] dataObjectsForUpdate = dataObjects.ToArray(); ds.UpdateObjects(ref dataObjectsForUpdate); LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), Медведь.Views.МедведьL); Function findFunction = langDef.GetFunction(langDef.funcL, new VariableDef(langDef.StringType, Information.ExtractPropertyPath <Медведь>(m => m.Вес)), objectsCount); if (isMssql) { keysMssqlList.Sort(); } else { keysPostgresList.Sort(); } // Act. IDictionary <int, string> result = ds.GetObjectIndexesWithPks(lcs, findFunction, null); // Assert. var values = result.Values.GetEnumerator(); var keys = result.Keys.GetEnumerator(); for (int i = 0; i < objectsCount; i++) { Assert.Equal(objectsCount, result.Count); values.MoveNext(); keys.MoveNext(); string key = isMssql ? ((Guid)keysMssqlList[i]).ToString("B") : keysPostgresList[i].ToString("B"); Assert.Equal(key, values.Current); Assert.Equal(i + 1, keys.Current); } } }
/// <summary> /// Selects messages from the database that can be sent. /// </summary> /// <param name="state">Not used.</param> private void ScanMessages(object state) { try { if (_sendingTasksCount >= MaxTasks) { return; } IEnumerable <Subscription> subscriptions = _subscriptionsManager.GetCallbackSubscriptions(); if (!subscriptions.Any()) { return; } foreach (var clientSubscriptions in subscriptions.GroupBy(s => s.Client)) { int currentConnections = 0; int connectionsLimit = clientSubscriptions.Key.ConnectionsLimit ?? DefaultConnectionsLimit; Guid clientId = (KeyGuid)clientSubscriptions.Key.__PrimaryKey; if (!_clientConnections.TryGetValue(clientId, out currentConnections)) { _clientConnections.Add(clientId, 0); } if (currentConnections >= connectionsLimit) { continue; } SQLWhereLanguageDef langDef = SQLWhereLanguageDef.LanguageDef; LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Message), Message.Views.SendingByCallbackView); // All messages for this client by all its active subscriptions Function clientLimitFunction = langDef.GetFunction(langDef.funcOR, clientSubscriptions.Select(s => langDef.GetFunction( langDef.funcAND, langDef.GetFunction(langDef.funcEQ, new VariableDef(langDef.GuidType, Information.ExtractPropertyPath <Message>(m => m.Recipient)), s.Client.__PrimaryKey), langDef.GetFunction(langDef.funcEQ, new VariableDef(langDef.GuidType, Information.ExtractPropertyPath <Message>(m => m.MessageType)), s.MessageType.__PrimaryKey))).ToArray()); // Only unsent messages whose sending time has already arrived lcs.LimitFunction = langDef.GetFunction( langDef.funcAND, clientLimitFunction, langDef.GetFunction(langDef.funcEQ, new VariableDef(langDef.BoolType, Information.ExtractPropertyPath <Message>(m => m.IsSending)), false), langDef.GetFunction(langDef.funcLEQ, new VariableDef(langDef.DateTimeType, Information.ExtractPropertyPath <Message>(m => m.SendingTime)), DateTime.Now)); // Get no more than we can send lcs.ReturnTop = connectionsLimit - currentConnections; lcs.ColumnsSort = new[] { new ColumnsSortDef(Information.ExtractPropertyPath <Message>(m => m.Priority), SortOrder.Asc), new ColumnsSortDef(Information.ExtractPropertyPath <Message>(m => m.SendingTime), SortOrder.Asc), }; Stopwatch stopwatch = Stopwatch.StartNew(); DataObject[] messages = _dataService.LoadObjects(lcs); stopwatch.Stop(); _statisticsService.NotifyAvgTimeSql(null, (int)stopwatch.ElapsedMilliseconds, $"PrioritySendingManager.ScanMessages(): Load {lcs.ReturnTop} messages for client with name: {clientSubscriptions.Key.Name}."); int index = 0; while (index < messages.Length && TryEnqueue((Message)messages[index])) { index++; } } } catch (Exception exception) { _logger.LogError("An error occurred while scanning messages.", exception.ToString()); } }
/// <summary> /// Вызывается самым последним в Page_Load /// </summary> protected override void Postload() { if (PK == null) { return; } Function limitByRole = _languageDef.GetFunction(_languageDef.funcEQ, new VariableDef(_languageDef.GuidType, "Role"), this.PK); LoadingCustomizationStruct lcsOwnUsers = new LoadingCustomizationStruct(null); lcsOwnUsers.LoadingTypes = new[] { typeof(LinkRole) }; lcsOwnUsers.LimitFunction = limitByRole; View usersView = Information.GetView("Sec_LinkRoleL", typeof(LinkRole)); lcsOwnUsers.View = usersView; List <LinkRole> roleOwnUsers = BridgeToDS.GetDataService().LoadObjects(lcsOwnUsers).Cast <LinkRole>().ToList(); if (IsPostBack) { #region Save Roles List <LinkRole> linkUsers = new List <LinkRole>(); foreach (Agent user in _allUsers) { string userKey = "User" + user.__PrimaryKey; if (Request.Form.AllKeys.Any(fk => fk.Contains(userKey))) { LinkRole linkUser = new LinkRole(); linkUser.Role = DataObject; linkUser.Agent = user; linkUsers.Add(linkUser); } } List <LinkRole> deletedUsers = new List <LinkRole>(); foreach (LinkRole ownUser in roleOwnUsers) { string ownId = ownUser.Agent.__PrimaryKey.ToString(); LinkRole singleOrDefault = linkUsers.SingleOrDefault(r => r.Agent.__PrimaryKey.ToString().Equals(ownId)); if (singleOrDefault != null) { linkUsers.Remove(singleOrDefault); } else { ownUser.SetStatus(ObjectStatus.Deleted); deletedUsers.Add(ownUser); } } roleOwnUsers = roleOwnUsers.Except(deletedUsers).Union(linkUsers).ToList(); linkUsers = linkUsers.Union(deletedUsers).ToList(); if (linkUsers.Count > 0) { DataObject[] dataObjects = linkUsers.Cast <DataObject>().ToArray(); BridgeToDS.GetDataService().UpdateObjects(ref dataObjects); } #endregion } GenerateUsersTable(roleOwnUsers); Function limitByAgent = _languageDef.GetFunction(_languageDef.funcEQ, new VariableDef(_languageDef.GuidType, "Agent"), this.PK); LoadingCustomizationStruct lcsParentRoles = new LoadingCustomizationStruct(null); lcsParentRoles.LoadingTypes = new[] { typeof(LinkRole) }; lcsParentRoles.LimitFunction = limitByAgent; View rolesView = Information.GetView("Sec_LinkRoleL", typeof(LinkRole)); lcsParentRoles.View = rolesView; List <LinkRole> parentRoles = BridgeToDS.GetDataService().LoadObjects(lcsParentRoles).Cast <LinkRole>().ToList(); Agent single = _allRoles.Single(r => r.__PrimaryKey.ToString().Equals(this.PK)); _allRoles.Remove(single); if (IsPostBack) { #region Save Roles List <LinkRole> linkRoles = new List <LinkRole>(); foreach (Agent role in _allRoles) { string roleKey = "Role" + role.__PrimaryKey; if (Request.Form.AllKeys.Any(fk => fk.Contains(roleKey))) { LinkRole linkRole = new LinkRole(); linkRole.Agent = DataObject; linkRole.Role = role; linkRoles.Add(linkRole); } } List <LinkRole> deletedRoles = new List <LinkRole>(); foreach (LinkRole ownRole in parentRoles) { string ownId = ownRole.Role.__PrimaryKey.ToString(); LinkRole singleOrDefault = linkRoles.SingleOrDefault(r => r.Role.__PrimaryKey.ToString().Equals(ownId)); if (singleOrDefault != null) { linkRoles.Remove(singleOrDefault); } else { ownRole.SetStatus(ObjectStatus.Deleted); deletedRoles.Add(ownRole); } } parentRoles = parentRoles.Except(deletedRoles).Union(linkRoles).ToList(); linkRoles = linkRoles.Union(deletedRoles).ToList(); if (linkRoles.Count > 0) { DataObject[] dataObjects = linkRoles.Cast <DataObject>().ToArray(); BridgeToDS.GetDataService().UpdateObjects(ref dataObjects); } #endregion } GenerateRolesTable(parentRoles); // Function limitByAgent = _languageDef.GetFunction(_languageDef.funcEQ, new VariableDef(_languageDef.GuidType, "Agent"), this.PK); LoadingCustomizationStruct lcsOwnClasses = new LoadingCustomizationStruct(null); lcsOwnClasses.LoadingTypes = new[] { typeof(Permition) }; lcsOwnClasses.LimitFunction = limitByAgent; View classesView = Information.GetView("Sec_PermitionE", typeof(Permition)); lcsOwnClasses.View = classesView; List <Permition> userOwnClasses = BridgeToDS.GetDataService().LoadObjects(lcsOwnClasses).Cast <Permition>().ToList(); List <Permissions> permissions = new List <Permissions>(); foreach (Subject @class in _allClasses) { Permissions u2c = new Permissions(); u2c.ObjectId = @class.__PrimaryKey.ToString(); u2c.ObjectName = @class.Name; Permition firstOrDefault = userOwnClasses.FirstOrDefault(c => c.Subject.__PrimaryKey.ToString().Equals(u2c.ObjectId)); if (firstOrDefault != null && firstOrDefault.Access != null) { for (int i = 0; i < firstOrDefault.Access.Count; i++) { Access access = firstOrDefault.Access[i]; switch (access.TypeAccess) { case tTypeAccess.Delete: u2c.Delete = true; break; case tTypeAccess.Execute: u2c.Execute = true; break; case tTypeAccess.Full: u2c.Full = true; break; case tTypeAccess.Insert: u2c.Insert = true; break; case tTypeAccess.Read: u2c.Read = true; break; case tTypeAccess.Update: u2c.Update = true; break; } } } permissions.Add(u2c); } if (IsPostBack) { #region Save Class Permissions List <Permissions> list = new List <Permissions>(); foreach (Subject @class in _allClasses) { string fullKey = "Full" + @class.__PrimaryKey; string readKey = "Read" + @class.__PrimaryKey; string insertKey = "Insert" + @class.__PrimaryKey; string updateKey = "Update" + @class.__PrimaryKey; string deleteKey = "Delete" + @class.__PrimaryKey; string executeKey = "Execute" + @class.__PrimaryKey; bool isClassPermissionsSet = false; Permissions permission = new Permissions(); permission.ObjectId = @class.__PrimaryKey.ToString(); permission.ObjectName = @class.Name; if (Request.Form.AllKeys.Any(fk => fk.Contains(fullKey))) { permission.Full = true; isClassPermissionsSet = true; } if (Request.Form.AllKeys.Any(fk => fk.Contains(readKey))) { permission.Read = true; isClassPermissionsSet = true; } if (Request.Form.AllKeys.Any(fk => fk.Contains(insertKey))) { permission.Insert = true; isClassPermissionsSet = true; } if (Request.Form.AllKeys.Any(fk => fk.Contains(updateKey))) { permission.Update = true; isClassPermissionsSet = true; } if (Request.Form.AllKeys.Any(fk => fk.Contains(deleteKey))) { permission.Delete = true; isClassPermissionsSet = true; } if (Request.Form.AllKeys.Any(fk => fk.Contains(executeKey))) { permission.Execute = true; isClassPermissionsSet = true; } if (isClassPermissionsSet) { list.Add(permission); } } List <Permissions> updatedPermissions = new List <Permissions>(); List <Permissions> deletedPermissions = new List <Permissions>(); foreach (Permissions p in permissions) { Permissions singleOrDefault = list.SingleOrDefault(c => c.ObjectId.Equals(p.ObjectId)); if (singleOrDefault != null) { updatedPermissions.Add(singleOrDefault); list.Remove(singleOrDefault); } else { deletedPermissions.Add(p); } } List <Permissions> addedPermissions = list.Union(updatedPermissions).ToList(); List <DataObject> deletedObjects = new List <DataObject>(); List <DataObject> addedObjects = new List <DataObject>(); foreach (Permition p in userOwnClasses) { string classId = p.Subject.__PrimaryKey.ToString(); if (updatedPermissions.Any(x => x.ObjectId.Equals(classId)) || deletedPermissions.Any(x => x.ObjectId.Equals(classId))) { p.SetStatus(ObjectStatus.Deleted); deletedObjects.Add(p); } } foreach (Permissions p in addedPermissions) { Permition permission = new Permition(); permission.Agent = DataObject; permission.Subject = new Subject(); permission.Subject.SetExistObjectPrimaryKey(p.ObjectId); permission.Access = new DetailArrayOfAccess(permission); if (p.Delete) { permission.Access.Add(new Access() { TypeAccess = tTypeAccess.Delete }); } if (p.Execute) { permission.Access.Add(new Access() { TypeAccess = tTypeAccess.Execute }); } if (p.Full) { permission.Access.Add(new Access() { TypeAccess = tTypeAccess.Full }); } if (p.Insert) { permission.Access.Add(new Access() { TypeAccess = tTypeAccess.Insert }); } if (p.Read) { permission.Access.Add(new Access() { TypeAccess = tTypeAccess.Read }); } if (p.Update) { permission.Access.Add(new Access() { TypeAccess = tTypeAccess.Update }); } addedObjects.Add(permission); } DataObject[] dataObjects = deletedObjects.Union(addedObjects).ToArray(); if (dataObjects.Length > 0) { BridgeToDS.GetDataService().UpdateObjects(ref dataObjects); } #endregion } GenerateClassesTable(permissions); }
// *** Start programmer edit section *** (ЗаказBS CustomMembers) // *** End programmer edit section *** (ЗаказBS CustomMembers) // *** Start programmer edit section *** (OnUpdateЗаказ CustomAttributes) // *** End programmer edit section *** (OnUpdateЗаказ CustomAttributes) public virtual ICSSoft.STORMNET.DataObject[] OnUpdateЗаказ(IIS.АСУ_Кондитерская.Заказ UpdatedObject) { // *** Start programmer edit section *** (OnUpdateЗаказ) if (UpdatedObject.IsAlteredProperty("Состояние") && UpdatedObject.Состояние == СостояниеЗаказа.Выполненный) { // 1) проверить, достаточно ли на складе продуктов для отправки в торговую точку // 2) в случае успеха создать объекты ПродуктНаПродажу в торговой точке // и осуществить декрементацию продуктов на складе // 3) заблокировать изменение статуса // ------------------------- ПРОВЕРКА ----------------------------- IDataService ds = DataService; var lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(СтрокаЗаказа), "СтрокаЗаказаE"); SQLWhereLanguageDef ld = SQLWhereLanguageDef.LanguageDef; lcs.LimitFunction = ld.GetFunction(ld.funcEQ, new VariableDef(ld.GuidType, Information.ExtractPropertyPath <СтрокаЗаказа>(x => x.Заказ)), UpdatedObject.__PrimaryKey); var order_points = ds.LoadObjects(lcs); foreach (var point in order_points) { var product_key = ((СтрокаЗаказа)point).Продукт.__PrimaryKey; // Загружаем требуемые продукты, которые хранятся на складе в цехе var lcs2 = LoadingCustomizationStruct.GetSimpleStruct(typeof(ГотовыйПродукт), "ГотовыйПродуктE"); lcs2.LimitFunction = ld.GetFunction(ld.funcEQ, new VariableDef(ld.GuidType, Information.ExtractPropertyPath <ГотовыйПродукт>(x => x.Продукт)), product_key); var complete_products = ds.LoadObjects(lcs2); // Посчитаем, сколько готовых продуктов (с разной датой изготовления) содержится на складе int total_count = 0; foreach (var comp_prod in complete_products) { total_count += ((ГотовыйПродукт)comp_prod).НаСкладе; } // Если продукции меньше, чем требуется в заказе, то кидаем исключение if (total_count < ((СтрокаЗаказа)point).Количество) { throw new Exception(((СтрокаЗаказа)point).Продукт.Наименование.ToString() + ". На складе - " + total_count.ToString() + ". Требуется - " + ((СтрокаЗаказа)point).Количество.ToString() + ". Перевод заказа в статус \"Выполненный\" невозможно."); } } // ------------------------- ПРОВЕРКА ЗАВЕРШЕНА ----------------------------- // --------------------- ОТПРАВКА ПРОДУКТОВ В ТОРГОВУЮ ТОЧКУ ----------------- List <DataObject> forupdate = new List <DataObject>(); foreach (var point in order_points) { var product_key = ((СтрокаЗаказа)point).Продукт.__PrimaryKey; // Загружаем требуемые продукты, которые хранятся на складе в цехе var lcs2 = LoadingCustomizationStruct.GetSimpleStruct(typeof(ГотовыйПродукт), "ГотовыйПродуктE"); lcs2.LimitFunction = ld.GetFunction(ld.funcAND, ld.GetFunction(ld.funcEQ, new VariableDef(ld.GuidType, Information.ExtractPropertyPath <ГотовыйПродукт>(x => x.Продукт)), product_key), ld.GetFunction(ld.funcNEQ, new VariableDef(ld.NumericType, Information.ExtractPropertyPath <ГотовыйПродукт>(x => x.НаСкладе)), 0)); var complete_products = ds.LoadObjects(lcs2); // Отсортируем все продукты по дате изготовления и будем отправлять по мере "старения" продуктов Array.Sort(complete_products); int req_count = ((СтрокаЗаказа)point).Количество; // требуемое в заказе количество продукта int i = 0; // счетчик продукта в списке while (req_count != 0) { int sklad_count = ((ГотовыйПродукт)complete_products[i]).НаСкладе; if (req_count <= sklad_count) { // Создаем детейл для торговой точки var sale_product = new ПродуктНаПродажу() { ДатаИзг = ((ГотовыйПродукт)complete_products[i]).ДатаИзг, Поступило = req_count, Осталось = req_count, ТорговаяТочка = UpdatedObject.ТорговаяТочка, Продукт = ((СтрокаЗаказа)point).Продукт }; sale_product.SetStatus(ObjectStatus.Created); // Обновляем инф-цию на складе ((ГотовыйПродукт)complete_products[i]).НаСкладе -= req_count; complete_products[i].SetStatus(ObjectStatus.Altered); req_count = 0; forupdate.Add(sale_product); forupdate.Add(((ГотовыйПродукт)complete_products[i])); } else // (req_count > sklad_count) { // Создаем детейл для торговой точки var sale_product = new ПродуктНаПродажу() { ДатаИзг = ((ГотовыйПродукт)complete_products[i]).ДатаИзг, Поступило = sklad_count, Осталось = sklad_count, ТорговаяТочка = UpdatedObject.ТорговаяТочка, Продукт = ((СтрокаЗаказа)point).Продукт }; sale_product.SetStatus(ObjectStatus.Created); // Обновляем инф-цию на складе ((ГотовыйПродукт)complete_products[i]).НаСкладе = 0; complete_products[i].SetStatus(ObjectStatus.Altered); req_count -= sklad_count; forupdate.Add(sale_product); forupdate.Add(((ГотовыйПродукт)complete_products[i])); } // Переходим к следующему продукту (более свежему) i++; } } // --------------------- ПРОДУКТЫ ОТПРАВЛЕНЫ В ТОРГОВУЮ ТОЧКУ ----------------- UpdatedObject.ДатаПоступления = DateTime.Now; return(forupdate.ToArray()); } return(new ICSSoft.STORMNET.DataObject[0]); // *** End programmer edit section *** (OnUpdateЗаказ) }
// *** Start programmer edit section *** (ПроверкаНаличияТоваров CustomMembers) // *** End programmer edit section *** (ПроверкаНаличияТоваров CustomMembers) // *** Start programmer edit section *** (OnUpdateЗаказ CustomAttributes) // *** End programmer edit section *** (OnUpdateЗаказ CustomAttributes) public virtual ICSSoft.STORMNET.DataObject[] OnUpdateЗаказ(АСУ_Склад.Заказ UpdatedObject) { // *** Start programmer edit section *** (OnUpdateЗаказ) // Определим массив, который будем возвращать для обновления. DataObject[] ret = new DataObject[0]; // Проверим на то, что пришедший объект - это именно то, что нам нужно (создан или изменён и статус установлен в Оплачено). if ((UpdatedObject.GetStatus() == ICSSoft.STORMNET.ObjectStatus.Created || UpdatedObject.GetStatus() == ICSSoft.STORMNET.ObjectStatus.Altered) && Array.IndexOf(UpdatedObject.GetAlteredPropertyNames(), "Статус") >= 0 && UpdatedObject.Статус == Состояние_Заказа.Оплаченный) { // Построим ограничение и вычитаем все объекты ТоварНаСкладе, которые нам подходят. Заказ заказ = UpdatedObject; SQLWhereLanguageDef langdef = SQLWhereLanguageDef.LanguageDef; ICSSoft.STORMNET.FunctionalLanguage.Function lf = null; for (int i = 0; i < заказ.Строка_Заказа.Count; i++) { if (lf != null) { if (заказ.Строка_Заказа[i].Товар != null) { lf = langdef.GetFunction(langdef.funcOR, lf, langdef.GetFunction(langdef.funcEQ, new VariableDef(langdef.GuidType, "Товар"), заказ.Строка_Заказа[i].Товар.__PrimaryKey)); } } else { if (заказ.Строка_Заказа[i].Товар != null) { lf = langdef.GetFunction(langdef.funcEQ, new VariableDef(langdef.GuidType, "Товар"), заказ.Строка_Заказа[i].Товар.__PrimaryKey); } } } ICSSoft.STORMNET.Business.LoadingCustomizationStruct lcs = ICSSoft.STORMNET.Business.LoadingCustomizationStruct.GetSimpleStruct(typeof(Товар_на_Складе), "ТоварНаСкладеE"); lcs.LimitFunction = lf; ICSSoft.STORMNET.DataObject[] objs = ICSSoft.STORMNET.Business.DataServiceProvider.DataService.LoadObjects(lcs); // Разместим вычитанные объекты в отсортированном списке для удобного доступа в дальнейшем. System.Collections.SortedList sl = new System.Collections.SortedList(); //for (int i = 0; i < objs.Length; i++) //{ // if (sl.ContainsKey(((Товар_на_Складе)objs[i]).Товар.__PrimaryKey)) // { // ((System.Collections.ArrayList)sl[objs[i].__PrimaryKey]).Add(objs[i]); // } // else // { // System.Collections.ArrayList списокТоваров = new System.Collections.ArrayList(); // списокТоваров.Add(objs[i]); // sl.Add(((Товар_на_Складе)objs[i]).Товар.__PrimaryKey, списокТоваров); // } //} // Определим строчку для сообщения об ошибке. string errStr = string.Empty; ArrayList retObjs = new ArrayList(); // Проверим наличие товара на складах, если не хватает, то выдадим сообщение об ошибке, если хватает, то вычитаем количество. for (int i = 0; i < заказ.Строка_Заказа.Count; i++) { if (sl.ContainsKey(заказ.Строка_Заказа[i].Товар.__PrimaryKey)) { ArrayList arl = ((System.Collections.ArrayList)sl[заказ.Строка_Заказа[i].Товар.__PrimaryKey]); int количествоНаСкладах = 0; for (int j = 0; j < arl.Count; j++) { количествоНаСкладах += ((Товар_на_Складе)arl[j]).Количество; } if (количествоНаСкладах < заказ.Строка_Заказа[i].Количество) { errStr += " Не хватает товара \"" + заказ.Строка_Заказа[i].Товар.Название + "\" в наличии: " + количествоНаСкладах + ", требуется " + заказ.Строка_Заказа[i].Количество + Environment.NewLine; } else { int колич = заказ.Строка_Заказа[i].Количество; for (int j = 0; j < arl.Count; j++) { if (колич > 0 && ((Товар_на_Складе)arl[j]).Количество > колич) { ((Товар_на_Складе)arl[j]).Количество -= колич; колич = 0; retObjs.Add(arl[j]); } else { if (колич > 0) { колич -= ((Товар_на_Складе)arl[j]).Количество; ((Товар_на_Складе)arl[j]).Количество = 0; retObjs.Add(arl[j]); } } } } } else { errStr += "Товар \""+ заказ.Строка_Заказа[i].Товар.Название + "\" в наличии отсутствует." + Environment.NewLine; } } // В случае, если чего-то не хватило, сообщаем об этом пользователю. if (errStr != string.Empty) { throw new Exception(errStr); } // Если всё нормально, то возвращаем массив объектов, которые надо обновить. ret = new DataObject[retObjs.Count]; retObjs.CopyTo(ret, 0); } return(ret); // *** End programmer edit section *** (OnUpdateЗаказ) }