浏览代码

Merge branch 'test' of http://110.188.24.182:10023/Fengwo/hotline into test

xf 5 月之前
父节点
当前提交
77462c2406

+ 7 - 7
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -277,31 +277,31 @@ namespace Hotline.Api.Controllers
         [LogFilter("知识修改")]
         public async Task UpdateKnowledge([FromBody] UpdateStartFlowDto dto)
         {
-            var update = _mapper.Map<UpdateKnowledgeDto>(dto.Data);
-            var knowledge = await _knowledgeRepository.GetAsync(update.Id);
+            var knowledge = await _knowledgeRepository.GetAsync(dto.Data.Id);
             if (knowledge == null)
                 throw UserFriendlyException.SameMessage("知识库数据错误");
             if ((knowledge.Status == EKnowledgeStatus.OnShelf || knowledge.Status == EKnowledgeStatus.Auditing) && (knowledge.ExpiredTime.HasValue && knowledge.ExpiredTime.Value > DateTime.Now))
                 throw UserFriendlyException.SameMessage("知识库数据不可修改");
 
-            var any = await _knowledgeRepository.Queryable().Where(x => x.Status == EKnowledgeStatus.OnShelf && x.Title == update.Title && x.Id != update.Id).AnyAsync();
+            var any = await _knowledgeRepository.Queryable().Where(x => x.Status == EKnowledgeStatus.OnShelf && x.Title == dto.Data.Title && x.Id != dto.Data.Id).AnyAsync();
             if (any) throw UserFriendlyException.SameMessage("当前知识标题存在重复标题!");
             _mapper.Map(dto.Data, knowledge);
-            //if (update.Tags.Any()) await _repositoryts.UpdateVectorAsync(update.Id, update.Tags, HttpContext.RequestAborted);
+            knowledge.HotspotId = dto.Data.HotspotId;
+            knowledge.HotspotExternal = dto.Data.HotspotExternal;
 
-            if (dto.Data.Files.Any())
+			if (dto.Data.Files.Any())
                 knowledge.FileJson = await _fileRepository.AddFileAsync(dto.Data.Files, knowledge.Id, "", HttpContext.RequestAborted);
             else
                 knowledge.FileJson = new List<Share.Dtos.File.FileJson>();
             if (dto.Workflow != null) knowledge.Renewaln = knowledge.Status != EKnowledgeStatus.Drafts;
-            await _knowledgeRepository.UpdateAsync(knowledge, HttpContext.RequestAborted);
+            await _knowledgeRepository.UpdateNullAsync(knowledge, HttpContext.RequestAborted);
             if (dto.Data.KnowledgeType.Any())
             {
                 var anyRelationTypes = await _knowledgeRelationTypeRepository.Queryable().Where(x => x.KnowledgeId == knowledge.Id).ToListAsync();
                 if (anyRelationTypes.Any())
                     await _knowledgeRelationTypeRepository.RemoveRangeAsync(anyRelationTypes);
                 List<KnowledgeRelationType> types = _mapper.Map<List<KnowledgeRelationType>>(dto.Data.KnowledgeType);
-                types.ForEach(x => x.KnowledgeId = update.Id);
+                types.ForEach(x => x.KnowledgeId = dto.Data.Id);
                 await _knowledgeRelationTypeRepository.AddRangeAsync(types, HttpContext.RequestAborted);
             }
             if (dto.Workflow != null)

+ 18 - 12
src/Hotline.Api/Controllers/OrderController.cs

@@ -3240,7 +3240,8 @@ public class OrderController : BaseController
     /// </summary>
     [HttpPost("add-anonymous")]
     [AllowAnonymous]
-    public async Task<AddOrderResponse> AddAnonymous([FromBody] AddOrderDto dto)
+    [LogFilter("省平台调用记录")]
+	public async Task<AddOrderResponse> AddAnonymous([FromBody] AddOrderDto dto)
     {
         return await _orderApplication.ReceiveOrderFromExternalAsync(dto, HttpContext.RequestAborted);
     }
@@ -3797,8 +3798,9 @@ public class OrderController : BaseController
             OrderStatusOptions = EnumExts.GetDescriptions<EOrderStatus>(),
             CurrentStepOptions = definition?.Steps.Select(x => new Kv(x.Code, x.Name)),
             IdentityTypeOptions = EnumExts.GetDescriptions<EIdentityType>(),
-            OrderTags = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.OrderTag)
-        };
+            OrderTags = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.OrderTag),
+            FocusOnEvents = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.FocusOnEvent)
+    };
         return rsp;
     }
 
