소스 검색

Merge branch 'test' into lib/test

libin 3 달 전
부모
커밋
28b4282f55

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

@@ -21,7 +21,7 @@ namespace Hotline.Ai.Jths
             _client = new RestClient();
             _baseUrl = baseUrl;
         }
-        public async Task CreateAiOrderQualityTask(string filename, CancellationToken cancellationToken) { }
+        public async Task<string> CreateAiOrderQualityTask(string filename, CancellationToken cancellationToken) { return ""; }
 
 
 		public async Task CreateAiOrderQualityTask(

+ 4 - 12
src/Hotline.Ai.XingTang/AiQualityService.cs

@@ -30,11 +30,11 @@ namespace Hotline.Ai.XingTang
         }
 
 
-		public async Task CreateAiOrderQualityTask(string filename, CancellationToken cancellationToken)
+		public async Task<string> CreateAiOrderQualityTask(string filename, CancellationToken cancellationToken)
         {
             var url = _baseUrl + "/offlinerecog?filename=" + filename;
 			var baseUrl = new Uri(url);
-             await ExecuteAsync(baseUrl.ToString(), Method.Get, "", cancellationToken);
+            return  await ExecuteAsync(baseUrl.ToString(), Method.Get, "", cancellationToken);
         }
 
         public async Task<ApiResponse<TResponse>> ExecuteAsync<TRequest, TResponse>(string path, Method httpMethod,
@@ -62,25 +62,17 @@ namespace Hotline.Ai.XingTang
             }
         }
 
-        public async Task<ApiResponse> ExecuteAsync<TRequest>(string path, Method httpMethod, TRequest request,
+        public async Task<string> ExecuteAsync<TRequest>(string path, Method httpMethod, TRequest request,
             CancellationToken cancellationToken)
             where TRequest : class
         {
             var req = new RestRequest(path, httpMethod);
             req.Timeout = new TimeSpan(0,30,0);
-            //if (httpMethod is Method.Get)
-            //{
-            //    req.AddObject(request);
-            //}
-            //else
-            //{
-            //    req.AddJsonBody(request);
-            //}
 
             try
             {
                 var response = await _client.ExecuteAsync<ApiResponse>(req, cancellationToken);
-                return response.Data;
+                return response.Content;
             }
             catch (Exception e)
             {

+ 70 - 0
src/Hotline.Api/Controllers/OrderController.cs

@@ -2069,6 +2069,76 @@ public class OrderController : BaseController
         }
     }
 
+	/// <summary>
+	/// 工单延期修改后下一步流程
+	/// </summary>
+	[HttpPost("delay/batch_audit")]
+	[LogFilter("批量审批延期")]
+	public async Task<string> BatchAuditDelay([FromBody] BatchDelayNextFlowDto dto) {
+		var result = new StringBuilder();
+		var fail = 0;
+		var success = 0;
+		foreach (var item in dto.DelayId)
+		{
+			try
+			{
+                var workflow = dto.NextWorkflow;
+				var delay = await _orderDelayRepository.GetAsync(item, HttpContext.RequestAborted);
+				workflow.WorkflowId = delay.WorkflowId;
+				NextStepsWithOpinionDto<NextStepOption> next = null;
+
+				try
+				{
+					next = await _workflowApplication.GetNextStepsAsync(delay.WorkflowId, HttpContext.RequestAborted);
+				}
+				catch (UserFriendlyException e)
+				{
+					if (e.Message.Contains("未找到对应节点"))
+					{
+						result.Append("无权审核:" + delay.No);
+						fail++;
+					}
+					else
+					{
+						throw;
+					}
+				}
+				if (next == null) continue;
+               
+				var isBatch = next.Steps.Where(x => x.Value == workflow.NextStepName).Any();
+                if (isBatch)
+                {
+					var step = next.Steps.Where(x => x.Value == workflow.NextStepName).FirstOrDefault();
+					workflow.NextStepCode = step.Key;
+					workflow.NextStepName = step.Value;
+				}
+                else {
+					result.Append("无权审核:" + delay.No);
+					fail++;
+                    continue;
+				}
+
+				workflow.StepId = next.StepId;
+                if (workflow.ReviewResult == EReviewResult.Approval) {
+					await _workflowDomainService.NextAsync(_sessionContext, workflow,cancellationToken: HttpContext.RequestAborted);
+				}
+				else
+				{
+					var reject = workflow.Adapt<RejectDto>();
+					await _workflowApplication.RejectAsync(reject, HttpContext.RequestAborted);
+				}
+				success++;
+			}
+			catch (UserFriendlyException e)
+			{
+				result.Append(e.Message);
+				fail++;
+			}
+		}
+		return $"总共: {dto.DelayId.Length}, 成功: {success}, 失败: {fail}, 失败原因: {result.ToString()}";
+
+	}
+
     /// <summary>
     ///  延期查询流程办理下一步可选节点
     /// </summary>

+ 69 - 9
src/Hotline.Api/Controllers/QualityController.cs

@@ -21,6 +21,9 @@ using Hotline.Application.CallCenter;
 using Hotline.CallCenter.Configs;
 using Microsoft.Extensions.Options;
 using Hotline.Configurations;
+using Hotline.CallCenter.Calls;
+using System.Linq;
+using Hotline.Repository.SqlSugar.Quality;
 
 namespace Hotline.Api.Controllers
 {
@@ -47,8 +50,9 @@ namespace Hotline.Api.Controllers
         private readonly ICallApplication _callApplication;
         private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
         private readonly IRepository<SystemLog> _logRepository;
+		private readonly IRepository<QualityTransferRecords> _qualityTransferRecordsRepository;
 
-        public QualityController(
+		public QualityController(
             ISessionContext sessionContext,
             IMapper mapper,
             IQualityRepository qualitey,
@@ -67,7 +71,8 @@ namespace Hotline.Api.Controllers
             ISystemSettingCacheManager systemSettingCacheManager,
             ICallApplication callApplication,
             IOptionsSnapshot<AppConfiguration> appOptions,
-            IRepository<SystemLog> logRepository)
+            IRepository<SystemLog> logRepository,
+			IRepository<QualityTransferRecords> qualityTransferRecordsRepository)
         {
             _sessionContext = sessionContext;
             _mapper = mapper;
@@ -88,7 +93,8 @@ namespace Hotline.Api.Controllers
             _callApplication = callApplication;
             _appOptions = appOptions;
             _logRepository = logRepository;
-        }
+            _qualityTransferRecordsRepository = qualityTransferRecordsRepository;
+		}
         #region 质检管理
         /// <summary>
         /// 删除质检
@@ -611,12 +617,66 @@ namespace Hotline.Api.Controllers
             return rsp;
         }
 
