Преглед на файлове

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

xf преди 1 година
родител
ревизия
ca24b6b687

+ 7 - 1
src/Hotline.Ai.Jths/AiQualityService.cs

@@ -75,7 +75,7 @@ namespace Hotline.Ai.Jths
 			req.AddHeader("content-type", "application/json");
 			req.AddHeader("token", "");
 			req.AddHeader("version", "1.0");
-			var sign = MD5Encrypt(request.ToString());
+			var sign = Base64En(MD5Encrypt(request.ToString()));
 			req.AddHeader("sign", sign);
 			req.AddHeader("signType", "md5");
 			req.AddHeader("appkey", "MTAwMDAx");
@@ -113,5 +113,11 @@ namespace Hotline.Ai.Jths
 				sb.Append(t[i].ToString("x").PadLeft(2, '0'));
 			return sb.ToString();
 		}
+
+		private static string Base64En(string? model) 
+		{
+			var bytes = Encoding.UTF8.GetBytes(model);
+			return Convert.ToBase64String(bytes);
+		}
 	}
 }

+ 3 - 2
src/Hotline.Ai.Jths/AiVisitService.cs

@@ -81,12 +81,13 @@ namespace Hotline.Ai.Jths
                     var taskInfo = response.Result.TaskInfoList.FirstOrDefault(x => x.CalledNumber == aiOrderVisit.AiOrderVisitDetails[i].OuterNo);
                     if (taskInfo != null)
                     {
-                        aiOrderVisit.AiOrderVisitDetails[i].AiOrderVisitState = Share.Enums.Ai.EAiOrderVisitState.InProgress;
+                        aiOrderVisit.AiOrderVisitDetails[i].AiOrderVisitState = Share.Enums.Ai.EAiOrderVisitState.NoStarted;
                         aiOrderVisit.AiOrderVisitDetails[i].TaskUid = taskInfo.TaskUid;
                     }
                     else
                     {
-                        aiOrderVisit.AiOrderVisitDetails[i].AiOrderVisitState = Share.Enums.Ai.EAiOrderVisitState.Cancel;
+                        aiOrderVisit.AiOrderVisitDetails[i].AiOrderVisitState = Share.Enums.Ai.EAiOrderVisitState.LoseEfficacy;
+                        //处理回访状态TODO
                     }
                 }
             }

+ 1 - 1
src/Hotline.Api/Controllers/AiController.cs

@@ -175,7 +175,7 @@ namespace Hotline.Api.Controllers
                         }
                         else
                         {
-                            aiOrderVisitDetail.AiOrderVisitState = Share.Enums.Ai.EAiOrderVisitState.Cancel; //更新AI子表
+                            aiOrderVisitDetail.AiOrderVisitState = (Share.Enums.Ai.EAiOrderVisitState)(dto.TaskStatus); //更新AI子表
                             aiOrderVisit.VisitedFailCount++;
                             //处理回访主表
                             aiOrderVisitDetail.OrderVisit.AiVisitTime();

+ 35 - 23
src/Hotline.Api/Controllers/OrderController.cs

@@ -1108,9 +1108,11 @@ public class OrderController : BaseController
             .FirstAsync(x => x.Id == id);
         var rspModel = _mapper.Map<OrderDelayDto>(model);
         rspModel.IsCanHandle = model.Workflow.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId);
-        var files = await _fileRepository.Queryable()
-            .Where(x => x.Key == rspModel.Id && string.IsNullOrEmpty(x.FlowKey)).ToListAsync();
-        if (files.Any()) rspModel.Files = _mapper.Map<List<FileDto>>(files);
+        if (rspModel.FileJson != null && rspModel.FileJson.Any())
+        {
+            var ids = rspModel.FileJson.Select(x => x.Id).ToList();
+            rspModel.Files = await _fileRepository.GetFilesAsync(ids, HttpContext.RequestAborted);
+        }
         return rspModel;
     }
 
@@ -1347,9 +1349,11 @@ public class OrderController : BaseController
             .FirstAsync(x => x.Id == id);
         var rspModel = _mapper.Map<OrderScreenListDto>(model);
         rspModel.IsCanHandle = model.Workflow.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId);
-        var files = await _fileRepository.Queryable()
-            .Where(x => x.Key == rspModel.Id && string.IsNullOrEmpty(x.FlowKey)).ToListAsync();
-        if (files.Any()) rspModel.Files = _mapper.Map<List<FileDto>>(files);
+        if (rspModel.FileJson != null && rspModel.FileJson.Any())
+        {
+	        var ids = rspModel.FileJson.Select(x => x.Id).ToList();
+	        rspModel.Files = await _fileRepository.GetFilesAsync(ids, HttpContext.RequestAborted);
+        }
         return rspModel;
     }
 
