/
IamDeveloper
/
Edk
Обзор
Документация
Войти
/
IamDeveloper
/
Edk
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
ComConnector.cs
174 строки
9 KB
IamDeveloper
init
13 дек 2024, 15:07
13 дек 2024, 15:07
9714be3
Код
Авторство
О чём код?
using EdkClassLibrary; using Microsoft.Extensions.Configuration; using SBRte; using System; using System.Collections.Generic; using System.Linq; using System.Security.Principal; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using System.Text.RegularExpressions; namespace Edk2directum { //реализация Коннектора к Директум через Ком объект. internal class ComConnector : IConnector { //переменная для получения ком объекта (неотъемлемая часть коннектора) private readonly DirectumApp _directum; private readonly IConfiguration _configuration; public ComConnector(IConfiguration configuration) { _configuration = configuration; string server = configuration["Directum:server"]!; string dbName = configuration["Directum:dbname"]!; _directum = new (server, dbName); } public Access GetAccessRight(string path) { IScript? script = _directum.GetApplication().ScriptFactory.GetObjectByName("GetEdkAccessByPath") as IScript; script?.Params.Add("path", path); string? accesRight = script?.Execute(); if (accesRight == null) throw new InternetDocumentCannotRecieveAccessError($"Не удалось получить группу доступа для {path}"); #if DEBUG Console.WriteLine($"Доступ {accesRight}"); #endif Access? access = JsonConvert.DeserializeObject<Access>(accesRight!); return access == null ? throw new InternetDocumentCannotRecieveAccessError($"Не удалось получить группу доступа для {path}") : access; } public Int64 GetClientId(string inn, Int64 filialId) { IScript? script = _directum.GetApplication().ScriptFactory.GetObjectByName("GetClientId") as IScript; script?.Params.Add("inn", inn); script?.Params.Add("filial", filialId.ToString()); string? clientIdStr = script?.Execute(); if (clientIdStr != null) { #if DEBUG Console.WriteLine($"inn = {inn} clientIdStr = {clientIdStr}"); #endif return Int64.Parse(clientIdStr); } return 0; } public Int64 CreateClient(string name, string inn, string? kpp, string acct, Int64 filial) { IReference orgRef = (IReference)_directum.GetApplication().ReferencesFactory.ReferenceFactory["ОРГ"].CreateNew(); orgRef.Requisites["Наименование"].Value = name; orgRef.Requisites["LongString5"].Value = name; if (kpp != null && kpp != "") { orgRef.Requisites["Ед_Изм"].Value = kpp; } orgRef.Requisites["ИНН"].Value = inn; IReference filRef = (IReference)_directum.GetApplication().ReferencesFactory.ReferenceFactory["ФИЛ"].GetObjectByID(267471); orgRef.Requisites["Филиал"].Value = filRef.Requisites["Код"].Value; orgRef.Save(); #if DEBUG Console.WriteLine($"Создан клиент ИД {orgRef.ID}"); #endif return orgRef.ID; } public long CreateEdk(long deptId, long clientId, string? dop, string? acct, string? recipient, string name, Int64 docId, string? docDate, string subject, List<Sign>? signs) { IReference deptEdk = (IReference)_directum.GetApplication().ReferencesFactory.ReferenceFactory["EDK_Dept"].GetObjectByID((int)deptId); IReference edkRef = (IReference)_directum.GetApplication().ReferencesFactory.ReferenceFactory["EDK_Dossier"].CreateNew(); IReference orgRef = (IReference)_directum.GetApplication().ReferencesFactory.ReferenceFactory["ОРГ"].GetObjectByID((int)clientId); edkRef.Requisites["Дата2"].Value = DateTime.Today.ToShortDateString(); if (docDate != null) edkRef.Requisites["Дата3"].Value = DateTime.Parse(docDate).ToShortDateString(); edkRef.Requisites["EDK_Dept"].Value = deptEdk.Requisites["Код"].Value; edkRef.Requisites["Организация"].Value = orgRef.Requisites["Код"].Value; if (dop != null) edkRef.Requisites["Дополнение"].Value = dop; if (acct != null) edkRef.Requisites["Дополнение2"].Value = acct; if (recipient != null) edkRef.Requisites["Дополнение5"].Value = recipient; //убрать из имени все лишнее string pattern = @"^(?:[^_]*_){4}"; // Шаблон для первых 4 частей до символа '_' name = Regex.Replace(name, pattern, ""); // Удаляем всё, что соответствует шаблону edkRef.Requisites["Дополнение3"].Value = name; edkRef.Requisites["Строка4"].Value = name; edkRef.Requisites["Строка5"].Value = docId.ToString(); edkRef.Requisites["Строка"].Value = "Ibank2"; edkRef.Requisites["LongString"].Value = subject; IDataSet ds = edkRef.DetailDataSet(1); if (signs != null) for (int i = 0; i < signs!.Count; i++) { ds.Insert(); ds.Requisites["AdditionT"].Value = signs[i].ID_KEY.ToString(); ds.Requisites["Доп2Т"].Value = signs[i].OWNER!; ds.Requisites["ДопТ"].Value = signs[i].TIMESTAMP!; } edkRef.Save(); #if DEBUG Console.WriteLine($"Создана запись ЭДК ИД {edkRef.ID}"); #endif return edkRef.ID; } public async Task<long> CreateDoc(string fileName, string attName, Int64 groupId) { //дать время ОС сохранить файл до конца на диске for (int i = 0; i < 4; i++) { if (File.Exists(fileName) == false) await Task.Delay(10000); } string fileExt = Path.GetExtension(fileName).TrimStart('.'); IReference prilRef = _directum.GetApplication().ReferencesFactory.ReferenceFactory["ПРР"].GetComponent(); prilRef.Open(); prilRef.Filter = $"[ТипПриложения] = \"{fileExt}\""; prilRef.Filtered = true; //если приложение-редактор не найден, поставить по-умолчанию текстовый редактор if (prilRef.RecordCount == 0) { prilRef.Filter = "[ТипПриложения] = \"txt\""; prilRef.Filtered = true; } string correctName = ""; string[] nameArray = attName.Split('_'); for (int i = 4; i < nameArray.Length; i++) { correctName += nameArray[i] + "_"; } if (correctName != "") attName = correctName.TrimEnd('_'); string typedoc = _configuration["Directum:typedoc"]!; string viddoc = _configuration["Directum:viddoc"]!; IEDocument newDoc = _directum.GetApplication().EDocumentFactory.CreateNewFromFile(typedoc, viddoc, prilRef.Requisites["Код"].Value, fileName); IUser accessGroup = _directum.GetApplication().ServiceFactory.GetGroupByID((int)groupId); newDoc.AccessRights.Readers.Add(accessGroup); newDoc.SetLifeCycleStageByName("Active"); IDataSet ds = newDoc.DataSet; if (attName.Length < 10) ds.Requisites["ISBEDocName"].Value = "attachment_" + attName; else ds.Requisites["ISBEDocName"].Value = attName; newDoc.Save(); int docId = newDoc.ID; #if DEBUG Console.WriteLine($"Создан документ ИД {docId}"); #endif newDoc = null; return docId; } public void BindTo(long edkId, long docId) { IReference edkRef = (IReference)_directum.GetApplication().ReferencesFactory.ReferenceFactory["EDK_Dossier"].GetObjectByID((int)edkId); IEDocument doc = (IEDocument)_directum.GetApplication().EDocumentFactory.GetObjectByID((int)docId); _directum.GetApplication().EDocumentFactory.BindTo(edkRef.Info, doc.Info); } } }