コード例 #1
0
ファイル: InfoDicSet.cs プロジェクト: HuZeHua/InternetDemo
 /// <summary>
 /// 根据字典Id索引字典项集合
 /// </summary>
 /// <param name="infoDic">字典Id</param>
 /// <returns>字典项集合</returns>
 public IReadOnlyCollection <InfoDicItemState> GetInfoDicItems(InfoDicState infoDic)
 {
     if (!_initialized)
     {
         Init();
     }
     return(!_infoDicItemByDic.ContainsKey(infoDic) ? _emptyInfoDicItems : new List <InfoDicItemState>(_infoDicItemByDic[infoDic].Values.OrderBy(item => item.SortCode)));
 }
コード例 #2
0
ファイル: InfoDicSet.cs プロジェクト: HuZeHua/InternetDemo
 /// <summary>
 ///
 /// </summary>
 /// <param name="dicId"></param>
 /// <param name="infoDic"></param>
 /// <returns></returns>
 public bool TryGetInfoDic(dicId dicId, out InfoDicState infoDic)
 {
     if (!_initialized)
     {
         Init();
     }
     return(_infoDicDicById.TryGetValue(dicId, out infoDic));
 }
コード例 #3
0
        /// <summary>
        /// 转换为数据传输对象。
        /// </summary>
        /// <param name="ontology"></param>
        /// <returns></returns>
        public static OntologyData ToOntologyData(this OntologyDescriptor ontology)
        {
            if (ontology == null)
            {
                return(null);
            }
            var ontologyData = new OntologyData()
            {
                Code     = ontology.Ontology.Code,
                Name     = ontology.Ontology.Name,
                IsSystem = ontology.Ontology.IsSystem
            };

            if (ontology.Actions != null && ontology.Actions.Count > 0)
            {
                foreach (var item in ontology.Actions.Values.OrderBy(a => a.Verb))
                {
                    ontologyData.Actions.Add(new ActionData
                    {
                        Verb = item.Verb,
                        Name = item.Name
                    });
                }
            }
            if (ontology.Elements != null && ontology.Elements.Count > 0)
            {
                foreach (var item in ontology.Elements.Values.OrderBy(a => a.Element.SortCode))
                {
                    if (!item.IsRuntimeElement)
                    {
                        InfoDicState infoDic = null;
                        if (item.Element.InfoDicId.HasValue)
                        {
                            ontology.Host.NodeHost.InfoDics.TryGetInfoDic(item.Element.InfoDicId.Value, out infoDic);
                        }
                        var infoDicCode         = infoDic == null ? "" : infoDic.Code;
                        var infoDicName         = infoDic == null ? "" : infoDic.Name;
                        var serializableElement = new ElementData()
                        {
                            Name      = item.Element.Name,
                            Key       = item.Element.Code,
                            Nullable  = item.Element.Nullable,
                            MaxLength = item.Element.MaxLength,
                            OType     = item.Element.OType,
                            ValueDic  = infoDicCode,
                            IsEnabled = item.Element.IsEnabled
                        };
                        ontologyData.Elements.Add(serializableElement);
                    }
                }
            }

            return(ontologyData);
        }
コード例 #4
0
ファイル: InfoDicSet.cs プロジェクト: HuZeHua/InternetDemo
 /// <summary>
 ///
 /// </summary>
 /// <param name="dicCode"></param>
 /// <param name="infoDic"></param>
 /// <returns></returns>
 public bool TryGetInfoDic(dicCode dicCode, out InfoDicState infoDic)
 {
     if (!_initialized)
     {
         Init();
     }
     if (dicCode != null)
     {
         return(_infoDicDicByCode.TryGetValue(dicCode, out infoDic));
     }
     infoDic = null;
     return(false);
 }
コード例 #5
0
ファイル: InfoDicSet.cs プロジェクト: HuZeHua/InternetDemo
 /// <summary>
 ///
 /// </summary>
 /// <param name="infoDic"></param>
 /// <param name="itemCode"></param>
 /// <param name="item"></param>
 /// <returns></returns>
 public bool TryGetInfoDicItem(InfoDicState infoDic, dicItemCode itemCode, out InfoDicItemState item)
 {
     if (!_initialized)
     {
         Init();
     }
     if (_infoDicItemByDic.ContainsKey(infoDic))
     {
         return(_infoDicItemByDic[infoDic].TryGetValue(itemCode, out item));
     }
     item = null;
     return(false);
 }
