Browse Source

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

qinchaoyue 5 months ago
parent
commit
2ff9bb07ec

+ 29 - 7
src/Hotline.Api/Controllers/AiController.cs

@@ -1,5 +1,6 @@
 
 using Consul;
+using DocumentFormat.OpenXml.Wordprocessing;
 using DotNetCore.CAP;
 using Hotline.Ai.CallOut;
 using Hotline.Ai.Jths;
@@ -661,7 +662,7 @@ namespace Hotline.Api.Controllers
                                     x.VisitContent = seatVisitContent;
                                 });
 
-                                await _orderVisitDetailRepository.UpdateRangeAsync(seatDetail, HttpContext.RequestAborted);
+                               
 
                                 //处理结果
                                 orgDetail.ForEach(x =>
@@ -678,8 +679,26 @@ namespace Hotline.Api.Controllers
                                     {
                                         //x.OrgNoSatisfiedReason = new List<Kv>() { new Kv() { Key = "7", Value = "未回复" } };
                                         //TODO 记录不满意原因到内容中供人工回访甄别选择不满意原因
-                                        aiOrderVisitDetail.OrderVisit.VisitState = Share.Enums.Order.EVisitState.WaitForVisit;
-                                        aiOrderVisitDetail.OrderVisit.IsEffectiveAiVisit = false;
+                                        if (dto.CallTimes.Value>=1)
+                                        {
+                                            aiOrderVisitDetail.OrderVisit.VisitState = EVisitState.Visited;
+                                            aiOrderVisitDetail.OrderVisit.NowEvaluate = new Kv() { Key = "6", Value = "未接通" };
+                                            x.VisitContent = "智能回访两次未接默认已回访";
+                                            x.Volved = true;
+                                            x.IsContact = true;
+                                            seatDetail.ForEach(x =>
+                                            {
+                                                x.VoiceEvaluate = Share.Enums.Order.EVoiceEvaluate.Satisfied;
+                                                x.SeatEvaluate =  ESeatEvaluate.DefaultSatisfied;
+                                                x.VisitContent = "智能回访两次未接默认已回访";
+                                            });
+                                        }
+                                        else
+                                        {
+                                            aiOrderVisitDetail.OrderVisit.VisitState = Share.Enums.Order.EVisitState.WaitForVisit;
+                                            aiOrderVisitDetail.OrderVisit.IsEffectiveAiVisit = false;
+                                        }
+                                        
                                     }
                                     else
                                     {
@@ -687,6 +706,7 @@ namespace Hotline.Api.Controllers
                                         aiOrderVisitDetail.OrderVisit.IsEffectiveAiVisit = true;
                                     }
                                 });
+                                await _orderVisitDetailRepository.UpdateRangeAsync(seatDetail, HttpContext.RequestAborted);
                                 await _orderVisitDetailRepository.UpdateRangeAsync(orgDetail, HttpContext.RequestAborted);
 
                                 //var first = orgProcessingResults; //aiOrderVisitDetail.OrderVisit.OrderVisitDetails.FirstOrDefault(x => x.VisitTarget == EVisitTarget.Org);
@@ -1065,10 +1085,12 @@ namespace Hotline.Api.Controllers
         public async Task AddAiVisit([FromBody]AddAiVisitDto dto)
         {
             //验证是否有重复电话
-            if (dto.AiOrderVisitDetails.DistinctBy(x=>x.OuterNo.Trim()).Count() != dto.AiOrderVisitDetails.Count)
-            {
-                throw UserFriendlyException.SameMessage("任务中存在重复外呼号码,请检查后重新提交");
-            }
+            //有重复电话自动排除
+            dto.AiOrderVisitDetails = dto.AiOrderVisitDetails.DistinctBy(x => x.OuterNo.Trim()).ToList() ;
+            //if (dto.AiOrderVisitDetails.DistinctBy(x=>x.OuterNo.Trim()).Count() != dto.AiOrderVisitDetails.Count)
+            //{
+            //    throw UserFriendlyException.SameMessage("任务中存在重复外呼号码,请检查后重新提交");
+            //}
 
             var model = _mapper.Map<AiOrderVisit>(dto);
 

+ 27 - 4
src/Hotline.Api/Controllers/OrderController.cs

@@ -799,7 +799,7 @@ public class OrderController : BaseController
             .WhereIF(dto.VisitStateQuery == EVisitStateQuery.Visited, d => d.VisitState == EVisitState.Visited)
             .WhereIF(dto.VisitStateQuery == EVisitStateQuery.SMSUnsatisfied, d => d.VisitState == EVisitState.SMSUnsatisfied)
             .WhereIF(dto.VisitStateQuery == EVisitStateQuery.SMSVisiting, d => d.VisitState == EVisitState.SMSVisiting)
-            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.NoPutThrough , d=>d.IsPutThrough == false)
+            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.NoPutThrough , d=>d.IsPutThrough == false && d.VisitState != EVisitState.Visited)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Order.Title.StartsWith(dto.Keyword!))
             .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
             .WhereIF(dto.VisitType != null, d => d.VisitType == dto.VisitType)