-        /// <summary>
-        /// 智能质检结果返回接收 
-        /// </summary>
-        /// <param name="dto"></param>
-        /// <returns></returns>
-        [AllowAnonymous]
+		/// <summary>
+		/// 智能质检转写_兴唐
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpPost("aitransfer_xt")]
+		[LogFilter("智能质检转写_兴唐")]
+		public async Task AiTransfer_XT([FromBody] List<AiQualityXTDto> dto)
+		{
+			var transfers = new List<QualityTransferRecords>();
+			foreach (var item in dto)
+			{
+                var records =  await _qualityTransferRecordsRepository.Queryable().Where(x=>x.QualityId == item.Id  &&  x.IsFinished == false).AnyAsync();
+                if (records)
+                    continue;
+
+				var transfer = new QualityTransferRecords();
+				transfer.QualityId = item.Id;
+				transfer.IsFinished = false;
+				transfer.TransferState = EQualityTransferState.NotStarted;
+				transfers.Add(transfer);
+				await _qualitey.Updateable().SetColumns(x => new Hotline.Quality.Quality { TransferState = EQualityTransferState.Translating }).Where(x => x.Id == item.Id).ExecuteCommandAsync();
+			}
+			await _qualityTransferRecordsRepository.AddRangeAsync(transfers);
+		}
+
+		/// <summary>
+		/// 智能质检转写
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[AllowAnonymous]
+		[HttpPost("transfer")]
+		[LogFilter("智能质检转写_兴唐_定时调用")]
+		public async Task AiTransfer_XT()
+		{
+            var translatings = await _qualityTransferRecordsRepository.Queryable().Where(x => x.IsFinished == false && x.TransferState == EQualityTransferState.Translating).OrderBy(x => x.TransferTime).ToListAsync();
+            if (translatings.Any())
+            {
+                var transfer = translatings.FirstOrDefault();
+                if ((DateTime.Now - transfer.TransferTime.Value).TotalMinutes >= 30)
+                {
+                    await _qualityTransferRecordsRepository.Updateable().SetColumns(x => new QualityTransferRecords { TransferState = EQualityTransferState.Lose }).Where(x => x.Id == transfer.Id).ExecuteCommandAsync();
+                }
+                return;
+            }
+            else {
+				var notStarted = await _qualityTransferRecordsRepository.Queryable().Where(x => x.IsFinished == false && x.TransferState == EQualityTransferState.NotStarted).OrderBy(x => x.TransferTime).FirstAsync();
+				await _qualityTransferRecordsRepository.Updateable().SetColumns(x => new QualityTransferRecords { TransferState = EQualityTransferState.Translating , TransferTime = DateTime.Now }).Where(x => x.Id == notStarted.Id).ExecuteCommandAsync();
+				_qualityApplication.Transfer_XT(notStarted.QualityId, HttpContext.RequestAborted);
+			}
+		}
+
+
+		/// <summary>
+		/// 智能质检结果返回接收 
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[AllowAnonymous]
         [HttpPost("AiResult")]
         [LogFilter("智能质检结果返回接收")]
         public async Task AiResult([FromBody] List<AiQualityResultDto> dto)

+ 21 - 20
src/Hotline.Api/Controllers/Snapshot/SnapshotOrderController.cs

@@ -112,34 +112,35 @@ public class SnapshotOrderController : BaseController
         => (await _orderSnapshotApplication.GetGuiderReplyItemsAsync(dto).ToPagedListAsync(dto)).ToPaged();
 
     /// <summary>
-    /// 获取工单标集合
+    /// 获取工单标集合
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [HttpGet("sign")]
-    public async Task<PagedDto<SignOrderSnapshotItemsOutDto>> GetSignOrderSnapshotItemsAsync([FromQuery] SignOrderSnapshotItemsInDto dto)
-        => (await _orderSnapshotApplication.GetSignOrderSnapshotItemsAsync(dto).ToPagedListAsync(dto)).ToPaged();
+    [HttpGet("label")]
+    public async Task<PagedDto<LabelOrderSnapshotItemsOutDto>> GetLabelOrderSnapshotItemsAsync([FromQuery] LabelOrderSnapshotItemsInDto dto)
+        => (await _orderSnapshotApplication.GetLabelOrderSnapshotItemsAsync(dto).ToPagedListAsync(dto)).ToPaged();
 
     /// <summary>
-    /// 获取工单已经标集合
+    /// 获取工单已经标集合
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [HttpGet("signed")]
-    public async Task<PagedDto<SignedOrderSnapshotItemsOutDto>> GetSignedOrderSnapshotItemsAsync([FromQuery] SignedOrderSnapshotItemsInDto dto)
-        => (await _orderSnapshotApplication.GetSignedOrderSnapshotItemsAsync(dto).ToPagedListAsync(dto)).ToPaged();
+    [HttpGet("labeled")]
+    public async Task<PagedDto<LabeledOrderSnapshotItemsOutDto>> GetLabeledOrderSnapshotItemsAsync([FromQuery] LabeledOrderSnapshotItemsInDto dto)
+        => (await _orderSnapshotApplication.GetLabeledOrderSnapshotItemsAsync(dto).ToPagedListAsync(dto)).ToPaged();
 
     /// <summary>
-    /// 标详情
+    /// 标详情
     /// </summary>
     /// <param name="id"></param>
     /// <returns></returns>
-    [HttpGet("sign/{id}")]
-    public async Task<SignOrderSnapshotDetailOutDto> GetSignOrderSnapshotDetailAsync(string id)
+    [HttpGet("label/{id}")]
+    public async Task<LabelOrderSnapshotDetailOutDto> GetLabelOrderSnapshotDetailAsync(string id)
     { 
         var order = await _orderRepository.Queryable()
-            .Where(order => order.Id == id)
-            .Select(order => new SignOrderSnapshotDetailOutDto(), true)
+            .LeftJoin<OrderSnapshot>((order, snapshot) => order.Id == snapshot.Id)
+            .Where((order, snapshot) => order.Id == id)
+            .Select((order, snapshot) => new LabelOrderSnapshotDetailOutDto { Id = order.Id, Title = order.Title, Lables =snapshot.Labels })
             .FirstAsync();
         var snapshot = await _orderSnapshotRepository.GetAsync(id, HttpContext.RequestAborted);
         order.Lables = snapshot.Labels;
@@ -148,22 +149,22 @@ public class SnapshotOrderController : BaseController
     }
 
     /// <summary>
