浏览代码

Merge branch 'master' of http://110.188.24.182:10023/Fengwo/hotline

xf 1 年之前
父节点
当前提交
db021f0b7a

+ 2 - 2
src/Hotline.Api/Controllers/FileController.cs

@@ -22,13 +22,13 @@ namespace Hotline.Api.Controllers
 	{
 		private readonly ISessionContext _sessionContext;
 		private readonly IMapper _mapper;
-		private readonly ISysDicDataCacheManager _sysDicDataCacheManager;
+		private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
 		private readonly IRepository<File.File> _fileRepository;
 
 		public FileController(
 			ISessionContext sessionContext,
 			IMapper mapper,
-			ISysDicDataCacheManager sysDicDataCacheManager,
+			ISystemDicDataCacheManager sysDicDataCacheManager,
 			IRepository<File.File> fileRepository
 			)
 		{

+ 2 - 2
src/Hotline.Api/Controllers/HotSpotController.cs

@@ -26,11 +26,11 @@ namespace Hotline.Api.Controllers
         private readonly IMapper _mapper;
         private readonly ITimeLimitDomainService _timeLimitDomainService;
         private readonly ITimeLimitRepository _timeLimitRepository;
-        private readonly ISysDicDataCacheManager _sysDicDataCacheManager;
+        private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
         private readonly ISystemDomainService _systemDomainService;
 
         public HotspotController(IRepository<Hotspot> hotspotTypeRepository,
-            IMapper mapper, ITimeLimitDomainService timeLimitDomainService, ITimeLimitRepository timeLimitRepository,ISysDicDataCacheManager sysDicDataCacheManager,
+            IMapper mapper, ITimeLimitDomainService timeLimitDomainService, ITimeLimitRepository timeLimitRepository,ISystemDicDataCacheManager sysDicDataCacheManager,
             ISystemDomainService systemDomainService)
         {
             _hotspotTypeRepository = hotspotTypeRepository;

+ 28 - 22
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -5,6 +5,7 @@ using Hotline.KnowledgeBase;
 using Hotline.KnowledgeBase.Notifies;
 using Hotline.Permissions;
 using Hotline.Repository.SqlSugar.Extensions;
+using Hotline.Repository.SqlSugar.Ts;
 using Hotline.Settings;
 using Hotline.Settings.Hotspots;
 using Hotline.Share.Dtos;
@@ -41,25 +42,26 @@ namespace Hotline.Api.Controllers
         private readonly IRepository<User> _userRepository;
         private readonly IRepository<KnowledgeType> _knowledgeTypeRepository;
         private readonly IRepository<Hotspot> _hotspotTypeRepository;
-
-
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="knowledgeRepository"></param>
-        /// <param name="sessionContext"></param>
-        /// <param name="knowledgeDomainService"></param>
-        /// <param name="mapper"></param>
-        /// <param name="knowApplication"></param>
-        /// <param name="mediator"></param>
-        /// <param name="workflowApplication"></param>
-        /// <param name="knowledgeWorkFlowRepository"></param>
-        /// <param name="userRepository"></param>
-        /// <param name="knowledgeTypeRepository"></param>
-        /// <param name="hotspotTypeRepository"></param>
-        public KnowledgeController(IKnowledgeRepository knowledgeRepository, ISessionContext sessionContext, IKnowledgeDomainService knowledgeDomainService, IMapper mapper, IKnowApplication knowApplication,
+        private readonly IRepositoryTextSearch<KnowledgeTs> _repositoryts;
+
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="knowledgeRepository"></param>
+		/// <param name="sessionContext"></param>
+		/// <param name="knowledgeDomainService"></param>
+		/// <param name="mapper"></param>
+		/// <param name="knowApplication"></param>
+		/// <param name="mediator"></param>
+		/// <param name="workflowApplication"></param>
+		/// <param name="knowledgeWorkFlowRepository"></param>
+		/// <param name="userRepository"></param>
+		/// <param name="knowledgeTypeRepository"></param>
+		/// <param name="hotspotTypeRepository"></param>
+		public KnowledgeController(IKnowledgeRepository knowledgeRepository, ISessionContext sessionContext, IKnowledgeDomainService knowledgeDomainService, IMapper mapper, IKnowApplication knowApplication,
            IMediator mediator, IWorkflowApplication workflowApplication, IKnowledgeWorkFlowRepository knowledgeWorkFlowRepository
-            , IRepository<User> userRepository, IRepository<KnowledgeType> knowledgeTypeRepository, IRepository<Hotspot> hotspotTypeRepository)
+            , IRepository<User> userRepository, IRepository<KnowledgeType> knowledgeTypeRepository, IRepository<Hotspot> hotspotTypeRepository, IRepositoryTextSearch<KnowledgeTs> repositoryts)
         {
             _knowledgeRepository = knowledgeRepository;
             _sessionContext = sessionContext;
@@ -72,7 +74,9 @@ namespace Hotline.Api.Controllers
             _userRepository = userRepository;
             _knowledgeTypeRepository = knowledgeTypeRepository;
             _hotspotTypeRepository = hotspotTypeRepository;
-        }
+            _repositoryts = repositoryts;
+
+		}
 
         #endregion
 
@@ -151,7 +155,9 @@ namespace Hotline.Api.Controllers
                 kn.Code = Convert.ToInt64((DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds).ToString();
 
             kn.Status = EKnowledgeStatus.Drafts;
-            return await _knowledgeRepository.AddAsync(kn, HttpContext.RequestAborted);
+            var id = await _knowledgeRepository.AddAsync(kn, HttpContext.RequestAborted);
+            if (dto.Tags.Any()) await _repositoryts.AddVectorAsync(id, DateTime.Now, dto.Tags, HttpContext.RequestAborted);
+			return id;
         }
 
         /// <summary>
@@ -266,8 +272,8 @@ namespace Hotline.Api.Controllers
             if (dto.Status != EKnowledgeStatus.Drafts)
                 throw UserFriendlyException.SameMessage("非草稿数据不可修改");
             var kn = _mapper.Map<Knowledge>(dto);
-
-            await _knowledgeRepository.UpdateAsync(kn, HttpContext.RequestAborted);
+            if (dto.Tags.Any()) await _repositoryts.UpdateVectorAsync(dto.Id, dto.Tags, HttpContext.RequestAborted);
+			await _knowledgeRepository.UpdateAsync(kn, HttpContext.RequestAborted);
         }
 
         /// <summary>

+ 26 - 9
src/Hotline.Api/Controllers/OrderController.cs

@@ -10,6 +10,7 @@ using Hotline.Orders;
 using Hotline.Orders.Notifications;
 using Hotline.Permissions;
 using Hotline.Repository.SqlSugar.Extensions;
+using Hotline.Repository.SqlSugar.Ts;
 using Hotline.Settings;
 using Hotline.Settings.Hotspots;
 using Hotline.Settings.TimeLimits;
@@ -23,7 +24,9 @@ using MapsterMapper;
 using MediatR;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.IdentityModel.Tokens;
+using MongoDB.Driver;
 using SqlSugar;
+using System.Threading;
 using XF.Domain.Authentications;
 using XF.Domain.Constants;
 using XF.Domain.Exceptions;
@@ -46,7 +49,7 @@ public class OrderController : BaseController
     private readonly ISystemDomainService _systemDomainService;
     private readonly ISystemOrganizeRepository _organizeRepository;
     private readonly IDefinitionDomainService _definitionDomainService;
-    private readonly ISysDicDataCacheManager _sysDicDataCacheManager;
+    private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
     private readonly ISessionContext _sessionContext;
     private readonly IMapper _mapper;
     private readonly IMediator _mediator;
@@ -63,9 +66,10 @@ public class OrderController : BaseController
     private readonly IFileRepository _fileRepository;
     private readonly IRepository<OrderScreen> _orderScreenRepository;
     private readonly IRepository<OrderPublishHistory> _orderPublishHistoryRepository;
+    private readonly IRepositoryTextSearch<OrderTs> _repositoryts;
 
 
-    public OrderController(
+	public OrderController(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         IWorkflowApplication workflowApplication,
@@ -74,7 +78,7 @@ public class OrderController : BaseController
         ISystemDomainService systemDomainService,
         ISystemOrganizeRepository organizeRepository,
         IDefinitionDomainService definitionDomainService,
-        ISysDicDataCacheManager sysDicDataCacheManager,
+        ISystemDicDataCacheManager sysDicDataCacheManager,
         ISessionContext sessionContext,
         IMapper mapper,
         IMediator mediator,
@@ -90,8 +94,9 @@ public class OrderController : BaseController
         IRepository<OrderUrge> orderUrgeRepository,
         IFileRepository fileRepository,
         IRepository<OrderScreen> orderScreenRepository,
-        IRepository<OrderPublishHistory> orderPublishHistoryRepository
-        )
+        IRepository<OrderPublishHistory> orderPublishHistoryRepository,
+        IRepositoryTextSearch<OrderTs> repositoryts
+		)
     {
         _orderDomainService = orderDomainService;
         _orderRepository = orderRepository;
@@ -118,8 +123,9 @@ public class OrderController : BaseController
         _fileRepository = fileRepository;
         _orderScreenRepository = orderScreenRepository;
         _orderPublishHistoryRepository = orderPublishHistoryRepository;
+        _repositoryts = repositoryts;
 
-    }
+	}
 
     #region 工单发布
 