@@ -1591,7 +1591,7 @@ public class OrderController : BaseController
 
         //验证延期次数
         var setting = _systemSettingCacheManager.GetSetting(SettingConstants.DelayNum);
-        if (int.Parse(setting?.SettingValue[0]) != 0)
+        if (int.Parse(setting?.SettingValue[0]) != 0 && !_sessionContext.OrgIsCenter)
         {
             int count = await _orderDelayRepository.CountAsync(x =>
                 x.OrderId == delaydto.OrderId && x.ApplyOrgCode == _sessionContext.RequiredOrgId && x.DelayState == EDelayState.Pass);
@@ -3950,17 +3950,31 @@ public class OrderController : BaseController
     /// <summary>
     /// 批量归档
     /// </summary>
+    /// <returns>成功总量</returns>
     [HttpPost("batch-file")]
-    public async Task BatchFile([FromBody]OrderBatchFileDto dto)
+    public async Task<string> BatchFile([FromBody]OrderBatchFileDto dto)
     {
         var orders = await _orderRepository.Queryable()
+            .Includes(w=>w.Workflow,d => d.WorkflowDefinition)
+            .Includes(w=>w.Workflow,d => d.Steps)
+            .Includes(w=>w.Workflow,d => d.Traces)
             .Where(d => dto.OrderIds.Contains(d.Id))
             .ToListAsync(HttpContext.RequestAborted);
+        var success = 0;
         foreach (var order in orders)
         {
-            await _workflowDomainService.JumpToEndAsync(_sessionContext, order.WorkflowId,dto.Opinion,dto.Files,
+            var startStep = order.Workflow.Steps.Where(d => d.StepType == EStepType.Start && d.IsOrigin)
+                .MaxBy(d => d.CreationTime);
+            if (startStep?.Status is not EWorkflowStepStatus.Handled || string.IsNullOrEmpty(startStep.Opinion))
+                continue;
+            var opinion = startStep.Opinion;
+
+            await _workflowDomainService.JumpToEndAsync(_sessionContext, order.Workflow, opinion, dto.Files,
                 order.ExpiredTime, cancellationToken: HttpContext.RequestAborted);
+            success++;
         }
+
+        return $"批量办理{dto.OrderIds.Count}件,成功{success}件";
     }
 
     #endregion
@@ -4747,12 +4761,21 @@ public class OrderController : BaseController
         if (specialAny) throw UserFriendlyException.SameMessage("工单已存在待审批特提信息!");
         var order = await _orderRepository.Queryable().Includes(d => d.Workflow).FirstAsync(d => d.Id == dto.OrderId);
 		await _orderApplication.SpecialVerify(dto, order, HttpContext.RequestAborted);
+		if (string.IsNullOrEmpty(dto.Cause))
+		{
+			dto.Cause = dto.Reason;
+		}
 
 		var  workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true, cancellationToken: HttpContext.RequestAborted);
         var currentStep = workflow.Steps.FirstOrDefault(x => x.Status != EWorkflowStepStatus.Handled);
         if (currentStep is null)
 	        currentStep = workflow.Steps.OrderByDescending(x => x.CreationTime).FirstOrDefault(x => x.StepType == EStepType.End);
 
+		if (string.IsNullOrEmpty(dto.Cause))
+		{
+			dto.Cause = dto.Reason;
+		}
+
 		var model = _mapper.Map<OrderSpecial>(dto);
         model.OrgId = currentStep is null ? _sessionContext.RequiredOrgId: currentStep.HandlerOrgId;
         model.OrgName = currentStep is null ? _sessionContext.OrgName : currentStep.HandlerOrgName;

+ 43 - 9
src/Hotline.Api/Controllers/WebPortalController.cs

@@ -565,13 +565,14 @@ namespace Hotline.Api.Controllers
         public async Task<OpenResponse> GetOrderListByNum([FromBody] QueryOrderListByNumDto dto)
         {
             var queryNew = _orderRepository.Queryable()
+                .LeftJoin<OrderPublish>((p, op) => p.Id == op.OrderId)
                 .Where(p => p.IsPublicity == true)
-                .OrderByDescending(p => p.CreationTime)
-               .Select(p => new DataListTopDto
+                .OrderByDescending((p, op) => p.CreationTime)
+               .Select((p, op) => new DataListTopDto
                {
                    DataID = p.Id,
                    Title = p.Title,
-                   CreateDate = p.CreationTime
+                   CreateDate = op.CreationTime
                });
 
             var queryold = _oldPublicDataRepository.Queryable()
@@ -580,7 +581,7 @@ namespace Hotline.Api.Controllers
                        {
                            DataID = p.OrderId,
                            Title = p.Title,
-                           CreateDate = p.PubDate
+                           CreateDate = p.CreationTime
                        });
             var items = await _orderRepository.UnionAll(queryNew, queryold)
               .OrderByDescending(p => p.CreateDate)
@@ -922,7 +923,7 @@ namespace Hotline.Api.Controllers
 
             //数据查询
             var listType = await _orderRepository.Queryable()
-                .Where(p => p.StartTime >= startDate && p.StartTime <= endDate && p.Status > EOrderStatus.WaitForAccept)
+                .Where(p => p.CreationTime >= startDate && p.CreationTime <= endDate && p.Status > EOrderStatus.WaitForAccept)
                 .Select(it => new
                 {
                     it.AcceptType,
@@ -938,7 +939,7 @@ namespace Hotline.Api.Controllers
                  .ToListAsync();
 
             var listHot = await _orderRepository.Queryable()
-                .Where(it => it.StartTime >= startDate && it.StartTime <= endDate && it.Status > EOrderStatus.WaitForAccept)
+                .Where(it => it.CreationTime >= startDate && it.CreationTime <= endDate && it.Status > EOrderStatus.WaitForAccept)
                  .Select(it => new
                  {
                      HotspotId = it.HotspotId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("2")),
@@ -1012,7 +1013,7 @@ namespace Hotline.Api.Controllers
           {
               AllCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.Status > EOrderStatus.WaitForAccept, 1, 0)) + 7079457,
               AllTrandCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.Status >= EOrderStatus.Filed, 1, 0)) + 7079214,
-              DayCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.StartTime >= startDate && p.StartTime <= endDate && p.Status > EOrderStatus.WaitForAccept, 1, 0)),
+              DayCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.CreationTime >= startDate && p.CreationTime <= endDate && p.Status > EOrderStatus.WaitForAccept, 1, 0)),
               DayTrandCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.FiledTime >= startDate && p.FiledTime <= endDate && p.Status >= EOrderStatus.Filed, 1, 0)),
           })
           .FirstAsync();
