internal async Task <ListObjectPF> mPutPostListObjectPF( DbConnectionSklad db, string UO_Action, ListObjectPF listObjectPF, EntityState entityState, //EntityState.Added, Modified Models.Sklad.List.ListObjectPFTab[] listObjectPFTabCollection, Classes.Account.Login.Field field, //Дополнительные данные о сотруднике HttpRequestMessage request //Информация о хосте ) { //Алгоритм //1. Если писали с ЛокалХоста, то не проверяем на 1 000 000 записей // Если писали НЕ ЛокалХоста, то проверяем (см ДокументМенеджент) //2. Сохраняем Шапку //3. Сохраняем Таблицу, если не пустая //1. Если меньше Миллиона записей и не Я редактирую, то это первая запись ПФ созданная пользователем, присваеваем её = 1 000 000 if (!await Task.Run(() => MoreMillion(db)) && request.RequestUri.DnsSafeHost != "localhost" && entityState == EntityState.Added) { //listObjectPF.ListObjectPFID = 1000000; db.Entry(listObjectPF).State = entityState; await db.SaveChangesAsync(); SQLiteParameter parDocPurchID1 = new SQLiteParameter("@ListObjectPFID1", System.Data.DbType.Int32) { Value = 1000000 }; SQLiteParameter parDocPurchID2 = new SQLiteParameter("@ListObjectPFID2", System.Data.DbType.Int32) { Value = listObjectPF.ListObjectPFID }; db.Database.ExecuteSqlCommand("UPDATE ListObjectPFs SET ListObjectPFID=@ListObjectPFID1 WHERE ListObjectPFID=@ListObjectPFID2;", parDocPurchID1, parDocPurchID2); listObjectPF.ListObjectPFID = 1000000; } else { //2. ListObjectPF db.Entry(listObjectPF).State = entityState; await db.SaveChangesAsync(); } //3. listObjectPFTabCollection //3.1. Удаляем записи в БД, если UPDATE if (entityState == EntityState.Modified) { SQLiteParameter parDocPurchID = new SQLiteParameter("@ListObjectPFID", System.Data.DbType.Int32) { Value = listObjectPF.ListObjectPFID }; db.Database.ExecuteSqlCommand("DELETE FROM ListObjectPFTabs WHERE ListObjectPFID=@ListObjectPFID;", parDocPurchID); } //3.2. Проставляем ID-шник "ListObjectPFID" для всех позиций спецификации for (int i = 0; i < listObjectPFTabCollection.Count(); i++) { listObjectPFTabCollection[i].ListObjectPFTabID = null; listObjectPFTabCollection[i].ListObjectPFID = Convert.ToInt32(listObjectPF.ListObjectPFID); db.Entry(listObjectPFTabCollection[i]).State = EntityState.Added; } await db.SaveChangesAsync(); return(listObjectPF); }
public async Task <IHttpActionResult> PostListObjectPF(ListObjectPF listObjectPF, HttpRequestMessage request) { try { #region Проверяем Логин и Пароль + Изменяем строку соединения + Права + Разные Функции //Получаем Куку System.Web.HttpCookie authCookie = System.Web.HttpContext.Current.Request.Cookies["CookieIPOL"]; // Проверяем Логин и Пароль Classes.Account.Login.Field field = await Task.Run(() => login.Return(authCookie, true)); if (!field.Access) { return(Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg10))); } //Изменяем строку соединения db = new DbConnectionSklad(connectionString.Return(field.DirCustomersID, null, true)); //Права (1 - Write, 2 - Read, 3 - No Access) int iRight = await Task.Run(() => accessRight.Access(connectionString.Return(field.DirCustomersID, null, true), field.DirEmployeeID, "RightDevelop")); if (iRight != 1) { return(Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg57(0)))); } //Разные Функции function.NumberDecimalSeparator(); //Получам настройки Models.Sklad.Sys.SysSetting sysSetting = await db.SysSettings.FindAsync(1); #endregion #region Параметры //save, save_close, held, held_cancel var paramList = request.GetQueryNameValuePairs(); string UO_Action = paramList.FirstOrDefault(kv => string.Compare(kv.Key, "UO_Action", true) == 0).Value; if (UO_Action == null) { return(Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg101))); } UO_Action = UO_Action.ToLower(); //Получаем колекцию "Спецификации" Models.Sklad.List.ListObjectPFTab[] listObjectPFTabCollection = null; if (!String.IsNullOrEmpty(listObjectPF.recordsListObjectPFTab)) { JavaScriptSerializer serializer = new JavaScriptSerializer(); listObjectPFTabCollection = serializer.Deserialize <Models.Sklad.List.ListObjectPFTab[]>(listObjectPF.recordsListObjectPFTab); } #endregion #region Проверки //Подстановки - некоторые поля надо заполнить, если они не заполены (Юридические реквизиты) listObjectPF.Substitute(); #endregion #region Сохранение //using (TransactionScope ts = new TransactionScope()) using (System.Data.Entity.DbContextTransaction ts = db.Database.BeginTransaction()) { db.Configuration.AutoDetectChangesEnabled = false; //Используем метод, что бы было всё в одном потоке listObjectPF = await Task.Run(() => mPutPostListObjectPF(db, UO_Action, listObjectPF, EntityState.Added, listObjectPFTabCollection, field, request)); //sysSetting ts.Commit(); //.Complete(); } #region 6. JourDisp *** *** *** *** *** *** *** *** *** * Models.Sklad.Sys.SysJourDisp sysJourDisp = new Models.Sklad.Sys.SysJourDisp(); sysJourDisp.DirDispOperationID = 3; //Добавление записи sysJourDisp.DirEmployeeID = field.DirEmployeeID; sysJourDisp.ListObjectID = ListObjectID; sysJourDisp.TableFieldID = listObjectPF.ListObjectPFID; sysJourDisp.Description = ""; try { sysJourDispsController.mPutPostSysJourDisps(db, sysJourDisp, EntityState.Added); } catch (Exception ex) { } #endregion dynamic collectionWrapper = new { ListObjectPFID = listObjectPF.ListObjectPFID }; return(Ok(returnServer.Return(true, collectionWrapper))); //return Ok(returnServer.Return(true, "")); #endregion } catch (Exception ex) { return(Ok(returnServer.Return(false, exceptionEntry.Return(ex)))); } }