HotSpotController.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. using Hotline.Caching.Interfaces;
  2. using Hotline.FlowEngine;
  3. using Hotline.Repository.SqlSugar.Extensions;
  4. using Hotline.Settings;
  5. using Hotline.Settings.Hotspots;
  6. using Hotline.Settings.TimeLimits;
  7. using Hotline.Share.Dtos;
  8. using Hotline.Share.Dtos.Settings;
  9. using Hotline.Share.Enums.Order;
  10. using Hotline.Share.Enums.Settings;
  11. using MapsterMapper;
  12. using Microsoft.AspNetCore.Mvc;
  13. using StackExchange.Redis;
  14. using XF.Domain.Exceptions;
  15. using XF.Domain.Repository;
  16. using XF.Utility.EnumExtensions;
  17. namespace Hotline.Api.Controllers
  18. {
  19. /// <summary>
  20. /// 热点
  21. /// </summary>
  22. public class HotspotController : BaseController
  23. {
  24. private readonly IRepository<Hotspot> _hotspotTypeRepository;
  25. private readonly IMapper _mapper;
  26. private readonly ITimeLimitDomainService _timeLimitDomainService;
  27. private readonly ITimeLimitRepository _timeLimitRepository;
  28. private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
  29. public HotspotController(IRepository<Hotspot> hotspotTypeRepository,
  30. IMapper mapper, ITimeLimitDomainService timeLimitDomainService, ITimeLimitRepository timeLimitRepository, ISystemDicDataCacheManager sysDicDataCacheManager)
  31. {
  32. _hotspotTypeRepository = hotspotTypeRepository;
  33. _mapper = mapper;
  34. _timeLimitDomainService = timeLimitDomainService;
  35. _timeLimitRepository = timeLimitRepository;
  36. _sysDicDataCacheManager = sysDicDataCacheManager;
  37. }
  38. #region 热点
  39. /// <summary>
  40. /// 查询子项
  41. /// </summary>
  42. [HttpGet("children")]
  43. public async Task<IReadOnlyList<Hotspot>> GetChildren([FromQuery] string? id)
  44. {
  45. return await _hotspotTypeRepository.Queryable()
  46. .Where(x => x.ParentId == id)
  47. .OrderBy(d => d.HotSpotName)
  48. .ToListAsync();
  49. }
  50. /// <summary>
  51. /// 查询热点数据(包含所有根目录及所查热点的所有上级对象)
  52. /// <remarks>
  53. /// 编辑页面使用
  54. /// </remarks>
  55. /// </summary>
  56. /// <param name="id"></param>
  57. /// <returns></returns>
  58. [HttpGet("{id}/with-parents")]
  59. public async Task<IReadOnlyList<Hotspot>> GetWithParents(string id)
  60. {
  61. var targetList = await _hotspotTypeRepository.Queryable()
  62. .ToTreeAsync(d => d.Children, d => d.ParentId, null, new[] { id });
  63. var topIds = targetList.Select(d => d.Id);
  64. var hotspots = await _hotspotTypeRepository.Queryable()
  65. .Where(d => string.IsNullOrEmpty(d.ParentId) && !topIds.Contains(d.Id))
  66. .ToListAsync();
  67. hotspots.AddRange(targetList);
  68. return hotspots.OrderBy(d => d.HotSpotName).ToList();
  69. }
  70. #endregion
  71. #region 时限管理
  72. /// <summary>
  73. /// 获取时限配置页面基础数据
  74. /// </summary>
  75. /// <returns></returns>
  76. [HttpGet("timelimit-basedata")]
  77. public async Task<object> GetTimeLimitBaseData()
  78. {
  79. return new
  80. {
  81. //ModuleOptions = WorkflowModule.Modules.ToList(),//todo
  82. TimeType = EnumExts.GetDescriptions<ETimeType>(),
  83. BaseData = TimeLimitBaseData.GetBaseData(),
  84. //AcceptType = EnumExts.GetDescriptions<EAcceptType>(),
  85. AcceptType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType),
  86. //PushType = _sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.PushType),
  87. SourceChannel = _sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.SourceChannel),
  88. IdentityType = EnumExts.GetDescriptions<EIdentityType>(),
  89. OrderType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.OrderType),
  90. CertType = _sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.LicenceType),
  91. EmergencyLevel = EnumExts.GetDescriptions<EEmergencyLevel>()
  92. };
  93. }
  94. /// <summary>
  95. /// 新增时限管理
  96. /// </summary>
  97. /// <param name="dto"></param>
  98. /// <returns>数据主键</returns>
  99. [HttpPost("add-timelimit")]
  100. public async Task<string> AddTimeLimit([FromBody] AddTimeLimitDto dto)
  101. {
  102. var model = _mapper.Map<TimeLimit>(dto);
  103. model.TimeLimitState = ETimeLimitState.Draft;
  104. return await _timeLimitDomainService.AddAsync(model, HttpContext.RequestAborted);
  105. }
  106. /// <summary>
  107. /// 修改时限管理
  108. /// </summary>
  109. /// <param name="dto"></param>
  110. /// <returns></returns>
  111. [HttpPost("update-timelimit")]
  112. public async Task UpdateTimeLimit([FromBody] UpdateTimeLimitDto dto)
  113. {
  114. var model = _mapper.Map<TimeLimit>(dto);
  115. await _timeLimitDomainService.UpdateAsync(model, HttpContext.RequestAborted);
  116. }
  117. /// <summary>
  118. /// 获取对象
  119. /// </summary>
  120. /// <param name="id"></param>
  121. /// <returns></returns>
  122. [HttpGet("timelimit/{id}")]
  123. public async Task<TimeLimit?> GetTimeLimit(string id)
  124. {
  125. return await _timeLimitRepository.GetAsync(id, HttpContext.RequestAborted);
  126. }
  127. /// <summary>
  128. /// 获取时限管理列表
  129. /// </summary>
  130. /// <param name="dto"></param>
  131. /// <returns></returns>
  132. [HttpGet("paged-timelimit")]
  133. public async Task<PagedDto<TimeLimit>> QueryPagedTimeLimit([FromQuery] QueryPagedTimeLimitPagedDto dto)
  134. {
  135. var (total, items) = await _timeLimitRepository.Queryable()
  136. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.TimeLimitName.Contains(dto.Keyword!))
  137. .OrderByDescending(d => d.CreationTime)
  138. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  139. return new PagedDto<TimeLimit>(total, _mapper.Map<IReadOnlyList<TimeLimit>>(items));
  140. }
  141. /// <summary>
  142. /// 删除时限(草稿)
  143. /// </summary>
  144. /// <param name="id"></param>
  145. /// <returns></returns>
  146. [HttpDelete("deltimelimit")]
  147. public async Task DelTimeLimit(string id)
  148. {
  149. var model = await _timeLimitRepository.GetAsync(id, HttpContext.RequestAborted);
  150. if (model == null)
  151. {
  152. throw UserFriendlyException.SameMessage("无效数据");
  153. }
  154. if (model.TimeLimitState != ETimeLimitState.Draft)
  155. {
  156. throw UserFriendlyException.SameMessage("无法删除,请刷新页面");
  157. }
  158. await _timeLimitRepository.RemoveAsync(id, true, HttpContext.RequestAborted);
  159. }
  160. /// <summary>
  161. /// 启用时限
  162. /// </summary>
  163. /// <param name="id"></param>
  164. /// <returns></returns>
  165. [HttpGet("enable-timelimit/{id}")]
  166. public async Task EnableTimeLimit(string id)
  167. {
  168. var model = await _timeLimitRepository.GetAsync(id, HttpContext.RequestAborted);
  169. if (model == null)
  170. {
  171. throw UserFriendlyException.SameMessage("无效数据");
  172. }
  173. if (model.TimeLimitState == ETimeLimitState.Enable)
  174. {
  175. throw UserFriendlyException.SameMessage("该配置已生效");
  176. }
  177. var list = await _timeLimitRepository.QueryAsync(x => x.WorkflowCode == model.WorkflowCode && x.TimeLimitState == ETimeLimitState.Enable);
  178. list.ForEach(x => x.TimeLimitState = ETimeLimitState.Disable);
  179. model.TimeLimitState = ETimeLimitState.Enable;
  180. list.Add(model);
  181. await _timeLimitRepository.UpdateRangeAsync(list, HttpContext.RequestAborted);
  182. }
  183. /// <summary>
  184. /// 禁用时限
  185. /// </summary>
  186. /// <param name="id"></param>
  187. /// <returns></returns>
  188. [HttpGet("disable-timelimit/{id}")]
  189. public async Task DisableTimeLimit(string id)
  190. {
  191. var model = await _timeLimitRepository.GetAsync(id, HttpContext.RequestAborted);
  192. if (model == null)
  193. {
  194. throw UserFriendlyException.SameMessage("无效数据");
  195. }
  196. if (model.TimeLimitState == ETimeLimitState.Draft)
  197. {
  198. throw UserFriendlyException.SameMessage("该配置未生效,无法禁用");
  199. }
  200. if (model.TimeLimitState == ETimeLimitState.Disable)
  201. {
  202. throw UserFriendlyException.SameMessage("该配置已禁用");
  203. }
  204. model.TimeLimitState = ETimeLimitState.Disable;
  205. await _timeLimitRepository.UpdateAsync(model, HttpContext.RequestAborted);
  206. }
  207. #endregion
  208. #region 工作日设定
  209. #endregion
  210. }
  211. }