@@ -1127,7 +1128,7 @@ namespace Hotline.Api.Controllers
             var list = _systemDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.KnowledgeBaseTags).Select(p => new
             {
                 SDICT_Name = p.DicDataName,
-                SDICT_ID = p.DicDataValue
+                SDICT_ID = p.DicDataName
             }).ToList();
 
             var rsp = new
@@ -1154,9 +1155,16 @@ namespace Hotline.Api.Controllers
                 typeSpliceName = type?.SpliceName;
             }
 
+            var typeSpliceNameTags = string.Empty;
+            if (!string.IsNullOrEmpty(dto.KnowledgeBaseTags))
+            {
+                var type = await _knowledgeTypeRepository.GetAsync(x => x.Name == dto.KnowledgeBaseTags);
+                typeSpliceNameTags = type?.SpliceName;
+            }
+
             var (total, items) = await _knowledgeRepository.Queryable()
                 .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Title.Contains(dto.Title))
-                .WhereIF(!string.IsNullOrEmpty(dto.KnowledgeBaseTags), p => p.KnowledgeType.Any(t => t.KnowledgeTypeSpliceName.EndsWith(dto.KnowledgeBaseTags)))
+                .WhereIF(!string.IsNullOrEmpty(typeSpliceNameTags), p => p.KnowledgeType.Any(t => t.KnowledgeTypeSpliceName.EndsWith(typeSpliceNameTags)))
                 .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => x.KnowledgeType.Any(t => t.KnowledgeTypeSpliceName.EndsWith(typeSpliceName)))
                 .OrderByDescending(p => p.CreationTime)
                 .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
