SysDicSet.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. namespace NTMiner.Core.Impl {
  6. internal class SysDicSet : ISysDicSet {
  7. private readonly Dictionary<string, SysDicData> _dicByCode = new Dictionary<string, SysDicData>(StringComparer.OrdinalIgnoreCase);
  8. private readonly Dictionary<Guid, SysDicData> _dicById = new Dictionary<Guid, SysDicData>();
  9. public SysDicSet(IServerContext context) {
  10. context.BuildCmdPath<AddSysDicCommand>("添加系统字典", LogEnum.DevConsole,
  11. action: message => {
  12. InitOnece();
  13. if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
  14. throw new ArgumentNullException();
  15. }
  16. if (string.IsNullOrEmpty(message.Input.Code)) {
  17. throw new ValidationException("dic code can't be null or empty");
  18. }
  19. if (_dicById.ContainsKey(message.Input.GetId())) {
  20. return;
  21. }
  22. if (_dicByCode.ContainsKey(message.Input.Code)) {
  23. throw new ValidationException("编码重复");
  24. }
  25. SysDicData entity = new SysDicData().Update(message.Input);
  26. _dicById.Add(entity.Id, entity);
  27. _dicByCode.Add(entity.Code, entity);
  28. var repository = NTMinerRoot.CreateServerRepository<SysDicData>();
  29. repository.Add(entity);
  30. VirtualRoot.RaiseEvent(new SysDicAddedEvent(entity));
  31. });
  32. context.BuildCmdPath<UpdateSysDicCommand>("更新系统字典", LogEnum.DevConsole,
  33. action: message => {
  34. InitOnece();
  35. if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
  36. throw new ArgumentNullException();
  37. }
  38. if (string.IsNullOrEmpty(message.Input.Code)) {
  39. throw new ValidationException("sysDic code can't be null or empty");
  40. }
  41. if (!_dicById.ContainsKey(message.Input.GetId())) {
  42. return;
  43. }
  44. SysDicData entity = _dicById[message.Input.GetId()];
  45. if (ReferenceEquals(entity, message.Input)) {
  46. return;
  47. }
  48. entity.Update(message.Input);
  49. var repository = NTMinerRoot.CreateServerRepository<SysDicData>();
  50. repository.Update(entity);
  51. VirtualRoot.RaiseEvent(new SysDicUpdatedEvent(entity));
  52. });
  53. context.BuildCmdPath<RemoveSysDicCommand>("移除系统字典", LogEnum.DevConsole,
  54. action: message => {
  55. InitOnece();
  56. if (message == null || message.EntityId == Guid.Empty) {
  57. throw new ArgumentNullException();
  58. }
  59. if (!_dicById.ContainsKey(message.EntityId)) {
  60. return;
  61. }
  62. SysDicData entity = _dicById[message.EntityId];
  63. List<Guid> toRemoves = context.SysDicItemSet.GetSysDicItems(entity.Code).Select(a => a.GetId()).ToList();
  64. foreach (var id in toRemoves) {
  65. VirtualRoot.Execute(new RemoveSysDicItemCommand(id));
  66. }
  67. _dicById.Remove(entity.Id);
  68. if (_dicByCode.ContainsKey(entity.Code)) {
  69. _dicByCode.Remove(entity.Code);
  70. }
  71. var repository = NTMinerRoot.CreateServerRepository<SysDicData>();
  72. repository.Remove(entity.Id);
  73. VirtualRoot.RaiseEvent(new SysDicRemovedEvent(entity));
  74. });
  75. }
  76. private bool _isInited = false;
  77. private readonly object _locker = new object();
  78. private void InitOnece() {
  79. if (_isInited) {
  80. return;
  81. }
  82. Init();
  83. }
  84. private void Init() {
  85. lock (_locker) {
  86. if (!_isInited) {
  87. var repository = NTMinerRoot.CreateServerRepository<SysDicData>();
  88. foreach (var item in repository.GetAll()) {
  89. if (!_dicById.ContainsKey(item.GetId())) {
  90. _dicById.Add(item.GetId(), item);
  91. }
  92. if (!_dicByCode.ContainsKey(item.Code)) {
  93. _dicByCode.Add(item.Code, item);
  94. }
  95. }
  96. _isInited = true;
  97. }
  98. }
  99. }
  100. public bool ContainsKey(Guid sysDicId) {
  101. InitOnece();
  102. return _dicById.ContainsKey(sysDicId);
  103. }
  104. public bool ContainsKey(string sysDicCode) {
  105. InitOnece();
  106. return _dicByCode.ContainsKey(sysDicCode);
  107. }
  108. public bool TryGetSysDic(string sysDicCode, out ISysDic sysDic) {
  109. InitOnece();
  110. var r = _dicByCode.TryGetValue(sysDicCode, out SysDicData d);
  111. sysDic = d;
  112. return r;
  113. }
  114. public bool TryGetSysDic(Guid sysDicId, out ISysDic sysDic) {
  115. InitOnece();
  116. var r = _dicById.TryGetValue(sysDicId, out SysDicData d);
  117. sysDic = d;
  118. return r;
  119. }
  120. public IEnumerator<ISysDic> GetEnumerator() {
  121. InitOnece();
  122. return _dicById.Values.GetEnumerator();
  123. }
  124. IEnumerator IEnumerable.GetEnumerator() {
  125. InitOnece();
  126. return _dicById.Values.GetEnumerator();
  127. }
  128. }
  129. }