コード例 #6
0
ファイル: InfoDicSet.cs プロジェクト: HuZeHua/InternetDemo
            private void Update(InfoDicState state)
            {
                var infoDicDicById   = _set._infoDicDicById;
                var infoDicDicByCode = _set._infoDicDicByCode;
                var newKey           = state.Code;
                var oldKey           = infoDicDicById[state.Id].Code;

                infoDicDicById[state.Id] = state;
                if (!infoDicDicByCode.ContainsKey(newKey))
                {
                    infoDicDicByCode.Add(newKey, state);
                    infoDicDicByCode.Remove(oldKey);
                }
                else
                {
                    infoDicDicByCode[newKey] = state;
                }
            }
コード例 #7
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="infoDic"></param>
        /// <returns></returns>
        public static InfoDicData ToInfoDicData(this InfoDicState infoDic)
        {
            var infoDicData = new InfoDicData()
            {
                Name = infoDic.Name,
                Code = infoDic.Code
            };

            foreach (var item in infoDic.AcDomain.NodeHost.InfoDics.GetInfoDicItems(infoDic).OrderBy(a => a.SortCode))
            {
                infoDicData.InfoDicItems.Add(new InfoDicItemData
                {
                    Code        = item.Code,
                    Description = item.Description,
                    Level       = item.Level,
                    Name        = item.Name
                });
            }

            return(infoDicData);
        }
コード例 #8
0
ファイル: InfoDicSet.cs プロジェクト: HuZeHua/InternetDemo
        private void Init()
        {
            if (_initialized)
            {
                return;
            }
            lock (Locker)
            {
                if (_initialized)
                {
                    return;
                }
                _acDomain.MessageDispatcher.DispatchMessage(new MemorySetInitingEvent(this));
                _infoDicDicById.Clear();
                _infoDicDicByCode.Clear();
                _infoDicItemByDic.Clear();
                _infoDicItemDic.Clear();
                var allInfoDics = _acDomain.RetrieveRequiredService <INodeHostBootstrap>().GetInfoDics();
                foreach (var infoDic in allInfoDics)
                {
                    var infoDicState = InfoDicState.Create(_acDomain, infoDic);
                    _infoDicDicById.Add(infoDic.Id, infoDicState);
                    _infoDicDicByCode.Add(infoDic.Code, infoDicState);
                    _infoDicItemByDic.Add(infoDicState, new Dictionary <string, InfoDicItemState>(StringComparer.OrdinalIgnoreCase));
                }
                var allDicItems = _acDomain.RetrieveRequiredService <INodeHostBootstrap>().GetInfoDicItems();

                foreach (var infoDicItem in allDicItems)
                {
                    var infoDicItemState = InfoDicItemState.Create(infoDicItem);
                    var infoDic          = _infoDicDicById[infoDicItem.InfoDicId];
                    _infoDicItemByDic[infoDic].Add(infoDicItem.Code, infoDicItemState);
                    _infoDicItemDic.Add(infoDicItem.Id, infoDicItemState);
                }
                _initialized = true;
                _acDomain.MessageDispatcher.DispatchMessage(new MemorySetInitializedEvent(this));
            }
        }