@@ -4713,11 +4715,13 @@ public class OrderController : BaseController
         var order = await _orderRepository.Queryable().Includes(d => d.Workflow).FirstAsync(d => d.Id == dto.OrderId);
 		await _orderApplication.SpecialVerify(dto, order, HttpContext.RequestAborted);
 
-		var model = _mapper.Map<OrderSpecial>(dto);
-        var orgs = order.HandlerOrgs;
-        model.OrgId = orgs != null && orgs.Count > 0 ? orgs[0].Key : "";
-        model.OrgName = orgs != null && orgs.Count > 0 ? orgs[0].Value : "";
-        var step = await _workflowDomainService.FindLastStepAsync(model.WorkflowId, HttpContext.RequestAborted);
+		var  workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true, withTraces: true, withCountersigns: true, cancellationToken: HttpContext.RequestAborted);
+        var currentStep = workflow.Steps.FirstOrDefault(x => x.Status != EWorkflowStepStatus.Handled);
+
+        var model = _mapper.Map<OrderSpecial>(dto);
+        model.OrgId = currentStep.HandlerOrgId;
+        model.OrgName = currentStep.HandlerOrgName;
+		var step = await _workflowDomainService.FindLastStepAsync(model.WorkflowId, HttpContext.RequestAborted);
         model.StepName = step.Name;
         model.StepCode = step.Code;
         model.Status = order.Status;
@@ -4917,10 +4921,12 @@ public class OrderController : BaseController
         if (order.Workflow.IsInCountersign) throw UserFriendlyException.SameMessage("工单会签中,无法进行重办!");
 
         var model = _mapper.Map<OrderSpecial>(dto);
-        var orgs = order.HandlerOrgs;
-        model.OrgId = orgs != null && orgs.Count > 0 ? orgs[0].Key : "";
-        model.OrgName = orgs != null && orgs.Count > 0 ? orgs[0].Value : "";
-        var step = await _workflowDomainService.FindLastStepAsync(model.WorkflowId, HttpContext.RequestAborted);
+
+        var workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true, withTraces: true, withCountersigns: true, cancellationToken: HttpContext.RequestAborted);
+        var currentStep = workflow.Steps.FirstOrDefault(x => x.Status != EWorkflowStepStatus.Handled);
+        model.OrgId = currentStep.HandlerOrgId;
+        model.OrgName = currentStep.HandlerOrgName;
+		var step = await _workflowDomainService.FindLastStepAsync(model.WorkflowId, HttpContext.RequestAborted);
         model.StepName = step.Name;
         model.StepCode = step.Code;
         model.State = 1;

+ 33 - 1
src/Hotline.Application.Tests/Application/DefaultCallApplicationTest.cs

@@ -3,6 +3,7 @@ using Hotline.Application.CallCenter;
 using Hotline.Identity.Accounts;
 using Hotline.Identity.Roles;
 using Hotline.Share.Dtos.CallCenter;
+using Hotline.Share.Enums.CallCenter;
 using Hotline.Users;
 using Microsoft.Extensions.DependencyInjection;
 using Shouldly;
@@ -26,7 +27,38 @@ public class DefaultCallApplicationTest
         inDto.CallStartTimeEnd = DateTime.Now;
         inDto.CallStartTimeStart = "2024/10/01 00:00:00".ObjToDate();
 
-        var items = _defaultCallApplication.QueryCallsFixedAsync(inDto, new CancellationToken());
+        var items = await _defaultCallApplication.QueryCallsFixedAsync(inDto, new CancellationToken());
         items.ShouldNotBeNull();
     }
