// *** 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Заказ) }
// *** End programmer edit section *** (IIS.АСУ_Кондитерская.DetailArrayOfСтрокаЗаказа members) /// <summary> /// Construct detail array. /// </summary> /// <summary> /// Returns object with type СтрокаЗаказа by index. /// </summary> /// <summary> /// Adds object with type СтрокаЗаказа. /// </summary> public DetailArrayOfСтрокаЗаказа(IIS.АСУ_Кондитерская.Заказ fЗаказ) : base(typeof(СтрокаЗаказа), ((ICSSoft.STORMNET.DataObject)(fЗаказ))) { }