コード例 #9
0
ファイル: ElementInfo.cs プロジェクト: HuZeHua/InternetDemo
        public static ElementInfo Create(DicReader dic)
        {
            if (dic == null)
            {
                return(null);
            }
            var data = new ElementInfo(dic.AcDomain);

            foreach (var item in dic)
            {
                data.Add(item.Key, item.Value);
            }
            data.Id = (Guid)dic["Id"];
            OntologyDescriptor ontology;

            if (!dic.AcDomain.NodeHost.Ontologies.TryGetOntology((Guid)data["OntologyId"], out ontology))
            {
                throw new GeneralException("意外的本体标识" + data["OntologyId"]);
            }
            if (!data.ContainsKey("OntologyCode"))
            {
                data.Add("OntologyCode", ontology.Ontology.Code);
            }
            if (!data.ContainsKey("OntologyName"))
            {
                data.Add("OntologyName", ontology.Ontology.Name);
            }
            if (data["MaxLength"] == DBNull.Value)
            {
                data.MaxLength = null;
            }
            else
            {
                data.MaxLength = (int?)data["MaxLength"];
            }
            if (!data.ContainsKey("DeletionStateName"))
            {
                data.Add("DeletionStateName", dic.AcDomain.Translate("Edi", "Element", "DeletionStateName", (int)data["DeletionStateCode"]));
            }
            if (!data.ContainsKey("IsEnabledName"))
            {
                data.Add("IsEnabledName", dic.AcDomain.Translate("Edi", "Element", "IsEnabledName", (int)data["IsEnabled"]));
            }
            if (data["InfoDicId"] == DBNull.Value)
            {
                data.InfoDicId = null;
            }
            else
            {
                data.InfoDicId = (Guid?)data["InfoDicId"];
            }
            if (data.InfoDicId.HasValue && !data.ContainsKey("InfoDicName"))
            {
                InfoDicState infoDic = null;
                if (data.InfoDicId != null && !dic.AcDomain.NodeHost.InfoDics.TryGetInfoDic(data.InfoDicId.Value, out infoDic))
                {
                    throw new GeneralException("意外的信息字典标识" + data.InfoDicId.Value);
                }
                if (infoDic != null)
                {
                    data.Add("InfoDicName", infoDic.Name);
                }
            }
            if (!data.ContainsKey("IsConfigValid"))
            {
                data.Add("IsConfigValid", data.IsConfigValid);
            }
            if (!data.ContainsKey("DbIsNullable"))
            {
                data.Add("DbIsNullable", data.DbIsNullable);
            }
            if (!data.ContainsKey("DbTypeName"))
            {
                data.Add("DbTypeName", data.DbTypeName);
            }
            if (!data.ContainsKey("DbMaxLength"))
            {
                data.Add("DbMaxLength", data.DbMaxLength);
            }

            return(data);
        }
コード例 #10
0
ファイル: InfoDicSet.cs プロジェクト: HuZeHua/InternetDemo
            private void Handle(IAcSession acSession, Guid infoDicId, bool isCommand)
            {
                var          acDomain          = _set._acDomain;
                var          infoDicDicById    = _set._infoDicDicById;
                var          infoDicDicByCode  = _set._infoDicDicByCode;
                var          infoDicRepository = acDomain.RetrieveRequiredService <IRepository <InfoDic, Guid> >();
                InfoDicState infoDic;

                if (!acDomain.NodeHost.InfoDics.TryGetInfoDic(infoDicId, out infoDic))
                {
                    return;
                }
                var infoDicItems = acDomain.NodeHost.InfoDics.GetInfoDicItems(infoDic);

                if (infoDicItems != null && infoDicItems.Count > 0)
                {
                    throw new ValidationException("信息字典下有信息字典项时不能删除");
                }
                InfoDic entity = infoDicRepository.GetByKey(infoDicId);

                if (entity == null)
                {
                    return;
                }
                var bkState = InfoDicState.Create(acDomain, entity);

                lock (Locker)
                {
                    if (infoDicDicById.ContainsKey(entity.Id))
                    {
                        infoDicDicById.Remove(entity.Id);
                    }
                    if (infoDicDicByCode.ContainsKey(entity.Code))
                    {
                        infoDicDicByCode.Remove(entity.Code);
                    }
                    if (isCommand)
                    {
                        try
                        {
                            infoDicRepository.Remove(entity);
                            infoDicRepository.Context.Commit();
                        }
                        catch
                        {
                            if (!infoDicDicById.ContainsKey(entity.Id))
                            {
                                infoDicDicById.Add(entity.Id, bkState);
                            }
                            if (!infoDicDicByCode.ContainsKey(entity.Code))
                            {
                                infoDicDicByCode.Add(entity.Code, bkState);
                            }
                            infoDicRepository.Context.Rollback();
                            throw;
                        }
                    }
                }
                if (isCommand)
                {
                    acDomain.MessageDispatcher.DispatchMessage(new InfoDicRemovedEvent(acSession, entity, isPrivate: true));
                }
            }
