/// <summary> /// Пошук листів у яких поле searchTag >= fromDate /// </summary> /// <param name="fromDate"></param> /// <param name="searchTag"></param> /// <returns></returns> public static IRestrictionHelper GetRestrictionStartDate(DateTime fromDate, TPropertyTag searchTag) { //relopGE - "більше або дорівнює" //relopGT - "більше" PropertyRestrictionHelper startDateRestriction = new PropertyRestrictionHelper(searchTag, fromDate, DS.relopGE.ConstVal); return(startDateRestriction); }
/// <summary> /// Пошук листів, у яких поле searchTag <= toDate /// </summary> /// <param name="toDate"></param> /// <param name="searchTag"></param> /// <returns></returns> public static IRestrictionHelper GetRestrictionEndDate(DateTime toDate, TPropertyTag searchTag) { //relopLE - "менше або дорівнює" //relopLT - "менше" PropertyRestrictionHelper endDateRestriction = new PropertyRestrictionHelper(searchTag, toDate, DS.relopLE.ConstVal); return(endDateRestriction); }
public BaseDocument(ISession session, OID parentFolderID, OID categoryID) { _Session = session; _ParentFolderID = parentFolderID; _ID = Converters.OID.NewOID(parentFolderID._base); _CategoryID = categoryID; _CreationContainerTag = Foss.FossDoc.ExternalModules.BusinessLogic.Schema.Folder.Attributes.Documents.Tag; _Props[Foss.FossDoc.ApplicationServer.ObjectDataManagment.Schema.PropertyTags.ObjectCategoryOID] = Converters.Properties.ObjectPropertyBuilder.Create(_CategoryID, Foss.FossDoc.ApplicationServer.ObjectDataManagment.Schema.PropertyTags.ObjectCategoryOID); if (_GenerateDisplayName) { //Имя документа сформируем string catName = categoryID.ToStringRepresentation(); var props = _Session.ObjectDataManager.GetProperties(categoryID, Foss.FossDoc.ApplicationServer.ObjectDataManagment.Schema.PropertyTags.DisplayName); if (props[0].PropertyTag.IsEquals(Foss.FossDoc.ApplicationServer.ObjectDataManagment.Schema.PropertyTags.DisplayName)) { catName = props[0].Value.GetstrVal(); } string docName = string.Format("{0} ({1}) {2}", catName, _Session.ObjectDataManager.GetObjectDisplayName(session.AccessControlManager.CurrentUserOID), DateTime.Now); _Props[Foss.FossDoc.ApplicationServer.ObjectDataManagment.Schema.PropertyTags.DisplayName] = Converters.Properties.ObjectPropertyBuilder.Create(docName, Foss.FossDoc.ApplicationServer.ObjectDataManagment.Schema.PropertyTags.DisplayName); } }
static void Main(string[] args) { try { //Строка підключення до сервера. Логін - dilovod //Змініть localhost на і'мя машини де у вас сервер. //Якщо у вас SSL-з'єднання, формат строки інший: "iiop-ssl://localhost:11301/AccessRoot;Login=dilovod;Password=123;AuthenticationAlgorithm=FossDoc;ClientAuthentication=Foss.FossDoc.ApplicationServer.Connection.ClientSSLAuthentication, Foss.FossDoc.ApplicationServer.Connection;" string connectionString = "URL=corbaloc::1.2@andrewsalko:11301/AccessRoot;Login=Деловод;Password=123;AuthenticationAlgorithm=FossDoc;"; //Якщо у вас Windows-аутентифікація (ActiveDirectory) то логін та пароль передавати не потрібно: //string connectionString = "URL=corbaloc::1.2@andrewsalko:11301/AccessRoot;AuthenticationAlgorithm=Windows;"; //Ви можете зберігати сессію достатньо довго, але не забувайте про Dispose using (ISession session = (ISession)Foss.FossDoc.ApplicationServer.Connection.Connector.Connect(connectionString)) { //менеджер для роботи з об'єктами (через нього ви отримаєте будь-які властивості, наприклад Тема листа, відправник, наявність файлів та інше) var obj = session.ObjectDataManager; //Сервер сам завантажує та зберігає листи у базі. Наш додаток лише перевіряє, чи є у папці Вхідні нові листи (які поточний користувач не читав) //Нам потрібно знати папку Вхідні (її ідентифікатор) для поточного користувача OID inboxID = session.MessagingManager.GetSpecialMessagingFolder(Foss.FossDoc.ApplicationServer.Messaging.SpecialMessagingFolder.Inbox); //структура DS.OID схожа на Guid, але має додаткові 4 байти. усі об'єкти у FossDoc мають свій унікальний ідентифікатор //Нам потрібен "фільтр" щоб знайти повідомлення за різними ознаками, наприклад "непрочитані", або у діапазоні дати. var nonReadRestrict = SearchRestrictions.GetRestrictForNonReadMessages(); //Дивись клас SearchRestrictions - приклади пошуку за діапазонами дат, або більше-менше заданої дати. var today = DateTime.Now; DateTime startDate = today; //кінець поточного дня DateTime endDate = new DateTime(today.Year, today.Month, today.Day, 23, 59, 59); //PR_MESSAGE_DELIVERY_TIME - "Отримано" (дата отримання листа) var dateRangeRestrict = SearchRestrictions.GetDateRangeRestriction(startDate, endDate, Foss.FossDoc.ApplicationServer.Messaging.Schema.InboundMessage.PR_MESSAGE_DELIVERY_TIME); var restrict = nonReadRestrict; //Можна застосувати dateRangeRestrict - для пошуку листів у діапазоні дати отримання //Метод GetChildren отримує дочірні обєкти в батьківському об'єкті за вказаним тегом. //Тег - можна вважати іменем властивості, хоча це структура з 4 байтів, наприклад: 0x360F1F00 - це тег "Документи в папці". //Наприклад у папки є гілки "Документи в папці" та "Папки в папці". У листа - "Файли". //наведений приклад GetChildren отримує листи (ідентифікатори) з папки Вхідні за достатньо популярним тегом "Документи в папці", із застосуванням фільтру tblMain. //У папці може бути тисячі листів, а нам потрібні тількі нові (непрочитані). OID[] messagesIDs = obj.GetChildren(new OID[] { inboxID }, new TPropertyTag[] { Foss.FossDoc.ApplicationServer.Messaging.Schema.MessagesFolder.PR_CONTAINER_CONTENTS }, restrict); if (messagesIDs == null || messagesIDs.Length == 0) { _Log("Нових листів не знайдено"); return; //нема нових email } string appDir = new Uri(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase)).LocalPath; for (int i = 0; i < messagesIDs.Length; i++) { OID msgID = messagesIDs[i]; //тут ми просто виводимо ідентифікатор листа, його можна побачити на вкладці Об'єкт. _Log("Лист {0}", msgID.ToStringRepresentation()); //Тепер ми можемо отримати властивості листа. Багато з них можна побачити на вкладці Обєкт, але контейнерні властивості треба дивитися у дереві (або окремих вкладках) //Це стосується "Файли" або "Отримувачі". //А поки що ми запитаємо лише дві властовості - Тема та Адреса відправника. //tags - це масив властовостей, які ми хочемо запитати в сервера. Багато з них можна знайти в інтерфейсах сервера, або ввести власноруч якщо скопіювати тег з адміністрування. //На вкладці Об'єкт, угорі активуйте показ тегів та унікальних імен (Show tags, Show unique names) //var testTag = Converters.PropertyTag.FromUInt32(0x0C1F001E); //це те ж саме що й PR_SENDER_EMAIL_ADDRESS TPropertyTag[] tags = new TPropertyTag[] { Foss.FossDoc.ApplicationServer.Messaging.Schema.Message.PR_SUBJECT, Foss.FossDoc.ApplicationServer.Messaging.Schema.Message.PR_SENDER_EMAIL_ADDRESS }; var props = obj.GetProperties(msgID, tags); if (props == null) { //Важливо завжди перевіряти результат GetProperties на null. Якщо у вас немає доступу на читання обєкта або його не існує у базі, ви отримаєте null. _Log("Об'єкт не існує або немає доступу на читання: {0}", msgID.ToStringRepresentation()); continue; } //Ми запитали дві властивості, та у результаті сервер збереже порядок - першим йде PR_SUBJECT (Тема листа), а потім адреса відправника if (props[0].PropertyTag.IsEquals(Foss.FossDoc.ApplicationServer.Messaging.Schema.Message.PR_SUBJECT)) { //Сервер повертає спец.структуру, та в неї перевірте тег - він повинен співпасти. Якщо ні - властивість не існує, та звертатися до значення не можна. string subject = props[0].Value.GetstrVal(); _Log("Тема:{0}", subject); } if (props[1].PropertyTag.IsEquals(Foss.FossDoc.ApplicationServer.Messaging.Schema.Message.PR_SENDER_EMAIL_ADDRESS)) { string senderAddr = props[1].Value.GetstrVal(); _Log("Адреса відправника:{0}", senderAddr); } //Ми створимо окрему папку для кожного листа, за його ідентифікатором: string destFolderPath = Path.Combine(appDir, msgID.ToStringRepresentation()); if (Directory.Exists(destFolderPath)) { //якщо папка вже існує, ми її видалимо Directory.Delete(destFolderPath, true); } Directory.CreateDirectory(destFolderPath); //У листа можуть бути файли, але не обов'язково. Метод нижче це проаналізує та завантажить файли на диск _DownloadAttaches(obj, msgID, destFolderPath); //Якщо необхідно "Прочитати" лист як звичайній користувач - відкрийте цей виклик: //session.MessagingManager.SetReadFlag(new OID[] { msgID }, true); } _Log("Виконано"); } //using } catch (Exception ex) { _Log(ex.ToString()); } }
/// <summary> /// Діапазон дати (від...до). Увага: дата-час містить хвилини та секунди. У разі, якщо вам потрібно шукати "за датою", /// рекомендується брати від 00:00:00 до 23:59:59 кінцевої дати, таким чином усі необхідні документи потраплять до виборки. /// </summary> /// <param name="start">Дата-час початку</param> /// <param name="end">Дата-час закінчення</param> /// <param name="searchTag">Поле</param> /// <returns></returns> public static DS.TableRestriction GetDateRangeRestriction(DateTime start, DateTime end, TPropertyTag searchTag) { var resStart = GetRestrictionStartDate(start, searchTag); var resEnd = GetRestrictionEndDate(end, searchTag); //обєднуємо "AND" умовою TableRestrictionHelper tblAND = new TableRestrictionHelper(DS.resAND.ConstVal, resStart, resEnd); return(tblAND); }