+
+    [Fact]
+    public async Task QueryCallsFixedThree_Test()
+    {
+        var inDto = new QueryCallsFixedDto();
+        inDto.CallStartTimeEnd = DateTime.Now;
+        inDto.CallStartTimeStart = "2024/11/08 00:00:00".ObjToDate();
+        inDto.FromNo = "8205175";
+
+        var items1 = await _defaultCallApplication.QueryCallsFixedAsync(inDto, new CancellationToken());
+        items1.ShouldNotBeNull();
+        foreach (var item in items1.Where(m => m.IsOrder))
+        {
+            item.Title.ShouldNotBeNull();
+            item.OrderId.ShouldNotBeNull();
+            item.OrderNo.ShouldNotBeNull();
+        }
+
+        inDto.ToNo = "13990006670";
+        inDto.FromNo = null;
+        inDto.Type = 2;
+        var items = await _defaultCallApplication.QueryCallsFixedAsync(inDto, new CancellationToken());
+        items.ShouldNotBeNull();
+        items.Count().ShouldNotBe(0, "通过被叫号码查询失败");
+        foreach (var item in items.Where(m => m.IsVisit))
+        {
+            item.Title.ShouldNotBeNull();
+            item.OrderId.ShouldNotBeNull();
+            item.OrderNo.ShouldNotBeNull();
+        }
+    }
 }

+ 27 - 20
src/Hotline.Application/CallCenter/DefaultCallApplication.cs

@@ -210,8 +210,9 @@ public abstract class DefaultCallApplication : ICallApplication
     {
         var query = _callNativeRepository.Queryable(includeDeleted: true)
             .LeftJoin<Order>((d, o) => d.Id == o.CallId)
-            .Where((d, o) => d.GroupId != "0")
-            .WhereIF(!string.IsNullOrEmpty(dto.OrderNo), (d, o) => o.No == dto.OrderNo)
+            .LeftJoin<OrderVisit>((d, o, v) => d.Id == v.CallId)
+            // .WhereIF(string.IsNullOrEmpty(dto.ToNo), (d, o, v) => d.GroupId != "0")
+            .WhereIF(!string.IsNullOrEmpty(dto.OrderNo), (d, o, v) => o.No == dto.OrderNo)
             .WhereIF(!string.IsNullOrEmpty(dto.FromNo), d => d.FromNo == dto.FromNo)
             .WhereIF(!string.IsNullOrEmpty(dto.ToNo), d => d.ToNo == dto.ToNo)
             .WhereIF(!string.IsNullOrEmpty(dto.UserName), d => d.UserName == dto.UserName)
@@ -223,32 +224,38 @@ public abstract class DefaultCallApplication : ICallApplication
             .WhereIF(dto.Direction != null, d => d.Direction == dto.Direction)
             .WhereIF(dto.WaitDurationStart != null && dto.WaitDurationStart > 0, d => d.WaitDuration >= dto.WaitDurationStart)
             .WhereIF(dto.WaitDurationEnd != null && dto.WaitDurationEnd > 0, d => d.WaitDuration <= dto.WaitDurationEnd)
-            .WhereIF(dto.IsMissOrder != null && dto.IsMissOrder.Value == true, (d, o) => string.IsNullOrEmpty(o.Id) == true)
-            .WhereIF(dto.IsMissOrder != null && dto.IsMissOrder.Value == false, (d, o) => string.IsNullOrEmpty(o.Id) == false)
+            .WhereIF(dto.IsMissOrder != null && dto.IsMissOrder.Value == true, (d, o, v) => string.IsNullOrEmpty(o.Id) == true)
+            .WhereIF(dto.IsMissOrder != null && dto.IsMissOrder.Value == false, (d, o, v) => string.IsNullOrEmpty(o.Id) == false)
             .OrderByDescending(d => d.Id);
 
-        query = query.WhereIF(dto.Type == 3, (d, o) => d.AnsweredTime == null);
-        query = query.WhereIF(dto.Type == 1, (d, o) => d.Direction == ECallDirection.In);
-        query = query.WhereIF(dto.Type == 2, (d, o) => d.Direction == ECallDirection.Out);
-        var items = await query.Select((d, o) => new CallNativeDto
+        query = query.WhereIF(dto.Type == 3, (d, o, v) => d.AnsweredTime == null);
+        query = query.WhereIF(dto.Type == 1, (d, o, v) => d.Direction == ECallDirection.In && d.AnsweredTime != null);
+        query = query.WhereIF(dto.Type == 2, (d, o, v) => d.Direction == ECallDirection.Out && d.AnsweredTime != null);
+
+        if (dto.Type == 2)
+        {
+            var items = await query.Select((d, o, v) => new CallNativeDto
+            {
+                OrderId = v.OrderId,
+                OrderNo = v.Order.No,
+                Title = v.Order.Title,
+                CallState = d.CallState,
+                IsVisit = !SqlFunc.IsNullOrEmpty(v.Id),
+                IsOrder = !SqlFunc.IsNullOrEmpty(o.Id),
+            }, true)
+                .ToFixedListAsync(dto, cancellationToken);
+            return items;
+        }
+        return await query.Select((d, o, v) => new CallNativeDto
         {
             OrderId = o.Id,
             OrderNo = o.No,
+            CallState = d.CallState,
             Title = o.Title,
-            Gateway = SqlFunc.Subqueryable<CallNative>()
-            .Where(m => m.GroupId == "0" && m.CallNo == d.CallNo)
-            .Select(m => m.ToNo)
+            IsVisit = !SqlFunc.IsNullOrEmpty(v.Id),
+            IsOrder = !SqlFunc.IsNullOrEmpty(o.Id),
         }, true)
         .ToFixedListAsync(dto, cancellationToken);
-
-        items.Where(m => m.Gateway != null)
-            .ToList().ForEach(m => 
-            {
-                var toNo = m.Gateway;
-                m.Gateway = m.ToNo;
-                m.ToNo = toNo;
-            });
-        return items;
     }
 
     /// <summary>

+ 2 - 2
src/Hotline.Application/Mappers/WebPortalMapperConfigs.cs

@@ -25,7 +25,7 @@ namespace Hotline.Application.Mappers
                .Map(d => d.ConTypeName, x => x.Order.HotspotName)
                .Map(d => d.FlowAddDate, x => x.Order.StartTime)
                .Map(d => d.PubDate, x => x.CreationTime)
-               .Map(d => d.RSFlagName, x => x.Order.Status <= EOrderStatus.Filed ? "办理中" : "办理完成")
+               .Map(d => d.RSFlagName, x => x.Order.Status < EOrderStatus.Filed ? "办理中" : "办理完成")
           ;
 
             //办件摘编详情
@@ -45,7 +45,7 @@ namespace Hotline.Application.Mappers
             .Map(d => d.FlowBMID, x => x.ActualHandleOrgCode)
             .Map(d => d.FlowBMName, x => x.ActualHandleOrgName)
             .Map(d => d.FlowLKName, x => x.FromName)
-            .Map(d => d.FlowRSFlagName, x => x.Status <= EOrderStatus.Filed ? "办理中" : "办理完成")
+            .Map(d => d.FlowRSFlagName, x => x.Status < EOrderStatus.Filed ? "办理中" : "办理完成")
        ;
 
             //注册用户数据

+ 5 - 6
src/Hotline.Application/Orders/OrderApplication.cs

@@ -1131,6 +1131,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
              .WhereIF(dto.FiledType is FiledType.CenterFiled, d => d.ProcessType == EProcessType.Zhiban)
              .WhereIF(dto.FiledType is FiledType.OrgFiled, d => d.ProcessType == EProcessType.Jiaoban)
              .WhereIF(!string.IsNullOrEmpty(dto.OrderTagCode), d => d.OrderTagCode == dto.OrderTagCode)
+             .WhereIF(!string.IsNullOrEmpty(dto.FocusOnEvents),d=>SqlFunc.SplitIn(d.FocusOnEvents, dto.FocusOnEvents))
              .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.CreationTime, OrderByType.Desc)//默认排序时间为创建时间
              .OrderByIF(dto is { SortField: "no", SortRule: 0 }, d => d.No, OrderByType.Asc) //工单编号升序
              .OrderByIF(dto is { SortField: "no", SortRule: 1 }, d => d.No, OrderByType.Desc) //工单编号降序