-    /// 修改工单标
+    /// 修改工单标
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [HttpPut("sign")]
-    public async Task UpdateSignOrderSnapshotAsync([FromBody] UpdateSignOrderSnapshotInDto dto)
+    [HttpPut("label")]
+    public async Task UpdateLabelOrderSnapshotAsync([FromBody] UpdateLabelOrderSnapshotInDto dto)
         => await _orderSnapshotApplication.UpdateLabelAsync(dto.Id, dto.SnapshotLabels);
 
     /// <summary>
-    /// 获取工单标日志集合
+    /// 获取工单标日志集合
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [HttpGet("sign/log")]
-    public async Task<PagedDto<SignOrderSnapshotLogItemsOutDto>> GetSignOrderSnapshotLogItemsAsync([FromQuery] SignOrderSnapshotLogItemsInDto dto)
-        => (await _orderSnapshotApplication.GetSignOrderSnapshotLogItemsAsync(dto).ToPagedListAsync(dto)).ToPaged();
+    [HttpGet("label/log")]
+    public async Task<PagedDto<LabelOrderSnapshotLogItemsOutDto>> GetLabelOrderSnapshotLogItemsAsync([FromQuery] LabelOrderSnapshotLogItemsInDto dto)
+        => (await _orderSnapshotApplication.GetLabelOrderSnapshotLogItemsAsync(dto).ToPagedListAsync(dto)).ToPaged();
 
     /// <summary>
     /// 随手拍公开集合

+ 2 - 2
src/Hotline.Application.Tests/Application/OrderSnapshotApplicationTest.cs

@@ -65,11 +65,11 @@ public class OrderSnapshotApplicationTest : TestBase
 
         snapshot.IsSafetyDepartment.ShouldBe(false);
 
-        var labelLog = await _orderSnapshotApplication.GetSignOrderSnapshotLogItemsAsync(new SignOrderSnapshotLogItemsInDto()).ToPagedListAsync(new PagedRequest());
+        var labelLog = await _orderSnapshotApplication.GetLabelOrderSnapshotLogItemsAsync(new LabelOrderSnapshotLogItemsInDto()).ToPagedListAsync(new PagedRequest());
         labelLog.Items.Any(m => m.Title.IsNullOrEmpty()).ShouldBe(false);
         labelLog.Items.Any(m => m.SourceChannel.IsNullOrEmpty()).ShouldBe(false);
 
-        var sigedItems = await _orderSnapshotApplication.GetSignedOrderSnapshotItemsAsync(new SignedOrderSnapshotItemsInDto()).ToListAsync();
+        var sigedItems = await _orderSnapshotApplication.GetLabeledOrderSnapshotItemsAsync(new LabeledOrderSnapshotItemsInDto()).ToListAsync();
         sigedItems.Any(m => m.OrderId == order.Id).ShouldBe(true);
     }
 }

+ 2 - 0
src/Hotline.Application/Quality/IQualityApplication.cs

@@ -11,5 +11,7 @@ namespace Hotline.Application.Quality
 		Task UpdateQualityAsync(UpdateQualityDto model, CancellationToken cancellationToken);
 		Task AiResultAsync(List<AiQualityResultDto> model, CancellationToken cancellationToken);
 
+		Task Transfer_XT(string Id, CancellationToken cancellationToken);
+
 	}
 }

+ 69 - 3
src/Hotline.Application/Quality/QualityApplication.cs

@@ -27,6 +27,11 @@ using XF.Domain.Repository;
 using Hotline.Share.Enums.CallCenter;
 using Hotline.Configurations;
 using Hotline.Tools;
+using Hotline.Share.Dtos;
+using MathNet.Numerics;
+using Microsoft.Extensions.DependencyInjection;
+using NPOI.HPSF;
+using System.Threading;
 
 namespace Hotline.Application.Quality
 {
@@ -45,8 +50,11 @@ namespace Hotline.Application.Quality
         private readonly Publisher _publisher;
         private readonly IRepository<TrCallRecord> _trCallRecordRepository;
         private readonly IRepository<OrderWord> _orderWordRepository;
+		private readonly IServiceProvider _serviceProvider;
+		private readonly IRepository<QualityItem> _qualiteyItem;
+		private readonly IRepository<QualityTransferRecords> _qualityTransferRecordsRepository;
 
-        public QualityApplication(
+		public QualityApplication(
             ISessionContext sessionContext,
             IMapper mapper,
             IRepository<QualityDetail> qualiteyDetail,
@@ -59,7 +67,10 @@ namespace Hotline.Application.Quality
             ILogger<Hotline.Quality.Quality> logger,
             Publisher publisher,
             IRepository<TrCallRecord> trCallRecordRepository,
-            IRepository<OrderWord> orderWordRepository)
+			IServiceProvider serviceProvider,
+			IRepository<QualityItem> qualiteyItem,
+			IRepository<OrderWord> orderWordRepository,
+			IRepository<QualityTransferRecords> qualityTransferRecordsRepository)
         {
             _sessionContext = sessionContext;
             _mapper = mapper;
@@ -74,7 +85,10 @@ namespace Hotline.Application.Quality
             _publisher = publisher;
             _trCallRecordRepository = trCallRecordRepository;
             _orderWordRepository = orderWordRepository;
-        }
+            _serviceProvider = serviceProvider;
+			_qualiteyItem = qualiteyItem;
+            _qualityTransferRecordsRepository = qualityTransferRecordsRepository;
+		}
 
         /// <summary>
         /// 新增质检
@@ -369,6 +383,58 @@ namespace Hotline.Application.Quality
 			}
 		}
 
