123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- using Hotline.Application.CallCenter;
- using Quartz;
- using SqlSugar;
- using Hotline.CallCenter.Calls;
- using Hotline.Repository.SqlSugar;
- using Hotline.Users;
- using MapsterMapper;
- using Microsoft.Extensions.Logging;
- using XF.Domain.Repository;
- using XingTang.Sdk;
- using DotNetCore.CAP;
- using Hotline.Share.Dtos.Order;
- using Hotline.Share.Dtos.TrCallCenter;
- using Hotline.Share.Enums.CallCenter;
- using System.Dynamic;
- using Hotline.Share.Dtos.CallCenter;
- namespace Hotline.Application.Jobs
- {
- /// <summary>
- /// 查询兴唐通话记录
- /// </summary>
- public class XingTangCallsSyncJob : IJob, IDisposable
- {
- private readonly IRepository<CallNative> _callRepository;
- private readonly IRepository<User> _userRepository;
- private readonly ICallApplication _callApplication;
- private readonly ICapPublisher _capPublisher;
- private readonly IMapper _mapper;
- private readonly ILogger<XingTangCallsSyncJob> _logger;
- private readonly ISqlSugarClient _db;
- public XingTangCallsSyncJob(
- ISugarUnitOfWork<XingTangDbContext> uow,
- IRepository<CallNative> callRepository,
- IRepository<User> userRepository,
- ICallApplication callApplication,
- ICapPublisher capPublisher,
- IMapper mapper,
- ILogger<XingTangCallsSyncJob> logger)
- {
- _callRepository = callRepository;
- _userRepository = userRepository;
- _callApplication = callApplication;
- _capPublisher = capPublisher;
- _mapper = mapper;
- _logger = logger;
- _db = uow.Db;
- }
- public async Task Execute(IJobExecutionContext context)
- {
- var xingtangCalls = await _db.Queryable<XingtangCall>()
- .Where(d => (d.IsSync == null || !d.IsSync) && (d.Tries == null || d.Tries <= 50))
- .OrderBy(d => d.Id)
- .Take(10)
- .ToListAsync(context.CancellationToken);
- var occupyCalls = new List<XingtangCall>();
- foreach (var call in xingtangCalls)
- {
- call.IsSync = true;
- call.Tries += 1;
- var rows = await _db.Updateable(call)
- .ExecuteCommandWithOptLockAsync();
- if (rows > 0)
- occupyCalls.Add(call);
- }
- try
- {
- var calls = _mapper.Map<List<CallNative>>(occupyCalls);
- //填充user信息
- var staffNos = calls.Select(d => d.StaffNo).ToList();
- var users = await _userRepository.Queryable()
- .Where(d => staffNos.Contains(d.StaffNo))
- .ToListAsync(context.CancellationToken);
- foreach (var call in calls)
- {
- call.Id = await GetCallIdAsync(call.CallNo, context.CancellationToken);
- var user = users.FirstOrDefault(d => d.StaffNo == call.StaffNo);
- if (user is not null)
- {
- call.UserId = user.Id;
- call.UserName = user.Name;
- }
- }
- await _callRepository.AddRangeAsync(calls, context.CancellationToken);
- //推省上
- if (calls.Any())
- {
- var callIns = _mapper.Map<List<CallNativeDto>>(calls);
- await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineCallAdd, callIns);
- }
- ////todo
- //var callIns = calls.Where(d => d.Direction == ECallDirection.In).ToList();
- //if (callIns.Any())
- //{
- // await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineCallAdd, callIns);
- //}
- }
- catch (Exception e)
- {
- //Console.WriteLine(e);
- _logger.LogError($"获取通话记录异常:{e.Message} \n {e.StackTrace}");
- foreach (var occupyCall in occupyCalls)
- {
- occupyCall.IsSync = false;
- }
- await _db.Updateable(occupyCalls)
- .UpdateColumns(d => new { d.IsSync })
- .ExecuteCommandAsync(context.CancellationToken);
- }
- }
- private async Task<string> GetCallIdAsync(string callNo, CancellationToken cancellation)
- {
- var relation = await _callApplication.GetRelationAsync(callNo, cancellation);
- if (relation is null)
- {
- relation = new CallidRelation
- {
- Id = callNo,
- CallId = Ulid.NewUlid().ToString(),
- IsUsed = true
- };
- await _callApplication.AddRelationAsync(relation, cancellation);
- return relation.CallId;
- }
- if (relation.IsUsed)
- return Ulid.NewUlid().ToString();
- relation.IsUsed = true;
- var rows = await _callApplication.UpdateRelationOptLockAsync(relation, cancellation);
- if (rows > 0)
- return relation.CallId;
- //重新取relation 重新判断isUsed
- return await GetCallIdAsync(callNo, cancellation);
- }
- /// <summary>Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.</summary>
- public void Dispose()
- {
- //_logger.LogInformation($"{nameof(XingTangCallsSyncJob)} disposed");
- }
- }
- }
|