@@ -1557,14 +1561,13 @@ public class OrderController : BaseController
         if (orderSupervise != null)
         {
             orderSuperviseDto = _mapper.Map<OrderSuperviseDto>(orderSupervise);
-            var files = await _fileRepository.Queryable().Where(x => x.Key == orderSupervise.Id).ToListAsync();
-            if (files.Any())
-            {
-                var applyFiles = files.Where(x => x.Classify == "督办申请").ToList();
-                if (applyFiles.Any()) orderSuperviseDto.Files = _mapper.Map<List<FileDto>>(applyFiles);
-                var replyFiles = files.Where(x => x.Classify == "督办回复").ToList();
-                if (replyFiles.Any()) orderSuperviseDto.ReplyFiles = _mapper.Map<List<FileDto>>(replyFiles);
-            }
+			if (orderSuperviseDto.FileJson != null && orderSuperviseDto.FileJson.Any())
+			{
+				var ids = orderSuperviseDto.FileJson.Select(x => x.Id).ToList();
+				var files = await _fileRepository.GetFilesAsync(ids, HttpContext.RequestAborted);
+				orderSuperviseDto.Files = files.Where(x => x.Classify == "督办申请").ToList();
+				orderSuperviseDto.ReplyFiles = files.Where(x => x.Classify == "督办回复").ToList();
+			}
         }
 
         return orderSuperviseDto;
@@ -1709,9 +1712,12 @@ public class OrderController : BaseController
         if (orderUrge != null)
         {
             orderUrgeDto = _mapper.Map<OrderUrgeDto>(orderUrge);
-            var files = await _fileRepository.Queryable().Where(x => x.Key == orderUrge.Id).ToListAsync();
-            if (files.Any()) orderUrgeDto.Files = _mapper.Map<List<FileDto>>(files);
-        }
+            if (orderUrgeDto.FileJson != null && orderUrgeDto.FileJson.Any())
+            {
+	            var ids = orderUrgeDto.FileJson.Select(x => x.Id).ToList();
+	            orderUrgeDto.Files = await _fileRepository.GetFilesAsync(ids, HttpContext.RequestAborted);
+            }
+		}
 
         return orderUrgeDto;
     }
@@ -1824,9 +1830,12 @@ public class OrderController : BaseController
 
         var dto = _mapper.Map<OrderDto>(order!);
 
-        var files = await _fileRepository.Queryable()
-            .Where(x => x.Key == dto.Id && x.Classify == "办理上传" && string.IsNullOrEmpty(x.FlowKey)).ToListAsync();
-        dto.Files = _mapper.Map<List<FileDto>>(files);
+        if (dto.FileJson != null && dto.FileJson.Any())
+        {
+	        var ids = order.FileJson.Select(x => x.Id).ToList();
+	        var files = await _fileRepository.GetFilesAsync(ids, HttpContext.RequestAborted);
+            dto.Files = files.Where(x => x.Classify == "办理上传" && string.IsNullOrEmpty(x.FlowKey)).ToList();
+		}
 
         var call = await _trCallRecordRepository.Queryable().Where(x => x.CallAccept == order.CallId).FirstAsync();
         if (call != null) dto.RecordingFileUrl = call.RecordingFileUrl;
@@ -2508,9 +2517,12 @@ public class OrderController : BaseController
         if (item != null)
         {
             itemDto = _mapper.Map<OrderSpecialDto>(item);
-            var files = await _fileRepository.Queryable().Where(x => x.Key == item.Id).ToListAsync();
-            if (files.Any()) itemDto.Files = _mapper.Map<List<FileDto>>(files);
-        }
+            if (itemDto.FileJson != null && itemDto.FileJson.Any())
+            {
+	            var ids = itemDto.FileJson.Select(x => x.Id).ToList();
+	            itemDto.Files = await _fileRepository.GetFilesAsync(ids, HttpContext.RequestAborted);
+            }
+		}
 
         return itemDto;
     }

+ 10 - 15
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -465,25 +465,20 @@ public class WorkflowController : BaseController
         var workflowDto = _mapper.Map<WorkflowDto>(workflow);
         if (workflowDto.Traces.Any())
         {
-            foreach (var item in workflowDto.Traces)
-            {
-                if (item.FileJson != null && item.FileJson.Any())
-                {
-                    var files = await _fileRepository.Queryable().Where(x => x.FlowKey == item.StepId).ToListAsync();
-                    if (files.Any()) item.Files = _mapper.Map<List<FileDto>>(files);
-                }
-            }
+	        workflowDto.Traces = await _fileRepository.WorkflowTraceRecursion(workflowDto.Traces, HttpContext.RequestAborted);
         }
