internal int NewElectronicOrder(BJElectronicExemplarInfo exemplar, ReaderInfo reader) { int OrderId; using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand command = new SqlCommand(); command.Connection = connection; command.Connection.Open(); command.CommandText = Queries.NEW_ELECTRONIC_ORDER; command.Parameters.Clear(); command.Parameters.Add("ReaderId", SqlDbType.Int).Value = reader.NumberReader; command.Parameters.Add("BookId", SqlDbType.NVarChar).Value = exemplar.BookId; command.Parameters.Add("Fund", SqlDbType.NVarChar).Value = exemplar.Fund; command.Parameters.Add("StatusName", SqlDbType.NVarChar).Value = CirculationStatuses.ElectronicIssue.Value; OrderId = Convert.ToInt32(command.ExecuteScalar()); string ViewMode = (exemplar.IsExistsLQ) ? "LQ" : "HQ"; string url = @"http://catalog.libfl.ru/Bookreader/Viewer?OrderId=" + OrderId + "&view_mode=" + ViewMode; command.Parameters.Add("OrderId", SqlDbType.Int).Value = OrderId; command.Parameters.Add("BookUrl", SqlDbType.NVarChar).Value = url; command.CommandText = "update Circulation..Orders set BookUrl = @BookUrl where ID = @OrderId"; command.ExecuteNonQuery(); } this.ChangeOrderStatus(OrderId, CirculationStatuses.ElectronicIssue.Value, 1, 2033, null); this.DeleteFromBasket(reader.NumberReader, new List <string>() { exemplar.BookId }); return(OrderId); }
private void RedirectToNewViewer(string IDMAIN, bool ForAllReader, string vkey, string IDReader) { string HostName = HttpContext.Current.Server.MachineName; string ElBookViewerServer = ""; if (HostName == "VGBIL-OPAC") { ElBookViewerServer = AppSettings.ExternalElectronicBookViewer; } else { ElBookViewerServer = AppSettings.IndoorElectronicBookViewer; } string redirect; if (ForAllReader) { redirect = ElBookViewerServer + "?pin=" + IDMAIN + "&idbase=1&idr=" + IDReader; } else { redirect = ElBookViewerServer + "?pin=" + IDMAIN + "&idbase=1&idr=" + IDReader + "&vkey=" + Server.UrlEncode(vkey); } if (HttpContext.Current.Server.MachineName == "VGBIL-OPAC") { //bool IsExistsLQ = false;//GetIsExistsLQ(IDMAIN); BJElectronicExemplarInfo electronicCopy = new BJElectronicExemplarInfo(Convert.ToInt32(IDMAIN), "BJVVV"); bool IsExistsLQ = electronicCopy.IsExistsLQ; if (IsExistsLQ) { Response.Redirect(@"http://catalog.libfl.ru/Bookreader/Viewer?bookID=BJVVV_" + IDMAIN + "&view_mode=LQ"); } else { Response.Redirect(@"http://catalog.libfl.ru/Bookreader/Viewer?bookID=BJVVV_" + IDMAIN + "&view_mode=HQ"); } } else { Response.Redirect(redirect); } }
internal void NewOrder(BookExemplarBase exemplar, ReaderInfo reader, int orderTypeId, int ReturnInDays, string AlligatBookId, int IssuingDepId) { switch (orderTypeId) { case OrderTypes.ElectronicVersion.Id: BJElectronicExemplarInfo ElectronicCopy = ((BJElectronicExemplarInfo)exemplar); dbWrapper.NewElectronicOrder(exemplar as BJElectronicExemplarInfo, reader); break; case OrderTypes.PaperVersion.Id: dbWrapper.NewOrder(exemplar as BJExemplarInfo, reader, ReturnInDays, CirculationStatuses.OrderIsFormed.Value, AlligatBookId, IssuingDepId); break; case OrderTypes.InLibrary.Id: dbWrapper.NewOrder(exemplar as BJExemplarInfo, reader, ReturnInDays, CirculationStatuses.OrderIsFormed.Value, AlligatBookId, IssuingDepId); break; case OrderTypes.SelfOrder.Id: dbWrapper.NewOrder(exemplar as BJExemplarInfo, reader, ReturnInDays, CirculationStatuses.SelfOrder.Value, AlligatBookId, IssuingDepId); break; } }
public void MakeOrder(MakeOrder request) { //BookBase book = new BookBase() BJBookInfo book = BJBookInfo.GetBookInfoByPIN(request.BookId); BookSimpleView bookSimpleView = ViewFactory.GetBookSimpleView(request.BookId); ReaderInfo reader = ReaderInfo.GetReader(request.ReaderId); List <int> acceptableOrderTypes = GetAcceptableOrderTypesForReader(request.BookId, request.ReaderId); if (!acceptableOrderTypes.Contains(request.OrderTypeId)) { throw new Exception("C013"); } if (request.OrderTypeId == OrderTypes.ElectronicVersion.Id) { if (this.ElectronicIssueCount(reader) >= 5) { throw new Exception("C001"); } if (this.IsElectronicIssueAlreadyIssued(reader, book)) { throw new Exception("C002"); } //в простой вид книги искусственно добавляется электронный экземпляр if (bookSimpleView.Exemplars.Count - this.GetBusyExemplarsCount(book) <= 0) { throw new Exception("C003"); } if (!this.IsTwentyFourHoursPastSinceReturn(reader, book)) { throw new Exception("C004"); } BJElectronicExemplarInfo exemplar = new BJElectronicExemplarInfo(book.ID, book.Fund); //BJExemplarInfo exemplar = BJExemplarInfo(book.ID, book.Fund); this.NewOrder(exemplar, reader, request.OrderTypeId, 30); } else { if (this.IsBookAlreadyIssuedToReader(book, reader)) { throw new Exception("C006"); } //ExemplarSimpleView exemplarSimpleView; bool IsOrderedSuccessfully = false; switch (request.OrderTypeId) { case OrderTypes.PaperVersion.Id: //приоритет для книг, которые в хранении, чтобы их принесли на кафедру для читателя foreach (BJExemplarInfo e in book.Exemplars) { if (e.Fields["899$a"].MNFIELD == 0) { continue; } if (e.ExemplarAccess.Access == 1000) { if (!this.IsExemplarIssued(e)) { this.NewOrder(e, reader, OrderTypes.PaperVersion.Id, 4); IsOrderedSuccessfully = true; break; } } } if (IsOrderedSuccessfully) { break; } //если свободных книг в хранении не осталось, то ищем те, которые в отрытом доступе. это будет самостоятельный заказ foreach (BJExemplarInfo e in book.Exemplars) { if (e.Fields["899$a"].MNFIELD == 0) { continue; } if ((e.ExemplarAccess.Access == 1006)) { if (!this.IsExemplarIssued(e)) { this.NewOrder(e, reader, OrderTypes.SelfOrder.Id, 4); IsOrderedSuccessfully = true; break; } } } if (IsOrderedSuccessfully) { break; } else { throw new Exception("C009"); } case OrderTypes.InLibrary.Id: //тут опять приоритет у тех, которые надо заказать из книгохранения перед самостоятельным заказом foreach (BJExemplarInfo e in book.Exemplars) { if (e.Fields["899$a"].MNFIELD == 0) { continue; } if ((e.ExemplarAccess.Access == 1005) || (e.ExemplarAccess.Access == 1012)) { if (!this.IsExemplarIssued(e)) { this.NewOrder(e, reader, OrderTypes.InLibrary.Id, 4); IsOrderedSuccessfully = true; break; } } } if (IsOrderedSuccessfully) { break; } //если свободных книг в хранении не осталось, то ищем те, которые в отрытом доступе. это будет самостоятельный заказ foreach (BJExemplarInfo e in book.Exemplars) { if (e.Fields["899$a"].MNFIELD == 0) { continue; } if ((e.ExemplarAccess.Access == 1007) || (e.ExemplarAccess.Access == 1014)) { if (!this.IsExemplarIssued(e)) { this.NewOrder(e, reader, OrderTypes.SelfOrder.Id, 4); IsOrderedSuccessfully = true; break; } } } if (IsOrderedSuccessfully) { break; } else { throw new Exception("C010"); } //это никогда не придёт case OrderTypes.NoActionProvided.Id: throw new Exception("C008"); case OrderTypes.ClarifyAccess.Id: throw new Exception("C008"); default: throw new Exception("C008"); } } }
private void AddExemplarFields(int idmain, VufindDoc result, string fund) { DataTable table = BJLoader.GetIdDataOfAllExemplars(idmain); if (table.Rows.Count == 0) { if (!BJLoader.IsElectronicCopyExists(idmain)) { return;//все списано и нет электронных копий. } } int IDMAIN = idmain; StringBuilder sb = new StringBuilder(); StringWriter sw = new StringWriter(sb); JsonWriter writer = new JsonTextWriter(sw); writer.WriteStartObject(); DataTable exemplar; int cnt = 1; string CarrierCode = ""; List <DateTime> ExemplarsCreatedDateList = new List <DateTime>(); foreach (DataRow iddata in table.Rows) { exemplar = BJLoader.GetExemplar((int)iddata["IDDATA"]); BJExemplarInfo bjExemplar = BJExemplarInfo.GetExemplarByIdData((int)iddata["IDDATA"], this.Fund); if (bjExemplar.ExemplarAccess.Access == 1020)//экстремистская литература. не выгружаем такое. { continue; } writer.WritePropertyName(cnt++.ToString()); writer.WriteStartObject(); //ExemplarInfo bjExemplar = new ExemplarInfo((int)iddata["IDDATA"]); BJExemplarInfo Convolute = null; #region FieldAnalyse foreach (DataRow r in exemplar.Rows) { string code = r["MNFIELD"].ToString() + r["MSFIELD"].ToString(); switch (code) { case "899$a": string plain = r["PLAIN"].ToString(); string check = r["NAME"].ToString(); string UL = KeyValueMapping.UnifiedLocation.GetValueOrDefault(r["NAME"].ToString(), "отсутствует в словаре"); int LocationCode = KeyValueMapping.UnifiedLocationCode.GetValueOrDefault(UL, 2999); writer.WritePropertyName("exemplar_location"); writer.WriteValue(LocationCode); result.Location.Add(LocationCode.ToString()); break; case "482$a": writer.WritePropertyName("exemplar_interlaced_to"); writer.WriteValue(r["PLAIN"].ToString()); writer.WritePropertyName("exemplar_convolute"); Convolute = BJExemplarInfo.GetExemplarByInventoryNumber(r["PLAIN"].ToString(), this.Fund); if (Convolute == null) { writer.WriteValue("Ошибка заполнения библиографического описания конволюта"); errors.Add(this.Fund + "_" + idmain); } else { writer.WriteValue(this.Fund + "_" + Convolute.IDMAIN); } break; case "899$b": //тут надо оставить только коллекции string fnd = r["PLAIN"].ToString(); writer.WritePropertyName("exemplar_collection"); writer.WriteValue(r["PLAIN"].ToString()); break; case "899$c": writer.WritePropertyName("exemplar_rack_location"); writer.WriteValue(r["PLAIN"].ToString()); break; case "899$d": writer.WritePropertyName("exemplar_direction_temporary_storage"); writer.WriteValue(r["PLAIN"].ToString()); break; case "899$j": result.PlacingCipher.Add(r["PLAIN"].ToString()); writer.WritePropertyName("exemplar_placing_cipher"); writer.WriteValue(r["PLAIN"].ToString()); break; case "899$p": writer.WritePropertyName("exemplar_inventory_number"); writer.WriteValue(r["PLAIN"].ToString()); ExemplarsCreatedDateList.Add((DateTime)r["Created"]); break; case "899$w": writer.WritePropertyName("exemplar_barcode"); writer.WriteValue(r["PLAIN"].ToString()); ExemplarsCreatedDateList.Add((DateTime)r["Created"]); break; case "899$x": writer.WritePropertyName("exemplar_inv_note"); writer.WriteValue(r["PLAIN"].ToString()); break; case "921$a": writer.WritePropertyName("exemplar_carrier"); CarrierCode = KeyValueMapping.CarrierNameToCode.GetValueOrDefault(r["PLAIN"].ToString(), 3001).ToString(); writer.WriteValue(CarrierCode); break; case "921$c": writer.WritePropertyName("exemplar_class_edition"); writer.WriteValue(r["PLAIN"].ToString()); break; case "921$d": break; //case "922$b": //Exemplar += "Трофей\\Принадлежность к:" + r["PLAIN"].ToString() + "#"; //writer.WritePropertyName("exemplar_trophy"); // writer.WriteValue(r["PLAIN"].ToString()); // break; case "3300$a": writer.WritePropertyName("exemplar_binding_kind"); writer.WriteValue(r["PLAIN"].ToString()); break; case "3300$b": writer.WritePropertyName("exemplar_binding_age"); writer.WriteValue(r["PLAIN"].ToString()); break; case "3300$c": writer.WritePropertyName("exemplar_binding_type"); writer.WriteValue(r["PLAIN"].ToString()); break; case "3300$d": writer.WritePropertyName("exemplar_cover_material"); writer.WriteValue(r["PLAIN"].ToString()); break; case "3300$e": writer.WritePropertyName("exemplar_material_on_cover"); writer.WriteValue(r["PLAIN"].ToString()); break; case "3300$f": writer.WritePropertyName("exemplar_spine_material"); writer.WriteValue(r["PLAIN"].ToString()); break; case "3300$g": writer.WritePropertyName("exemplar_bandages"); writer.WriteValue(r["PLAIN"].ToString()); break; case "3300$h": writer.WritePropertyName("exemplar_stamping_on_cover"); writer.WriteValue(r["PLAIN"].ToString()); break; case "3300$i": writer.WritePropertyName("exemplar_embossing_on_spine"); writer.WriteValue(r["PLAIN"].ToString()); break; case "3300$j": writer.WritePropertyName("exemplar_fittings"); writer.WriteValue(r["PLAIN"].ToString()); break; case "3300$k": writer.WritePropertyName("exemplar_bugs"); writer.WriteValue(r["PLAIN"].ToString()); break; case "3300$l": writer.WritePropertyName("exemplar_forth"); writer.WriteValue(r["PLAIN"].ToString()); break; case "3300$m": writer.WritePropertyName("exemplar_cutoff"); writer.WriteValue(r["PLAIN"].ToString()); break; case "3300$n": writer.WritePropertyName("exemplar_condition"); writer.WriteValue(r["PLAIN"].ToString()); break; case "3300$o": writer.WritePropertyName("exemplar_case"); writer.WriteValue(r["PLAIN"].ToString()); break; case "3300$p": writer.WritePropertyName("exemplar_embossing_on_edge"); writer.WriteValue(r["PLAIN"].ToString()); break; case "3300$r": writer.WritePropertyName("exemplar_binding_note"); writer.WriteValue(r["PLAIN"].ToString()); break; } } #endregion //Exemplar += "exemplar_id:" + ds.Tables["t"].Rows[0]["IDDATA"].ToString() + "#"; writer.WritePropertyName("exemplar_id"); writer.WriteValue(iddata["IDDATA"].ToString()); result.MethodOfAccess.Add(bjExemplar.ExemplarAccess.MethodOfAccess.ToString()); writer.WritePropertyName("exemplar_access"); writer.WriteValue(bjExemplar.ExemplarAccess.Access); writer.WritePropertyName("exemplar_access_group"); writer.WriteValue(KeyValueMapping.AccessCodeToGroup[bjExemplar.ExemplarAccess.Access]); result.Exemplars.Add(bjExemplar); writer.WriteEndObject(); } //смотрим есть ли гиперссылка и запись в таблице электронных копий table = BJLoader.GetHyperLink(IDMAIN); //здесь надо сделать так, чтобы просто строка возвращалась DataTable hyperLinkTable = BJLoader.GetBookScanInfo(IDMAIN); //здесь надо сделать так, чтобы возвращалась структура сканИнфо if (table.Rows.Count == 1 && hyperLinkTable.Rows.Count == 1) //если есть - вставляем отдельным экземпляром. после электронной инвентаризации этот кусок можно будет убрать { //ExemplarInfo bjExemplar = new ExemplarInfo(-1); writer.WritePropertyName(cnt++.ToString()); writer.WriteStartObject(); writer.WritePropertyName("exemplar_electronic_copy"); writer.WriteValue("да"); writer.WritePropertyName("exemplar_hyperlink"); writer.WriteValue(table.Rows[0]["PLAIN"].ToString()); writer.WritePropertyName("exemplar_hyperlink_newviewer"); writer.WriteValue("/Bookreader/Viewer?bookID=" + result.id + "&view_mode=HQ"); result.HyperLinkNewViewer.Add("/Bookreader/Viewer?bookID=" + result.id + "&view_mode=HQ"); BJElectronicExemplarAvailabilityCodes ElectronincAccessLevel = BJLoader.GetElectronicExemplarAccessLevel(IDMAIN, 1);//IDProject = 1 это значит для библиотеки. 2 - для НЭБ writer.WritePropertyName("exemplar_copyright"); writer.WriteValue((ElectronincAccessLevel == BJElectronicExemplarAvailabilityCodes.vloginview) ? "есть" : "нет"); writer.WritePropertyName("exemplar_old_original"); writer.WriteValue(((hyperLinkTable.Rows[0]["OldBook"].ToString() == "1") ? "да" : "нет")); writer.WritePropertyName("exemplar_PDF_exists"); writer.WriteValue(((hyperLinkTable.Rows[0]["PDF"].ToString() == "1") ? "да" : "нет")); writer.WritePropertyName("exemplar_access"); writer.WriteValue( (ElectronincAccessLevel == BJElectronicExemplarAvailabilityCodes.vloginview) ? "1002" : "1001"); //"Для прочтения онлайн необходимо положить в корзину и заказать через личный кабинет"); //"Для прочтения онлайн необходимо перейти по ссылке" writer.WritePropertyName("exemplar_access_group"); writer.WriteValue((ElectronincAccessLevel == BJElectronicExemplarAvailabilityCodes.vloginview) ? KeyValueMapping.AccessCodeToGroup[1002] : KeyValueMapping.AccessCodeToGroup[1001]); writer.WritePropertyName("exemplar_carrier"); writer.WriteValue("3011"); result.format.Add("3011"); writer.WritePropertyName("exemplar_id"); writer.WriteValue("ebook");//для всех у кого есть электронная копия. АПИ когда это значение встретит, сразу вернёт "доступно" writer.WritePropertyName("exemplar_location"); writer.WriteValue("2030"); writer.WriteEndObject(); result.MethodOfAccess.Add("4002"); BJElectronicExemplarInfo ElExemplar = new BJElectronicExemplarInfo(idmain, fund);//фейковый электронный экземпляр. если его не добавить и если бумажных экземпляров нет, то будет 0 экземпляров и документ не попадёт в индекс, хотя етсь электронный экземпляр result.Exemplars.Add(ElExemplar); //определить структуру, в которую полностью запись ложится и здесь её проверять, чтобы правильно вычисляемые поля проставить. } writer.WriteEndObject(); writer.Flush(); writer.Close(); result.ExemplarsJSON = sb.ToString(); if (ExemplarsCreatedDateList.Count != 0) { result.NewArrivals = ExemplarsCreatedDateList.Min(); } }