@@ -2710,15 +2711,13 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 var isPaiDan = await _workflowDomainService.RecallToCenterFirstToSendAsync(order.WorkflowId, "省工单重派", order.Status >= EOrderStatus.Filed,
                     order.ExpiredTime, cancellationToken);
                 order.FileEmpty();
-                if (isPaiDan)
+
+                var status = EOrderStatus.WaitForAccept;
+				if (isPaiDan)
                 {
                     order.Status = EOrderStatus.Handling;
                 }
-                else
-                {
-                    order.Status = EOrderStatus.WaitForAccept;
-                }
-                await _orderRepository.Updateable().SetColumns(o => new Order{ Status = order.Status }).Where(o => o.Id == order.Id).ExecuteCommandAsync(cancellationToken);
+                await _orderRepository.Updateable().SetColumns(o => new Order{ Status = status }).Where(o => o.Id == order.Id).ExecuteCommandAsync(cancellationToken);
 				//await _orderRepository.UpdateAsync(order, cancellationToken);
 				//处理回访和发布信息
 

+ 9 - 1
src/Hotline.Repository.SqlSugar/BaseRepository.cs

@@ -110,7 +110,15 @@ namespace Hotline.Repository.SqlSugar
                 .ExecuteCommandAsync(cancellationToken);
         }
 
