Entity.cs 8.7 KB

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