コード例 #1
0
        /// <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;
        }
コード例 #2
0
        /// <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();
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
ファイル: TASSyncService.asmx.cs プロジェクト: SanSay157/IT8
        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);
        }
コード例 #5
0
 /// <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);
 }
コード例 #6
0
        /// <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);
        }
コード例 #7
0
 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));
 }
コード例 #8
0
 public virtual XTreeLevelInfoIT[] GetChildTreeLevels(XTreeLevelInfoIT treeLevelInfo, XParamsCollection treeParams)
 {
     return(treeLevelInfo.ChildTreeLevelsInfoMetadata);
 }
コード例 #9
0
 /// <summary>
 /// Возвращает массив актуальных типизированных описаний дочерних уровней иерархии.
 /// Т.е. сформированных executor'ом в runtime'е на основании параметров и (возможно) метаданных (ChildTreeLevelsInfoMetadata)
 /// </summary>
 /// <param name="treeParams"></param>
 /// <returns></returns>
 public virtual XTreeLevelInfoIT[] GetChildTreeLevelsRuntime(XParamsCollection treeParams)
 {
     return(m_executor.GetChildTreeLevels(this, treeParams));
 }
コード例 #10
0
 /// <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;
 }
コード例 #11
0
        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);
        }
コード例 #12
0
        /// <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));
        }
コード例 #13
0
        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));
        }
コード例 #14
0
 protected virtual XTreeLevelInfoIT[] getRootsInternal(XTreeStructInfo treeStruct, XParamsCollection treeParams, XTreePath treePath)
 {
     return(treeStruct.RootTreeLevels);
 }
コード例 #15
0
 public virtual XTreeLevelInfoIT[] GetRoots(XTreeStructInfo treeStruct, XParamsCollection treeParams)
 {
     return(getRootsInternal(treeStruct, treeParams, null));
 }