/// <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))); }
/// <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)); }
/// <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); }
/// <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); }
/// <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); }
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; } }
/// <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); }
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)); } }
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); }
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)); } }
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)); } }
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)); } }