using Hotline.Api.Filter; using Hotline.Application.CallCenter; using Hotline.Caching.Interfaces; using Hotline.CallCenter.Calls; using Hotline.CallCenter.Configs; using Hotline.CallCenter.Tels; using Hotline.EventBus; using Hotline.Repository.SqlSugar; using Hotline.Share.Dtos; using Hotline.Share.Dtos.CallCenter; using Hotline.Share.Dtos.CallNative; using Hotline.Share.Dtos.TrCallCenter; using Hotline.Share.Enums.CallCenter; using MapsterMapper; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using SqlSugar; using XF.Domain.Authentications; using XF.Domain.Exceptions; using XF.Domain.Repository; using XingTang.Sdk; using Hotline.Repository.SqlSugar.Extensions; using Hotline.Share.Requests; using Hotline.Share.Dtos.Order; using Hotline.CallCenter.BlackLists; namespace Hotline.Api.Controllers { public class CallNativeContrroller : BaseController { private readonly ICallApplication _callApplication; private readonly Publisher _publisher; private readonly IMapper _mapper; private readonly IOptionsSnapshot _callcenterOptions; private readonly ISystemSettingCacheManager _systemSettingCacheManager; private readonly IRepository _telOperationXthxRepository; private readonly IUserCacheManager _userCacheManager; private readonly ISessionContext _sessionContext; private readonly IRepository _telActionRecordRepository; private readonly ITelRestRepository _telRestRepository; private readonly ISqlSugarClient _db; private readonly IRepository _whiteBlackLogRepository; public CallNativeContrroller( ICallApplication callApplication, Publisher publisher, IMapper mapper, IOptionsSnapshot callcenterOptions, ISystemSettingCacheManager systemSettingCacheManager, IRepository telOperationXthxRepository, IUserCacheManager userCacheManager, ISessionContext sessionContext, IRepository telActionRecordRepository, ITelRestRepository telRestRepository, ISugarUnitOfWork uow, IRepository whiteBlackLogRepository) { _callApplication = callApplication; _publisher = publisher; _mapper = mapper; _callcenterOptions = callcenterOptions; _systemSettingCacheManager = systemSettingCacheManager; _telOperationXthxRepository = telOperationXthxRepository; _userCacheManager = userCacheManager; _sessionContext = sessionContext; _telActionRecordRepository = telActionRecordRepository; _telRestRepository = telRestRepository; _db = uow.Db; _whiteBlackLogRepository = whiteBlackLogRepository; } #region 黑白名单处理 #region 黑名单 /// /// 获取黑名单 /// /// /// [HttpGet("get-black-phone-list")] public async Task> GetBlackPhoneList([FromQuery] PagedKeywordRequest dto) { var (total, items) = await _db.Queryable() .WhereIF(!string.IsNullOrEmpty(dto.Keyword), p => p.StartPhone.Contains(dto.Keyword)) .ToPagedListAsync(dto, HttpContext.RequestAborted); return new PagedDto(total, _mapper.Map>(items)); } /// /// 删除黑名单 /// /// /// [HttpDelete("delete-black-phone/{phone}")] [LogFilter("删除黑名单")] public async Task DeleteBlackPhone(string phone) { var row = await _db.Deleteable().Where(p => p.StartPhone == phone).ExecuteCommandAsync(); if (row >= 0) { WhiteBlackLog whiteBlackLog = new() { LogType = "1", LogAction = "删除", PhoneNum = phone }; await _whiteBlackLogRepository.AddAsync(whiteBlackLog, HttpContext.RequestAborted); } } /// /// 新增黑名单 /// /// /// [HttpPost("add-black-phone")] [LogFilter("新增黑名单")] public async Task AddBlackPhone([FromBody] AddBlackPhoneDto dto) { if (string.IsNullOrEmpty(dto.PhoneNum)) throw UserFriendlyException.SameMessage("电话号码不能为空!"); if (dto.ValidDateTime.HasValue == false) dto.ValidDateTime = Convert.ToDateTime("2099-01-01 23:59:59"); var isEx = await _db.Queryable().Where(p => p.StartPhone == dto.PhoneNum).AnyAsync(); if (isEx) throw UserFriendlyException.SameMessage("此号码已经是黑名单!"); var id = await _db.Queryable().MaxAsync(p => p.BlackPhoneId); XingtangBlackPhone xingtangBlackPhone = new XingtangBlackPhone() { BlackPhoneId = id + 1, StartPhone = dto.PhoneNum, PhoneType = 0, ValidDateTime = dto.ValidDateTime, Enabled = 1, CreateDate = DateTime.Now, CreateUserId = _sessionContext.UserId }; var row = await _db.Insertable(xingtangBlackPhone).ExecuteCommandAsync(); if (row >= 0) { WhiteBlackLog whiteBlackLog = new() { LogType = "1", LogAction = "新增", PhoneNum = dto.PhoneNum, ValidDateTime = dto.ValidDateTime }; await _whiteBlackLogRepository.AddAsync(whiteBlackLog, HttpContext.RequestAborted); } } #endregion #region 白名单 /// /// 获取白名单 /// /// /// [HttpGet("get-white-phone-list")] public async Task> GetWhitePhoneList([FromQuery] PagedKeywordRequest dto) { var (total, items) = await _db.Queryable() .WhereIF(!string.IsNullOrEmpty(dto.Keyword), p => p.Phone.Contains(dto.Keyword)) .Select(p => new WhitePhoneListDto { Id = p.Id, StartPhone = p.Phone, ValidDateTime = p.ValidDateTime, Enabled = p.Enabled }) .ToPagedListAsync(dto, HttpContext.RequestAborted); return new PagedDto(total, _mapper.Map>(items)); } /// /// 删除白名单 /// /// /// [HttpDelete("delete-white-phone/{phone}")] [LogFilter("删除白名单")] public async Task DeleteWhitePhone(string phone) { var row = await _db.Deleteable().Where(p => p.Phone == phone).ExecuteCommandAsync(); if (row >= 0) { WhiteBlackLog whiteBlackLog = new() { LogType = "2", LogAction = "删除", PhoneNum = phone }; await _whiteBlackLogRepository.AddAsync(whiteBlackLog, HttpContext.RequestAborted); } } /// /// 新增白名单 /// /// /// [HttpPost("add-white-phone")] [LogFilter("新增白名单")] public async Task AddWhitePhone([FromBody] AddBlackPhoneDto dto) { if (string.IsNullOrEmpty(dto.PhoneNum)) throw UserFriendlyException.SameMessage("电话号码不能为空!"); if (dto.ValidDateTime.HasValue == false) dto.ValidDateTime = Convert.ToDateTime("2099-01-01 23:59:59"); var isEx = await _db.Queryable().Where(p => p.Phone == dto.PhoneNum).AnyAsync(); if (isEx) throw UserFriendlyException.SameMessage("此号码已经是白名单!"); var id = await _db.Queryable().MaxAsync(p => p.Id); XingtangWhitePhone xingtangPhone = new XingtangWhitePhone() { Id = id + 1, Phone = dto.PhoneNum, ValidDateTime = dto.ValidDateTime, Enabled = 1 }; var row = await _db.Insertable(xingtangPhone).ExecuteCommandAsync(); if (row >= 0) { WhiteBlackLog whiteBlackLog = new() { LogType = "2", LogAction = "新增", PhoneNum = dto.PhoneNum, ValidDateTime = dto.ValidDateTime }; await _whiteBlackLogRepository.AddAsync(whiteBlackLog, HttpContext.RequestAborted); } } #endregion /// /// 查询黑白名单操作记录 /// /// /// [HttpGet("get-white-black-log-list")] public async Task> GetWhiteBlackLogList([FromQuery] BlackPhoneListQuery dto) { var (total, items) = await _whiteBlackLogRepository.Queryable() .WhereIF(dto.StartTime.HasValue, p => p.CreationTime >= dto.StartTime) .WhereIF(dto.EndTime.HasValue, p => p.CreationTime <= dto.EndTime) .WhereIF(!string.IsNullOrEmpty(dto.LogType), p => p.LogType == dto.LogType) .WhereIF(!string.IsNullOrEmpty(dto.LogAction), p => p.LogAction == dto.LogAction) .WhereIF(!string.IsNullOrEmpty(dto.UserName), p => p.CreatorName == dto.UserName) .WhereIF(!string.IsNullOrEmpty(dto.PhoneNum), p => p.PhoneNum == dto.PhoneNum) .OrderByDescending(p => p.CreationTime) .ToPagedListAsync(dto, HttpContext.RequestAborted); return new PagedDto(total, items); } /// /// 验证号码是否是白名单 /// /// /// [HttpGet("verify-white-list/{phone}")] public async Task VerifyWhiteList(string phone) { var isEx = await _db.Queryable().Where(p => p.Phone == phone && p.ValidDateTime >= DateTime.Now).AnyAsync(); if (isEx) return true; else return false; } #endregion } }