@@ -1164,5 +1172,31 @@ namespace Hotline.Api.Controllers
             var data = new PagedDto<KnowledgeInfoDto>(total, _mapper.Map<IReadOnlyList<KnowledgeInfoDto>>(items));
             return OpenResponse.Ok(WebPortalDeResponse<PagedDto<KnowledgeInfoDto>>.Success(data));
         }
+
+        /// <summary>
+        /// 获取知识库详情
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("getknowledgeinfo")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> GetKnowledgeInfo([FromBody] QueryKnowledgeInfo dto)
+        {
+            var data = await _knowledgeRepository.GetAsync(p => p.Id == dto.Id, HttpContext.RequestAborted);
+            KnowledgeInfoDto detailsDto = null;
+            if (data != null)
+            {
+                detailsDto = _mapper.Map<KnowledgeInfoDto>(data);
+
+                if (detailsDto != null && !string.IsNullOrEmpty(detailsDto.Content))
+                    data.Content = _bulletinApplication.GetSiteUrls(data.Content);
+            }
+            else
+            {
+                detailsDto = new();
+            }
+            List<KnowledgeInfoDto> dataDto = [detailsDto];
+            return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<KnowledgeInfoDto>>.Success(dataDto));
+        }
     }
 }

+ 1 - 1
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -957,7 +957,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                         UserId = d.Id,
                         Username = d.Name,
                         OrgId = d.OrgId,
-                        OrgName = d.Organization.Name,
+                        OrgName = d.Organization?.Name,
                         RoleId = defineTypeItem.Key,
                         RoleName = defineTypeItem.Value
                     })

+ 2 - 1
src/Hotline.Share/Dtos/Article/BulletinDto.cs

@@ -119,7 +119,8 @@ namespace Hotline.Share.Dtos.Article
 
         public string PushRangesText => PushRanges.Any() ? string.Join("、", PushRanges.Select(x => x.Value)) : "-";
 
-	}
+        public string DisplayLocationText => DisplayLocation.Any() ? string.Join("、", DisplayLocation.Select(x => x.Value)) : "-";
+    }
 
     public record CircularDto
     {

+ 5 - 0
src/Hotline.Share/Dtos/WebPortal/QueryKnowledgeList.cs

@@ -21,6 +21,11 @@ namespace Hotline.Share.Dtos.WebPortal
         public string? KnowledgeBaseTags { get; set; }
     }
 
+    public class QueryKnowledgeInfo
+    {
+        public string Id { get; set; }
+    }
+
     /// <summary>
     /// 知识实体
     /// </summary>

+ 1 - 1
src/Hotline/Article/Bulletin.cs

@@ -13,7 +13,7 @@ namespace Hotline.Article
     {
         public string Title { get; set; }
 
-        [SugarColumn(ColumnDataType = "varchar(8000)")]
+        [SugarColumn(ColumnDataType = "text")]
         public string Content { get; set; }
 
         public string BulletinTypeId { get; set; }

+ 3 - 0
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -292,5 +292,8 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         Task JumpToEndAsync(ISessionContext current,string workflowId, string opinion, List<FileDto> files, DateTime? expiredTime,
             EReviewResult reviewResult = EReviewResult.Unknown, CancellationToken cancellationToken = default);
+
+        Task JumpToEndAsync(ISessionContext current, Workflow workflow, string opinion, List<FileDto> files, DateTime? expiredTime,
+            EReviewResult reviewResult = EReviewResult.Unknown, CancellationToken cancellationToken = default);
     }
 }

+ 9 - 0
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -1444,6 +1444,15 @@ namespace Hotline.FlowEngine.Workflows
         {
             var workflow = await GetWorkflowAsync(workflowId, withDefine: true, withSteps: true, withTraces: true,
                 withCountersigns: true, cancellationToken: cancellationToken);
+            await JumpToEndAsync(current, workflow, opinion, files, expiredTime, reviewResult, cancellationToken);
+        }
+
+        /// <summary>
+        /// 跳转至结束节点(无视流程模板配置以及当前办理对象,直接跳至结束节点)
+        /// </summary>
+        public async Task JumpToEndAsync(ISessionContext current, Workflow workflow, string opinion, List<FileDto> files, DateTime? expiredTime,
+            EReviewResult reviewResult = EReviewResult.Unknown, CancellationToken cancellationToken = default)
+        {
             var endStepDefine = workflow.WorkflowDefinition.FindEndStepDefine();
             if (endStepDefine is null)
                 throw new UserFriendlyException("未正确配置结束节点");