+        /// <summary>
+        /// 异步转写
+        /// </summary>
+        /// <returns></returns>
+        public async Task Transfer_XT(string Id, CancellationToken cancellationToken) {
+
+			var quality = await _qualityRepository.Queryable().Includes(x => x.Order).Where(x => x.Id == Id).FirstAsync();
+			var call = await _callApplication.GetCallAsync(quality.Order.CallId, cancellationToken);
+			var items = await _qualiteyItem.Queryable().Where(x => x.IsEnable == 0 && x.IsDeleted == true && x.IsIntelligent == 1).ToListAsync();
 
+			var transfers = new List<Transfer>();
+			if (!string.IsNullOrEmpty(call?.AudioFile))
+			{
+				var filename = Path.GetFileName(call.AudioFile);
+				try
+				{
+					var aiQualityService = _serviceProvider.GetRequiredService<IAiQualityService>();
+					var res = await aiQualityService.CreateAiOrderQualityTask(filename, cancellationToken);
+					if (!string.IsNullOrEmpty(res))
+					{
+						var rowList = res.Split("\n");
+						var sort = 0;
+						foreach (var row in rowList)
+						{
+							var model = new Transfer();
+							var statement = row.Split(":");
+							if (statement.Count() == 2)
+							{
+								model.Sort = sort;
+								model.Type = statement[0].ToString() == "spk_01" ? EQualityTransferType.Seats : EQualityTransferType.Citizen;
+								model.Content = statement[1].ToString();
+								model.ReviseContent = model.Content;
+								if (!string.IsNullOrEmpty(model.Content))
+								{
+									var hitWord = items.Where(x => model.Content.Contains(x.Name)).ToList();
+									model.Prohibited = string.Join(";", hitWord);
+								}
+							}
+							transfers.Add(model);
+							sort++;
+						}
+					}
+					await _qualityRepository.Updateable().SetColumns(x => new Hotline.Quality.Quality { TransferState = EQualityTransferState.Succeed,Transfer = transfers }).Where(x => x.Id == quality.Id).ExecuteCommandAsync();
+					await _qualityTransferRecordsRepository.Updateable().SetColumns(x => new QualityTransferRecords { TransferState = EQualityTransferState.Succeed,IsFinished = true }).Where(x => x.QualityId == quality.Id).ExecuteCommandAsync();
+				}
+				catch (Exception)
+				{
+					await _qualityRepository.Updateable().SetColumns(x => new Hotline.Quality.Quality { TransferState = EQualityTransferState.Lose}).Where(x => x.Id == quality.Id).ExecuteCommandAsync();
+					await _qualityTransferRecordsRepository.Updateable().SetColumns(x => new QualityTransferRecords { TransferState = EQualityTransferState.Lose, IsFinished = true }).Where(x => x.QualityId == quality.Id).ExecuteCommandAsync();
+					throw;
+				}
+			}
+		}
 	}
 }

+ 7 - 7
src/Hotline.Application/Snapshot/IOrderSnapshotApplication.cs

@@ -56,11 +56,11 @@ public interface IOrderSnapshotApplication
     ISugarQueryable<GetOrderSnapshotPublishItemsOutDto> GetOrderSnapshotPublishItemsAsync(GetOrderSnapshotPublishItemsInDto dto);
 
     /// <summary>
-    /// 获取工单标集合
+    /// 获取工单标集合
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    ISugarQueryable<SignOrderSnapshotItemsOutDto> GetSignOrderSnapshotItemsAsync(SignOrderSnapshotItemsInDto dto);
+    ISugarQueryable<LabelOrderSnapshotItemsOutDto> GetLabelOrderSnapshotItemsAsync(LabelOrderSnapshotItemsInDto dto);
 
     /// <summary>
     /// 批量设置随手拍公开申请不通过
@@ -75,7 +75,7 @@ public interface IOrderSnapshotApplication
     Task UpdateOrderSnapshotPublishStatusAsync(UpdateOrderSnapshotPublishStatusInDto dto);
 
     /// <summary>
-    /// 随手拍工单标
+    /// 随手拍工单标
     /// </summary>
     /// <param name="id"></param>
     /// <param name="snapshotLabels"></param>
@@ -90,11 +90,11 @@ public interface IOrderSnapshotApplication
     Task SaveOrderWorkflowInfo(NextWorkflowDto<OrderHandleFlowDto> dto);
 
     /// <summary>
-    /// 获取随手拍工单标日志
+    /// 获取随手拍工单标日志
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    ISugarQueryable<SignOrderSnapshotLogItemsOutDto> GetSignOrderSnapshotLogItemsAsync(SignOrderSnapshotLogItemsInDto dto);
+    ISugarQueryable<LabelOrderSnapshotLogItemsOutDto> GetLabelOrderSnapshotLogItemsAsync(LabelOrderSnapshotLogItemsInDto dto);
 
     /// <summary>
     /// 返回办理页面基础数据
@@ -112,9 +112,9 @@ public interface IOrderSnapshotApplication
     ISugarQueryable<OrderSnapshotItemsOutDto> GetOrderSnapshotItemsAsync(OrderSnapshotItemsInDto dto);
 
     /// <summary>
-    /// 获取工单已经标集合
+    /// 获取工单已经标集合
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    ISugarQueryable<SignedOrderSnapshotItemsOutDto> GetSignedOrderSnapshotItemsAsync(SignedOrderSnapshotItemsInDto dto);
+    ISugarQueryable<LabeledOrderSnapshotItemsOutDto> GetLabeledOrderSnapshotItemsAsync(LabeledOrderSnapshotItemsInDto dto);
 }

+ 26 - 22
src/Hotline.Application/Snapshot/OrderSnapshotApplication.cs