@@ -458,7 +464,16 @@ public class OrderController : BaseController
             {
                 visit.Order.Visited(first.OrgProcessingResults.Id, first.OrgProcessingResults.Name);
             }
-            _mapper.Map(dto.VisitDetails,visit.OrderVisitDetails);
+            //_mapper.Map(dto.VisitDetails,visit.OrderVisitDetails);
+            for (int i = 0; i < visit.OrderVisitDetails.Count; i++)
+            {
+                var detail = visit.OrderVisitDetails[i];
+                var detaildto = dto.VisitDetails.FirstOrDefault(x => x.Id == detail.Id);
+                if (detaildto!=null)
+                {
+                    _mapper.Map(detaildto, visit.OrderVisitDetails[i]);
+                }
+            }
             await _orderVisitRepository.UpdateAsync(visit,HttpContext.RequestAborted);
             await _orderVisitedDetailRepository.UpdateRangeAsync(visit.OrderVisitDetails, HttpContext.RequestAborted);
             await _orderRepository.UpdateAsync(visit.Order, HttpContext.RequestAborted);
@@ -1087,7 +1102,8 @@ public class OrderController : BaseController
     {
         var order = _mapper.Map<Order>(dto);
         var orderId = await _orderDomainService.AddAsync(order, HttpContext.RequestAborted);
-        if (dto.Files.Any()) await _fileRepository.AddFileAsync(dto.Files, orderId, HttpContext.RequestAborted);
+		if (dto.Tags.Any()) await _repositoryts.AddVectorAsync(orderId, DateTime.Now, dto.Tags, HttpContext.RequestAborted);
+		if (dto.Files.Any()) await _fileRepository.AddFileAsync(dto.Files, orderId, HttpContext.RequestAborted);
         return orderId;
     }
 
