SettingController.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. using Hotline.Caching.Interfaces;
  2. using Hotline.Caching.Services;
  3. using Hotline.CallCenter.Manage;
  4. using Hotline.Orders;
  5. using Hotline.Permissions;
  6. using Hotline.Repository.SqlSugar.Extensions;
  7. using Hotline.Repository.SqlSugar.Ts;
  8. using Hotline.Settings;
  9. using Hotline.Settings.TimeLimits;
  10. using Hotline.Share.Dtos;
  11. using Hotline.Share.Dtos.Order;
  12. using Hotline.Share.Dtos.Settings;
  13. using Hotline.Share.Enums.Settings;
  14. using Hotline.Share.Requests;
  15. using MapsterMapper;
  16. using Microsoft.AspNetCore.Authorization;
  17. using Microsoft.AspNetCore.Mvc;
  18. using XF.Domain.Exceptions;
  19. using XF.Domain.Repository;
  20. using XF.Utility.EnumExtensions;
  21. namespace Hotline.Api.Controllers
  22. {
  23. /// <summary>
  24. /// 系统参数相关接口
  25. /// </summary>
  26. public class SettingController : BaseController
  27. {
  28. private readonly IVoiceFileDomainService _voiceFileDomainService;
  29. private readonly IRepository<SystemSetting> _systemSettingsRepository;
  30. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  31. private readonly IDaySettingRepository _daysettingRepository;
  32. private readonly IMapper _mapper;
  33. private readonly IBusinessTagRepository _businessTag;
  34. private readonly IRepositoryTextSearch<OrderTs> _repositoryts;
  35. private readonly IDaySettingCacheManager _daySettingCacheManager;
  36. public SettingController(
  37. IVoiceFileDomainService voiceFileDomainService,
  38. IRepository<SystemSetting> systemSettingsRepository,
  39. ISystemSettingCacheManager systemSettingCacheManager,
  40. IDaySettingRepository daySettingRepository,
  41. IMapper mapper,
  42. IBusinessTagRepository businessTag,
  43. IRepositoryTextSearch<OrderTs> repositoryts,
  44. IDaySettingCacheManager daySettingCacheManager)
  45. {
  46. _voiceFileDomainService = voiceFileDomainService;
  47. _systemSettingsRepository = systemSettingsRepository;
  48. _systemSettingCacheManager = systemSettingCacheManager;
  49. _daysettingRepository = daySettingRepository;
  50. _mapper = mapper;
  51. _businessTag = businessTag;
  52. _repositoryts = repositoryts;
  53. _daySettingCacheManager = daySettingCacheManager;
  54. }
  55. /// <summary>
  56. /// 查询语音文件
  57. /// </summary>
  58. /// <returns></returns>
  59. [HttpGet("voicequerylist")]
  60. public async Task<List<string>> VoiceQueryList()
  61. {
  62. return await _voiceFileDomainService.VoiceQueryListAsync(HttpContext.RequestAborted);
  63. }
  64. /// <summary>
  65. /// 删除语音文件
  66. /// </summary>
  67. /// <param name="voiceFileName"></param>
  68. /// <returns></returns>
  69. [HttpPost("removevoicefile")]
  70. public async Task RemoveVoiceFile(string voiceFileName)
  71. {
  72. await _voiceFileDomainService.RemoveVoiceFileAsync(new RemoveVoiceFileRequest(voiceFileName), HttpContext.RequestAborted);
  73. }
  74. #region 系统参数
  75. /// <summary>
  76. /// 获取系统参数列表
  77. /// </summary>
  78. /// <returns></returns>
  79. [HttpGet("getsyssettings")]
  80. public async Task<PagedDto<SystemSetting>> GetSysSettings([FromQuery]SettingsQueryDto dto)
  81. {
  82. //return await _systemSettingsRepository.QueryAsync(x => true);
  83. var (total,items) = await _systemSettingsRepository.Queryable()
  84. .Includes(d=>d.Creator)
  85. .WhereIF(!string.IsNullOrEmpty(dto.settingName), d => d.SettingName.Contains(dto.settingName))
  86. .WhereIF(!string.IsNullOrEmpty(dto.code),d=>d.Code.Contains(dto.code))
  87. .OrderBy(d=>d.CreationTime)
  88. .OrderBy(d => d.Sort)
  89. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  90. return new PagedDto<SystemSetting>(total, items);
  91. }
  92. /// <summary>
  93. /// 获取系统参数
  94. /// </summary>
  95. /// <param name="id"></param>
  96. /// <returns></returns>
  97. [HttpGet("getsetting-entity/{id}")]
  98. public async Task<SystemSetting?> GetSettingEntity(string id)
  99. {
  100. return await _systemSettingsRepository.GetAsync(id, HttpContext.RequestAborted);
  101. }
  102. /// <summary>
  103. /// 通过code获取系统参数
  104. /// </summary>
  105. /// <param name="code"></param>
  106. /// <returns></returns>
  107. [AllowAnonymous]
  108. [HttpGet("getsetting-code/{code}")]
  109. public async Task<SystemSetting?> GetSettingByCode(string code)
  110. {
  111. return _systemSettingCacheManager.GetSetting(code);
  112. }
  113. /// <summary>
  114. /// 新增系统参数
  115. /// </summary>
  116. /// <param name="dto"></param>
  117. /// <returns></returns>
  118. [HttpPost("setting-add")]
  119. public async Task AddSetting([FromBody]AddSettingDto dto)
  120. {
  121. var setting = _mapper.Map<SystemSetting>(dto);
  122. await _systemSettingsRepository.AddAsync(setting, HttpContext.RequestAborted);
  123. }
  124. /// <summary>
  125. /// 修改配置
  126. /// </summary>
  127. /// <param name="dto"></param>
  128. /// <returns></returns>
  129. [HttpPost("modifysettings")]
  130. public async Task ModifySettingsAsync([FromBody]ModifySettingDto dto)
  131. {
  132. var model = await _systemSettingsRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
  133. if (model is null)
  134. throw UserFriendlyException.SameMessage("未知配置,请刷新界面");
  135. model.SettingValue = dto.SettingValue;
  136. model.Sort = dto.Sort;
  137. model.Remark = dto.Remark;
  138. _systemSettingCacheManager.DelSystemSetting(model.Code);
  139. await _systemSettingsRepository.UpdateAsync(model, HttpContext.RequestAborted);
  140. }
  141. #endregion
  142. #region 日期类型设置
  143. /// <summary>
  144. /// 获取月份的日期设置
  145. /// </summary>
  146. /// <param name="year"></param>
  147. /// <param name="month"></param>
  148. /// <returns></returns>
  149. [HttpGet("getdaysettings-month/{year}/{month}")]
  150. public async Task<List<DaySetting>> GetDaySettingsByMonth(int year,int month)
  151. {
  152. return await _daysettingRepository.GetDaySettingsByMonth(year,month);
  153. }
  154. /// <summary>
  155. /// 设置日期
  156. /// </summary>
  157. /// <param name="request"></param>
  158. /// <returns></returns>`
  159. [HttpPost("setdaysettings")]
  160. public async Task SetDaySettings([FromBody]SetDaySettingsRequest request)
  161. {
  162. _daySettingCacheManager.DelDaySetting();
  163. foreach (var item in request.list)
  164. {
  165. var day = await _daysettingRepository.GetAsync(x => x.Day.Date == item.Date, HttpContext.RequestAborted);
  166. if (day != null)
  167. {
  168. day.IsWorkDay = request.isWorkDay;
  169. await _daysettingRepository.UpdateAsync(day, HttpContext.RequestAborted);
  170. }
  171. else
  172. {
  173. await _daysettingRepository.AddAsync(new DaySetting() { Day = item, IsWorkDay = request.isWorkDay },HttpContext.RequestAborted);
  174. }
  175. }
  176. }
  177. #endregion
  178. #region 标签
  179. /// <summary>
  180. /// 业务标签列表
  181. /// </summary>
  182. /// <param name="dto"></param>
  183. /// <returns></returns>
  184. [HttpGet("businessTag")]
  185. public async Task<PagedDto<BusinessTagListVo>> BusinessTagList([FromQuery] BusinessTagListDto dto)
  186. {
  187. var (total, items) = await _businessTag.Queryable()
  188. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Name.Contains(dto.Keyword!))
  189. .WhereIF(dto.Type> 0, d => d.Type == dto.Type)
  190. .WhereIF(dto.BusinessType > 0, d => d.BusinessType == dto.BusinessType)
  191. .OrderByDescending(x => x.CreationTime)
  192. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  193. return new PagedDto<BusinessTagListVo>(total, _mapper.Map<IReadOnlyList<BusinessTagListVo>>(items));
  194. }
  195. /// <summary>
  196. /// 新增标签(支持批量)
  197. /// </summary>
  198. /// <param name="dtos"></param>
  199. /// <returns></returns>
  200. [HttpPost("businessTag")]
  201. public async Task AddBusinessTag([FromBody] List<BusinessTagDto> dtos)
  202. {
  203. List<BusinessTag> tags = new List<BusinessTag>();
  204. foreach (var dto in dtos)
  205. {
  206. var model = _mapper.Map<BusinessTag>(dto);
  207. tags.Add(model);
  208. }
  209. await _businessTag.AddRangeAsync(tags, HttpContext.RequestAborted);
  210. }
  211. /// <summary>
  212. /// 删除标签
  213. /// </summary>
  214. /// <param name="dto"></param>
  215. /// <returns></returns>
  216. [HttpDelete("businessTag")]
  217. public async Task DeleteBusinessTag([FromBody] DeleteBusinessTagDto dto)
  218. {
  219. foreach (var Id in dto.Ids)
  220. {
  221. await _businessTag.RemoveAsync(x => x.Id == Id);
  222. }
  223. }
  224. /// <summary>
  225. /// 更新标签
  226. /// </summary>
  227. /// <param name="dto"></param>
  228. /// <returns></returns>
  229. [HttpPut("businessTag")]
  230. public async Task UpdateBusinessTag([FromBody] UpdateBusinessTagDto dto)
  231. {
  232. //验证工单是否可以申请
  233. var tag = await _businessTag.GetAsync(dto.Id, HttpContext.RequestAborted);
  234. if (tag is null)
  235. throw UserFriendlyException.SameMessage("无效标签");
  236. _mapper.Map(dto, tag);
  237. await _businessTag.UpdateAsync(tag, HttpContext.RequestAborted);
  238. }
  239. /// <summary>
  240. /// 获取标签实体
  241. /// </summary>
  242. /// <param name="id"></param>
  243. /// <returns></returns>
  244. [HttpGet("businessTag/{id}")]
  245. public async Task<BusinessTag> BusinessTagEntity(string id)
  246. {
  247. return await _businessTag.Queryable()
  248. .FirstAsync(x => x.Id == id);
  249. }
  250. /// <summary>
  251. /// 获取标签基本数据
  252. /// </summary>
  253. /// <returns></returns>
  254. [HttpGet("businessTag/baseData")]
  255. public async Task<object> TagBaseData()
  256. {
  257. var rsp = new
  258. {
  259. TagType = EnumExts.GetDescriptions<ETagType>(),
  260. BusinessTagType = EnumExts.GetDescriptions<EBusinessTagType>(),
  261. };
  262. return rsp;
  263. }
  264. /// <summary>
  265. /// 绑定标签
  266. /// </summary>
  267. /// <param name="dto"></param>
  268. /// <returns></returns>
  269. [HttpPut("businessTag/binding")]
  270. public async Task BusinessTagBinding([FromBody]BusinessTagBindingDto dto)
  271. {
  272. await _businessTag.BindingAsync(dto, HttpContext.RequestAborted);
  273. }
  274. #endregion
  275. }
  276. }