Entity.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. using SqlSugar;
  2. using XF.Domain.Entities;
  3. using XF.Domain.Events;
  4. using XF.Domain.Extensions;
  5. using XF.Utility.SequentialId;
  6. namespace XF.Domain.Repository;
  7. public abstract class Entity : IEntity<string>, IDomainEvents, IDataPermission, ITable
  8. {
  9. private List<IAppNotification> _domainEvents = new();
  10. public string Id { get; set; }
  11. [SugarColumn(ColumnDescription = "创建人")]
  12. public string? CreatorId { get; set; }
  13. public string? CreatorName { get; set; }
  14. [SugarColumn(ColumnDescription = "组织Id")]
  15. public string? CreatorOrgId { get; set; }
  16. public string? CreatorOrgName { get; set; }
  17. public int CreatorOrgLevel { get; set; } = 0;
  18. /// <summary>
  19. /// 一级部门Id
  20. /// </summary>
  21. [SugarColumn(ColumnDescription = "数据权限区域Id")]
  22. public string? AreaId { get; set; }
  23. public void CreateDataPermission(string creatorId, string? creatorName, string orgId, string? orgName, int orgLevel,
  24. string? areaId)
  25. {
  26. CreatorId = creatorId;
  27. CreatorName = creatorName;
  28. CreatorOrgId = orgId;
  29. CreatorOrgName = orgName;
  30. CreatorOrgLevel = orgLevel;
  31. AreaId = areaId;
  32. }
  33. public void AddEvent(IAppNotification notification)
  34. {
  35. if (_domainEvents.Contains(notification)) return;
  36. _domainEvents.Add(notification);
  37. }
  38. public void ClearEvents() => _domainEvents.Clear();
  39. public ICollection<IAppNotification> QueryAllEvents() => _domainEvents;
  40. }
  41. /// <summary>
  42. /// 实体(带有创建时间)
  43. /// </summary>
  44. public abstract class CreationEntity : Entity, IHasCreationTime
  45. {
  46. /// <summary>
  47. /// 创建时间
  48. /// </summary>
  49. [SugarColumn(ColumnDescription = "创建时间")]
  50. public DateTime CreationTime { get; set; }
  51. }
  52. /// <summary>
  53. /// 实体(带有软删除)
  54. /// </summary>
  55. public abstract class SoftDeleteEntity : Entity, IHasDeletionTime, ISoftDelete
  56. {
  57. /// <summary>
  58. /// 删除时间
  59. /// </summary>
  60. [SugarColumn(ColumnDescription = "删除时间")]
  61. public DateTime? DeletionTime { get; set; }
  62. [SugarColumn(ColumnDescription = "是否删除")]
  63. public bool IsDeleted { get; set; }
  64. public void SoftDelete()
  65. {
  66. IsDeleted = true;
  67. DeletionTime = DateTime.Now;
  68. }
  69. }
  70. /// <summary>
  71. /// 实体(带有创建时间和软删除)
  72. /// </summary>
  73. public abstract class CreationSoftDeleteEntity : CreationEntity, IHasDeletionTime, ISoftDelete
  74. {
  75. [SugarColumn(ColumnDescription = "是否删除", DefaultValue = "f")]
  76. public bool IsDeleted { get; set; }
  77. /// <summary>
  78. /// 删除时间
  79. /// </summary>
  80. [SugarColumn(ColumnDescription = "删除时间")]
  81. public DateTime? DeletionTime { get; set; }
  82. public void SoftDelete()
  83. {
  84. IsDeleted = true;
  85. DeletionTime = DateTime.Now;
  86. }
  87. public void Recover() => IsDeleted = false;
  88. }
  89. public abstract class CreationModificationEntity : CreationEntity, IHasModificationTime
  90. {
  91. /// <summary>
  92. /// 最近更新时间
  93. /// </summary>
  94. [SugarColumn(ColumnDescription = "最近更新时间")]
  95. public DateTime? LastModificationTime { get; set; }
  96. public void Modified() => LastModificationTime = DateTime.Now;
  97. }
  98. /// <summary>
  99. /// 全状态实体(创建时间、更新时间、软删除)
  100. /// </summary>
  101. public abstract class FullStateEntity : CreationSoftDeleteEntity, IHasModificationTime
  102. {
  103. /// <summary>
  104. /// 最近更新时间
  105. /// </summary>
  106. [SugarColumn(ColumnDescription = "最近更新时间")]
  107. public DateTime? LastModificationTime { get; set; }
  108. public void Modified() => LastModificationTime = DateTime.Now;
  109. }
  110. public abstract class WorkflowEntity : FullStateEntity, IWorkflow
  111. {
  112. [SugarColumn(IsNullable = true)] public string? WorkflowId { get; set; }
  113. /// <summary>
  114. /// 过期时间配置id
  115. /// </summary>
  116. [SugarColumn(IsNullable = true)]
  117. public string? ExpiredTimeConfigId { get; set; }
  118. [SugarColumn(ColumnDataType = "json", IsJson = true)]
  119. public List<string>? FlowedOrgIds { get; set; } = new();
  120. [SugarColumn(ColumnDataType = "json", IsJson = true)]
  121. public List<string>? FlowedUserIds { get; set; } = new();
  122. //[SugarColumn(ColumnDataType = "varchar(600)", IsJson = true)]
  123. //public List<string> AssignRoles { get; set; } = new();
  124. public void Assign(EFlowAssignType type, string handler)
  125. {
  126. handler = handler.ToLower();
  127. switch (type)
  128. {
  129. case EFlowAssignType.Org:
  130. var orgCodes = handler.GetHigherOrgCodes(true).ToList();
  131. FlowedOrgIds.AddRange(orgCodes);
  132. FlowedOrgIds = FlowedOrgIds.Distinct().ToList();
  133. break;
  134. case EFlowAssignType.User:
  135. if (!FlowedUserIds.Exists(d => d == handler))
  136. FlowedUserIds.Add(handler);
  137. break;
  138. default:
  139. throw new ArgumentOutOfRangeException(nameof(type), type, null);
  140. }
  141. }
  142. public void Assign(EFlowAssignType type, IEnumerable<string> handlers)
  143. {
  144. handlers = handlers.Select(d => d.ToLower());
  145. switch (type)
  146. {
  147. case EFlowAssignType.Org:
  148. var orgCodes = handlers.SelectMany(d => d.GetHigherOrgCodes(true)).ToList();
  149. FlowedOrgIds.AddRange(orgCodes);
  150. FlowedOrgIds = FlowedOrgIds.Distinct().ToList();
  151. break;
  152. case EFlowAssignType.User:
  153. FlowedUserIds.AddRange(handlers);
  154. FlowedUserIds = FlowedUserIds.Distinct().ToList();
  155. break;
  156. default:
  157. throw new ArgumentOutOfRangeException(nameof(type), type, null);
  158. }
  159. }
  160. }
  161. public abstract class PositionEntity : FullStateEntity
  162. {
  163. public PositionEntity()
  164. {
  165. FullAddress ??= $"{Address}{Street}";
  166. }
  167. /// <summary>
  168. /// 经度
  169. /// </summary>
  170. [SugarColumn(ColumnDescription = "经度")]
  171. public double? Longitude { get; set; }
  172. /// <summary>
  173. /// 维度
  174. /// </summary>
  175. [SugarColumn(ColumnDescription = "纬度")]
  176. public double? Latitude { get; set; }
  177. /// <summary>
  178. /// 行政区划编码
  179. /// </summary>
  180. [SugarColumn(ColumnDescription = "行政区划编码", IsNullable = true)]
  181. public string? AreaCode { get; set; }
  182. /// <summary>
  183. /// 行政区划地址
  184. /// </summary>
  185. public string? Address { get; set; }
  186. /// <summary>
  187. /// 详细街道
  188. /// </summary>
  189. public string? Street { get; set; }
  190. /// <summary>
  191. /// 完整地址
  192. /// </summary>
  193. public string? FullAddress { get; set; }
  194. }
  195. public abstract class PositionWorkflowEntity : PositionEntity, IWorkflow
  196. {
  197. [SugarColumn(IsNullable = true)] public string? WorkflowId { get; set; }
  198. /// <summary>
  199. /// 过期时间配置id
  200. /// </summary>
  201. [SugarColumn(IsNullable = true)]
  202. public string? ExpiredTimeConfigId { get; set; }
  203. [SugarColumn(ColumnDataType = "json", IsJson = true)]
  204. public List<string>? FlowedOrgIds { get; set; } = new();
  205. [SugarColumn(ColumnDataType = "json", IsJson = true)]
  206. public List<string>? FlowedUserIds { get; set; } = new();
  207. //[SugarColumn(ColumnDataType = "varchar(600)", IsJson = true)]
  208. //public List<string> AssignRoles { get; set; } = new();
  209. public void Assign(EFlowAssignType type, string handler)
  210. {
  211. handler = handler.ToLower();
  212. switch (type)
  213. {
  214. case EFlowAssignType.Org:
  215. var orgCodes = handler.GetHigherOrgCodes(true).ToList();
  216. FlowedOrgIds.AddRange(orgCodes);
  217. FlowedOrgIds = FlowedOrgIds.Distinct().ToList();
  218. break;
  219. case EFlowAssignType.User:
  220. if (!FlowedUserIds.Exists(d => d == handler))
  221. FlowedUserIds.Add(handler);
  222. break;
  223. default:
  224. throw new ArgumentOutOfRangeException(nameof(type), type, null);
  225. }
  226. }
  227. public void Assign(EFlowAssignType type, IEnumerable<string> handlers)
  228. {
  229. handlers = handlers.Select(d => d.ToLower());
  230. switch (type)
  231. {
  232. case EFlowAssignType.Org:
  233. var orgCodes = handlers.SelectMany(d => d.GetHigherOrgCodes(true)).ToList();
  234. FlowedOrgIds.AddRange(orgCodes);
  235. FlowedOrgIds = FlowedOrgIds.Distinct().ToList();
  236. break;
  237. case EFlowAssignType.User:
  238. FlowedUserIds.AddRange(handlers);
  239. FlowedUserIds = FlowedUserIds.Distinct().ToList();
  240. break;
  241. default:
  242. throw new ArgumentOutOfRangeException(nameof(type), type, null);
  243. }
  244. }
  245. public void InitId() => Id = SequentialStringGenerator.Create();
  246. }