SettingController.cs 10 KB

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