public static string SaveKmhCard(transfer card, int saveType, Guid order_id) { DateTime CurDateTime = DateTime.Now; // saveType == 1 (сохранить как основную) // saveType == 2 (сохранить как приказную) // saveType == 3 (как приказную и как основную) using (ProductProvider provider = new ProductProvider()) { // {!} здесь может быть проблемное место, потому что надо оборачивать действия // в одну транзакцию // проходим два раза по коду // 1 - стандартная карточка // 2 - карточка по приказу for (int index = 1; index <= 2; index++) { if (saveType == 2 && index == 1) continue; if (saveType == 1 && index == 2) continue; // получаем все существующие стандарные карты для данного продукта var all_kmh = from kmh in provider.Specification_1s where Object.Equals(kmh.OrderArticleID, index == 1 ? null : new Guid?(order_id)) && kmh._Product_ID == card.prod_id select kmh; // переносим полученные данные в карту Specification_1 savedCard = new Specification_1(); savedCard.id = Guid.NewGuid(); savedCard.OrderArticleID = (index == 1 ? null : new Guid?(order_id)); LoadKmh(savedCard, card); // устанавливаем время действия карты savedCard.FinishDT = PlusInfinity; if (all_kmh.Count() == 0) { // если других карт нету, даты от -∞ до +∞ // savedCard.StartDT = MinusInfinity; savedCard.StartDT = CurDateTime; } else { // если другие карты есть, дата от CurDateTime+1 до +∞ savedCard.StartDT = CurDateTime; // выбираем актуальные карты и завершаем дату их действия List<Specification_1> actual_kmh = all_kmh.Where(c => c.StartDT <= CurDateTime && c.FinishDT > CurDateTime).ToList(); foreach (Specification_1 iter_kmh in actual_kmh) { iter_kmh.FinishDT = CurDateTime; } } savedCard.dtle = CurDateTime; try { savedCard.userID = (Guid)HttpContext.Current.Session["userID"]; } catch { } provider.Specification_1s.InsertOnSubmit(savedCard); } // Сохраняем изменения provider.SubmitChanges(); } PostResult result = new PostResult("ok", 0) { TimeStamp = CurDateTime.ToUniversalTime() }; return result.ToString(); }
public static string SaveAddMaterials(List<transfer_add> list, Guid prodid, int saveType, Guid order_id, Guid ste_id) { DateTime CurDateTime = DateTime.Now; // saveType == 1 (сохранить как основную) // saveType == 2 (сохранить как приказную) // saveType == 3 (как приказную и как основную) using (ProductProvider provider = new ProductProvider()) { // {!} здесь может быть проблемное место, потому что надо оборачивать действия // в одну транзакцию // проходим два раза по коду // 1 - стандартная карточка // 2 - карточка по приказу for (int index = 1; index <= 2; index++) { if (saveType == 2 && index == 1) continue; if (saveType == 1 && index == 2) continue; // получаем актуальные на текущий момент дополнительные материалы var all_kmh = from kmh in provider.Specification_2s where Object.Equals(kmh.OrderArticleID, index == 1 ? null : new Guid?(order_id)) && kmh._Product_ID == prodid && kmh._dictS_TEID == ste_id select kmh; // перебераем только актуальные карты // и завершаем их по текущей дате foreach (var kmh in all_kmh.Where(it => it.StartDT <= CurDateTime && it.FinishDT > CurDateTime)) { kmh.FinishDT = CurDateTime; } // если в списке нет доп. материалов, то вставляем // специальный материал с Guid = {00000000-0000-0000-0000-000000000000} if (list.Count == 0) { list.Add(new transfer_add() { material_id = Guid.Empty }); } // создаём новые карты материалов foreach (transfer_add new_kmh in list) { provider.Specification_2s.InsertOnSubmit(new Specification_2() { id = Guid.NewGuid(), _Product_ID = prodid, _Material_ID = new_kmh.material_id, // если данный материал уже применялся, то дата начинается с текущего момента // если же данный материал добавлен впервые то дата начаинается с -∞ // StartDT = all_kmh.Count(it => it._Material_ID == new_kmh.material_id) > 0 ? CurDateTime : MinusInfinity, StartDT = CurDateTime, FinishDT = PlusInfinity, no = new_kmh.no, _dictUMID = new_kmh.um_id, _dictSID = new_kmh.s_id, _dictS_TEID = ste_id, OrderArticleID = (index == 1 ? null : new Guid?(order_id)) }); } } // Сохраняем изменения provider.SubmitChanges(); } PostResult result = new PostResult("ok", 0) { TimeStamp = CurDateTime.ToUniversalTime() }; return result.ToString(); }