@@ -198,7 +198,7 @@ public class OrderSnapshotApplication : IOrderSnapshotApplication, IScopeDepende
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    public ISugarQueryable<SignOrderSnapshotItemsOutDto> GetSignOrderSnapshotItemsAsync(SignOrderSnapshotItemsInDto dto)
+    public ISugarQueryable<LabelOrderSnapshotItemsOutDto> GetLabelOrderSnapshotItemsAsync(LabelOrderSnapshotItemsInDto dto)
     {
         var query = _orderSnapshotRepository.Queryable()
             .LeftJoin<Order>((snapshot, order) => snapshot.Id == order.Id)
@@ -209,7 +209,7 @@ public class OrderSnapshotApplication : IOrderSnapshotApplication, IScopeDepende
             .WhereIF(dto.No.NotNullOrEmpty(), (snapshot, order, step) => order.No.Contains(dto.No))
             .WhereIF(dto.Title.NotNullOrEmpty(), (snapshot, order, step) => order.Title.Contains(dto.Title))
             .OrderByDescending((snapshot, order, step) => snapshot.CreationTime)
-            .Select((snapshot, order) => new SignOrderSnapshotItemsOutDto
+            .Select((snapshot, order) => new LabelOrderSnapshotItemsOutDto
             {
                 OrderId = snapshot.Id,
                 No = order.No,
@@ -222,8 +222,8 @@ public class OrderSnapshotApplication : IOrderSnapshotApplication, IScopeDepende
                 NetworkENumber = snapshot.NetworkENumber,
                 NetworkRemark = snapshot.NetworkRemark,
                 ReplyDate = snapshot.ReplyDate,
-                SignTime = snapshot.SignTime,
-                SignUserName = snapshot.SignUserName
+                LabelTime = snapshot.LabelTime,
+                LabelUserName = snapshot.LabelUserName
             });
         return query;
     }
@@ -281,12 +281,16 @@ public class OrderSnapshotApplication : IOrderSnapshotApplication, IScopeDepende
             snapshot.IsTruthDepartment = true;
         if (labels.Any(m => m.Key == "bss"))
             snapshot.IsTruthDepartment = false;
+        snapshot.LabelTime = DateTime.Now;
+        snapshot.LabelUserName = _sessionContext.UserName;
+        snapshot.LabelUserId = _sessionContext.UserId;
         await _orderSnapshotRepository.UpdateAsync(snapshot);
 
-        var entity = new SnapshotLabelLog { 
-        OrderId = snapshot.Id,
-        LabelName = snapshot.LabelName,
-        Labels = labels
+        var entity = new SnapshotLabelLog
+        {
+            OrderId = snapshot.Id,
+            LabelName = snapshot.LabelName,
+            Labels = labels
         };
         await _snapshotLabelLogRepository.AddAsync(entity);
     }
@@ -346,23 +350,23 @@ public class OrderSnapshotApplication : IOrderSnapshotApplication, IScopeDepende
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    public ISugarQueryable<SignOrderSnapshotLogItemsOutDto> GetSignOrderSnapshotLogItemsAsync(SignOrderSnapshotLogItemsInDto dto)
+    public ISugarQueryable<LabelOrderSnapshotLogItemsOutDto> GetLabelOrderSnapshotLogItemsAsync(LabelOrderSnapshotLogItemsInDto dto)
     {
         var query = _snapshotLabelLogRepository.Queryable()
             .LeftJoin<Order>((log, order) => log.OrderId == order.Id)
             .LeftJoin<OrderSnapshot>((log, order, snapshot) => log.OrderId == snapshot.Id)
             .WhereIF(dto.No.NotNullOrEmpty(), (log, order) => order.No.Contains(dto.No))
             .WhereIF(dto.Title.NotNullOrEmpty(), (log, order) => order.Title.Contains(dto.Title))
-            .WhereIF(dto.Contact.NotNullOrEmpty(), (log, order)=> order.Contact.Contains(dto.Contact))
-            .WhereIF(dto.FromName.NotNullOrEmpty(), (log, order)=> order.FromName.Contains(dto.FromName))
-            .WhereIF(dto.Label.NotNullOrEmpty(), (log, order)=> log.LabelName.Contains(dto.Label))
-            .WhereIF(dto.SignName.NotNullOrEmpty(), (log, order) => log.CreatorName.Contains(dto.SignName))
+            .WhereIF(dto.Contact.NotNullOrEmpty(), (log, order) => order.Contact.Contains(dto.Contact))
+            .WhereIF(dto.FromName.NotNullOrEmpty(), (log, order) => order.FromName.Contains(dto.FromName))
+            .WhereIF(dto.Label.NotNullOrEmpty(), (log, order) => log.LabelName.Contains(dto.Label))
+            .WhereIF(dto.LabelUserName.NotNullOrEmpty(), (log, order) => log.CreatorName.Contains(dto.LabelUserName))
             .WhereIF(dto.BeginSignTime.HasValue && dto.EndSignTime.HasValue, (log, order) => log.CreationTime >= dto.BeginSignTime && log.CreationTime <= dto.EndSignTime)
-            .Select((log, order, snapshot) => new SignOrderSnapshotLogItemsOutDto
+            .Select((log, order, snapshot) => new LabelOrderSnapshotLogItemsOutDto
             {
                 OrderId = order.Id,
-                SignName = log.CreatorName,
-                SignTime = log.CreationTime,
+                LabelUserName = log.CreatorName,
+                LabelTime = log.CreationTime,
                 IndustryName = snapshot.IndustryName
             }, true);
         return query;
@@ -425,7 +429,7 @@ public class OrderSnapshotApplication : IOrderSnapshotApplication, IScopeDepende
             .WhereIF(dto.No.NotNullOrEmpty(), (snapshot, order) => order.No.Contains(dto.No))
             .WhereIF(dto.Title.NotNullOrEmpty(), (snapshot, order) => order.Title.Contains(dto.Title))
             .WhereIF(dto.ActualHandleOrgName.NotNullOrEmpty(), (snapshot, order) => order.ActualHandleOrgName.Contains(dto.ActualHandleOrgName))
-            .Select((snapshot, order) => new OrderSnapshotItemsOutDto 
+            .Select((snapshot, order) => new OrderSnapshotItemsOutDto
             {
                 CreationTime = order.CreationTime
             }
@@ -438,7 +442,7 @@ public class OrderSnapshotApplication : IOrderSnapshotApplication, IScopeDepende
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    public ISugarQueryable<SignedOrderSnapshotItemsOutDto> GetSignedOrderSnapshotItemsAsync(SignedOrderSnapshotItemsInDto dto)
+    public ISugarQueryable<LabeledOrderSnapshotItemsOutDto> GetLabeledOrderSnapshotItemsAsync(LabeledOrderSnapshotItemsInDto dto)
     {
         var query = _orderSnapshotRepository.Queryable()
             .LeftJoin<Order>((snapshot, order) => order.Id == snapshot.Id)
@@ -450,12 +454,12 @@ public class OrderSnapshotApplication : IOrderSnapshotApplication, IScopeDepende
             .WhereIF(dto.Label.NotNullOrEmpty(), (snapshot, order) => snapshot.LabelName.Contains(dto.Label))
             .WhereIF(dto.BeginSignTime.HasValue && dto.EndSignTime.HasValue, (snapshot, order) => snapshot.SignTime >= dto.BeginSignTime && snapshot.SignTime <= dto.EndSignTime)
             .OrderByDescending((snapshot, order) => snapshot.CreationTime)
-            .Select((snapshot, order) => new SignedOrderSnapshotItemsOutDto
-            { 
+            .Select((snapshot, order) => new LabeledOrderSnapshotItemsOutDto
+            {
                 LabelName = snapshot.LabelName,
                 OrderId = order.Id,
-                SignTime = snapshot.SignTime,
-                SignUserName = snapshot.SignUserName,
+                LabelTime = snapshot.LabelTime,
+                LabelUserName = snapshot.LabelUserName,
                 SourceChannel = order.SourceChannel,
             }, true);
 

+ 17 - 3
src/Hotline.Application/StatisticalReport/CallReport/YiBinCallReportApplication.cs

@@ -315,9 +315,9 @@ public class YiBinCallReportApplication : CallReportApplicationBase, ICallReport
                   InHangupImmediateWhenAnswered = SqlFunc.AggregateSum(SqlFunc.IIF(c.AnsweredTime != null && c.Duration < connectByeTimes, 1, 0)),//接通秒挂
                   OverTimeImmediate = SqlFunc.AggregateSum(SqlFunc.IIF(c.AnsweredTime != null && c.RingTimes > ringTimes, 1, 0)),//超时接通量
                   InTimeImmediate = SqlFunc.AggregateSum(SqlFunc.IIF(c.AnsweredTime != null && c.RingTimes <= ringTimes, 1, 0)),//按时接通量
-                  InHanguped = SqlFunc.AggregateSum(SqlFunc.IIF(c.AnsweredTime == null, 1, 0)),
-                  InHangupImmediate = SqlFunc.AggregateSum(SqlFunc.IIF(c.AnsweredTime == null && c.RingTimes <= noConnectByeTimes, 1, 0)),
-                  OverTimeInHanguped = SqlFunc.AggregateSum(SqlFunc.IIF(c.AnsweredTime == null && c.RingTimes > noConnectByeTimes, 1, 0)),
+                  InHanguped = SqlFunc.AggregateSum(SqlFunc.IIF(c.AnsweredTime == null, 1, 0)), //呼入未接通
+                  InHangupImmediate = SqlFunc.AggregateSum(SqlFunc.IIF(c.AnsweredTime == null && c.RingTimes <= noConnectByeTimes, 1, 0)),//未接通秒挂量
+                  OverTimeInHanguped = SqlFunc.AggregateSum(SqlFunc.IIF(c.AnsweredTime == null && c.RingTimes > noConnectByeTimes, 1, 0)), //超时未接通量
               }).ToListAsync();
         return list;
     }
@@ -329,6 +329,12 @@ public class YiBinCallReportApplication : CallReportApplicationBase, ICallReport
     /// <returns></returns>
     public override ISugarQueryable<QuerySeatMonthCallDetailResp> QuerySeatMonthCallDetail(QuerySeatMonthCallDetailRequest dto)
     {
+        //获取配置
+        int noConnectByeTimes = _systemSettingCacheManager.NoConnectByeTimes;
+        int effectiveTimes = _systemSettingCacheManager.EffectiveTimes;
+        int connectByeTimes = _systemSettingCacheManager.ConnectByeTimes;
+        int ringTimes = _systemSettingCacheManager.RingTimes;
+
         return  _trCallRecordRepository.Queryable()
             .WhereIF(dto.RingStartTime.HasValue, x => x.BeginRingTime >= dto.RingStartTime)
             .WhereIF(dto.RingEndTime.HasValue, x => x.BeginRingTime <= dto.RingEndTime)
@@ -338,6 +344,14 @@ public class YiBinCallReportApplication : CallReportApplicationBase, ICallReport
             .WhereIF(!string.IsNullOrEmpty(dto.TelNo), x => x.TelNo.Contains(dto.TelNo!))
             .WhereIF(!string.IsNullOrEmpty(dto.Cpn),x=>x.CPN.Contains(dto.Cpn!))
             .WhereIF(!string.IsNullOrEmpty(dto.Cdpn), x => x.CDPN.Contains(dto.Cdpn!))
+            .WhereIF(dto.QueryType.HasValue && dto.QueryType == 1,x=>x.AnsweredTime != null) //呼入接通总量
+            .WhereIF(dto.QueryType.HasValue && dto.QueryType == 2,x=> x.AnsweredTime != null && x.Duration >= effectiveTimes) //有效接通量
+            .WhereIF(dto.QueryType.HasValue && dto.QueryType == 3,x=> x.AnsweredTime != null && x.Duration < connectByeTimes) //接通秒挂量
+            .WhereIF(dto.QueryType.HasValue && dto.QueryType == 4,x=> x.AnsweredTime != null && x.RingTimes > ringTimes) //超时接通量
+            .WhereIF(dto.QueryType.HasValue && dto.QueryType == 5,x=> x.AnsweredTime != null && x.RingTimes <= ringTimes) //按时接通量
+            .WhereIF(dto.QueryType.HasValue && dto.QueryType == 6,x=> x.AnsweredTime == null) //呼入未接通量
+            .WhereIF(dto.QueryType.HasValue && dto.QueryType == 7,x=> x.AnsweredTime == null && x.RingTimes <= noConnectByeTimes) //未接通秒挂量
+            .WhereIF(dto.QueryType.HasValue && dto.QueryType == 8,x=> x.AnsweredTime == null && x.RingTimes > noConnectByeTimes) //超时未接通量
             .Where(x => x.CallDirection == ECallDirection.In)
             .OrderBy(x => x.BeginRingTime)
             .MergeTable()

+ 4 - 0
src/Hotline.Share/Dtos/CallCenter/BiQueryCallsDto.cs

@@ -620,6 +620,10 @@ public record QuerySeatMonthCallDetailRequest:PagedRequest
     /// </summary>
     public DateTime? RingEndTime { get;set; }
 
+    /// <summary>
+    /// 点数进入明细类型(1:呼入接通总量 2:有效接通量 3:接通秒挂量 4:超时接通量 5:按时接通量 6:呼入未接通总量 7:未接通秒挂量 8:超时未接通量)
+    /// </summary>
+    public int? QueryType { get; set; }
 }
 
 public class QuerySeatMonthCallDetailResp

+ 7 - 0
src/Hotline.Share/Dtos/Order/OrderStartFlowDto.cs

@@ -268,4 +268,11 @@ namespace Hotline.Share.Dtos.Order
 
         public NextWorkflowDto NextWorkflow { get; set; }
     }
+
+    public class BatchDelayNextFlowDto {
+
+        public string[] DelayId { get; set; }
+        
+		public NextWorkflowDto NextWorkflow { get; set; }
+	}
 }

+ 6 - 1
src/Hotline.Share/Dtos/Order/QueryOrderDto.cs

@@ -178,10 +178,15 @@ namespace Hotline.Share.Dtos.Order
         public string? ProvinceChannel { get; set; }
 
         /// <summary>
-        /// 内容检索
+        /// 内容检索(受理内容)
         /// </summary>
         public string? ContentRetrieval { get; set; }
 
+        /// <summary>
+        /// 内容检索(归档意见)
+        /// </summary>
+        public string? FileOption { get; set; }
+
         /// <summary>
         /// 归档方式
         /// </summary>

+ 5 - 0
src/Hotline.Share/Dtos/Quality/QualityDto.cs

@@ -230,4 +230,9 @@ namespace Hotline.Share.Dtos.Quality
 		/// </summary>
 		public int? MinGrade { get; set; }
 	}
+
+	public class AiQualityXTDto 
+	{
+		public string Id { get; set; }
+	}
 }

+ 17 - 17
src/Hotline.Share/Dtos/Snapshot/OrderDto.cs

@@ -981,7 +981,7 @@ public class GuiderReplyItemsOutDto
     public string? NetworkENumber { get; set; }
 }
 