-        public async Task UpdateRangeAsync(List<TEntity> entities, CancellationToken cancellationToken = default)
+		public async Task UpdateNullAsync(TEntity entity, CancellationToken cancellationToken = default)
+		{
+			await Db.Updateable(entity)
+				.IgnoreColumns(d => d.CreationTime)
+				.ExecuteCommandAsync(cancellationToken);
+		}
+
+
+		public async Task UpdateRangeAsync(List<TEntity> entities, CancellationToken cancellationToken = default)
         {
             await Db.Updateable(entities)
                 .IgnoreColumns(d => d.CreationTime)

+ 17 - 2
src/Hotline.Share/Dtos/CallCenter/CallNativeDto.cs

@@ -134,8 +134,23 @@ namespace Hotline.Share.Dtos.CallCenter
         public string? Title { get; set; }
 
         /// <summary>
-        /// 中继号码
+        /// 通话状态
         /// </summary>
-        public string Gateway { get; set; }
+        public ECallState? CallState { get; set; }
+
+        /// <summary>
+        /// 通话状态
+        /// </summary>
+        public string? CallStateTxt => CallState != null ? CallState.GetDescription() : "";
+
+        /// <summary>
+        /// 是否回访
+        /// </summary>
+        public bool IsVisit { get; set; } = false;
+
+        /// <summary>
+        /// 是否工单
+        /// </summary>
+        public bool IsOrder { get; set; } = false;
     }
 }

+ 10 - 0
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -362,6 +362,11 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public string? CurrentHandleOrgAreaName { get; set; }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        public string? FocusOnEventsName { get; set; }
+
         #endregion
 
         #region 一级部门
@@ -1253,6 +1258,11 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public string? FocusOnEvents { get; set; }
 
+        /// <summary>
+        /// 重点关注事件,保存前端选择文字,用于返回前端数据
+        /// </summary>
+        public string? FocusOnEventsName { get; set; }
+
         /// <summary>
         /// 是否紧急
         /// </summary>

+ 5 - 0
src/Hotline.Share/Dtos/Order/QueryOrderDto.cs

@@ -205,6 +205,11 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public int? SortRule { get; set; }
 
+        /// <summary>
+        /// 重点标记
+        /// </summary>
+        public string? FocusOnEvents { get; set; }
+
     }
 
 

+ 6 - 0
src/Hotline/Orders/Order.cs

@@ -1005,6 +1005,12 @@ namespace Hotline.Orders
         [SugarColumn(ColumnDescription = "重点关注事件")]
         public string? FocusOnEvents { get; set; }
 
+        /// <summary>
+        /// 重点关注事件名称,保存前端选择,用于返回前端数据
+        /// </summary>
+        [SugarColumn(ColumnDescription ="重点关注事件名称")]
+        public string? FocusOnEventsName { get; set; }
+
         /// <summary>
         /// 待发布人Id
         /// </summary>

+ 3 - 1
src/XF.Domain.Repository/IRepositoryWithTKey.cs

@@ -24,7 +24,9 @@ namespace XF.Domain.Repository
         Task RemoveRangeAsync(IEnumerable<TEntity> entities, bool? soft, CancellationToken cancellationToken = default);
 
         Task UpdateAsync(TEntity entity, CancellationToken cancellationToken = default);
-        Task UpdateRangeAsync(List<TEntity> entities, CancellationToken cancellationToken = default);
+
+        Task UpdateNullAsync(TEntity entity, CancellationToken cancellationToken = default);
+		Task UpdateRangeAsync(List<TEntity> entities, CancellationToken cancellationToken = default);
         Task<TEntity?> GetAsync(TKey id, CancellationToken cancellationToken = default);
         Task<TEntity?> GetAsync(Expression<Func<TEntity, bool>> predicate, CancellationToken cancellationToken = default);
         Task<TEntity?> GetAsync(Expression<Func<TEntity, bool>> predicate, bool isDesc, Expression<Func<TEntity, object>> orderBy, CancellationToken cancellationToken = default);