@@ -1129,8 +1145,9 @@ public class OrderController : BaseController
             await _orderRepository.RemoveOrderComplainAsync(order.OrderComplain, HttpContext.RequestAborted);
         if (order?.OrderReport is not null)
             await _orderRepository.RemoveOrderReportAsync(order.OrderReport, HttpContext.RequestAborted);
+        if (dto.Tags.Any()) await _repositoryts.UpdateVectorAsync(dto.Id, dto.Tags, HttpContext.RequestAborted);
 
-        _mapper.Map(dto, order);
+		_mapper.Map(dto, order);
         await _orderRepository.UpdateOrderNavAsync(order, HttpContext.RequestAborted);
     }
 

+ 18 - 5
src/Hotline.Api/Controllers/SettingController.cs

@@ -8,18 +8,15 @@ using Hotline.Repository.SqlSugar.Ts;
 using Hotline.Settings;
 using Hotline.Settings.TimeLimits;
 using Hotline.Share.Dtos;
-using Hotline.Share.Dtos.File;
-using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.Settings;
+using Hotline.Share.Enums.Settings;
 using Hotline.Share.Requests;
 using MapsterMapper;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
-using MongoDB.Bson;
-using MongoDB.Driver;
-using XF.Domain.Authentications;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
+using XF.Utility.EnumExtensions;
 
 namespace Hotline.Api.Controllers
 {
@@ -270,6 +267,22 @@ namespace Hotline.Api.Controllers
 				.FirstAsync(x => x.Id == id);
 		}
 
+		/// <summary>
+		/// 获取标签基本数据
+		/// </summary>
+		/// <param name="id"></param>
+		/// <returns></returns>
+		[HttpGet("businessTag/baseData")]
+		public async Task<object> TagBaseData()
+		{
+			var rsp = new
+			{
+				TagType = EnumExts.GetDescriptions<ETagType>(),
+				BusinessTagType = EnumExts.GetDescriptions<EBusinessTagType>(),
+			};
+			return rsp;
+		}
+
 		#endregion
 	}
 }

+ 11 - 11
src/Hotline.Api/Controllers/SysController.cs

@@ -24,8 +24,8 @@ namespace Hotline.Api.Controllers
         private readonly IMapper _mapper;
         private readonly IRepository<SystemSetting> _systemSettingsRepository;
         private readonly ISystemMenuRepository _systemMenuRepository;
-        private readonly IRepository<SysDicType> _sysDicTypeRepository;
-        private readonly IRepository<SysDicData> _sysDicDataRepository;
+        private readonly IRepository<SystemDicType> _sysDicTypeRepository;
+        private readonly IRepository<SystemDicData> _sysDicDataRepository;
         private readonly ISystemAreaDomainService _systemAreaDomainService;
         private readonly IRepository<SystemArea> _systemAreaRepository;
 
@@ -42,8 +42,8 @@ namespace Hotline.Api.Controllers
             IMapper mapper,
             IRepository<SystemSetting> systemSettingsRepository,
             ISystemMenuRepository systemMenuRepository,
-            IRepository<SysDicType> sysDicTypeRepository,
-            IRepository<SysDicData> sysDicDataRepository,
+            IRepository<SystemDicType> sysDicTypeRepository,
+            IRepository<SystemDicData> sysDicDataRepository,
             ISystemAreaDomainService systemAreaDomainService,
             IRepository<SystemArea> systemAreaRepository
             )
@@ -225,7 +225,7 @@ namespace Hotline.Api.Controllers
         /// <returns></returns>
         [Permission(EPermission.GetSysDicType)]
         [HttpPost("dictype-list")]
-        public async Task<List<SysDicType>> GetSysDicType()
+        public async Task<List<SystemDicType>> GetSysDicType()
         {
             return await _sysDicTypeRepository.Queryable().ToListAsync();
         }