-public record SignedOrderSnapshotItemsInDto : PagedRequest
+public record LabeledOrderSnapshotItemsInDto : PagedRequest
 {
     /// <summary>
     /// 受理编号
@@ -1020,7 +1020,7 @@ public record SignedOrderSnapshotItemsInDto : PagedRequest
 }
 
 
-public class SignedOrderSnapshotItemsOutDto
+public class LabeledOrderSnapshotItemsOutDto
 {
     /// <summary>
     /// Id
@@ -1080,7 +1080,7 @@ public class SignedOrderSnapshotItemsOutDto
     /// <summary>
     /// 标注人
     /// </summary>
-    public string? SignUserName { get; set; }
+    public string? LabelUserName { get; set; }
 
     /// <summary>
     /// 标注类型
@@ -1090,10 +1090,10 @@ public class SignedOrderSnapshotItemsOutDto
     /// <summary>
     /// 标记时间
     /// </summary>
-    public DateTime? SignTime { get; set; }
+    public DateTime? LabelTime { get; set; }
 }
 
-public record SignOrderSnapshotItemsInDto : PagedRequest
+public record LabelOrderSnapshotItemsInDto : PagedRequest
 {
     /// <summary>
     /// No
@@ -1108,13 +1108,13 @@ public record SignOrderSnapshotItemsInDto : PagedRequest
     /// <summary>
     /// 状态;
     /// 0: 全部;
-    /// 1: 待标;
-    /// 2: 已标;
+    /// 1: 待标;
+    /// 2: 已标;
     /// </summary>
     public int Status { get; set; }
 }
 
