SettingController.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  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. //[Permission(EPermission.GetSettingEntity)]
  96. [HttpGet("getsetting-entity/{id}")]
  97. public async Task<SystemSetting?> GetSettingEntity(string id)
  98. {
  99. return await _systemSettingsRepository.GetAsync(id, HttpContext.RequestAborted);
  100. }
  101. /// <summary>
  102. /// 通过code获取系统参数
  103. /// </summary>
  104. /// <param name="code"></param>
  105. /// <returns></returns>
  106. [AllowAnonymous]
  107. [HttpGet("getsetting-code/{code}")]
  108. public async Task<SystemSetting?> GetSettingByCode(string code)
  109. {
  110. return _systemSettingCacheManager.GetSetting(code);
  111. }
  112. /// <summary>
  113. /// 新增系统参数
  114. /// </summary>
  115. /// <param name="dto"></param>
  116. /// <returns></returns>
  117. [Permission(EPermission.AddSetting)]
  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. [Permission(EPermission.ModifySettings)]
  130. [HttpPost("modifysettings")]
  131. public async Task ModifySettingsAsync([FromBody]ModifySettingDto dto)
  132. {
  133. var model = await _systemSettingsRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
  134. if (model is null)
  135. throw UserFriendlyException.SameMessage("未知配置,请刷新界面");
  136. model.SettingValue = dto.SettingValue;
  137. model.Sort = dto.Sort;
  138. model.Remark = dto.Remark;
  139. _systemSettingCacheManager.DelSystemSetting(model.Code);
  140. await _systemSettingsRepository.UpdateAsync(model, HttpContext.RequestAborted);
  141. }
  142. #endregion
  143. #region 日期类型设置
  144. /// <summary>
  145. /// 获取月份的日期设置
  146. /// </summary>
  147. /// <param name="year"></param>
  148. /// <param name="month"></param>
  149. /// <returns></returns>
  150. //[Permission(EPermission.DaySetingsList)]
  151. [HttpGet("getdaysettings-month/{year}/{month}")]
  152. public async Task<List<DaySetting>> GetDaySettingsByMonth(int year,int month)
  153. {
  154. return await _daysettingRepository.GetDaySettingsByMonth(year,month);
  155. }
  156. /// <summary>
  157. /// 设置日期
  158. /// </summary>
  159. /// <param name="request"></param>
  160. /// <returns></returns>`
  161. [Permission(EPermission.SetDaySetting)]
  162. [HttpPost("setdaysettings")]
  163. public async Task SetDaySettings([FromBody]SetDaySettingsRequest request)
  164. {
  165. foreach (var item in request.list)
  166. {
  167. var day = await _daysettingRepository.GetAsync(x => x.Day.Date == item.Date, HttpContext.RequestAborted);
  168. if (day != null)
  169. {
  170. day.IsWorkDay = request.isWorkDay;
  171. await _daysettingRepository.UpdateAsync(day, HttpContext.RequestAborted);
  172. }
  173. else
  174. {
  175. await _daysettingRepository.AddAsync(new DaySetting() { Day = item, IsWorkDay = request.isWorkDay },HttpContext.RequestAborted);
  176. }
  177. }
  178. }
  179. #endregion
  180. #region 标签
  181. /// <summary>
  182. /// 业务标签列表
  183. /// </summary>
  184. /// <param name="dto"></param>
  185. /// <returns></returns>
  186. [Permission(EPermission.BusinessTagList)]
  187. [HttpGet("businessTag")]
  188. public async Task<PagedDto<BusinessTagListVo>> BusinessTagList([FromQuery] BusinessTagListDto dto)
  189. {
  190. var (total, items) = await _businessTag.Queryable()
  191. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Name.Contains(dto.Keyword!))
  192. .WhereIF(dto.Type> 0, d => d.Type == dto.Type)
  193. .WhereIF(dto.BusinessType > 0, d => d.BusinessType == dto.BusinessType)
  194. .OrderByDescending(x => x.CreationTime)
  195. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  196. return new PagedDto<BusinessTagListVo>(total, _mapper.Map<IReadOnlyList<BusinessTagListVo>>(items));
  197. }
  198. /// <summary>
  199. /// 新增标签(支持批量)
  200. /// </summary>
  201. /// <param name="dtos"></param>
  202. /// <returns></returns>
  203. [Permission(EPermission.AddBusinessTag)]
  204. [HttpPost("businessTag")]
  205. public async Task AddBusinessTag([FromBody] List<BusinessTagDto> dtos)
  206. {
  207. List<BusinessTag> tags = new List<BusinessTag>();
  208. foreach (var dto in dtos)
  209. {
  210. var model = _mapper.Map<BusinessTag>(dto);
  211. tags.Add(model);
  212. }
  213. await _businessTag.AddRangeAsync(tags, HttpContext.RequestAborted);
  214. }
  215. /// <summary>
  216. /// 删除标签
  217. /// </summary>
  218. /// <param name="dto"></param>
  219. /// <returns></returns>
  220. [Permission(EPermission.DeleteBusinessTag)]
  221. [HttpDelete("businessTag")]
  222. public async Task DeleteBusinessTag([FromBody] DeleteBusinessTagDto dto)
  223. {
  224. foreach (var Id in dto.Ids)
  225. {
  226. await _businessTag.RemoveAsync(x => x.Id == Id);
  227. }
  228. }
  229. /// <summary>
  230. /// 更新标签
  231. /// </summary>
  232. /// <param name="dto"></param>
  233. /// <returns></returns>
  234. [Permission(EPermission.UpdateBusinessTag)]
  235. [HttpPut("businessTag")]
  236. public async Task UpdateBusinessTag([FromBody] UpdateBusinessTagDto dto)
  237. {
  238. //验证工单是否可以申请
  239. var tag = await _businessTag.GetAsync(dto.Id, HttpContext.RequestAborted);
  240. if (tag is null)
  241. throw UserFriendlyException.SameMessage("无效标签");
  242. _mapper.Map(dto, tag);
  243. await _businessTag.UpdateAsync(tag, HttpContext.RequestAborted);
  244. }
  245. /// <summary>
  246. /// 获取标签实体
  247. /// </summary>
  248. /// <param name="id"></param>
  249. /// <returns></returns>
  250. [Permission(EPermission.BusinessTagEntity)]
  251. [HttpGet("businessTag/{id}")]
  252. public async Task<BusinessTag> BusinessTagEntity(string id)
  253. {
  254. return await _businessTag.Queryable()
  255. .FirstAsync(x => x.Id == id);
  256. }
  257. /// <summary>
  258. /// 获取标签基本数据
  259. /// </summary>
  260. /// <returns></returns>
  261. [HttpGet("businessTag/baseData")]
  262. public async Task<object> TagBaseData()
  263. {
  264. var rsp = new
  265. {
  266. TagType = EnumExts.GetDescriptions<ETagType>(),
  267. BusinessTagType = EnumExts.GetDescriptions<EBusinessTagType>(),
  268. };
  269. return rsp;
  270. }
  271. /// <summary>
  272. /// 绑定标签
  273. /// </summary>
  274. /// <param name="dto"></param>
  275. /// <returns></returns>
  276. [Permission(EPermission.BusinessTagBinding)]
  277. [HttpPut("businessTag/binding")]
  278. public async Task BusinessTagBinding([FromBody]BusinessTagBindingDto dto)
  279. {
  280. await _businessTag.BindingAsync(dto, HttpContext.RequestAborted);
  281. }
  282. #endregion
  283. }
  284. }