CallNativeContrroller.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. using Hotline.Api.Filter;
  2. using Hotline.Application.CallCenter;
  3. using Hotline.Caching.Interfaces;
  4. using Hotline.CallCenter.Calls;
  5. using Hotline.CallCenter.Configs;
  6. using Hotline.CallCenter.Tels;
  7. using Hotline.EventBus;
  8. using Hotline.Repository.SqlSugar;
  9. using Hotline.Share.Dtos;
  10. using Hotline.Share.Dtos.CallCenter;
  11. using Hotline.Share.Dtos.CallNative;
  12. using Hotline.Share.Dtos.TrCallCenter;
  13. using Hotline.Share.Enums.CallCenter;
  14. using MapsterMapper;
  15. using Microsoft.AspNetCore.Mvc;
  16. using Microsoft.Extensions.Options;
  17. using SqlSugar;
  18. using XF.Domain.Authentications;
  19. using XF.Domain.Exceptions;
  20. using XF.Domain.Repository;
  21. using XingTang.Sdk;
  22. using Hotline.Repository.SqlSugar.Extensions;
  23. using Hotline.Share.Requests;
  24. using Hotline.Share.Dtos.Order;
  25. using Hotline.CallCenter.BlackLists;
  26. namespace Hotline.Api.Controllers
  27. {
  28. public class CallNativeContrroller : BaseController
  29. {
  30. private readonly ICallApplication _callApplication;
  31. private readonly Publisher _publisher;
  32. private readonly IMapper _mapper;
  33. private readonly IOptionsSnapshot<CallCenterConfiguration> _callcenterOptions;
  34. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  35. private readonly IRepository<TelOperationXthx> _telOperationXthxRepository;
  36. private readonly IUserCacheManager _userCacheManager;
  37. private readonly ISessionContext _sessionContext;
  38. private readonly IRepository<TelActionRecord> _telActionRecordRepository;
  39. private readonly ITelRestRepository _telRestRepository;
  40. private readonly ISqlSugarClient _db;
  41. private readonly IRepository<WhiteBlackLog> _whiteBlackLogRepository;
  42. public CallNativeContrroller(
  43. ICallApplication callApplication,
  44. Publisher publisher,
  45. IMapper mapper,
  46. IOptionsSnapshot<CallCenterConfiguration> callcenterOptions,
  47. ISystemSettingCacheManager systemSettingCacheManager,
  48. IRepository<TelOperationXthx> telOperationXthxRepository,
  49. IUserCacheManager userCacheManager,
  50. ISessionContext sessionContext,
  51. IRepository<TelActionRecord> telActionRecordRepository,
  52. ITelRestRepository telRestRepository,
  53. ISugarUnitOfWork<XingTangDbContext> uow,
  54. IRepository<WhiteBlackLog> whiteBlackLogRepository)
  55. {
  56. _callApplication = callApplication;
  57. _publisher = publisher;
  58. _mapper = mapper;
  59. _callcenterOptions = callcenterOptions;
  60. _systemSettingCacheManager = systemSettingCacheManager;
  61. _telOperationXthxRepository = telOperationXthxRepository;
  62. _userCacheManager = userCacheManager;
  63. _sessionContext = sessionContext;
  64. _telActionRecordRepository = telActionRecordRepository;
  65. _telRestRepository = telRestRepository;
  66. _db = uow.Db;
  67. _whiteBlackLogRepository = whiteBlackLogRepository;
  68. }
  69. #region 黑白名单处理
  70. #region 黑名单
  71. /// <summary>
  72. /// 获取黑名单
  73. /// </summary>
  74. /// <param name="dto"></param>
  75. /// <returns></returns>
  76. [HttpGet("get-black-phone-list")]
  77. public async Task<PagedDto<BlackPhoneListDto>> GetBlackPhoneList([FromQuery] PagedKeywordRequest dto)
  78. {
  79. var (total, items) = await _db.Queryable<XingtangBlackPhone>()
  80. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), p => p.StartPhone.Contains(dto.Keyword))
  81. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  82. return new PagedDto<BlackPhoneListDto>(total, _mapper.Map<IReadOnlyList<BlackPhoneListDto>>(items));
  83. }
  84. /// <summary>
  85. /// 删除黑名单
  86. /// </summary>
  87. /// <param name="phone"></param>
  88. /// <returns></returns>
  89. [HttpDelete("delete-black-phone/{phone}")]
  90. [LogFilter("删除黑名单")]
  91. public async Task DeleteBlackPhone(string phone)
  92. {
  93. var row = await _db.Deleteable<XingtangBlackPhone>().Where(p => p.StartPhone == phone).ExecuteCommandAsync();
  94. if (row >= 0)
  95. {
  96. WhiteBlackLog whiteBlackLog = new()
  97. {
  98. LogType = "1",
  99. LogAction = "删除",
  100. PhoneNum = phone
  101. };
  102. await _whiteBlackLogRepository.AddAsync(whiteBlackLog, HttpContext.RequestAborted);
  103. }
  104. }
  105. /// <summary>
  106. /// 新增黑名单
  107. /// </summary>
  108. /// <param name="dto"></param>
  109. /// <returns></returns>
  110. [HttpPost("add-black-phone")]
  111. [LogFilter("新增黑名单")]
  112. public async Task AddBlackPhone([FromBody] AddBlackPhoneDto dto)
  113. {
  114. if (string.IsNullOrEmpty(dto.PhoneNum))
  115. throw UserFriendlyException.SameMessage("电话号码不能为空!");
  116. if (dto.ValidDateTime.HasValue == false)
  117. dto.ValidDateTime = Convert.ToDateTime("2099-01-01 23:59:59");
  118. var isEx = await _db.Queryable<XingtangBlackPhone>().Where(p => p.StartPhone == dto.PhoneNum).AnyAsync();
  119. if (isEx)
  120. throw UserFriendlyException.SameMessage("此号码已经是黑名单!");
  121. var id = await _db.Queryable<XingtangBlackPhone>().MaxAsync(p => p.BlackPhoneId);
  122. XingtangBlackPhone xingtangBlackPhone = new XingtangBlackPhone()
  123. {
  124. BlackPhoneId = id + 1,
  125. StartPhone = dto.PhoneNum,
  126. PhoneType = 0,
  127. ValidDateTime = dto.ValidDateTime,
  128. Enabled = 1,
  129. CreateDate = DateTime.Now,
  130. CreateUserId = _sessionContext.UserId
  131. };
  132. var row = await _db.Insertable(xingtangBlackPhone).ExecuteCommandAsync();
  133. if (row >= 0)
  134. {
  135. WhiteBlackLog whiteBlackLog = new()
  136. {
  137. LogType = "1",
  138. LogAction = "新增",
  139. PhoneNum = dto.PhoneNum,
  140. ValidDateTime = dto.ValidDateTime
  141. };
  142. await _whiteBlackLogRepository.AddAsync(whiteBlackLog, HttpContext.RequestAborted);
  143. }
  144. }
  145. #endregion
  146. #region 白名单
  147. /// <summary>
  148. /// 获取白名单
  149. /// </summary>
  150. /// <param name="dto"></param>
  151. /// <returns></returns>
  152. [HttpGet("get-white-phone-list")]
  153. public async Task<PagedDto<WhitePhoneListDto>> GetWhitePhoneList([FromQuery] PagedKeywordRequest dto)
  154. {
  155. var (total, items) = await _db.Queryable<XingtangWhitePhone>()
  156. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), p => p.Phone.Contains(dto.Keyword))
  157. .Select(p => new WhitePhoneListDto
  158. {
  159. Id = p.Id,
  160. StartPhone = p.Phone,
  161. ValidDateTime = p.ValidDateTime,
  162. Enabled = p.Enabled
  163. })
  164. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  165. return new PagedDto<WhitePhoneListDto>(total, _mapper.Map<IReadOnlyList<WhitePhoneListDto>>(items));
  166. }
  167. /// <summary>
  168. /// 删除白名单
  169. /// </summary>
  170. /// <param name="phone"></param>
  171. /// <returns></returns>
  172. [HttpDelete("delete-white-phone/{phone}")]
  173. [LogFilter("删除白名单")]
  174. public async Task DeleteWhitePhone(string phone)
  175. {
  176. var row = await _db.Deleteable<XingtangWhitePhone>().Where(p => p.Phone == phone).ExecuteCommandAsync();
  177. if (row >= 0)
  178. {
  179. WhiteBlackLog whiteBlackLog = new()
  180. {
  181. LogType = "2",
  182. LogAction = "删除",
  183. PhoneNum = phone
  184. };
  185. await _whiteBlackLogRepository.AddAsync(whiteBlackLog, HttpContext.RequestAborted);
  186. }
  187. }
  188. /// <summary>
  189. /// 新增白名单
  190. /// </summary>
  191. /// <param name="dto"></param>
  192. /// <returns></returns>
  193. [HttpPost("add-white-phone")]
  194. [LogFilter("新增白名单")]
  195. public async Task AddWhitePhone([FromBody] AddBlackPhoneDto dto)
  196. {
  197. if (string.IsNullOrEmpty(dto.PhoneNum))
  198. throw UserFriendlyException.SameMessage("电话号码不能为空!");
  199. if (dto.ValidDateTime.HasValue == false)
  200. dto.ValidDateTime = Convert.ToDateTime("2099-01-01 23:59:59");
  201. var isEx = await _db.Queryable<XingtangWhitePhone>().Where(p => p.Phone == dto.PhoneNum).AnyAsync();
  202. if (isEx)
  203. throw UserFriendlyException.SameMessage("此号码已经是白名单!");
  204. var id = await _db.Queryable<XingtangWhitePhone>().MaxAsync(p => p.Id);
  205. XingtangWhitePhone xingtangPhone = new XingtangWhitePhone()
  206. {
  207. Id = id + 1,
  208. Phone = dto.PhoneNum,
  209. ValidDateTime = dto.ValidDateTime,
  210. Enabled = 1
  211. };
  212. var row = await _db.Insertable(xingtangPhone).ExecuteCommandAsync();
  213. if (row >= 0)
  214. {
  215. WhiteBlackLog whiteBlackLog = new()
  216. {
  217. LogType = "2",
  218. LogAction = "新增",
  219. PhoneNum = dto.PhoneNum,
  220. ValidDateTime = dto.ValidDateTime
  221. };
  222. await _whiteBlackLogRepository.AddAsync(whiteBlackLog, HttpContext.RequestAborted);
  223. }
  224. }
  225. #endregion
  226. /// <summary>
  227. /// 查询黑白名单操作记录
  228. /// </summary>
  229. /// <param name="dto"></param>
  230. /// <returns></returns>
  231. [HttpGet("get-white-black-log-list")]
  232. public async Task<PagedDto<WhiteBlackLog>> GetWhiteBlackLogList([FromQuery] BlackPhoneListQuery dto)
  233. {
  234. var (total, items) = await _whiteBlackLogRepository.Queryable()
  235. .WhereIF(dto.StartTime.HasValue, p => p.CreationTime >= dto.StartTime)
  236. .WhereIF(dto.EndTime.HasValue, p => p.CreationTime <= dto.EndTime)
  237. .WhereIF(!string.IsNullOrEmpty(dto.LogType), p => p.LogType == dto.LogType)
  238. .WhereIF(!string.IsNullOrEmpty(dto.LogAction), p => p.LogAction == dto.LogAction)
  239. .WhereIF(!string.IsNullOrEmpty(dto.UserName), p => p.CreatorName == dto.UserName)
  240. .WhereIF(!string.IsNullOrEmpty(dto.PhoneNum), p => p.PhoneNum == dto.PhoneNum)
  241. .OrderByDescending(p => p.CreationTime)
  242. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  243. return new PagedDto<WhiteBlackLog>(total, items);
  244. }
  245. /// <summary>
  246. /// 验证号码是否是白名单
  247. /// </summary>
  248. /// <param name="phone"></param>
  249. /// <returns></returns>
  250. [HttpGet("verify-white-list/{phone}")]
  251. public async Task<bool> VerifyWhiteList(string phone)
  252. {
  253. var isEx = await _db.Queryable<XingtangWhitePhone>().Where(p => p.Phone == phone && p.ValidDateTime >= DateTime.Now).AnyAsync();
  254. if (isEx)
  255. return true;
  256. else
  257. return false;
  258. }
  259. #endregion
  260. }
  261. }