-public class SignOrderSnapshotItemsOutDto
+public class LabelOrderSnapshotItemsOutDto
 {
     /// <summary>
     /// Id
@@ -1176,12 +1176,12 @@ public class SignOrderSnapshotItemsOutDto
     /// <summary>
     /// 标注人
     /// </summary>
-    public string? SignUserName { get; set; }
+    public string? LabelUserName { get; set; }
 
     /// <summary>
     /// 标记时间
     /// </summary>
-    public DateTime? SignTime { get; set; }
+    public DateTime? LabelTime { get; set; }
 }
 
 public class GetOrderSnapshotPublishItemsOutDto
@@ -1502,7 +1502,7 @@ public class OrderSignBathInDto
     public string Remark { get; set; }
 }
 
-public record SignOrderSnapshotLogItemsInDto : PagedRequest
+public record LabelOrderSnapshotLogItemsInDto : PagedRequest
 {
     /// <summary>
     /// 受理编号
@@ -1527,7 +1527,7 @@ public record SignOrderSnapshotLogItemsInDto : PagedRequest
     /// <summary>
     /// 标注人
     /// </summary>
-    public string? SignName { get; set; }
+    public string? LabelUserName { get; set; }
 
     /// <summary>
     /// 标注类型
@@ -1545,7 +1545,7 @@ public record SignOrderSnapshotLogItemsInDto : PagedRequest
     public DateTime? EndSignTime { get; set; }
 }
 
-public class SignOrderSnapshotLogItemsOutDto
+public class LabelOrderSnapshotLogItemsOutDto
 {
     /// <summary>
     /// Id
@@ -1605,7 +1605,7 @@ public class SignOrderSnapshotLogItemsOutDto
     /// <summary>
     /// 标注人
     /// </summary>
-    public string SignName { get; set; }
+    public string LabelUserName { get; set; }
 
     /// <summary>
     /// 标注类型
@@ -1615,7 +1615,7 @@ public class SignOrderSnapshotLogItemsOutDto
     /// <summary>
     /// 标注时间
     /// </summary>
-    public DateTime SignTime { get; set; }
+    public DateTime LabelTime { get; set; }
 }
 
 public record OrderSnapshotItemsInDto : PagedRequest
@@ -1942,7 +1942,7 @@ public class NameCodeDto
     public string Code { get; set; }
 }
 
-public class UpdateSignOrderSnapshotInDto
+public class UpdateLabelOrderSnapshotInDto
 {
     /// <summary>
     /// Id
@@ -1955,7 +1955,7 @@ public class UpdateSignOrderSnapshotInDto
     public IList<Kv>? SnapshotLabels { get; set; }
 }
 