コード例 #11
0
ファイル: InfoDicSet.cs プロジェクト: HuZeHua/InternetDemo
            private void Handle(IAcSession acSession, IInfoDicUpdateIo input, bool isCommand)
            {
                var acDomain          = _set._acDomain;
                var infoDicRepository = acDomain.RetrieveRequiredService <IRepository <InfoDic, Guid> >();

                if (string.IsNullOrEmpty(input.Code))
                {
                    throw new ValidationException("编码不能为空");
                }
                InfoDicState infoDic;

                if (!acDomain.NodeHost.InfoDics.TryGetInfoDic(input.Id, out infoDic))
                {
                    throw new NotExistException();
                }
                if (acDomain.NodeHost.InfoDics.TryGetInfoDic(input.Code, out infoDic) && infoDic.Id != input.Id)
                {
                    throw new ValidationException("重复的编码");
                }
                var entity = infoDicRepository.GetByKey(input.Id);

                if (entity == null)
                {
                    throw new NotExistException();
                }
                var bkState = InfoDicState.Create(acDomain, entity);

                entity.Update(input);

                var  newState     = InfoDicState.Create(acDomain, entity);
                bool stateChanged = newState != bkState;

                lock (Locker)
                {
                    if (stateChanged)
                    {
                        Update(newState);
                    }
                    if (isCommand)
                    {
                        try
                        {
                            infoDicRepository.Update(entity);
                            infoDicRepository.Context.Commit();
                        }
                        catch
                        {
                            if (stateChanged)
                            {
                                Update(bkState);
                            }
                            infoDicRepository.Context.Rollback();
                            throw;
                        }
                    }
                }
                if (isCommand && stateChanged)
                {
                    acDomain.MessageDispatcher.DispatchMessage(new InfoDicUpdatedEvent(acSession, entity, input, isPrivate: true));
                }
            }
コード例 #12
0
ファイル: InfoDicSet.cs プロジェクト: HuZeHua/InternetDemo
            private void Handle(IAcSession acSession, IInfoDicCreateIo input, bool isCommand)
            {
                var acDomain          = _set._acDomain;
                var infoDicDicById    = _set._infoDicDicById;
                var infoDicDicByCode  = _set._infoDicDicByCode;
                var infoDicRepository = acDomain.RetrieveRequiredService <IRepository <InfoDic, Guid> >();

                if (string.IsNullOrEmpty(input.Code))
                {
                    throw new ValidationException("编码不能为空");
                }
                if (!input.Id.HasValue)
                {
                    throw new ValidationException("标识是必须的");
                }
                InfoDic entity;

                lock (Locker)
                {
                    InfoDicState infoDic;
                    if (acDomain.NodeHost.InfoDics.TryGetInfoDic(input.Id.Value, out infoDic))
                    {
                        throw new ValidationException("给定标识标识的记录已经存在");
                    }
                    if (acDomain.NodeHost.InfoDics.TryGetInfoDic(input.Code, out infoDic) && infoDic.Id != input.Id.Value)
                    {
                        throw new ValidationException("重复的编码");
                    }

                    entity = InfoDic.Create(input);

                    var state = InfoDicState.Create(acDomain, entity);
                    if (!infoDicDicById.ContainsKey(entity.Id))
                    {
                        infoDicDicById.Add(entity.Id, state);
                    }
                    if (!infoDicDicByCode.ContainsKey(entity.Code))
                    {
                        infoDicDicByCode.Add(entity.Code, state);
                    }
                    if (isCommand)
                    {
                        try
                        {
                            infoDicRepository.Add(entity);
                            infoDicRepository.Context.Commit();
                        }
                        catch
                        {
                            if (infoDicDicById.ContainsKey(entity.Id))
                            {
                                infoDicDicById.Remove(entity.Id);
                            }
                            if (infoDicDicByCode.ContainsKey(entity.Code))
                            {
                                infoDicDicByCode.Remove(entity.Code);
                            }
                            infoDicRepository.Context.Rollback();
                            throw;
                        }
                    }
                }
                if (isCommand)
                {
                    acDomain.MessageDispatcher.DispatchMessage(new InfoDicAddedEvent(acSession, entity, input, isPrivate: true));
                }
            }