@@ -237,9 +237,9 @@ namespace Hotline.Api.Controllers
         /// <returns></returns>
         [Permission(EPermission.GetSysDicData)]
         [HttpGet("dictdata-type")]
-        public async Task<List<SysDicData>> GetSysDicData([FromQuery] GetSysDicDataDto dto)
+        public async Task<List<SystemDicData>> GetSysDicData([FromQuery] GetSysDicDataDto dto)
         {
-            return await _sysDicDataRepository.Queryable().Where(x => x.DicTypeId == dto.typeid)/*.WhereIF(!string.IsNullOrEmpty(dto.datavalue),x=>x.DicDataValue.Contains(dto.datavalue))*/.ToTreeAsync(x=>x.Children,x=>x.ParentId,"");
+            return await _sysDicDataRepository.Queryable().Where(x => x.DicTypeId == dto.typeid).OrderBy(x=>x.Sort)/*.WhereIF(!string.IsNullOrEmpty(dto.datavalue),x=>x.DicDataValue.Contains(dto.datavalue))*/.ToTreeAsync(x=>x.Children,x=>x.ParentId,"");
             //return await _sysDicDataRepository.Queryable().Where(x => x.DicTypeId == dto.typeid).WhereIF(!string.IsNullOrEmpty(dto.datavalue), x => x.DicDataValue.Contains(dto.datavalue)).WhereIF(!string.IsNullOrEmpty(dto.ParentId), x => x.ParentId == dto.ParentId).ToListAsync();
         }
 
@@ -249,9 +249,9 @@ namespace Hotline.Api.Controllers
         /// <param name="code"></param>
         /// <returns></returns>
         [HttpGet("dictdata-code/{code}")]
-        public async Task<List<SysDicData>> GetSysDicDataByCode(string code)
+        public async Task<List<SystemDicData>> GetSysDicDataByCode(string code)
         {
-            return await _sysDicDataRepository.Queryable().Where(x => x.DicTypeCode == code).ToListAsync();
+            return await _sysDicDataRepository.Queryable().Where(x => x.DicTypeCode == code).OrderBy(x=>x.Sort).ToListAsync();
         }
          
         /// <summary>
@@ -261,7 +261,7 @@ namespace Hotline.Api.Controllers
         /// <returns></returns>
         [Permission(EPermission.SysDicDataModel)]
         [HttpGet("dicdata/{id}")]
-        public async Task<SysDicData> SysDicDataModel(string id)
+        public async Task<SystemDicData> SysDicDataModel(string id)
         {
             var dicData = await _sysDicDataRepository.GetAsync(id, HttpContext.RequestAborted);
             if (dicData is null)
@@ -281,7 +281,7 @@ namespace Hotline.Api.Controllers
             var dicType = await _sysDicTypeRepository.GetAsync(dto.DicTypeId, HttpContext.RequestAborted);
             if (dicType is null)
                 throw UserFriendlyException.SameMessage("无效字典类型");
-            var dicData = _mapper.Map<SysDicData>(dto);
+            var dicData = _mapper.Map<SystemDicData>(dto);
             dicData.DicTypeCode = dicType.DicTypeCode;
             await _sysDicDataRepository.AddAsync(dicData);
         }

+ 6 - 2
src/Hotline.Api/Controllers/TestController.cs

@@ -61,6 +61,8 @@ public class TestController : BaseController
     private readonly IRepositoryTextSearch<OrderTs> _repositoryts;
     private readonly IGroupManager _goupManager;
 
+    private readonly ITimeLimitDomainService _timeLimitDomainService;
+
     //private readonly ITypedCache<List<User>> _cache;
     //private readonly ICacheManager<User> _cache;
 
@@ -86,7 +88,8 @@ public class TestController : BaseController
         IWexClient wexClient,
         ISugarUnitOfWork<WexDbContext> uowWex,
         IRepository<OrderUrge> orderUrgeRepository,
-        IRepositoryTextSearch<OrderTs> repositoryts)
+        IRepositoryTextSearch<OrderTs> repositoryts,
+        ITimeLimitDomainService timeLimitDomainService)
     {
         _logger = logger;
         _authorizeGenerator = authorizeGenerator;
@@ -106,6 +109,7 @@ public class TestController : BaseController
         _uowWex = uowWex;
         _orderUrgeRepository = orderUrgeRepository;
         _repositoryts = repositoryts;
+        _timeLimitDomainService = timeLimitDomainService;
     }
 
     [HttpGet("time")]
@@ -126,7 +130,7 @@ public class TestController : BaseController
         //var rsp = await _wexClient.QueryTelsAsync(new QueryTelRequest {  }, HttpContext.RequestAborted);
 
         //int a = _timeLimitDomainService.CalcWorkTime(DateTime.Now, DateTime.Parse("2023-09-11 16:21:00"));
-
+        int m = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2023-09-19 12:00:00"), DateTime.Parse("2023-09-20 10:00:00"), true);
 
         return OpenResponse.Ok(DateTime.Now.ToString("F"));
 

