/// <summary> /// Метод отложенной загрузки/проверки данных /// </summary> internal void DelayLoad() { if (m_bIsLoaded) { return; } // Данные для типа инцидента и роли загружаем полностью, // что бы сделать потом внутреннюю проверку: IncidentType.LoadObject(new string[] { "Props", "States" }); Role_Observer.LoadObject(new string[] { "IncidentType" }); // Проверка внутреннего соответствия: // ... тип инцидента для ролей должен совпадать с заданным в конфигурации: ObjectOperationHelper helperType; helperType = Role_Observer.GetInstanceFromPropScalarRef("IncidentType"); if (helperType.ObjectID != IncidentType.ObjectID) { throw new InvalidOperationException(String.Format( "Тип инцидента \"{0}\" для заданной роли itws:role-for-observer( id=\"{1}\" ) не соответствует типу инцидента itws:incident-type( id=\"{2}\" )", helperType.ObjectID.ToString(), Role_Observer.ObjectID.ToString(), IncidentType.ObjectID.ToString() )); } // Фиксируем нужные нам для создания инцидента данные: // ... приоритет инцидента по умолчанию: ChangeIncident_DefaultPriority = (IncidentPriority)IncidentType.GetPropValue("DefaultPriority", XPropType.vt_i2); // ... начальное состояние инцидента; идентификатор объекта получаем // банальным XPath-запросом, опираясь на то, что свойство прогружено: XmlElement xmlDefaultState = (XmlElement)IncidentType.PropertyXml("States").SelectSingleNode("IncidentState[IsStartState='1']"); if (null == xmlDefaultState) { throw new InvalidOperationException(String.Format( "Для указанного типа инцидента (id={0}) стартовое состояние не определено", IncidentType.ObjectID.ToString() )); } ChangeIncident_StartState.ObjectID = new Guid(xmlDefaultState.GetAttribute("oid")); // ...запланированное время для наблюдателя, по умолчанию: DefaultDuration_for_ObserverRole = (int)Role_Observer.GetPropValue("DefDuration", XPropType.vt_i4); // Отдельно прямым запросом в БД определям тип внешней ссылки // для определения URL, по ее классу: XParamsCollection keys = new XParamsCollection(); keys.Add("ServiceType", (int)ServiceSystemType.URL); LinkType_URL.LoadObject(keys); m_bIsLoaded = true; }
/// <summary> /// Параметризированный конструктор /// Выполняет до-загрузку данных о подчиненных подразделениях, если /// это требуется в соответствии с заданными параметрами конфигурации /// </summary> /// <param name="xmlList_ExceptedDepsList"> /// Перечень элемментов itws:department из секции itws:excepted-departments. /// Может быть null или пустым. /// </param> public ExpensesProcessPrarms(XmlNodeList xmlList_ExceptedDepsList) { StringBuilder sbExceptedDepsList = new StringBuilder(); StringBuilder sbExceptedDepsWithNestedList = new StringBuilder(); if (null != xmlList_ExceptedDepsList && 0 != xmlList_ExceptedDepsList.Count) { // Перебор всех элементов конфигурации; формируется две строки - // перечень идентификаторов подразделений "как есть" и перечень // идентификаторов подразделений, для которых еще надо определить // подчиненных: foreach (XmlElement xmlExceptedDep in xmlList_ExceptedDepsList) { if (null == xmlExceptedDep) { continue; } string sDepID = xmlExceptedDep.GetAttribute("id"); ObjectOperationHelper.ValidateRequiredArgumentAsID(sDepID, "Идентификатор подразделения (" + sDepID + ")"); if (String.Empty == xmlExceptedDep.GetAttribute("include-nested")) { sbExceptedDepsList.Append(sDepID).Append(","); } else { sbExceptedDepsWithNestedList.Append(sDepID).Append(","); } } // Если есть такие, для которых надо определить подчиненных, то // выполняем действия по дозагрузке: получение данных с сервера: if (sbExceptedDepsWithNestedList.Length > 0) { XParamsCollection dsParams = new XParamsCollection(); sbExceptedDepsWithNestedList.Length -= 1; dsParams.Add("SrcList", sbExceptedDepsWithNestedList.ToString()); object oResult = ObjectOperationHelper.ExecAppDataSourceScalar("CommonService-INIT-ExpandDepsIDsWithNested", dsParams); if (null != oResult && DBNull.Value != oResult) { sbExceptedDepsList.Append(oResult.ToString()).Append(","); } } } // Итоговый список if (sbExceptedDepsList.Length > 0) { sbExceptedDepsList.Length -= 1; } m_sEmpExpenses_ExceptedDepsList = sbExceptedDepsList.ToString(); }
/// <summary> /// Возвращает метаописание уровня (i:tree-level) иерархии, соответствующего "пути" /// </summary> /// <returns>Объект-описатель уровня иерархии</returns> public virtual XTreeLevelInfoIT GetTreeLevel(XTreeStructInfo treeStruct, XParamsCollection treeParams, XTreePath treePath) { string[] nodesTypes = treePath.GetNodeTypes(); string sIgnoreType = String.Empty; // наименование игнорируемого типа из переданного пути (в случае рекурсии) XTreeLevelInfoIT treelevel = null; XTreeLevelInfoIT[] treelevels; bool bFound; for (int i = nodesTypes.Length - 1; i >= 0; i--) { if (sIgnoreType != nodesTypes[i]) { bFound = false; if (treelevel == null) { treelevels = getRootsInternal(treeStruct, treeParams, treePath); } else { treelevels = treelevel.GetChildTreeLevelsRuntime(treeParams); } foreach (XTreeLevelInfoIT childLevel in treelevels) { if (childLevel.ObjectType == nodesTypes[i]) { treelevel = childLevel; bFound = true; break; } } if (!bFound) { throw new XTreeStructException("Не найдено описания уровня иерархии, соответствующего заданному пути"); } // если у текущего уровня стоит признак рекурсии, то надо пропускать все // последующие типы в пути до тех пор, пока не встретится другой тип: if (treelevel.IsRecursive) { sIgnoreType = nodesTypes[i]; } else { sIgnoreType = String.Empty; } } } return(treelevel); }
public TASTenderInfo[] GetTendersInfo(Guid[] objectIDs) { XParamsCollection dsParams = new XParamsCollection(); // Если заданы идентификаторы Тендеров, то добавим их в параметры источника данных if (objectIDs != null) { foreach (Guid objectID in objectIDs) { dsParams.Add("ObjectID", objectID); } } // Зачитаем данные о тендерах: DataTable oDataTable = ObjectOperationHelper.ExecAppDataSource("SyncTAS-TendersInfo", dsParams); if (null == oDataTable) { return(new TASTenderInfo[0]); } TASTenderInfo[] arrTenderInfo = new TASTenderInfo[oDataTable.Rows.Count]; // Пробежимся по всем строкам и сформируем результат for (int nRowIndex = 0; nRowIndex < oDataTable.Rows.Count; nRowIndex++) { TASTenderInfo info = new TASTenderInfo(); info.ObjectID = oDataTable.Rows[nRowIndex]["ObjectID"].ToString(); info.ProjectCode = (DBNull.Value != oDataTable.Rows[nRowIndex]["Number"]) ? oDataTable.Rows[nRowIndex]["Number"].ToString() : null; info.Name = oDataTable.Rows[nRowIndex]["Name"].ToString(); info.Director = (DBNull.Value != oDataTable.Rows[nRowIndex]["Director"]) ? oDataTable.Rows[nRowIndex]["Director"].ToString() : null; info.Customer = (DBNull.Value != oDataTable.Rows[nRowIndex]["TenderCustomer"]) ? oDataTable.Rows[nRowIndex]["TenderCustomer"].ToString() : null; info.Folder = (DBNull.Value != oDataTable.Rows[nRowIndex]["Folder"]) ? oDataTable.Rows[nRowIndex]["Folder"].ToString() : null; info.Initiator = (DBNull.Value != oDataTable.Rows[nRowIndex]["Initiator"]) ? oDataTable.Rows[nRowIndex]["Initiator"].ToString() : null; info.InputDate = (DBNull.Value != oDataTable.Rows[nRowIndex]["InputDate"]) ? ((DateTime)oDataTable.Rows[nRowIndex]["InputDate"]).ToString("yyyy-MM-ddTHH:mm:ss") : null; // Добавим считанные данные в массив arrTenderInfo[nRowIndex] = info; } return(arrTenderInfo); }
/// <summary> /// Возвращает массив типизированных описаний дочерних уровней иерархии /// Если текущий уровень рекурсивный, то в в возвращаемой коллекции /// присутствует он сам /// </summary> /// <returns>Массив типизированных описаний уровней иерархии</returns> public XTreeLevelInfoIT[] GetChildTreeLevelsAffected(XParamsCollection treeParams) { XTreeLevelInfoIT[] levels_bydesing = GetChildTreeLevelsRuntime(treeParams); XTreeLevelInfoIT[] levels; if (IsRecursive) { levels = new XTreeLevelInfoIT[levels_bydesing.Length + 1]; levels[0] = this; for (int i = 1; i <= levels_bydesing.Length; ++i) { levels[i] = levels_bydesing[i - 1]; } } else { levels = levels_bydesing; } return(levels); }
/// <summary> /// ¬нутренний метод получени¤ данных объекта UserProfile дл¤ пользовател¤ /// системы, заданного идентификатором (SystemUser.ObjectID). /// </summary> /// <param name="uidSystemUserID">»дентификатор пользовател¤</param> /// <returns> /// -- »нифиализированный объект DomainObjectData, описывающий данные UserProfile /// -- null, если профил¤ пользовател¤ нет (что, в принципе возможно) /// </returns> protected DomainObjectData getUserProfile(Guid uidSystemUserID, XStorageConnection connection) { // ѕолучим идентификатор объекта UserProfile, соответствующего // указанному пользователю; дл¤ этого воспользуемс¤ запросом, // "зашитым" в data-source: // ...параметр запроса - идентификатор пользовател¤: XParamsCollection datasourceParams = new XParamsCollection(); datasourceParams.Add("UserID", uidSystemUserID); // ...получение и выполнение источника данных: XDataSource dataSource = connection.GetDataSource(DEF_DATASOURCE_NAME); dataSource.SubstituteNamedParams(datasourceParams, true); dataSource.SubstituteOrderBy(); object oResult = dataSource.ExecuteScalar(); // ќжидаетс¤, что в результате мы получаем GUID: если в результате // получили null - что говорит об отсутствии профил¤ - возвращаем null: Guid uidResult = Guid.Empty; if (null != oResult && DBNull.Value != oResult) { uidResult = connection.Behavior.CastGuidValueFromDB(oResult); } if (Guid.Empty == uidResult) { return(null); } // «агрузка данных профил¤ пользовател¤: DomainObjectDataSet dataSet = new DomainObjectDataSet(connection.MetadataManager.XModel); DomainObjectData xobj = dataSet.Load(connection, "UserProfile", uidResult); return(xobj); }
public override XTreeLevelInfoIT[] GetChildTreeLevels(XTreeLevelInfoIT treeLevelInfo, XParamsCollection treeParams) { if (treeParams.Contains("OnlyFolders")) { // оставим только уровни с типом Folder ArrayList aList = new ArrayList(treeLevelInfo.ChildTreeLevelsInfoMetadata.Length); foreach (XTreeLevelInfoIT levelInfo in treeLevelInfo.ChildTreeLevelsInfoMetadata) { if (levelInfo.ObjectType == "Folder") { aList.Add(levelInfo); } } if (aList.Count == 0) { return(XTreeLevelInfoIT.EmptyLevels); } else { XTreeLevelInfoIT[] levels = new XTreeLevelInfoIT[aList.Count]; aList.CopyTo(levels); return(levels); } } return(base.GetChildTreeLevels(treeLevelInfo, treeParams)); }
public virtual XTreeLevelInfoIT[] GetChildTreeLevels(XTreeLevelInfoIT treeLevelInfo, XParamsCollection treeParams) { return(treeLevelInfo.ChildTreeLevelsInfoMetadata); }
/// <summary> /// Возвращает массив актуальных типизированных описаний дочерних уровней иерархии. /// Т.е. сформированных executor'ом в runtime'е на основании параметров и (возможно) метаданных (ChildTreeLevelsInfoMetadata) /// </summary> /// <param name="treeParams"></param> /// <returns></returns> public virtual XTreeLevelInfoIT[] GetChildTreeLevelsRuntime(XParamsCollection treeParams) { return(m_executor.GetChildTreeLevels(this, treeParams)); }
/// <summary> /// Параметризированный конструктор /// </summary> /// <param name="sTypeName">Наименование ds-типа</param> /// <param name="paramsCollection"> /// Коллекция параметров, задающих значения свойств, по которым /// определяется удаляемый экземпляр ds-объекта /// </param> public DeleteObjectByExKeyRequest(string sTypeName, XParamsCollection paramsCollection) { Name = DEF_COMMAND_NAME; TypeName = sTypeName; Params = paramsCollection; }
protected override XTreeLevelInfoIT[] getRootsInternal(XTreeStructInfo treeStruct, XParamsCollection treeParams, XTreePath treePath) { DKPTreeModes mode; // получение корней при загрузке корней будем определять по параметру Mode, if (treePath == null) { int nMode; if (!treeParams.Contains("Mode")) { throw new ArgumentException("Не задан обязательный параметр Mode - режим иерархии"); } string sMode = treeParams["Mode"].ToString(); try { nMode = Int32.Parse(sMode); } catch (FormatException) { throw new ApplicationException("Некорректный формат параметра \"режим иерархии\": " + sMode); } mode = (DKPTreeModes)nMode; } // а получение корней в других случаях (при поиске описания узла, соответствующего пути) по типу 1-ой ноды в пути else { string sRootTypeName = treePath[treePath.Length - 1].ObjectType; if (sRootTypeName == "Folder") { mode = DKPTreeModes.Activities; } else if (sRootTypeName == "Organization" || sRootTypeName == "HomeOrganization") { mode = DKPTreeModes.Organizations; } else { throw new ArgumentException("Неизвестный тип корневого узла: " + sRootTypeName); } } bool bAcceptOrganization = (mode == DKPTreeModes.Organizations); ArrayList aList = new ArrayList(); foreach (XTreeLevelInfoIT levelInfo in treeStruct.RootTreeLevels) { if ( (bAcceptOrganization && (levelInfo.ObjectType == "Organization" || levelInfo.ObjectType == "HomeOrganization")) || !bAcceptOrganization && levelInfo.ObjectType == "Folder" ) { aList.Add(levelInfo); } } XTreeLevelInfoIT[] roots = new XTreeLevelInfoIT[aList.Count]; aList.CopyTo(roots); return(roots); }
/// <summary> /// Метод запуска операции на выполнение, <входная> точка операции /// ПЕРЕГРУЖЕННЫЙ, СТРОГО ТИПИЗИРОВАННЫЙ МЕТОД /// ВЫЗЫВАЕТСЯ ЯДРОМ АВТОМАТИЧЕСКИ /// </summary> /// <param name="request">Запрос на выполнение операции</param> /// <param name="context">Контекст выполнения операции</param> /// <returns>Результат выполнения</returns> public XGetObjectResponse Execute(XRequest request, IXExecutionContext context) { // #1: Определяем идентификатор текущего пользователя // Используем внутренние механизмы аутентификации ITUser user = (ITUser)XSecurityManager.Instance.GetCurrentUser(); XParamsCollection datasourceParams = new XParamsCollection(); datasourceParams.Add("UserID", user.SystemUserID); // #2: Найдем идентификатор объекта - профиля, связанного с текущим // пользователем: испоьзуем для этого тривиальный запрос, заданный // в "источнике данных" XDataSource dataSource = context.Connection.GetDataSource(DEF_DATASOURCE_NAME); dataSource.SubstituteNamedParams(datasourceParams, true); dataSource.SubstituteOrderBy(); object oResult = dataSource.ExecuteScalar(); // Ожидается, что в результате мы получаем GUID: Guid uidResult = Guid.Empty; if (null != oResult && DBNull.Value != oResult) { uidResult = context.Connection.Behavior.CastGuidValueFromDB(oResult); } // #3: Загрузка данных профиля и всех сопутствующих объектов: DomainObjectDataSet dataSet = new DomainObjectDataSet(context.Connection.MetadataManager.XModel); DomainObjectData xobj; if (Guid.Empty != uidResult) { // Объект профиля уже есть; загружаем существующий xobj = dataSet.Load(context.Connection, "UserProfile", uidResult); } else { xobj = dataSet.CreateNew("UserProfile", false); // В новом объекте описания профиля сразу проставляем заглушку на текущего пользователя xobj.SetUpdatedPropValue("SystemUser", user.SystemUserID); // Задаем "собственную" стартовую страницу по умолчанию - список текущих инцидентов xobj.SetUpdatedPropValue("StartPage", StartPages.CurrentTaskList); } // Догружаем данные пользователя (SystemUser) и сотрудника (Employee) dataSet.PreloadProperty(context.Connection, xobj, "SystemUser.Employee"); // Сериализуем датасет с загруженными объектами в формат для Web-клиента DomainObjectDataXmlFormatter formatter = new DomainObjectDataXmlFormatter(context.Connection.MetadataManager); // ... при этом учитываем, что в сериализованные данные должны так же попасть // данные с описанием пользователя и сотрудника: XmlElement xmlObject = formatter.SerializeObject(xobj, new string[] { "SystemUser.Employee" }); if (Guid.Empty != uidResult) { // ..обработаем объект и все вложенные объекты в прогруженных свойства, расставим атрибуты ограничения доступа XmlObjectRightsProcessor.ProcessObject(xobj, xmlObject); } return(new XGetObjectResponse(xmlObject)); }
public override XTreeLevelInfoIT[] GetChildTreeLevels(XTreeLevelInfoIT treeLevelInfo, XParamsCollection treeParams) { //treeLevelInfo.GetChildTreeLevelsRuntime(treeParams); //Add(new XUserCodeWeb("DKP_ContractMenu_ExecutionHandler")); /* * ArrayList aList = new ArrayList(treeLevelInfo.ChildTreeLevelsInfoMetadata.Length); * foreach (XTreeLevelInfoIT levelInfo in treeLevelInfo.ChildTreeLevelsInfoMetadata) * if (levelInfo.ObjectType == "Contract") * aList.Add(levelInfo); * if (aList.Count == 0) * return XTreeLevelInfoIT.EmptyLevels; * else * { * XTreeLevelInfoIT[] levels = new XTreeLevelInfoIT[aList.Count]; * aList.CopyTo(levels); * return levels; * } */ return(base.GetChildTreeLevels(treeLevelInfo, treeParams)); }
protected virtual XTreeLevelInfoIT[] getRootsInternal(XTreeStructInfo treeStruct, XParamsCollection treeParams, XTreePath treePath) { return(treeStruct.RootTreeLevels); }
public virtual XTreeLevelInfoIT[] GetRoots(XTreeStructInfo treeStruct, XParamsCollection treeParams) { return(getRootsInternal(treeStruct, treeParams, null)); }