-public class SignOrderSnapshotDetailOutDto
+public class LabelOrderSnapshotDetailOutDto
 {
     /// <summary>
     /// Id

+ 55 - 0
src/Hotline.Share/Dtos/Transfer.cs

@@ -0,0 +1,55 @@
+using Hotline.Share.Enums.Quality;
+using Lucene.Net.Search;
+using Newtonsoft.Json.Linq;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Dtos
+{
+	/// <summary>
+	/// 转写
+	/// </summary>
+	public class Transfer
+	{
+		public Transfer()
+		{
+		}
+
+		public Transfer(EQualityTransferType type, string content,string reviseContent, int sort,string prohibited)
+		{
+			Type  = type;
+			Content = content;
+			ReviseContent = reviseContent;
+			Sort = sort;
+			Prohibited = prohibited;
+		}
+
+		/// <summary>
+		/// 转写类型
+		/// </summary>
+		public EQualityTransferType Type { get; set; }
+
+		/// <summary>
+		/// 转写内容
+		/// </summary>
+		public string? Content { get; set; }
+
+		/// <summary>
+		/// 转写修改后内容
+		/// </summary>
+		public string? ReviseContent { get; set; }
+
+		/// <summary>
+		/// 排序
+		/// </summary>
+		public int Sort { get; set; }
+
+		/// <summary>
+		/// 违禁词
+		/// </summary>
+		public string? Prohibited { get; set; }
+	}
+}

+ 42 - 0
src/Hotline.Share/Enums/Quality/EQuality.cs

@@ -42,4 +42,46 @@ namespace Hotline.Share.Enums.Quality
 		[Description("回访待质检")]
 		Visit = 3
 	}
+
+	public enum EQualityTransferState
+	{
+		/// <summary>
+		/// 未开始
+		/// </summary>
+		[Description("未开始")]
+		NotStarted = 0,
+
+		/// <summary>
+		/// 转写中
+		/// </summary>
+		[Description("转写中")]
+		Translating = 1,
+
+		/// <summary>
+		/// 转写成功
+		/// </summary>
+		[Description("转写成功")]
+		Succeed = 1,
+
+		/// <summary>
+		/// 转写失败
+		/// </summary>
+		[Description("转写失败")]
+		Lose = 1,
+	}
+
+	public enum EQualityTransferType {
+
+		/// <summary>
+		/// 坐席
+		/// </summary>
+		[Description("坐席")]
+		Seats = 0,
+
+		/// <summary>
+		/// 市民
+		/// </summary>
+		[Description("市民")]
+		Citizen = 1,
+	}
 }

+ 1 - 1
src/Hotline/Ai/Quality/IAiQualityService.cs

@@ -16,6 +16,6 @@ namespace Hotline.Ai.Quality
         //TrCallRecord? call,
 		Task CreateAiOrderQualityTask(string id, string audioFile,string fromNo,DateTime? callStartTime, string viteRecordPrefix, string ywlxString, CancellationToken cancellationToken);
 
-		Task CreateAiOrderQualityTask(string filename, CancellationToken cancellationToken);
+		Task<string> CreateAiOrderQualityTask(string filename, CancellationToken cancellationToken);
 	}
 }

+ 18 - 0
src/Hotline/Quality/Quality.cs

@@ -1,4 +1,5 @@
 using Hotline.Orders;
+using Hotline.Share.Dtos;
 using Hotline.Share.Enums.Quality;
 using SqlSugar;
 using System;
@@ -12,6 +13,9 @@ using XF.Domain.Repository;
 namespace Hotline.Quality
 {
 	[Description("质检")]
+	[SugarIndex("index_quality_creationtime", nameof(Quality.CreationTime), OrderByType.Desc)]
+	[SugarIndex("index_quality_orderId", nameof(OrderScreen.OrderId), OrderByType.Asc)]
+	[SugarIndex("index_quality_visitId", nameof(OrderScreen.VisitId), OrderByType.Asc)]
 	public class Quality : FullStateEntity
 	{
 		/// <summary>
@@ -90,5 +94,19 @@ namespace Hotline.Quality
 		/// 智能质检
 		/// </summary>
 		public bool? AiQuality { get; set; } = false;
+
+		/// <summary>
+		/// 转写状态
+		/// </summary>
+		[SugarColumn(ColumnDescription = "转写状态", DefaultValue = "0")]
+		public EQualityTransferState? TransferState { get; set; }
+
+		/// <summary>
+		/// 转写内容
+		/// </summary>
+		[SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
+		public List<Transfer>? Transfer { get; set; }
+
 	}
+
 }

+ 40 - 0
src/Hotline/Quality/QualityTransferRecords.cs

@@ -0,0 +1,40 @@
+using Hotline.Share.Enums.Quality;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.Quality
+{
+	[Description("录音文件质检转写")]
+	public class QualityTransferRecords : FullStateEntity
+	{
+
+		/// <summary>
+		/// 质检ID
+		/// </summary>
+		public string QualityId { get; set; }
+
+
+		/// <summary>
+		/// 是否完成
+		/// </summary>
+		public bool? IsFinished { get; set; }
+
+		/// <summary>
+		/// 转写时间
+		/// </summary>
+		public DateTime? TransferTime { get; set; }
+
+
+		/// <summary>
+		/// 转写状态
+		/// </summary>
+		[SugarColumn(ColumnDescription = "转写状态", DefaultValue = "0")]
+		public EQualityTransferState? TransferState { get; set; }
+	}
+}

+ 22 - 0
src/Hotline/Snapshot/OrderSnapshot.cs

@@ -77,6 +77,8 @@ public class OrderSnapshot : CreationSoftDeleteEntity
     [SugarColumn(ColumnDescription = "作业时间")]
     public DateTime? EndWorkTime { get; set; }
 
+    #region 标记工单是否安全生产字段
+
     /// <summary>
     /// 部门标记是否安全生产
     /// </summary>
@@ -106,6 +108,7 @@ public class OrderSnapshot : CreationSoftDeleteEntity
     /// </summary>
     [SugarColumn(ColumnDescription = "标记备注")]
     public string? SignRemark { get; set; }
+    #endregion
 
     /// <summary>
     /// 部门是否存在安全隐患
@@ -155,6 +158,24 @@ public class OrderSnapshot : CreationSoftDeleteEntity
     [SugarColumn(ColumnDescription = "工单标签")]
     public string? LabelName { get; set; }
 
+    /// <summary>
+    /// 标签用户
+    /// </summary>
+    [SugarColumn(ColumnDescription = "标签用户")]
+    public string? LabelUserName { get; set; }
+
+    /// <summary>
+    /// 标签用户Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "标签用户Id")]
+    public string? LabelUserId { get; set; }
+
+    /// <summary>
+    /// 标签时间
+    /// </summary>
+    [SugarColumn(ColumnDescription = "标签时间")]
+    public DateTime? LabelTime { get; set; }
+
     /// <summary>
     /// 工单办理:
     /// 是否申请追加奖励
@@ -303,4 +324,5 @@ public class OrderSnapshot : CreationSoftDeleteEntity
     /// </summary>
     [SugarColumn(ColumnDescription = "购气单位/个人名称")]
     public string? CompanyName { get; set; }
+
 }