+ 26 - 5
src/Hotline.Application/CallCenter/Calls/CallRecordManager.cs

@@ -1,5 +1,11 @@
-//using Hotline.CallCenter.Calls;
+//using DotNetCore.CAP;
+//using Hotline.CallCenter.Calls;
+//using Hotline.Orders;
 //using Hotline.Repository.SqlSugar;
+//using Hotline.Share.Dtos.CallCenter;
+//using Hotline.Share.Dtos.Order;
+//using Hotline.Share.Mq;
+//using MapsterMapper;
 //using Microsoft.Extensions.DependencyInjection;
 //using Microsoft.Extensions.Hosting;
 //using Microsoft.Extensions.Logging;
@@ -11,13 +17,12 @@
 //    {
 //        private readonly IServiceScopeFactory _serviceScopeFactory;
 
+
 //        public CallRecordManager(IServiceScopeFactory serviceScopeFactory, ISugarUnitOfWork<WexDbContext> uowWex)
 //        {
 //            _serviceScopeFactory = serviceScopeFactory;
 //        }
 
-
-//        //TODO
 //        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
 //        {
 //            //20秒扫描一次威尔信数据库
@@ -29,9 +34,13 @@
 //                using var scope = _serviceScopeFactory.CreateScope();
 //                var _wexCallRecordRepository = scope.ServiceProvider.GetService<IWexCallRecordRepository>();
 //                var _uowWex = scope.ServiceProvider.GetService<ISugarUnitOfWork<WexDbContext>>();
+//                var _mapper = scope.ServiceProvider.GetService<IMapper>();
+//                var _capPublisher = scope.ServiceProvider.GetService<ICapPublisher>();
+//                var _orderRepository = scope.ServiceProvider.GetService<IOrderRepository>();
 //                var wexRes = _uowWex?.Db.Ado.SqlQuery<WexRecord>("select * from view_telinfo_full where IsSynch=@IsSynch and IsOk = @IsOk and CallType<>'会议' ", new { IsSynch = 0, IsOk = 1 });
 //                if (wexRes != null)
 //                {
+//                    List<CallConnectOrderDto> list = new List<CallConnectOrderDto>();
 //                    foreach (var item in wexRes)
 //                    {
 //                        var wexCallRecord = new WexCallRecord();
@@ -161,10 +170,22 @@
 //                            //执行更新来源数据库已下载数据
 //                            _uowWex?.Db.Ado.ExecuteCommand("update telinfo set IsSynch=1 where GUID=@CallId", new { CallId = wexCallRecord.CallId });
 
-//                            //推送到省上
-
+//                            var callRecord = _mapper.Map<CallRecordDto>(wexCallRecord);
+//                            var callConnectionOrder = new CallConnectOrderDto() { CallRecord = callRecord };
+//                            var order = await _orderRepository.GetAsync(x => x.CallId == wexCallRecord.CallId);
+//                            if (order != null)
+//                            {
+//                                var orderDto = _mapper.Map<OrderDto>(order);
+//                                callConnectionOrder.Order = orderDto;
+//                            }
+//                            list.Add(callConnectionOrder);
 //                        }
 //                    }
+//                    //推省上
+//                    if (list.Count > 0)
+//                    {
+//                        await _capPublisher.PublishAsync(EventNames.HotlineCallBye, list);
+//                    }
 //                }
 //                else
 //                {

+ 149 - 0
src/Hotline.Share/Dtos/CallCenter/CallRecordDto.cs

