Entity.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  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. public void InitId() => Id = SequentialStringGenerator.Create();
  41. }
  42. /// <summary>
  43. /// 实体(带有创建时间)
  44. /// </summary>
  45. public abstract class CreationEntity : Entity, IHasCreationTime
  46. {
  47. /// <summary>
  48. /// 创建时间
  49. /// </summary>
  50. [SugarColumn(ColumnDescription = "创建时间")]
  51. public DateTime CreationTime { get; set; }
  52. }
  53. /// <summary>
  54. /// 实体(带有软删除)
  55. /// </summary>
  56. public abstract class SoftDeleteEntity : Entity, IHasDeletionTime, ISoftDelete
  57. {
  58. /// <summary>
  59. /// 删除时间
  60. /// </summary>
  61. [SugarColumn(ColumnDescription = "删除时间")]
  62. public DateTime? DeletionTime { get; set; }
  63. [SugarColumn(ColumnDescription = "是否删除")]
  64. public bool IsDeleted { get; set; }
  65. public void SoftDelete()
  66. {
  67. IsDeleted = true;
  68. DeletionTime = DateTime.Now;
  69. }
  70. }
  71. /// <summary>
  72. /// 实体(带有创建时间和软删除)
  73. /// </summary>
  74. public abstract class CreationSoftDeleteEntity : CreationEntity, IHasDeletionTime, ISoftDelete
  75. {
  76. [SugarColumn(ColumnDescription = "是否删除", DefaultValue = "f")]
  77. public bool IsDeleted { get; set; }
  78. /// <summary>
  79. /// 删除时间
  80. /// </summary>
  81. [SugarColumn(ColumnDescription = "删除时间")]
  82. public DateTime? DeletionTime { get; set; }
  83. public void SoftDelete()
  84. {
  85. IsDeleted = true;
  86. DeletionTime = DateTime.Now;
  87. }
  88. public void Recover() => IsDeleted = false;
  89. }
  90. public abstract class CreationModificationEntity : CreationEntity, IHasModificationTime
  91. {
  92. /// <summary>
  93. /// 最近更新时间
  94. /// </summary>
  95. [SugarColumn(ColumnDescription = "最近更新时间")]
  96. public DateTime? LastModificationTime { get; set; }
  97. public void Modified() => LastModificationTime = DateTime.Now;
  98. }
  99. /// <summary>
  100. /// 全状态实体(创建时间、更新时间、软删除)
  101. /// </summary>
  102. public abstract class FullStateEntity : CreationSoftDeleteEntity, IHasModificationTime
  103. {
  104. /// <summary>
  105. /// 最近更新时间
  106. /// </summary>
  107. [SugarColumn(ColumnDescription = "最近更新时间")]
  108. public DateTime? LastModificationTime { get; set; }
  109. public void Modified() => LastModificationTime = DateTime.Now;
  110. }
  111. public abstract class WorkflowEntity : FullStateEntity, IWorkflow
  112. {
  113. [SugarColumn(IsNullable = true)] public string? WorkflowId { get; set; }
  114. /// <summary>
  115. /// 过期时间配置id
  116. /// </summary>
  117. [SugarColumn(IsNullable = true)]
  118. public string? ExpiredTimeConfigId { get; set; }
  119. [SugarColumn(ColumnDataType = "json", IsJson = true)]
  120. public List<string>? FlowedOrgIds { get; set; } = new();
  121. [SugarColumn(ColumnDataType = "json", IsJson = true)]
  122. public List<string>? FlowedUserIds { get; set; } = new();
  123. //[SugarColumn(ColumnDataType = "varchar(600)", IsJson = true)]
  124. //public List<string> AssignRoles { get; set; } = new();
  125. public void Assign(EFlowAssignType type, string handler)
  126. {
  127. handler = handler.ToLower();
  128. switch (type)
  129. {
  130. case EFlowAssignType.Org:
  131. var orgCodes = handler.GetHigherOrgCodes(true).ToList();
  132. FlowedOrgIds.AddRange(orgCodes);
  133. FlowedOrgIds = FlowedOrgIds.Distinct().ToList();
  134. break;
  135. case EFlowAssignType.User:
  136. if (!FlowedUserIds.Exists(d => d == handler))
  137. FlowedUserIds.Add(handler);
  138. break;
  139. default:
  140. throw new ArgumentOutOfRangeException(nameof(type), type, null);
  141. }
  142. }
  143. public void Assign(EFlowAssignType type, IEnumerable<string> handlers)
  144. {
  145. handlers = handlers.Select(d => d.ToLower());
  146. switch (type)
  147. {
  148. case EFlowAssignType.Org:
  149. var orgCodes = handlers.SelectMany(d => d.GetHigherOrgCodes(true)).ToList();
  150. FlowedOrgIds.AddRange(orgCodes);
  151. FlowedOrgIds = FlowedOrgIds.Distinct().ToList();
  152. break;
  153. case EFlowAssignType.User:
  154. FlowedUserIds.AddRange(handlers);
  155. FlowedUserIds = FlowedUserIds.Distinct().ToList();
  156. break;
  157. default:
  158. throw new ArgumentOutOfRangeException(nameof(type), type, null);
  159. }
  160. }
  161. }
  162. public abstract class PositionEntity : FullStateEntity
  163. {
  164. public PositionEntity()
  165. {
  166. FullAddress ??= $"{Address}{Street}";
  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. /// <summary>
  184. /// 行政区划地址
  185. /// </summary>
  186. public string? Address { get; set; }
  187. /// <summary>
  188. /// 详细街道
  189. /// </summary>
  190. public string? Street { get; set; }
  191. /// <summary>
  192. /// 完整地址
  193. /// </summary>
  194. public string? FullAddress { get; set; }
  195. }
  196. public abstract class PositionWorkflowEntity : PositionEntity, IWorkflow
  197. {
  198. [SugarColumn(IsNullable = true)] public string? WorkflowId { get; set; }
  199. /// <summary>
  200. /// 过期时间配置id
  201. /// </summary>
  202. [SugarColumn(IsNullable = true)]
  203. public string? ExpiredTimeConfigId { get; set; }
  204. [SugarColumn(ColumnDataType = "json", IsJson = true)]
  205. public List<string>? FlowedOrgIds { get; set; } = new();
  206. [SugarColumn(ColumnDataType = "json", IsJson = true)]
  207. public List<string>? FlowedUserIds { get; set; } = new();
  208. //[SugarColumn(ColumnDataType = "varchar(600)", IsJson = true)]
  209. //public List<string> AssignRoles { get; set; } = new();
  210. public void Assign(EFlowAssignType type, string handler)
  211. {
  212. handler = handler.ToLower();
  213. switch (type)
  214. {
  215. case EFlowAssignType.Org:
  216. var orgCodes = handler.GetHigherOrgCodes(true).ToList();
  217. FlowedOrgIds.AddRange(orgCodes);
  218. FlowedOrgIds = FlowedOrgIds.Distinct().ToList();
  219. break;
  220. case EFlowAssignType.User:
  221. if (!FlowedUserIds.Exists(d => d == handler))
  222. FlowedUserIds.Add(handler);
  223. break;
  224. default:
  225. throw new ArgumentOutOfRangeException(nameof(type), type, null);
  226. }
  227. }
  228. public void Assign(EFlowAssignType type, IEnumerable<string> handlers)
  229. {
  230. handlers = handlers.Select(d => d.ToLower());
  231. switch (type)
  232. {
  233. case EFlowAssignType.Org:
  234. var orgCodes = handlers.SelectMany(d => d.GetHigherOrgCodes(true)).ToList();
  235. FlowedOrgIds.AddRange(orgCodes);
  236. FlowedOrgIds = FlowedOrgIds.Distinct().ToList();
  237. break;
  238. case EFlowAssignType.User:
  239. FlowedUserIds.AddRange(handlers);
  240. FlowedUserIds = FlowedUserIds.Distinct().ToList();
  241. break;
  242. default:
  243. throw new ArgumentOutOfRangeException(nameof(type), type, null);
  244. }
  245. }
  246. }