internal async Task <string> ReturnGenID(DbConnectionSklad db) //internal string ReturnGenID(DbConnectionSklad db) { Models.Sklad.Sys.SysGen sysGen = new Models.Sklad.Sys.SysGen(); sysGen.SysGenID = null; sysGen.SysGenTemp = true; db.Entry(sysGen).State = EntityState.Added; await db.SaveChangesAsync(); //db.SaveChangesAsync(); string SysGenID = sysGen.SysGenID.ToString(); return(SysGenID); }
public async Task<IHttpActionResult> PutDirWarehouse(HttpRequestMessage request) //HttpPostedFileBase upload { #region Проверяем Логин и Пароль + Изменяем строку соединения + Права + Разные Функции //Получаем Куку System.Web.HttpCookie authCookie = System.Web.HttpContext.Current.Request.Cookies["CookieIPOL"]; // Проверяем Логин и Пароль 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)); //dbRead = 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, "RightDocAccounts")); if (iRight == 3) return Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg57(0))); */ if(field.DirEmployeeID != 1) return Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg57(0))); //Разные Функции function.NumberDecimalSeparator(); //Получам настройки sysSetting = await db.SysSettings.FindAsync(1); //Получаем сотрудника: если к нему привязан Склад и/или Организация, то выбираем документы только по этим характеристикам Models.Sklad.Dir.DirEmployee dirEmployee = await db.DirEmployees.FindAsync(field.DirEmployeeID); #endregion #region Параметры //paramList -список параметров var paramList = request.GetQueryNameValuePairs(); //Параметры sheetName = paramList.FirstOrDefault(kv => string.Compare(kv.Key, "sheetName", true) == 0).Value; DirContractorIDOrg = Convert.ToInt32(paramList.FirstOrDefault(kv => string.Compare(kv.Key, "DirContractorIDOrg", true) == 0).Value); DirContractorID = Convert.ToInt32(paramList.FirstOrDefault(kv => string.Compare(kv.Key, "DirContractorID", true) == 0).Value); DirWarehouseID = Convert.ToInt32(paramList.FirstOrDefault(kv => string.Compare(kv.Key, "DirWarehouseID", true) == 0).Value); #endregion #region Сохранение OleDbConnection OleDbConn = null; try { //Алгоритм: //0. Проверка //1. Генерируем ID-шник "SysGens" //2. Получаем файл и сохраняем в папаке "Uploads" с именем: authCookie["CookieB"] + "_" + sysGen.SysGenID //3. Считываем Эксель файл // [Код товара], [Категория], [Товар] //Получаем категорию "APPLE/ iPhone 4S/ Распродажа/ Распродажа Swarovski /" //Разделитель "/" и убираем первый пробел //Проверяем каждую получиную категорию: есть ли связка (Sub, Name) //Если нет - вносим категорию, а потом товар: ([Код товара], [Товар]) //Если есть - вносим товар: ([Код товара], [Товар]) // *** Важно *** *** *** //1.Находим максимальный код группы //2.Создаём коды групп (Макс + 1) //3.Создаём коды товаров(из Эксель) #region 0. Проверка *** *** *** *** *** *** *** if (!Request.Content.IsMimeMultipartContent()) Ok(returnServer.Return(false, "{" + "'msgType':'1', 'msg':'" + Classes.Language.Sklad.Language.msg57(0) + "'}")); #endregion #region 1. Генерируем ID-шник "SysGens" *** *** *** *** *** *** *** Models.Sklad.Sys.SysGen sysGen = new Models.Sklad.Sys.SysGen(); sysGen.SysGenDisc = ""; sysGen.SysGenID = null; //if (!ModelState.IsValid) return Ok(returnServer.Return(false, Classes.Language.Sklad.Language.msg91)); //return BadRequest(ModelState); db.Entry(sysGen).State = EntityState.Added; await db.SaveChangesAsync(); #endregion #region 2. Получаем файл и сохраняем в папаке "Uploads" с именем: authCookie["CookieB"] + "_" + sysGen.SysGenID *** *** *** *** *** *** *** string filePatch = ""; var provider = new MultipartMemoryStreamProvider(); string root = System.Web.HttpContext.Current.Server.MapPath("~/UsersTemp/FileStock/"); await Request.Content.ReadAsMultipartAsync(provider); foreach (var file in provider.Contents) { if (file.Headers.ContentDisposition.FileName != null) { var filename = file.Headers.ContentDisposition.FileName.Trim('\"'); var ext = Path.GetExtension(filename); filePatch = root + field.DirCustomersID + "_" + sysGen.SysGenID + ext; byte[] fileArray = await file.ReadAsByteArrayAsync(); using (System.IO.FileStream fs = new System.IO.FileStream(filePatch, System.IO.FileMode.Create)) //root + filename { await fs.WriteAsync(fileArray, 0, fileArray.Length); } } } #endregion #region 3. Получаем максимальный код группы var queryMaxGroupID = await Task.Run(() => ( from x in db.DirNomens where x.DirNomenCategoryID == null select x ).MaxAsync(x => x.DirNomenID)); iMaxGroupID = queryMaxGroupID + 1; if (iMaxGroupID == null || iMaxGroupID == 0) iMaxGroupID = 1; #endregion #region 4. Считываем Эксель файл if (filePatch.Length > 0) { //1. Получаем категорию "APPLE/ iPhone 4S/ Распродажа/ Распродажа Swarovski /" //2. Разделитель "/" и убираем первый пробел //3. Проверяем каждую получиную категорию: есть ли связка (Sub, Name) //4. Если нет - вносим категорию, а потом товар: ([Код товара], [Товар]) //5. Если есть - вносим товар: ([Код товара], [Товар]) string sExcelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePatch + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1;\""; //8.0 using (OleDbConn = new OleDbConnection(sExcelConnectionString)) { OleDbConn.Open(); using (OleDbCommand OleDbCmd = new OleDbCommand("", OleDbConn)) { #region 1. Таблица "Товар" OleDbCmd.CommandText = "SELECT * FROM [" + sheetName + "$]"; OleDbCmd.Parameters.Clear(); using (OleDbDataReader dr = OleDbCmd.ExecuteReader()) { using (System.Data.Entity.DbContextTransaction ts = db.Database.BeginTransaction()) { while (dr.Read()) { if (dr["Код товара"].ToString().Length == 5) { //Read string DirNomenID = dr["Код товара"].ToString(); string GroupList = dr["Категория"].ToString(); string DirNomenName = dr["Товар"].ToString(); //Create Group in database await Task.Run(() => GroupCreate(Convert.ToInt32(DirNomenID), GroupList, DirNomenName)); } else { alCodeNot.Add(dr["Код товара"].ToString() + " - " + dr["Категория"].ToString() + " - " + dr["Товар"].ToString()); //... } } ts.Commit(); } } #endregion #region 2. Таблицы: Характеристики, Приходная накладная (Шапка + Спецификация), Остатки, Партии. (Новый алгоритм алгоритм: одна приходная накладная) //1. Надо получить все точки из Эксель (GROUP BY) //2. И делать SELECT по точкам, что бы сформировать приходные накладные по точкам OleDbCmd.CommandText = "SELECT [Точка] FROM [" + sheetName + "$] GROUP BY [Точка] ORDER BY [Точка]"; OleDbCmd.Parameters.Clear(); ArrayList alDirWarehouseID = new ArrayList(); using (OleDbDataReader dr = OleDbCmd.ExecuteReader()) { while (dr.Read()) { alDirWarehouseID.Add(dr["Точка"].ToString()); } } //Формируем "Приходные накладные" using (System.Data.Entity.DbContextTransaction ts = db.Database.BeginTransaction()) { for (int i = 0; i < alDirWarehouseID.Count; i++) { Models.Sklad.Doc.DocPurch docPurch = new Models.Sklad.Doc.DocPurch(); ArrayList alWrite = new ArrayList(); //OleDbCmd.CommandText = "SELECT * FROM [" + sheetName + "$] WHERE Дата=@pDate"; OleDbCmd.CommandText = "SELECT * FROM [" + sheetName + "$] WHERE Точка=@Точка"; // ORDER BY [Код товара], [Дата] DESC OleDbCmd.Parameters.Clear(); OleDbCmd.Parameters.AddWithValue("@Точка", alDirWarehouseID[i].ToString()); using (OleDbDataReader dr = OleDbCmd.ExecuteReader()) { while (dr.Read()) { if (dr["Код товара"].ToString().Length == 5) { Field1 field1 = new Field1(); field1.DirNomenID = Convert.ToInt32(dr["Код товара"].ToString()); field1.DocDate = dr["Дата"].ToString(); //field1.DirWarehouseID = ReturnDirWarehouseID(dr["Точка"].ToString()); field1.DirWarehouseID = await Task.Run(() => ReturnDirWarehouseID(dr["Точка"].ToString())); field1.Quantity = Convert.ToInt32(dr["Остаток"].ToString()); field1.PriceVAT = Convert.ToDouble(dr["Закуп цена за ед"].ToString()); field1.PriceCurrency = Convert.ToDouble(dr["Закуп цена за ед"].ToString()); field1.PriceRetailVAT = Convert.ToDouble(dr["Цена-1"].ToString()); field1.PriceRetailCurrency = Convert.ToDouble(dr["Цена-1"].ToString()); field1.PriceWholesaleVAT = Convert.ToDouble(dr["Цена-2"].ToString()); field1.PriceWholesaleCurrency = Convert.ToDouble(dr["Цена-2"].ToString()); field1.PriceIMVAT = Convert.ToDouble(dr["Цена-3"].ToString()); field1.PriceIMCurrency = Convert.ToDouble(dr["Цена-3"].ToString()); field1.DirCharColourID = ReturnDirCharColourID(dr["Поставщик"].ToString()); field1.DirCharTextureID = ReturnDirCharTextureID(dr["Примечание"].ToString()); alWrite.Add(field1); } else { //alCodeNot.Add(dr["Код товара"].ToString() + " - " + dr["Категория"].ToString() + " - " + dr["Товар"].ToString()); //... } } } //Create Purchase documents and Remnants of goods in stock docPurch = await Task.Run(() => DocsCreate(alWrite)); #region Чистим пустые партии товара, но только соотвутствующие Номеру документа, что бы НЕ удалить все пустые (0, 0) SQLiteParameter parDocID = new SQLiteParameter("@DocID", System.Data.DbType.Int32) { Value = docPurch.DocID }; await db.Database.ExecuteSqlCommandAsync("DELETE FROM RemParties WHERE DocID=@DocID and Remnant=0; ", parDocID); #endregion } ts.Commit(); } #endregion } OleDbConn.Close(); } } #endregion #region 5. Send dynamic collectionWrapper = new { Msg = "Файл загружен!" }; return Ok(returnServer.Return(true, collectionWrapper)); #endregion } catch (Exception ex) { try { OleDbConn.Close(); OleDbConn.Dispose(); } catch { } return Ok(returnServer.Return(false, exceptionEntry.Return(ex) + i777.ToString())); } #endregion }