@@ -0,0 +1,149 @@
+using Hotline.Share.Enums.CallCenter;
+
+
+namespace Hotline.Share.Dtos.CallCenter
+{
+    public class CallRecordDto
+    {
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public DateTime CreationTime { get; set; }
+
+        /// <summary>
+        /// 通话记录ID(外部主键)
+        /// </summary>
+        public string CallId { get; set; }
+
+
+        /// <summary>
+        /// 电话方向
+        /// </summary>
+        public ECallDirection Direction { get; set; }
+
+        /// <summary>
+        /// 应答分机号
+        /// </summary>
+        public string TelNo { get; set; }
+
+        /// <summary>
+        /// 工号
+        /// </summary>
+        public string StaffNo { get; set; }
+
+        /// <summary>
+        /// 主叫
+        /// </summary>
+        public string CPN { get; set; }
+
+        /// <summary>
+        /// 被叫
+        /// </summary>
+        public string CDPN { get; set; }
+
+        /// <summary>
+        /// 号码归属地
+        /// </summary>
+        public string AreaName { get; set; }
+
+        /// <summary>
+        /// 进入IVR时间
+        /// </summary>
+        public DateTime? InIvrTime { get; set; }
+
+
+        /// <summary>
+        /// 离开 IVR时间
+        /// </summary>
+        public DateTime? OutIvrTime { get; set; }
+
+
+        /// <summary>
+        /// 进入队列时间
+        /// </summary>
+        public DateTime? InQueueTime { get; set; }
+
+
+        /// <summary>
+        /// 离开队列时间
+        /// </summary>
+        public DateTime? OutQueueTime { get; set; }
+
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        public DateTime? BeginTime { get; set; }
+
+        /// <summary>
+        /// 振铃开始时间
+        /// </summary>
+        public DateTime? BeginRingTime { get; set; }
+
+        /// <summary>
+        /// 振铃结束时间
+        /// </summary>
+        public DateTime? EndRingTime { get; set; }
+
+        /// <summary>
+        /// 振铃时长
+        /// </summary>
+        public int RingTimes { get; set; }
+
+        /// <summary>
+        /// 接听时间
+        /// </summary>
+        public DateTime? AnsweredTime { get; set; }
+
+        /// <summary>
+        /// 挂断时间
+        /// </summary>
+        public DateTime? ByeTime { get; set; }
+
+        /// <summary>
+        /// 通话时长
+        /// </summary>
+        public int TalkTime { get; set; }
+
+        /// <summary>
+        /// 录音播放路径
+        /// </summary>
+        public string RecordUrl { get; set; }
+
+        /// <summary>
+        /// 录音本地路径
+        /// </summary>
+        public string RecordName { get; set; }
+
+        /// <summary>
+        /// 录音相对路径
+        /// </summary>
+        public string SourceRecord { get; set; }
+
+        /// <summary>
+        /// 通话结果
+        /// </summary>
+        public EOnState OnState { get; set; }
+
+
+        /// <summary>
+        /// 挂断方
+        /// </summary>
+        public EEndBy EndBy { get; set; }
+
+        /// <summary>
+        /// 成功or失败
+        /// </summary>
+        public string Result { get; set; }
+
+
+        /// <summary>
+        /// 评价结果
+        /// </summary>
+        public string EvaluateResult { get; set; }
+
+        /// <summary>
+        /// 中继线
+        /// </summary>
+        public string TrunkLine { get; set; }
+    }
+}

+ 2 - 0
src/Hotline.Share/Dtos/Dic/DicDto.cs

@@ -14,6 +14,8 @@ namespace Hotline.Share.Dtos.Dic
         public string DicDataValue { get; set; }
 
         public string? ParentId { get; set; }
+
+        public int Sort { get; set; }
     }
     public record UpdateDicDataDto: AddDicDataDto
     {

+ 12 - 2
src/Hotline.Share/Dtos/Knowledge/KnowledgeDto.cs

@@ -12,7 +12,12 @@ namespace Hotline.Share.Dtos.Knowledge
         /// ID
         /// </summary>
         public string Id { get; set; }
-    }
+
+        /// <summary>
+        /// 标签名称
+        /// </summary>
+        public List<string> Tags { get; set; } = new();
+	}
 
     /// <summary>
     /// 新增知识
@@ -23,7 +28,12 @@ namespace Hotline.Share.Dtos.Knowledge
         /// 知识Code
         /// </summary>
         public string Code { get; set; }
-    }
+
+        /// <summary>
+        /// 标签名称
+        /// </summary>
+        public List<string> Tags { get; set; } = new();
+	}
 
     /// <summary>
     /// 查询详情

+ 2 - 5
src/Hotline.Share/Dtos/Order/CallConnectOrderDto.cs

@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using Hotline.Share.Dtos.CallCenter;
 
 namespace Hotline.Share.Dtos.Order
 {
@@ -10,5 +6,6 @@ namespace Hotline.Share.Dtos.Order
     {
         public OrderDto Order { get; set; }
         //todo 补充calldto
+        public CallRecordDto CallRecord { get; set; }
     }
 }

+ 7 - 1
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -522,7 +522,13 @@ namespace Hotline.Share.Dtos.Order
         /// 附件列表
         /// </summary>
         public List<FileDto> Files { get; set; } = new();