-
         return workflowDto;
     }
 
-    /// <summary>
-    /// 查询被督办/催办部门
-    /// </summary>
-    /// <param name="workflowId"></param>
-    /// <returns></returns>
-    [HttpGet("{workflowId}/urge")]
+   
+
+
+	/// <summary>
+	/// 查询被督办/催办部门
+	/// </summary>
+	/// <param name="workflowId"></param>
+	/// <returns></returns>
+	[HttpGet("{workflowId}/urge")]
     public async Task<IReadOnlyList<Kv>> GetUrgeOrgs(string workflowId)
     {
         /*

+ 22 - 0
src/Hotline.Repository.SqlSugar/File/FileRepository.cs

@@ -2,6 +2,7 @@
 using Hotline.Orders;
 using Hotline.Repository.SqlSugar.DataPermissions;
 using Hotline.Share.Dtos.File;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using MapsterMapper;
 using Microsoft.AspNetCore.Http;
 using Newtonsoft.Json;
@@ -45,5 +46,26 @@ namespace Hotline.Repository.SqlSugar.File
 			await AddRangeAsync(newFiles, cancellationToken);
 			return newFiles.Select(x=> new FileJson { Id = x.Id,FileId = x.Additions,Path = x.Path}).ToList();
 		}
+
+		public async Task<List<FileDto>> GetFilesAsync(List<string> ids, CancellationToken cancellationToken) 
+		{
+			var files = await Queryable().In(x=>x.Id,ids).ToListAsync(cancellationToken);
+			return files.Any() ? _mapper.Map<List<FileDto>>(files) : new List<FileDto>();
+		}
+
+		public async Task<List<WorkflowTraceDto>> WorkflowTraceRecursion(List<WorkflowTraceDto> dto, CancellationToken cancellationToken)
+		{
+			foreach (var item in dto)
+			{
+				if (item.FileJson != null && item.FileJson.Any())
+				{
+					var ids = item.FileJson.Select(x => x.Id).ToList();
+					item.Files = await GetFilesAsync(ids, cancellationToken);
+				}
+
+				if (item.Traces != null && item.Traces.Any()) item.Traces =  await WorkflowTraceRecursion(item.Traces, cancellationToken);
+			}
+			return dto;
+		}
 	}
 }

+ 1 - 1
src/Hotline.Share/Dtos/Ai/AiDto.cs

@@ -28,7 +28,7 @@ namespace Hotline.Share.Dtos.Ai
         /// </summary>
         public int TaskStatus { get; set; }
 
-        public string CallTimes { get; set; }
+        public int CallTimes { get; set; }
 
         public List<CallRecordDto> CallRecordList { get; set; }
     }

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

@@ -354,6 +354,8 @@ namespace Hotline.Share.Dtos.Order
         public bool IsCanHandle { get; set; }
 
         public List<FileDto> Files { get; set; }
+
+        public List<FileJson> FileJson { get; set; }
 	}
 
 

+ 14 - 6
src/Hotline.Share/Enums/Ai/EAiOrderVisitState.cs

@@ -5,16 +5,24 @@ namespace Hotline.Share.Enums.Ai
 {
     public enum EAiOrderVisitState
     {
-        [Description("未开始")]
+        [Description("待执行")]
         NoStarted = 1,
 
-        [Description("进行中")]
-        InProgress = 2,
+        [Description("暂停中")]
+        Stop = 2,
+
+        [Description("执行中")]
+        InProgress = 3,
+
+        [Description("失效")]
+        LoseEfficacy = 4,
+
+        [Description("呼叫失败")]
+        CallFail = 5,
 
         [Description("已结束")]
-        Ended = 3,
+        Ended = 6,
+
 
-        [Description("取消")]
-        Cancel = 4,
     }
 }

+ 3 - 0
src/Hotline/File/IFileRepository.cs

@@ -1,5 +1,6 @@
 using Hotline.Orders;
 using Hotline.Share.Dtos.File;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -12,5 +13,7 @@ namespace Hotline.File
 	public interface IFileRepository : IRepository<File>
 	{
 		Task<List<FileJson>> AddFileAsync(List<FileDto> files ,string id, string flowId = "",CancellationToken cancellationToken = default);
+		Task<List<FileDto>> GetFilesAsync(List<string> ids, CancellationToken cancellationToken);
+		Task<List<WorkflowTraceDto>> WorkflowTraceRecursion(List<WorkflowTraceDto> dto, CancellationToken cancellationToken);
 	}
 }