-    }
+
+        /// <summary>
+        /// 标签名称
+        /// </summary>
+        public List<string> Tags { get; set; } = new();
+
+	}
 
     public class PublishedEntityDto
     {

+ 2 - 2
src/Hotline.Share/Dtos/Settings/BusinessTagDto.cs

@@ -18,7 +18,7 @@ namespace Hotline.Share.Dtos.Settings
 		/// <summary>
 		/// 分类
 		/// </summary>
-		public string Sort { get; set; }
+		public string Classify { get; set; }
 
 		/// <summary>
 		/// 标签类型
@@ -43,7 +43,7 @@ namespace Hotline.Share.Dtos.Settings
 		/// <summary>
 		/// 分类
 		/// </summary>
-		public string? Sort { get; set; } 
+		public string? Classify { get; set; } 
 	}
 	public class DeleteBusinessTagDto
 	{

+ 25 - 0
src/Hotline.Share/Enums/Settings/EBusinessTag.cs

@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Enums.Settings
+{
+	public enum ETagType
+	{
+		[Description("标签")]
+		Tag = 1,
+		[Description("分类")]
+		Classify = 2,
+	}
+
+	public enum EBusinessTagType
+	{
+		[Description("工单")]
+		Order = 1,
+		[Description("知识库")]
+		Knowledge = 2,
+	}
+}

+ 1 - 1
src/Hotline.Share/Hotline.Share.csproj

@@ -7,7 +7,7 @@
     <GenerateDocumentationFile>True</GenerateDocumentationFile>
     <NoWarn>$(NoWarn);1591;8618;</NoWarn>
     <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
-    <Version>1.0.17</Version>
+    <Version>1.0.18</Version>
   </PropertyGroup>
 
   <ItemGroup>

+ 2 - 2
src/Hotline/Caching/Interfaces/ISysDicDataCacheManager.cs

@@ -7,8 +7,8 @@ using System.Threading.Tasks;
 
 namespace Hotline.Caching.Interfaces
 {
-    public interface ISysDicDataCacheManager
+    public interface ISystemDicDataCacheManager
     {
-        IReadOnlyList<SysDicData> GetSysDicDataCache(string code);
+        IReadOnlyList<SystemDicData> GetSysDicDataCache(string code);
     }
 }

+ 5 - 5
src/Hotline/Caching/Services/SysDicDataCacheManager.cs

@@ -6,18 +6,18 @@ using XF.Domain.Repository;
 
 namespace Hotline.Caching.Services
 {
-    public class SysDicDataCacheManager : ISysDicDataCacheManager, IScopeDependency
+    public class SysDicDataCacheManager : ISystemDicDataCacheManager, IScopeDependency
     {
-        private readonly IRepository<SysDicData> _sysDicDataRepository;
-        private readonly ITypedCache<IReadOnlyList<SysDicData>> _cacheSysDicData;
+        private readonly IRepository<SystemDicData> _sysDicDataRepository;
+        private readonly ITypedCache<IReadOnlyList<SystemDicData>> _cacheSysDicData;
 
-        public SysDicDataCacheManager(IRepository<SysDicData> sysDicDataRepository, ITypedCache<IReadOnlyList<SysDicData>> cacheSysDicData)
+        public SysDicDataCacheManager(IRepository<SystemDicData> sysDicDataRepository, ITypedCache<IReadOnlyList<SystemDicData>> cacheSysDicData)
         {
             _sysDicDataRepository = sysDicDataRepository;
             _cacheSysDicData = cacheSysDicData;
         }
 
-        public IReadOnlyList<SysDicData> GetSysDicDataCache(string code)
+        public IReadOnlyList<SystemDicData> GetSysDicDataCache(string code)
         {
             var sysDicDataList = _cacheSysDicData.GetOrSet(code, k =>
             {

+ 9 - 0
src/Hotline/KnowledgeBase/KnowledgeTs.cs

@@ -0,0 +1,9 @@
+using XF.Domain.Entities;
+using XF.Domain.Repository;
+
+namespace Hotline.KnowledgeBase
+{
+	public class KnowledgeTs : TextSearchEntity, ITable
+	{
+	}
+}

+ 9 - 4
src/Hotline/Orders/OrderDomainService.cs

@@ -16,6 +16,8 @@ using XF.Domain.Entities;
 using XF.Domain.Exceptions;
 using XF.Domain.Extensions;
 using XF.Domain.Repository;
+using Hotline.CallCenter.Calls;
+using Hotline.Share.Dtos.CallCenter;
 
 namespace Hotline.Orders;
 
@@ -31,6 +33,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     private readonly ICapPublisher _capPublisher;
     private readonly IMapper _mapper;
     private readonly ILogger<OrderDomainService> _logger;
+    private readonly IRepository<WexCallRecord> _wexCallRecordRepository;
 
     public OrderDomainService(
         IOrderRepository orderRepository,
@@ -41,7 +44,8 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         ISessionContext sessionContext,
         ICapPublisher capPublisher,
         IMapper mapper,
-        ILogger<OrderDomainService> logger)
+        ILogger<OrderDomainService> logger,
+        IRepository<WexCallRecord> wexCallRecordRepository)
     {
         _orderRepository = orderRepository;
         _orderRedoRepository = orderRedoRepository;
@@ -52,6 +56,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         _capPublisher = capPublisher;
         _mapper = mapper;
         _logger = logger;
+        _wexCallRecordRepository = wexCallRecordRepository;
     }
 
     public async Task<Order> GetOrderAsync(string? orderId, CancellationToken cancellationToken)
@@ -80,13 +85,13 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
 
         if (order.SourceChannelCode == OrderDefaults.SourceChannel.DianHua && !string.IsNullOrEmpty(order.CallId))
         {
-            //查询通话记录TODO
-            if (true)
+            var callRecord = await _wexCallRecordRepository.GetAsync(x => x.CallId == order.CallId,cancellationToken);
+            if (callRecord != null)
             {
                 await _capPublisher.PublishAsync(EventNames.HotlineCallConnectWithOrder, new CallConnectOrderDto
                 {
                     Order = _mapper.Map<OrderDto>(order),
-                    //todo calldto
+                    CallRecord = _mapper.Map<CallRecordDto>(callRecord)
                 }, cancellationToken: cancellationToken);
             }
         }

+ 1 - 1
src/Hotline/Settings/ISystemDomainService.cs

@@ -16,7 +16,7 @@ namespace Hotline.Settings
         Task<IEnumerable<KeyValuePair<int, string>>> QueryOrgLevelOptionsAsync(CancellationToken cancellationToken);
         Task<IEnumerable<KeyValuePair<string, string>>> QueryOrgLevelStringOptionsAsync(CancellationToken cancellationToken);
 
-        Task<IReadOnlyList<SysDicData>> GetSysDicDataByCodeAsync(string code, CancellationToken cancellationToken = default);
+        Task<IReadOnlyList<SystemDicData>> GetSysDicDataByCodeAsync(string code, CancellationToken cancellationToken = default);
 
         /// <summary>
         /// 生成新的部门编码

+ 7 - 2
src/Hotline/Settings/SysDicData.cs → src/Hotline/Settings/SystemDicData.cs

@@ -5,7 +5,7 @@ using XF.Domain.Repository;
 namespace Hotline.Settings
 {
     [Description("字典表")]
-    public class SysDicData: CreationEntity
+    public class SystemDicData: CreationEntity
     {
         /// <summary>
         /// 字典类型Id
@@ -27,6 +27,11 @@ namespace Hotline.Settings
         /// </summary>
         public string DicDataValue { get; set; }
 
+        /// <summary>
+        /// 排序
+        /// </summary>
+        [SugarColumn(DefaultValue = "0")]
+        public int Sort { get; set; }
         /// <summary>
         /// 上级ID
         /// </summary>
@@ -34,6 +39,6 @@ namespace Hotline.Settings
         public string? ParentId { get; set; }
 
         [SugarColumn(IsIgnore = true)]
-        public List<SysDicData> Children { get; set; }
+        public List<SystemDicData> Children { get; set; }
     }
 }

+ 3 - 3
src/Hotline/Settings/SysDicType.cs → src/Hotline/Settings/SystemDicType.cs

@@ -5,7 +5,7 @@ using XF.Domain.Repository;
 namespace Hotline.Settings
 {
     [Description("字典类型表")]
-    public class SysDicType: CreationEntity
+    public class SystemDicType: CreationEntity
     {
         /// <summary>
         /// 字典类型名称
@@ -18,7 +18,7 @@ namespace Hotline.Settings
         public string DicTypeCode { get; set; }
 
 
-        [Navigate(NavigateType.OneToMany, nameof(SysDicData.DicTypeId))]
-        public List<SysDicData> SysDicDatas { get; set; }
+        [Navigate(NavigateType.OneToMany, nameof(SystemDicData.DicTypeId))]
+        public List<SystemDicData> SysDicDatas { get; set; }
     }
 }

+ 3 - 3
src/Hotline/Settings/SystemDomainService.cs

@@ -7,11 +7,11 @@ namespace Hotline.Settings;
 public class SystemDomainService : ISystemDomainService, IScopeDependency
 {
     private readonly ISystemOrganizeRepository _organizeRepository;
-    private readonly IRepository<SysDicData> _sysDicDataRepository;
+    private readonly IRepository<SystemDicData> _sysDicDataRepository;
 
     public SystemDomainService(
         ISystemOrganizeRepository organizeRepository,
-        IRepository<SysDicData> sysDicDataRepository)
+        IRepository<SystemDicData> sysDicDataRepository)
     {
         _organizeRepository = organizeRepository;
         _sysDicDataRepository = sysDicDataRepository;
@@ -37,7 +37,7 @@ public class SystemDomainService : ISystemDomainService, IScopeDependency
         return rsp.Select(d => new KeyValuePair<string, string>(d.Key.ToString(), d.Value));
     }
 
-    public async Task<IReadOnlyList<SysDicData>> GetSysDicDataByCodeAsync(string code, CancellationToken cancellationToken = default)
+    public async Task<IReadOnlyList<SystemDicData>> GetSysDicDataByCodeAsync(string code, CancellationToken cancellationToken = default)
     {
         return await _sysDicDataRepository.Queryable().Where(x => x.DicTypeCode == code).ToTreeAsync(x => x.Children, x => x.ParentId, "");
     }

+ 1 - 25
src/Hotline/Settings/TimeLimits/TimeLimitDomainService.cs

@@ -137,31 +137,7 @@ namespace Hotline.Settings.TimeLimits
                     }
 
                     int minutes = 0;
-                    while (true)
-                    {
-                        if (IsWorkDay(beginTime))
-                        {
-                            if(endTime.Date == WorkEndTime.Date)
-                            {
-                                if (endTime>WorkEndTime)
-                                {
-                                    endTime = WorkEndTime;
-                                }
-                                TimeSpan sp = new TimeSpan(endTime.Ticks - WorkEndTime.Ticks);
-                                minutes += (int)sp.TotalMinutes;
-                                return minutes;
-                            }
-                            else
-                            {
-
-                            }
-                        }
-                        else
-                        {
-                            beginTime = beginTime.AddDays(1);
-                            WorkEndTime = WorkEndTime.AddDays(1);
-                        }
-                    }
+                   
                 }
                 return 0;
             }