瀏覽代碼

Merge branch 'test' into lib/test

libin 3 月之前
父節點
當前提交
e0b67684de
共有 37 個文件被更改,包括 668 次插入156 次删除
  1. 7 0
      Hotline.sln
  2. 3 1
      src/Hotline.Ai.Jths/AiQualityService.cs
  3. 112 0
      src/Hotline.Ai.XingTang/AiQualityService.cs
  4. 15 0
      src/Hotline.Ai.XingTang/AiXingTangStartupExtensions.cs
  5. 20 0
      src/Hotline.Ai.XingTang/Hotline.Ai.XingTang.csproj
  6. 91 91
      src/Hotline.Api/Controllers/Bi/BiOrderController.cs
  7. 8 4
      src/Hotline.Api/Controllers/Bigscreen/DataScreenController.cs
  8. 3 0
      src/Hotline.Api/Controllers/OrderController.cs
  9. 25 0
      src/Hotline.Api/Controllers/Snapshot/RedPackController.cs
  10. 29 4
      src/Hotline.Api/Controllers/Snapshot/SnapshotOrderController.cs
  11. 35 22
      src/Hotline.Api/Controllers/TestController.cs
  12. 3 1
      src/Hotline.Api/StartupExtensions.cs
  13. 5 0
      src/Hotline.Api/config/appsettings.Development.json
  14. 4 0
      src/Hotline.Application.Tests/Application/OrderSnapshotApplicationTest.cs
  15. 6 0
      src/Hotline.Application.Tests/Application/RedPackApplicationTest.cs
  16. 2 2
      src/Hotline.Application.Tests/Application/SnapshotApplicationMockTest.cs
  17. 1 0
      src/Hotline.Application/Hotline.Application.csproj
  18. 16 6
      src/Hotline.Application/Orders/Handles/SnapshotHandler/GuiderSystemTimeoutHandler.cs
  19. 1 1
      src/Hotline.Application/Snapshot/DefaultSnapshotApplication.cs
  20. 7 0
      src/Hotline.Application/Snapshot/IOrderSnapshotApplication.cs
  21. 6 0
      src/Hotline.Application/Snapshot/IRedPackApplication.cs
  22. 33 0
      src/Hotline.Application/Snapshot/OrderSnapshotApplication.cs
  23. 21 0
      src/Hotline.Application/Snapshot/RedPackApplication.cs
  24. 5 3
      src/Hotline.Application/Snapshot/SnapshotApplicationBase.cs
  25. 1 1
      src/Hotline.Application/Snapshot/ZiGongSnapshotApplication.cs
  26. 2 2
      src/Hotline.Application/StatisticalReport/OrderReportApplication.cs
  27. 8 0
      src/Hotline.Repository.SqlSugar/Snapshot/IndustryRepository.cs
  28. 2 1
      src/Hotline.Repository.SqlSugar/System/SystemLogRepository.cs
  29. 119 2
      src/Hotline.Share/Dtos/Snapshot/OrderDto.cs
  30. 51 0
      src/Hotline.Share/Dtos/Snapshot/RedPackRecordDto.cs
  31. 2 0
      src/Hotline/Ai/Quality/IAiQualityService.cs
  32. 1 1
      src/Hotline/Caching/Interfaces/ISystemSettingCacheManager.cs
  33. 2 2
      src/Hotline/Caching/Services/SystemSettingCacheManager.cs
  34. 2 1
      src/Hotline/Configurations/AppConfiguration.cs
  35. 1 1
      src/Hotline/Settings/ISystemLogRepository.cs
  36. 1 0
      src/Hotline/Snapshot/Interfaces/IIndustryRepository.cs
  37. 18 10
      src/TianQue.Sdk/TiqnQueService.cs

+ 7 - 0
Hotline.sln

@@ -61,6 +61,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Hotline.WeChat", "src\Hotli
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TianQue.Sdk", "src\TianQue.Sdk\TianQue.Sdk.csproj", "{6CF27647-D0E0-4D17-80FB-3EE57864A2B4}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hotline.Ai.XingTang", "src\Hotline.Ai.XingTang\Hotline.Ai.XingTang.csproj", "{8E4F64EF-314A-45BA-8BB2-46FF5B06F7D5}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -159,6 +161,10 @@ Global
 		{6CF27647-D0E0-4D17-80FB-3EE57864A2B4}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{6CF27647-D0E0-4D17-80FB-3EE57864A2B4}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{6CF27647-D0E0-4D17-80FB-3EE57864A2B4}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8E4F64EF-314A-45BA-8BB2-46FF5B06F7D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8E4F64EF-314A-45BA-8BB2-46FF5B06F7D5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8E4F64EF-314A-45BA-8BB2-46FF5B06F7D5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8E4F64EF-314A-45BA-8BB2-46FF5B06F7D5}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -190,6 +196,7 @@ Global
 		{37784861-ABC0-41F4-87B4-2E08A89A2C42} = {D041C554-B78E-4AAF-B597-E309DC8EEF4F}
 		{75215667-65AF-4B7B-85E7-3140239B30CC} = {D041C554-B78E-4AAF-B597-E309DC8EEF4F}
 		{6CF27647-D0E0-4D17-80FB-3EE57864A2B4} = {D041C554-B78E-4AAF-B597-E309DC8EEF4F}
+		{8E4F64EF-314A-45BA-8BB2-46FF5B06F7D5} = {D041C554-B78E-4AAF-B597-E309DC8EEF4F}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {4B8EA790-BD13-4422-8D63-D6DBB77B823F}

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

@@ -21,8 +21,10 @@ namespace Hotline.Ai.Jths
             _client = new RestClient();
             _baseUrl = baseUrl;
         }
+        public async Task CreateAiOrderQualityTask(string filename, CancellationToken cancellationToken) { }
 
-        public async Task CreateAiOrderQualityTask(
+
+		public async Task CreateAiOrderQualityTask(
              string id,
              string audioFile,
              string fromNo,

+ 112 - 0
src/Hotline.Ai.XingTang/AiQualityService.cs

@@ -0,0 +1,112 @@
+using RestSharp;
+using Fw.Utility.UnifyResponse;
+using System.Text;
+using System.Security.Cryptography;
+using Hotline.Share.Dtos.Quality;
+using Hotline.Ai.Quality;
+
+namespace Hotline.Ai.XingTang
+{
+    public class AiQualityService : IAiQualityService
+    {
+        private readonly RestClient _client;
+        private readonly string _baseUrl;
+
+        public AiQualityService(string baseUrl)
+        {
+            _client = new RestClient();
+            _baseUrl = baseUrl;
+        }
+
+        public async Task CreateAiOrderQualityTask(
+            string id,
+            string audioFile,
+            string fromNo,
+            DateTime? callStartTime,
+            string viteRecordPrefix,
+            string ywlxString,
+            CancellationToken cancellationToken)
+        { 
+        }
+
+
+		public async Task CreateAiOrderQualityTask(string filename, CancellationToken cancellationToken)
+        {
+            var url = _baseUrl + "/offlinerecog?filename=" + filename;
+			var baseUrl = new Uri(url);
+             await ExecuteAsync(baseUrl.ToString(), Method.Get, "", cancellationToken);
+        }
+
+        public async Task<ApiResponse<TResponse>> ExecuteAsync<TRequest, TResponse>(string path, Method httpMethod,
+            TRequest request, CancellationToken cancellationToken)
+            where TRequest : class
+        {
+            var req = new RestRequest(path, httpMethod);
+            if (httpMethod is Method.Get)
+            {
+                req.AddObject(request);
+            }
+            else
+            {
+                req.AddJsonBody(request);
+            }
+
+            try
+            {
+                var response = await _client.ExecuteAsync<ApiResponse<TResponse>>(req, cancellationToken);
+                return response.Data;
+            }
+            catch (Exception e)
+            {
+                throw new HttpRequestException($"智能质检平台错误,Error: {e.Message}");
+            }
+        }
+
+        public async Task<ApiResponse> 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;
+            }
+            catch (Exception e)
+            {
+                throw new HttpRequestException($"智能质检平台错误,Error: {e.Message}");
+            }
+        }
+
+        /// <summary>
+        /// MD5加密
+        /// </summary>
+        /// <param name="input">需要加密的字符串</param>
+        /// <returns></returns>
+        private static string MD5Encrypt(string? input)
+        {
+            using var md5 = MD5.Create();
+            var t = md5.ComputeHash(Encoding.UTF8.GetBytes(input));
+            var sb = new StringBuilder(32);
+            for (var i = 0; i < t.Length; i++)
+                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);
+        }
+    }
+}

+ 15 - 0
src/Hotline.Ai.XingTang/AiXingTangStartupExtensions.cs

@@ -0,0 +1,15 @@
+using Hotline.Ai.Quality;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Hotline.Ai.XingTang
+{
+	public static class AiXingTangStartupExtensions
+	{
+		public  static IServiceCollection AddAiXingTang(this IServiceCollection services, string baseUrl)
+		{
+			services.AddSingleton<IAiQualityService, AiQualityService>(_ => new AiQualityService(baseUrl));
+
+			return services;
+		}
+	}
+}

+ 20 - 0
src/Hotline.Ai.XingTang/Hotline.Ai.XingTang.csproj

@@ -0,0 +1,20 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Fw.Utility.UnifyResponse" Version="1.0.0" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.0" />
+    <PackageReference Include="RestSharp" Version="112.1.0" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\Hotline.Share\Hotline.Share.csproj" />
+    <ProjectReference Include="..\Hotline\Hotline.csproj" />
+  </ItemGroup>
+
+</Project>

+ 91 - 91
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -1916,11 +1916,11 @@ namespace Hotline.Api.Controllers.Bi
                 .Select(o => new CenterReportCallDto
                 {
                     EffectiveCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.OnState == EOnState.On, 1, 0)),//有效
-					InTotal = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In, 1, 0)),//呼入总量
-					OutTotal = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.Out, 1, 0)),//呼出总量
-					InConnectionQuantity = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.AnsweredTime != null, 1, 0)),//呼入接通量
-					OutConnectionQuantity = SqlFunc.AggregateSum(SqlFunc.IIF(o.TelNo != "0" && o.CallDirection == ECallDirection.Out && o.AnsweredTime != null, 1, 0)),//呼出接通量
-					InvalidCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.OnState == EOnState.NoOn /*&& o.BeginIvrTime.HasValue && o.BeginQueueTime.HasValue && o.BeginRingTime.HasValue*/, 1, 0)), //无效(排除队列挂断和IVR挂断)
+                    InTotal = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In, 1, 0)),//呼入总量
+                    OutTotal = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.Out, 1, 0)),//呼出总量
+                    InConnectionQuantity = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.AnsweredTime != null, 1, 0)),//呼入接通量
+                    OutConnectionQuantity = SqlFunc.AggregateSum(SqlFunc.IIF(o.TelNo != "0" && o.CallDirection == ECallDirection.Out && o.AnsweredTime != null, 1, 0)),//呼出接通量
+                    InvalidCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.OnState == EOnState.NoOn /*&& o.BeginIvrTime.HasValue && o.BeginQueueTime.HasValue && o.BeginRingTime.HasValue*/, 1, 0)), //无效(排除队列挂断和IVR挂断)
                     QueueByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.QueueTims > 0 && o.RingTimes == 0 && o.OnState == EOnState.NoOn, 1, 0)), //队列挂断
                     IvrByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.BeginIvrTime.HasValue && !o.BeginQueueTime.HasValue && !o.BeginRingTime.HasValue && o.OnState == EOnState.NoOn, 1, 0)), //IVR挂断
                 })
@@ -2086,8 +2086,8 @@ namespace Hotline.Api.Controllers.Bi
             {
                 sourceChannel.Add(new CenterReportOrderSourceChannelDto
                 {
-					AllCountNum = sourceChannelCount,
-					Name = item.DicDataName,
+                    AllCountNum = sourceChannelCount,
+                    Name = item.DicDataName,
                     Code = item.DicTypeCode,
                     CountNum = sourceChannelData.Find(p => p.Code == item.DicDataValue)?.CountNum ?? 0
                 });
@@ -2495,14 +2495,14 @@ namespace Hotline.Api.Controllers.Bi
 
             if (enterpriseOrderDto2 != null)
             {
-				centerReportStatisticsDto.EnterpriseOrderDto.VisitdCount = enterpriseOrderDto2.VisitdCount;
-				centerReportStatisticsDto.EnterpriseOrderDto.Dissatisfied = enterpriseOrderDto2.Dissatisfied;
-				centerReportStatisticsDto.EnterpriseOrderDto.CityDissatisfied = enterpriseOrderDto2.CityDissatisfied;
-				centerReportStatisticsDto.EnterpriseOrderDto.CountyDissatisfied = enterpriseOrderDto2.CountyDissatisfied;
-				centerReportStatisticsDto.EnterpriseOrderDto.Satisfied = enterpriseOrderDto2.Satisfied;
-				centerReportStatisticsDto.EnterpriseOrderDto.CitySatisfied = enterpriseOrderDto2.CitySatisfied;
-				centerReportStatisticsDto.EnterpriseOrderDto.CountySatisfied = enterpriseOrderDto2.CountySatisfied;
-			}
+                centerReportStatisticsDto.EnterpriseOrderDto.VisitdCount = enterpriseOrderDto2.VisitdCount;
+                centerReportStatisticsDto.EnterpriseOrderDto.Dissatisfied = enterpriseOrderDto2.Dissatisfied;
+                centerReportStatisticsDto.EnterpriseOrderDto.CityDissatisfied = enterpriseOrderDto2.CityDissatisfied;
+                centerReportStatisticsDto.EnterpriseOrderDto.CountyDissatisfied = enterpriseOrderDto2.CountyDissatisfied;
+                centerReportStatisticsDto.EnterpriseOrderDto.Satisfied = enterpriseOrderDto2.Satisfied;
+                centerReportStatisticsDto.EnterpriseOrderDto.CitySatisfied = enterpriseOrderDto2.CitySatisfied;
+                centerReportStatisticsDto.EnterpriseOrderDto.CountySatisfied = enterpriseOrderDto2.CountySatisfied;
+            }
 
             if (listInfo != null && listInfo.Rows.Count > 0 && centerReportStatisticsDto.EnterpriseOrderDto != null)
             {
@@ -2525,65 +2525,65 @@ namespace Hotline.Api.Controllers.Bi
                 centerReportStatisticsDto.EnterpriseOrderDto.CountySatisfied = centerReportStatisticsDto.EnterpriseOrderDto.CountySatisfied + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCountySatisfaction"]);
             }
 
-			#endregion
-
-			#region 企业信件分类
-			//信件来源
-			var enterpriseAcceptTypeData = await _orderRepository.Queryable(false, false, false)
-				.Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime && p.IdentityType == EIdentityType.Enterprise)
-				.Select(it => new
-				{
-					AcceptTypeCode = SqlFunc.IIF(SqlFunc.IsNullOrEmpty(it.AcceptTypeCode), "40", it.AcceptTypeCode),
-					FileOrgIsCenter = it.FileOrgIsCenter.HasValue ? it.FileOrgIsCenter : true,
-					CreationTimeHandleDurationWorkday = it.CreationTimeHandleDurationWorkday.HasValue ? it.CenterToOrgHandleDurationWorkday : 0,
-					CenterToOrgHandleDurationWorkday = it.CenterToOrgHandleDurationWorkday.HasValue ? it.CenterToOrgHandleDurationWorkday : 0,
-				})
-				.MergeTable()//将查询出来的结果合并成一个新表
-				 .GroupBy(temp => new { temp.AcceptTypeCode })//对新表进行分组
-				 .Select(temp => new CenterReportOrderSourceChannelDto
-				 {
-					 Code = temp.AcceptTypeCode,
-					 CountNum = SqlFunc.AggregateCount(temp.AcceptTypeCode),
-					 CompletedAging = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter == true, temp.CreationTimeHandleDurationWorkday, temp.CenterToOrgHandleDurationWorkday))
-				 })
-				 .ToListAsync();
-			List<CenterReportOrderSourceChannelDto> enterpriseAcceptType = new();
-			var enterpriseAcceptTypeDic = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType);
-			foreach (var item in enterpriseAcceptTypeDic)
-			{
-				enterpriseAcceptType.Add(new CenterReportOrderSourceChannelDto
-				{
-					AllCountNum = sourceChannelCount,
-					Name = item.DicDataName,
-					Code = item.DicTypeCode,
-					CountNum = enterpriseAcceptTypeData.Find(p => p.Code == item.DicDataValue)?.CountNum ?? 0,
-					CompletedAging = enterpriseAcceptTypeData.Find(p => p.Code == item.DicDataValue)?.CompletedAging ?? 0
-				});
-			}
-
-			if (listPurOld != null && listPurOld.Rows.Count > 0 && enterpriseAcceptType != null)
-			{
-				foreach (var item in enterpriseAcceptType)
-				{
-					if (item.Code == "10")
-						item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Consult"]);            // 咨询
-					else if (item.Code == "15")
-						item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Suggest"]);            // 建议
-					else if (item.Code == "20")
-						item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["SeekHelp"]);           // 求助
-					else if (item.Code == "25")
-						item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Praise"]);             // 表扬
-					else if (item.Code == "30")
-						item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Report"]);             // 举报
-					else if (item.Code == "35")
-						item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Complaint"]);          // 投诉
-				}
-			}
-
-			centerReportStatisticsDto.EnterpriseCenterReportOrderAcceptTypes = enterpriseAcceptType;
-			#endregion
-
-			return centerReportStatisticsDto;
+            #endregion
+
+            #region 企业信件分类
+            //信件来源
+            var enterpriseAcceptTypeData = await _orderRepository.Queryable(false, false, false)
+                .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime && p.IdentityType == EIdentityType.Enterprise)
+                .Select(it => new
+                {
+                    AcceptTypeCode = SqlFunc.IIF(SqlFunc.IsNullOrEmpty(it.AcceptTypeCode), "40", it.AcceptTypeCode),
+                    FileOrgIsCenter = it.FileOrgIsCenter.HasValue ? it.FileOrgIsCenter : true,
+                    CreationTimeHandleDurationWorkday = it.CreationTimeHandleDurationWorkday.HasValue ? it.CenterToOrgHandleDurationWorkday : 0,
+                    CenterToOrgHandleDurationWorkday = it.CenterToOrgHandleDurationWorkday.HasValue ? it.CenterToOrgHandleDurationWorkday : 0,
+                })
+                .MergeTable()//将查询出来的结果合并成一个新表
+                 .GroupBy(temp => new { temp.AcceptTypeCode })//对新表进行分组
+                 .Select(temp => new CenterReportOrderSourceChannelDto
+                 {
+                     Code = temp.AcceptTypeCode,
+                     CountNum = SqlFunc.AggregateCount(temp.AcceptTypeCode),
+                     CompletedAging = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter == true, temp.CreationTimeHandleDurationWorkday, temp.CenterToOrgHandleDurationWorkday))
+                 })
+                 .ToListAsync();
+            List<CenterReportOrderSourceChannelDto> enterpriseAcceptType = new();
+            var enterpriseAcceptTypeDic = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType);
+            foreach (var item in enterpriseAcceptTypeDic)
+            {
+                enterpriseAcceptType.Add(new CenterReportOrderSourceChannelDto
+                {
+                    AllCountNum = sourceChannelCount,
+                    Name = item.DicDataName,
+                    Code = item.DicTypeCode,
+                    CountNum = enterpriseAcceptTypeData.Find(p => p.Code == item.DicDataValue)?.CountNum ?? 0,
+                    CompletedAging = enterpriseAcceptTypeData.Find(p => p.Code == item.DicDataValue)?.CompletedAging ?? 0
+                });
+            }
+
+            if (listPurOld != null && listPurOld.Rows.Count > 0 && enterpriseAcceptType != null)
+            {
+                foreach (var item in enterpriseAcceptType)
+                {
+                    if (item.Code == "10")
+                        item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Consult"]);            // 咨询
+                    else if (item.Code == "15")
+                        item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Suggest"]);            // 建议
+                    else if (item.Code == "20")
+                        item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["SeekHelp"]);           // 求助
+                    else if (item.Code == "25")
+                        item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Praise"]);             // 表扬
+                    else if (item.Code == "30")
+                        item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Report"]);             // 举报
+                    else if (item.Code == "35")
+                        item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Complaint"]);          // 投诉
+                }
+            }
+
+            centerReportStatisticsDto.EnterpriseCenterReportOrderAcceptTypes = enterpriseAcceptType;
+            #endregion
+
+            return centerReportStatisticsDto;
         }
 
 
@@ -5597,16 +5597,16 @@ namespace Hotline.Api.Controllers.Bi
         public async Task<List<OrderTsDetails>> GetQueryOrderTsDetailslOrderList(string KeyWord)
         {
             return await _orderTsDetailsRepository.Queryable()
-                .LeftJoin<Order>((ot,o)=>ot.OrderId==o.Id)
+                .LeftJoin<Order>((ot, o) => ot.OrderId == o.Id)
                    .Where((ot, o) => ot.Terms == KeyWord)
-                   .Select((ot, o)=>new OrderTsDetails
+                   .Select((ot, o) => new OrderTsDetails
                    {
-                       Id=ot.Id,
-                       Terms=ot.Terms,
-                       OrderId=o.Id,
-                       Title=o.Title,
-                       No=ot.No
-                   } )
+                       Id = ot.Id,
+                       Terms = ot.Terms,
+                       OrderId = o.Id,
+                       Title = o.Title,
+                       No = ot.No
+                   })
                    .ToListAsync(HttpContext.RequestAborted);
         }
 
@@ -5662,21 +5662,21 @@ namespace Hotline.Api.Controllers.Bi
         /// <summary>
         /// 根据知识库引用查询工单
         /// </summary>
-        /// <param name="KeyWord"></param>
+        /// <param name="dto"></param>
         /// <returns></returns>
         [HttpGet("get_query_knowledge_quote_order_list")]
-        public async Task<List<KnowledgeQuote>> GetQueryKnowledgeQuoteOrderList(string KeyWord)
+        public async Task<List<KnowledgeQuote>> GetQueryKnowledgeQuoteOrderList([FromQuery] PagedKeywordRequest dto)
         {
             return await _knowledgeQuoteRepository.Queryable()
                    .LeftJoin<Order>((kn, o) => kn.OrderId == o.Id)
-                   .Where((kn, o) => kn.KnowledgeId == KeyWord)
-                   .Select((kn, o)=>new KnowledgeQuote
+                   .Where((kn, o) => kn.KnowledgeId == dto.Keyword && kn.CreationTime >= dto.StartTime && kn.CreationTime <= dto.EndTime)
+                   .Select((kn, o) => new KnowledgeQuote
                    {
-                       KnowledgeId=kn.Id,
-                       KnowledgeTitle=o.Title,
-                       OrderId=o.Id,
-                       Title=o.Title,
-                       No=o.No,
+                       KnowledgeId = kn.Id,
+                       KnowledgeTitle = o.Title,
+                       OrderId = o.Id,
+                       Title = o.Title,
+                       No = o.No,
                    })
                    .ToListAsync(HttpContext.RequestAborted);
         }

+ 8 - 4
src/Hotline.Api/Controllers/Bigscreen/DataScreenController.cs

@@ -15,6 +15,7 @@ using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
 using SqlSugar;
+using System;
 using XF.Domain.Repository;
 
 namespace Hotline.Api.Controllers.Bigscreen
@@ -606,6 +607,7 @@ namespace Hotline.Api.Controllers.Bigscreen
         [HttpGet("order-secondary-statistics")]
         public async Task<SecondaryProcessingOrderStatisticsDto> OrderSecondaryStatistics(DateTime StartTime, DateTime EndTime)
         {
+            DateTime? dateTime = DateTime.Now;
             EndTime = EndTime.AddDays(1).AddSeconds(-1);
             var data = new SecondaryProcessingOrderStatisticsDto
             {
@@ -622,15 +624,17 @@ namespace Hotline.Api.Controllers.Bigscreen
 
                 OrderSoonOverdueCount = await _orderSecondaryHandlingRepository.Queryable()
                 .Includes(x => x.Order)
-                 .Where(x => x.Order.ExpiredStatus == EExpiredStatus.GoingToExpired && x.AuditTime >= StartTime && x.AuditTime <= EndTime
+                 .Where(x => x.Order.Status < EOrderStatus.Filed && dateTime > x.Order.NearlyExpiredTime && dateTime < x.Order.ExpiredTime)
+                 .Where(x => x.AuditTime >= StartTime && x.AuditTime <= EndTime
                  && x.State != ESecondaryHandlingState.NotApply
                  && x.State != ESecondaryHandlingState.Apply && x.State != ESecondaryHandlingState.Refuse)
                  .CountAsync()
             };
             var da = await _orderSecondaryHandlingRepository.Queryable()
                 .LeftJoin<OrderVisit>((os, ov) => os.VisitId == ov.Id)
-                    .LeftJoin<OrderVisitDetail>((os, ov, od) => os.VisitDetailId == od.Id)
-                    .Where((os, ov, od) => ov.VisitTime >= StartTime && ov.VisitTime <= EndTime && os.State != ESecondaryHandlingState.NotApply
+                    .LeftJoin<OrderVisitDetail>((os, ov, od) => ov.Id == od.VisitId)
+                    .Where((os, ov, od) => ov.VisitState == EVisitState.Visited && od.VisitTarget == EVisitTarget.Org && ov.VisitTime >= StartTime && ov.VisitTime <= EndTime
+                    && os.State != ESecondaryHandlingState.NotApply
                     && os.State != ESecondaryHandlingState.Apply && os.State != ESecondaryHandlingState.Refuse)
                     .Select((os, ov, od) => new SecondarySatisfactionDto()
                     {
@@ -652,7 +656,7 @@ namespace Hotline.Api.Controllers.Bigscreen
         public async Task<List<OrderSecondaryHandlingDto>> OrderSecondaryHandlingDetailQuery()
         {
             var quer = await _orderSecondaryHandlingRepository.Queryable()
-                 .Includes(x=>x.Order)
+                 .Includes(x => x.Order)
                   .Where(x => x.CreationTime.Date == DateTime.Now.Date)
                   .OrderByDescending(x => x.CreationTime)
                   .Take(50)

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

@@ -3656,6 +3656,9 @@ public class OrderController : BaseController
                 IndustryName = dto.IndustryName
             };
             await _orderSnapshotRepository.AddAsync(snapshot, HttpContext.RequestAborted);
+            order.Latitude = 29.33924;
+            order.Longitude = 104.779307;
+            await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
         }
 
         //订阅此事件的内部处理工单数据只能更新各自业务的字段,不能全部更新

+ 25 - 0
src/Hotline.Api/Controllers/Snapshot/RedPackController.cs

@@ -188,6 +188,31 @@ public class RedPackController : BaseController
     public async Task<PagedDto<SnapshotRedPackRecordItemsGuiderOutDto>> GetRedPackRecordGuiderItemsAsync([FromQuery] SnapshotRedPackRecordItemsGuiderInDto dto)
         => (await _redPackApplication.GetRedPackRecordGuiderItemsAsync(dto).ToPagedListAsync(dto)).ToPaged();
 
+    /// <summary>
+    /// 红包发放明细基础数据
+    /// </summary>
+    /// <returns></returns>
+    [HttpGet("record/send/database")]
+    public async Task<Dictionary<string, object>> GetRedPackRecordSendBaseDataAsync()
+    {
+        return new Dictionary<string, object>()
+        {
+            { "industry", await _industryRepository.Queryable()
+            .Select(m => new { m.Id, m.Name })
+            .ToListAsync()},
+            { "sendStatus", EnumExts.GetDescriptions<EReadPackSendStatus>().Where(m => m.Key != 2).ToList() },
+            { "userType", EnumExts.GetDescriptions<EReadPackUserType>() }
+        };
+    }
+
+    /// <summary>
+    /// 红包发放明细
+    /// </summary>
+    /// <returns></returns>
+    [HttpGet("record/send")]
+    public async Task<PagedDto<SnapshotRedPackRecordSendOutDto>> GetRedPackRecordDetailAsync([FromQuery] SnapshotRedPackRecordSendInDto dto)
+        => (await _redPackApplication.GetRedPackRecordDetailAsync(dto).ToPagedListAsync(dto)).ToPaged();
+
     /// <summary>
     /// 批量发送红包
     /// </summary>

+ 29 - 4
src/Hotline.Api/Controllers/Snapshot/SnapshotOrderController.cs

@@ -1,5 +1,6 @@
 using Amazon.Runtime.Internal.Transform;
 using Hotline.Application.FlowEngine;
+using Hotline.Application.Orders;
 using Hotline.Application.Snapshot;
 using Hotline.Caching.Interfaces;
 using Hotline.Caching.Services;
@@ -15,6 +16,7 @@ using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Snapshot;
 using Hotline.Share.Tools;
+using Hotline.Snapshot;
 using Hotline.Snapshot.Interfaces;
 using Mapster;
 using Microsoft.AspNetCore.Mvc;
@@ -43,8 +45,9 @@ public class SnapshotOrderController : BaseController
     private readonly IOrderRepository _orderRepository;
     private readonly IWorkflowApplication _workflowApplication;
     private readonly IRepository<WorkflowDefinition> _workflowDefinitionRepository;
+    private readonly IOrderApplication _orderApplication;
 
-    public SnapshotOrderController(IOrderSnapshotRepository orderSnapshotRepository, IOrderSnapshotApplication orderSnapshotApplication, ISystemAreaDomainService systemAreaDomainService, ISystemDicDataCacheManager systemDicDataCacheManager, IIndustryRepository industryRepository, ISessionContext sessionContext, IWorkflowDomainService workflowDomainService, IOrderRepository orderRepository, IWorkflowApplication workflowApplication, IRepository<WorkflowDefinition> workflowDefinitionRepository)
+    public SnapshotOrderController(IOrderSnapshotRepository orderSnapshotRepository, IOrderSnapshotApplication orderSnapshotApplication, ISystemAreaDomainService systemAreaDomainService, ISystemDicDataCacheManager systemDicDataCacheManager, IIndustryRepository industryRepository, ISessionContext sessionContext, IWorkflowDomainService workflowDomainService, IOrderRepository orderRepository, IWorkflowApplication workflowApplication, IRepository<WorkflowDefinition> workflowDefinitionRepository, IOrderApplication orderApplication)
     {
         _orderSnapshotRepository = orderSnapshotRepository;
         _orderSnapshotApplication = orderSnapshotApplication;
@@ -56,6 +59,7 @@ public class SnapshotOrderController : BaseController
         _orderRepository = orderRepository;
         _workflowApplication = workflowApplication;
         _workflowDefinitionRepository = workflowDefinitionRepository;
+        _orderApplication = orderApplication;
     }
 
     /// <summary>
@@ -116,6 +120,15 @@ public class SnapshotOrderController : BaseController
     public async Task<PagedDto<SignOrderSnapshotItemsOutDto>> GetSignOrderSnapshotItemsAsync([FromQuery] SignOrderSnapshotItemsInDto dto)
         => (await _orderSnapshotApplication.GetSignOrderSnapshotItemsAsync(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();
+
     /// <summary>
     /// 标记详情
     /// </summary>
@@ -125,10 +138,12 @@ public class SnapshotOrderController : BaseController
     public async Task<SignOrderSnapshotDetailOutDto> GetSignOrderSnapshotDetailAsync(string id)
     { 
         var order = await _orderRepository.Queryable()
-            .Where(m => m.Id == id)
-            .Select(m => new SignOrderSnapshotDetailOutDto { Id = m.Id, Title = m.Title})
+            .Where(order => order.Id == id)
+            .Select(order => new SignOrderSnapshotDetailOutDto(), true)
             .FirstAsync();
-        order.Lables = _systemDicDataCacheManager.SnapshotOrderLabel;
+        var snapshot = await _orderSnapshotRepository.GetAsync(id, HttpContext.RequestAborted);
+        order.Lables = snapshot.Labels;
+        order.LabelsBaseData = _systemDicDataCacheManager.SnapshotOrderLabel;
         return order;
     }
 
@@ -230,4 +245,14 @@ public class SnapshotOrderController : BaseController
         };
     }
 
+    /// <summary>
+    /// 网格员超时未回复, 处理工单
+    /// </summary>
+    /// <param name="id">工单Id</param>
+    /// <returns></returns>
+    [HttpPut("guider/timeout/{id}")]
+    public async Task HandleFromWanggeyuanToMaskAsync(string id)
+    {
+        await _orderApplication.HandleFromWanggeyuanToMaskAsync(id, HttpContext.RequestAborted);
+    }
 }

+ 35 - 22
src/Hotline.Api/Controllers/TestController.cs

@@ -73,6 +73,7 @@ using static System.Runtime.InteropServices.JavaScript.JSType;
 using Order = Hotline.Orders.Order;
 using Hotline.Share.Dtos.Settings;
 using OrderDto = Hotline.Share.Dtos.Order.OrderDto;
+using Hotline.Ai.Quality;
 
 namespace Hotline.Api.Controllers;
 
@@ -144,6 +145,7 @@ public class TestController : BaseController
 	private readonly IOrderScreenRepository _orderScreenRepository;
 	private readonly IRepository<OrderVisit> _orderVisitRepository;
     private readonly IThirdIdentiyService _thirdIdentiyService;
+	private readonly IServiceProvider _serviceProvider;
 
 
 	public TestController(
@@ -201,7 +203,8 @@ ICallApplication callApplication,
         IRepository<OldSendProData> oldSendProDataRepository,
         IThirdIdentiyService thirdIdentiyService,
 		IOrderScreenRepository orderScreenRepository,
-		IRepository<OrderVisit> orderVisitRepository
+		IRepository<OrderVisit> orderVisitRepository,
+		IServiceProvider serviceProvider
 		)
     {
         _logger = logger;
@@ -255,6 +258,7 @@ ICallApplication callApplication,
         _thirdIdentiyService = thirdIdentiyService;
         _orderScreenRepository = orderScreenRepository;
         _orderVisitRepository = orderVisitRepository;
+        _serviceProvider = serviceProvider;
 	}
 
     /// <summary>
@@ -1373,33 +1377,35 @@ ICallApplication callApplication,
         }
     }
 
-    /// <summary>
-    /// 老系统数据同步
-    /// </summary>
-    /// <returns></returns>
-	[HttpGet("old_data_synchronization/{no}")]
+	/// <summary>
+	/// 老系统数据同步
+	/// </summary>
+	/// <returns></returns>
+	[HttpGet("old_data_synchronization")]
 	[AllowAnonymous]
-	public async Task oldDataSynchronization(string no) 
-    {
-        var orders = new List<Order>();
-        if (string.IsNullOrEmpty(no))
-        {
-            orders = await _orderRepository.Queryable().Where(x => x.No.Length == 12 && x.ActualHandleTime == null  &&  x.CenterToOrgTime == null).ToListAsync();
-        }
-        else {
+	public async Task oldDataSynchronization([FromQuery] string? no)
+	{
+		var orders = new List<Order>();
+		if (string.IsNullOrEmpty(no))
+		{
+			orders = await _orderRepository.Queryable().Where(x => x.No.Length == 12 && x.ActualHandleTime == null && x.CenterToOrgTime == null).ToListAsync();
+		}
+		else
+		{
 			orders = await _orderRepository.Queryable().Where(x => x.No == no).ToListAsync();
 		}
-        foreach (var order in orders) {
+		foreach (var order in orders)
+		{
 
-            var  steps = await _workflowStepRepository.Queryable().Where(x=>x.ExternalId == order.Id).ToListAsync();
+			var steps = await _workflowStepRepository.Queryable().Where(x => x.ExternalId == order.Id).ToListAsync();
 
-            var actualHandleStep = steps.Where(x => x.HandlerOrgId == order.ActualHandleOrgCode).OrderByDescending(x => x.CreationTime).FirstOrDefault();
-            var CenterToOrgStep = steps.Where(x => x.AssignerOrgId == "001" && x.HandlerOrgId  != "001").OrderByDescending(x => x.CreationTime).FirstOrDefault();
+			var actualHandleStep = steps.Where(x => x.HandlerOrgId == order.ActualHandleOrgCode).OrderByDescending(x => x.CreationTime).FirstOrDefault();
+			var CenterToOrgStep = steps.Where(x => x.AssignerOrgId == "001" && x.HandlerOrgId != "001").OrderByDescending(x => x.CreationTime).FirstOrDefault();
 
 			order.ActualHandleTime = actualHandleStep.HandleTime;
-            order.CenterToOrgTime = CenterToOrgStep.CreationTime;
+			order.CenterToOrgTime = CenterToOrgStep.CreationTime;
 
-            await _orderRepository.Updateable().SetColumns(x => new Order { ActualHandleTime = order.ActualHandleTime, CenterToOrgTime = order.CenterToOrgTime }).ExecuteCommandAsync();
+			await _orderRepository.Updateable().SetColumns(x => new Order { ActualHandleTime = order.ActualHandleTime, CenterToOrgTime = order.CenterToOrgTime }).Where(x => x.Id == order.Id).ExecuteCommandAsync();
 
 
 			var now = order.FiledTime.Value;
@@ -1442,8 +1448,15 @@ ICallApplication callApplication,
 			order.File(now, handleDuration, fileDuration, allDuration, creationTimeHandleDurationWorkday, centerToOrgHandleDurationWorkday);
 
 		}
-       
-    }
 
+	}
+
+	[HttpGet("aiXingTang")]
+	[AllowAnonymous]
+	public async Task aiXingTang() {
+		var aiQualityService = _serviceProvider.GetRequiredService<IAiQualityService>();
+        await aiQualityService.CreateAiOrderQualityTask("cs202501030002.mp3", HttpContext.RequestAborted);
+
+	}
 
 }

+ 3 - 1
src/Hotline.Api/StartupExtensions.cs

@@ -47,6 +47,7 @@ using XF.Domain.Repository.Events;
 using Hotline.Orders.DatabaseEventHandler;
 using Hotline.Snapshot;
 using Hotline.WeChat;
+using Hotline.Ai.XingTang;
 
 
 namespace Hotline.Api;
@@ -157,7 +158,8 @@ internal static class StartupExtensions
                 services.AddProxiedScoped<ISnapshotApplication, DefaultSnapshotApplication>();
                 break;
             case AppDefaults.AppScope.ZiGong:
-                services.AddProxiedScoped<ISnapshotApplication, ZiGongSnapshotApplication>();
+				services.AddAiXingTang(appConfiguration.ZiGong.AiQuality.Url);
+				services.AddProxiedScoped<ISnapshotApplication, ZiGongSnapshotApplication>();
                 break;
             case AppDefaults.AppScope.LuZhou:
                 services.AddProxiedScoped<ISnapshotApplication, DefaultSnapshotApplication>();

+ 5 - 0
src/Hotline.Api/config/appsettings.Development.json

@@ -25,6 +25,11 @@
       }
     },
     "ZiGong": {
+      //智能质检
+      "AiQuality": {
+        "Url": "http://175.10.86.234:10095" // 正式
+        //"Url": "http://118.122.73.80:19072/", // 测试
+      },
       "AreaCode": "510300",
       "CallCenterType": "XingTang"
     },

+ 4 - 0
src/Hotline.Application.Tests/Application/OrderSnapshotApplicationTest.cs

@@ -39,6 +39,7 @@ public class OrderSnapshotApplicationTest : TestBase
     /// <summary>
     /// 随手拍办理流程
     /// 工单标注 : 验证数据是否保存正确
+    /// 获取已标注集合: 验证是否有已标注的数据
     /// </summary>
     /// <returns></returns>
     [Fact]
@@ -67,6 +68,9 @@ public class OrderSnapshotApplicationTest : TestBase
         var labelLog = await _orderSnapshotApplication.GetSignOrderSnapshotLogItemsAsync(new SignOrderSnapshotLogItemsInDto()).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();
+        sigedItems.Any(m => m.OrderId == order.Id).ShouldBe(true);
     }
 }
 

+ 6 - 0
src/Hotline.Application.Tests/Application/RedPackApplicationTest.cs

@@ -60,5 +60,11 @@ public class RedPackApplicationTest : TestBase
         record.ShouldNotBeNull();
         var recordItems = await _redPackApplication.GetRedPackRecordItemsAsync(new SnapshotRedPackRecordItemsInDto { Status =2}).ToListAsync();
         recordItems.Count.ShouldNotBe(0);
+
+        var sendRecordItems = await _redPackApplication.GetRedPackRecordDetailAsync(new SnapshotRedPackRecordSendInDto
+        {
+            IsReceive = true,
+        }).ToListAsync();
+        sendRecordItems.Count.ShouldNotBe(0);
     }
 }

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

@@ -26,7 +26,7 @@ namespace Hotline.Application.Tests.Snapshot
     public class SnapshotApplicationTest
     {
         private readonly Mock<IThirdIdentiyService> _thirdLoginServiceMock;
-        private readonly Mock<IRepository<Industry>> _industryRepositoryMock;
+        private readonly Mock<IIndustryRepository> _industryRepositoryMock;
         private readonly Mock<ISnapshotBulletinRepository> _bulletinRepositoryMock;
         private readonly Mock<ISessionContext> _sessionContextMock;
         private readonly Mock<IRepository<RedPackRecord>> _redPackRecordRepositoryMock;
@@ -55,7 +55,7 @@ namespace Hotline.Application.Tests.Snapshot
         public SnapshotApplicationTest()
         {
             _thirdLoginServiceMock = new Mock<IThirdIdentiyService>();
-            _industryRepositoryMock = new Mock<IRepository<Industry>>();
+            _industryRepositoryMock = new Mock<IIndustryRepository>();
             _bulletinRepositoryMock = new Mock<ISnapshotBulletinRepository>();
             _sessionContextMock = new Mock<ISessionContext>();
             _redPackRecordRepositoryMock = new Mock<IRepository<RedPackRecord>>();

+ 1 - 0
src/Hotline.Application/Hotline.Application.csproj

@@ -17,6 +17,7 @@
 
   <ItemGroup>
     <ProjectReference Include="..\Hotline.Ai.Jths\Hotline.Ai.Jths.csproj" />
+    <ProjectReference Include="..\Hotline.Ai.XingTang\Hotline.Ai.XingTang.csproj" />
     <ProjectReference Include="..\Hotline.Application.Contracts\Hotline.Application.Contracts.csproj" />
     <ProjectReference Include="..\Hotline.NewRock\Hotline.NewRock.csproj" />
     <ProjectReference Include="..\Hotline.Repository.SqlSugar\Hotline.Repository.SqlSugar.csproj" />

+ 16 - 6
src/Hotline.Application/Orders/Handles/SnapshotHandler/GuiderSystemTimeoutHandler.cs

@@ -13,6 +13,7 @@ using Hotline.Orders;
 using Hotline.Settings;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Enums.FlowEngine;
+using Hotline.Share.Tools;
 using Hotline.Snapshot.Notifications;
 using MediatR;
 using XF.Domain.Exceptions;
@@ -26,14 +27,17 @@ namespace Hotline.Application.Orders.Handles.Snapshot
     {
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
         private readonly IOrderApplication _orderApplication;
+        private readonly ISystemLogRepository _systemLogRepository;
 
         public GuiderSystemTimeoutHandler(
             ISystemSettingCacheManager systemSettingCacheManager,
             IOrderApplication orderApplication
-            )
+,
+            ISystemLogRepository systemLogRepository)
         {
             _systemSettingCacheManager = systemSettingCacheManager;
             _orderApplication = orderApplication;
+            _systemLogRepository = systemLogRepository;
         }
 
         /// <summary>Handles a notification</summary>
@@ -41,13 +45,19 @@ namespace Hotline.Application.Orders.Handles.Snapshot
         /// <param name="cancellationToken">Cancellation token</param>
         public async Task Handle(GuiderSystemTimeOutBackNotification notification, CancellationToken cancellationToken)
         {
-            bool.TryParse(
-                _systemSettingCacheManager.GetSetting(SettingConstants.Snapshot)?.SettingValue[0],
-                out bool isSnapshotEnable);
-            if (isSnapshotEnable)
+            try
             {
-                await _orderApplication.HandleFromWanggeyuanToMaskAsync(notification.OrderId, cancellationToken);
+                if (_systemSettingCacheManager.Snapshot)
+                {
+                    await _orderApplication.HandleFromWanggeyuanToMaskAsync(notification.OrderId, cancellationToken);
+                }
             }
+            catch (Exception e)
+            {
+                _systemLogRepository.Add("网格员超时未回复", notification.OrderId, "方法异常", status: 0, executeResult: e.ToJson());
+                throw;
+            }
+            _systemLogRepository.Add("网格员超时未回复", notification.OrderId, "收到事件", "", 1);
         }
     }
 }

+ 1 - 1
src/Hotline.Application/Snapshot/DefaultSnapshotApplication.cs

@@ -25,7 +25,7 @@ namespace Hotline.Application.Snapshot;
 public class DefaultSnapshotApplication : SnapshotApplicationBase
     , ISnapshotApplication, IScopeDependency
 {
-    public DefaultSnapshotApplication(IThirdIdentiyService thirdLoginService, IRepository<Industry> industryRepository, ISnapshotBulletinRepository bulletinRepository, ISessionContext sessionContext, IRepository<RedPackRecord> redPackRecordRepository, IRepository<Order> orderRepository, IThirdAccountRepository thirdAccountRepository, IOrderSnapshotRepository orderSnapshotRepository, ISystemSettingCacheManager systemSettingCacheManager, ISystemAreaDomainService systemAreaDomainService, IFileRepository fileRepository, ISystemDicDataCacheManager systemDicDataCacheManager, ISnapshotOrderPublishRepository snapshotOrderPublishRepository, IRepository<WorkflowTrace> workflowTraceRepository, IPractitionerRepository practitionerRepository, IRepository<SystemArea> systemAreaRepository, IVolunteerRepository volunteerRepository, IVolunteerReportRepository volunteerReportRepository, ISystemLogRepository systemLog, IGuiderSystemService guiderSystemService, ICapPublisher capPublisher, Publisher publisher, IGuiderInfoRepository guiderInfoRepository, IFileDomainService fileDomainService, ICommunityInfoRepository communityInfoRepository, IRedPackAuditRepository redPackAuditRepository, IOrderVisitRepository orderVisitRepository, IOrderVisitDetailRepository orderVisitDetailRepository, IRedPackGuiderAuditRepository redPackGuiderAuditRepository) : base(thirdLoginService, industryRepository, bulletinRepository, sessionContext, redPackRecordRepository, orderRepository, thirdAccountRepository, orderSnapshotRepository, systemSettingCacheManager, systemAreaDomainService, fileRepository, systemDicDataCacheManager, snapshotOrderPublishRepository, workflowTraceRepository, practitionerRepository, systemAreaRepository, volunteerRepository, volunteerReportRepository, systemLog, guiderSystemService, capPublisher, publisher, guiderInfoRepository, fileDomainService, communityInfoRepository, redPackAuditRepository, orderVisitRepository, orderVisitDetailRepository, redPackGuiderAuditRepository)
+    public DefaultSnapshotApplication(IThirdIdentiyService thirdLoginService, IIndustryRepository industryRepository, ISnapshotBulletinRepository bulletinRepository, ISessionContext sessionContext, IRepository<RedPackRecord> redPackRecordRepository, IRepository<Order> orderRepository, IThirdAccountRepository thirdAccountRepository, IOrderSnapshotRepository orderSnapshotRepository, ISystemSettingCacheManager systemSettingCacheManager, ISystemAreaDomainService systemAreaDomainService, IFileRepository fileRepository, ISystemDicDataCacheManager systemDicDataCacheManager, ISnapshotOrderPublishRepository snapshotOrderPublishRepository, IRepository<WorkflowTrace> workflowTraceRepository, IPractitionerRepository practitionerRepository, IRepository<SystemArea> systemAreaRepository, IVolunteerRepository volunteerRepository, IVolunteerReportRepository volunteerReportRepository, ISystemLogRepository systemLog, IGuiderSystemService guiderSystemService, ICapPublisher capPublisher, Publisher publisher, IGuiderInfoRepository guiderInfoRepository, IFileDomainService fileDomainService, ICommunityInfoRepository communityInfoRepository, IRedPackAuditRepository redPackAuditRepository, IOrderVisitRepository orderVisitRepository, IOrderVisitDetailRepository orderVisitDetailRepository, IRedPackGuiderAuditRepository redPackGuiderAuditRepository) : base(thirdLoginService, industryRepository, bulletinRepository, sessionContext, redPackRecordRepository, orderRepository, thirdAccountRepository, orderSnapshotRepository, systemSettingCacheManager, systemAreaDomainService, fileRepository, systemDicDataCacheManager, snapshotOrderPublishRepository, workflowTraceRepository, practitionerRepository, systemAreaRepository, volunteerRepository, volunteerReportRepository, systemLog, guiderSystemService, capPublisher, publisher, guiderInfoRepository, fileDomainService, communityInfoRepository, redPackAuditRepository, orderVisitRepository, orderVisitDetailRepository, redPackGuiderAuditRepository)
     {
     }
 }

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

@@ -110,4 +110,11 @@ public interface IOrderSnapshotApplication
     /// <param name="dto"></param>
     /// <returns></returns>
     ISugarQueryable<OrderSnapshotItemsOutDto> GetOrderSnapshotItemsAsync(OrderSnapshotItemsInDto dto);
+
+    /// <summary>
+    /// 获取工单已经标记集合
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    ISugarQueryable<SignedOrderSnapshotItemsOutDto> GetSignedOrderSnapshotItemsAsync(SignedOrderSnapshotItemsInDto dto);
 }

+ 6 - 0
src/Hotline.Application/Snapshot/IRedPackApplication.cs

@@ -64,6 +64,12 @@ public interface IRedPackApplication
     /// <returns></returns>
     ISugarQueryable<SnapshotOrderGuiderAuditItemsOutDto> GetRedPackGuiderAuditItemsAsync(SnapshotOrderGuiderAuditItemsInDto dto);
 
+    /// <summary>
+    /// 红包发放明细
+    /// </summary>
+    /// <returns></returns>
+    ISugarQueryable<SnapshotRedPackRecordSendOutDto> GetRedPackRecordDetailAsync(SnapshotRedPackRecordSendInDto dto);
+
     /// <summary>
     /// 网格员红包发放记录
     /// </summary>

+ 33 - 0
src/Hotline.Application/Snapshot/OrderSnapshotApplication.cs

@@ -422,6 +422,9 @@ public class OrderSnapshotApplication : IOrderSnapshotApplication, IScopeDepende
     {
         var query = _orderSnapshotRepository.Queryable()
             .LeftJoin<Order>((snapshot, order) => snapshot.Id == order.Id)
+            .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 
             {
                 CreationTime = order.CreationTime
@@ -429,4 +432,34 @@ public class OrderSnapshotApplication : IOrderSnapshotApplication, IScopeDepende
              , true);
         return query;
     }
+
+    /// <summary>
+    /// 获取工单已经标记集合
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<SignedOrderSnapshotItemsOutDto> GetSignedOrderSnapshotItemsAsync(SignedOrderSnapshotItemsInDto dto)
+    {
+        var query = _orderSnapshotRepository.Queryable()
+            .LeftJoin<Order>((snapshot, order) => order.Id == snapshot.Id)
+            .Where((snapshot, order) => order.Status >= EOrderStatus.Published)
+            .WhereIF(dto.No.NotNullOrEmpty(), (snapshot, order) => order.No.Contains(dto.No))
+            .WhereIF(dto.Title.NotNullOrEmpty(), (snapshot, order) => order.Title.Contains(dto.Title))
+            .WhereIF(dto.FromName.NotNullOrEmpty(), (snapshot, order) => order.FromName.Contains(dto.FromName))
+            .WhereIF(dto.FromPhone.NotNullOrEmpty(), (snapshot, order) => order.FromPhone.Contains(dto.FromPhone))
+            .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
+            { 
+                LabelName = snapshot.LabelName,
+                OrderId = order.Id,
+                SignTime = snapshot.SignTime,
+                SignUserName = snapshot.SignUserName,
+                SourceChannel = order.SourceChannel,
+            }, true);
+
+        return query;
+    }
+
 }

+ 21 - 0
src/Hotline.Application/Snapshot/RedPackApplication.cs

@@ -464,6 +464,27 @@ public class RedPackApplication : IRedPackApplication, IScopeDependency
         return query;
     }
 
+    public ISugarQueryable<SnapshotRedPackRecordSendOutDto> GetRedPackRecordDetailAsync(SnapshotRedPackRecordSendInDto dto)
+    {
+        var query = _redPackRecordRepository.Queryable()
+            .LeftJoin<OrderSnapshot>((m , snapshot) => m.OrderId == snapshot.Id)
+            .LeftJoin<Order>((m , snapshot, order) => m.OrderId == order.Id)
+            .Where(m => m.DistributionState != EReadPackSendStatus.Unsend)
+            .WhereIF(dto.Status == 1, m => m.PickupStatus == ERedPackPickupStatus.Received)
+            .WhereIF(dto.Status == 2, m => m.PickupStatus == ERedPackPickupStatus.Back)
+            .WhereIF(dto.Status == 3, m => m.DistributionState == EReadPackSendStatus.Fail)
+            .WhereIF(dto.Status == 4, m => m.PickupStatus == ERedPackPickupStatus.Unreceived)
+            .WhereIF(dto.IndustryId.NotNullOrEmpty(), (m, snapshot) => snapshot.IndustryId == dto.IndustryId)
+            .WhereIF(dto.No.NotNullOrEmpty(), order => order.No.Contains(dto.No))
+            .WhereIF(dto.UserType.HasValue, m => m.PeopleType == dto.UserType)
+            .WhereIF(dto.OpenId.NotNullOrEmpty(), m => m.WXOpenId == dto.OpenId)
+            .WhereIF(dto.SendStatus.HasValue, m => m.DistributionState == dto.SendStatus)
+            .WhereIF(dto.IsReceive.HasValue && dto.IsReceive == true, m => m.PickupStatus == ERedPackPickupStatus.Received)
+            .WhereIF(dto.IsReceive.HasValue && dto.IsReceive == false, m => m.PickupStatus == ERedPackPickupStatus.Unreceived)
+            .Select(m => new SnapshotRedPackRecordSendOutDto());
+        return query;
+    }
+
 
     #endregion
 }

+ 5 - 3
src/Hotline.Application/Snapshot/SnapshotApplicationBase.cs

@@ -51,7 +51,7 @@ public abstract class SnapshotApplicationBase
     /// <summary>
     /// 行业
     /// </summary>
-    private readonly IRepository<Industry> _industryRepository;
+    private readonly IIndustryRepository _industryRepository;
     private readonly IThirdIdentiyService _thirdLoginService;
     private readonly ISessionContext _sessionContext;
     private readonly IRepository<RedPackRecord> _redPackRecordRepository;
@@ -78,7 +78,7 @@ public abstract class SnapshotApplicationBase
     private readonly IOrderVisitRepository _orderVisitRepository;
     private readonly IOrderVisitDetailRepository _orderVisitDetailRepository;
 
-    public SnapshotApplicationBase(IThirdIdentiyService thirdLoginService, IRepository<Industry> industryRepository, ISnapshotBulletinRepository bulletinRepository, ISessionContext sessionContext, IRepository<RedPackRecord> redPackRecordRepository, IRepository<Order> orderRepository, IThirdAccountRepository thirdAccountRepository, IOrderSnapshotRepository orderSnapshotRepository, ISystemSettingCacheManager systemSettingCacheManager, ISystemAreaDomainService systemAreaDomainService, IFileRepository fileRepository, ISystemDicDataCacheManager systemDicDataCacheManager, ISnapshotOrderPublishRepository snapshotOrderPublishRepository, IRepository<WorkflowTrace> workflowTraceRepository, IPractitionerRepository practitionerRepository, IRepository<SystemArea> systemAreaRepository, IVolunteerRepository volunteerRepository, IVolunteerReportRepository volunteerReportRepository, ISystemLogRepository systemLog, IGuiderSystemService guiderSystemService, ICapPublisher capPublisher, Publisher publisher, IGuiderInfoRepository guiderInfoRepository, IFileDomainService fileDomainService, ICommunityInfoRepository communityInfoRepository, IRedPackAuditRepository redPackAuditRepository, IOrderVisitRepository orderVisitRepository, IOrderVisitDetailRepository orderVisitDetailRepository, IRedPackGuiderAuditRepository redPackGuiderAuditRepository)
+    public SnapshotApplicationBase(IThirdIdentiyService thirdLoginService, IIndustryRepository industryRepository, ISnapshotBulletinRepository bulletinRepository, ISessionContext sessionContext, IRepository<RedPackRecord> redPackRecordRepository, IRepository<Order> orderRepository, IThirdAccountRepository thirdAccountRepository, IOrderSnapshotRepository orderSnapshotRepository, ISystemSettingCacheManager systemSettingCacheManager, ISystemAreaDomainService systemAreaDomainService, IFileRepository fileRepository, ISystemDicDataCacheManager systemDicDataCacheManager, ISnapshotOrderPublishRepository snapshotOrderPublishRepository, IRepository<WorkflowTrace> workflowTraceRepository, IPractitionerRepository practitionerRepository, IRepository<SystemArea> systemAreaRepository, IVolunteerRepository volunteerRepository, IVolunteerReportRepository volunteerReportRepository, ISystemLogRepository systemLog, IGuiderSystemService guiderSystemService, ICapPublisher capPublisher, Publisher publisher, IGuiderInfoRepository guiderInfoRepository, IFileDomainService fileDomainService, ICommunityInfoRepository communityInfoRepository, IRedPackAuditRepository redPackAuditRepository, IOrderVisitRepository orderVisitRepository, IOrderVisitDetailRepository orderVisitDetailRepository, IRedPackGuiderAuditRepository redPackGuiderAuditRepository)
     {
         _thirdLoginService = thirdLoginService;
         _industryRepository = industryRepository;
@@ -564,7 +564,9 @@ public abstract class SnapshotApplicationBase
         _systemLog.Add(LogName, $"OrderNo: {order.No}", status: 1);
         if (result.Code == 0)
         {
-            await _capPublisher.PublishAsync(EventNames.GuiderSystemReplyDelay, new PostGuiderSystemDelayed(order.Id));
+            double intervalTime = await _industryRepository.GetIntervalTimeAsync(orderSnapshot.IndustryId, _sysSetting.OvertimeBack, cancellationToken);
+            _systemLog.Add(LogName, $"OrderNo: {order.No}", $"intervalTime: {intervalTime} overtimeBack: {_sysSetting.OvertimeBack}");
+            await _capPublisher.PublishDelayAsync(TimeSpan.FromHours(intervalTime), EventNames.GuiderSystemReplyDelay, new PostGuiderSystemDelayed(order.Id), cancellationToken: cancellationToken);
         }
     }
 

+ 1 - 1
src/Hotline.Application/Snapshot/ZiGongSnapshotApplication.cs

@@ -24,7 +24,7 @@ namespace Hotline.Application.Snapshot;
 [Injection(AppScopes = EAppScope.ZiGong)]
 public class ZiGongSnapshotApplication : SnapshotApplicationBase, ISnapshotApplication, IScopeDependency
 {
-    public ZiGongSnapshotApplication(IThirdIdentiyService thirdLoginService, IRepository<Industry> industryRepository, ISnapshotBulletinRepository bulletinRepository, ISessionContext sessionContext, IRepository<RedPackRecord> redPackRecordRepository, IRepository<Order> orderRepository, IThirdAccountRepository thirdAccountRepository, IOrderSnapshotRepository orderSnapshotRepository, ISystemSettingCacheManager systemSettingCacheManager, ISystemAreaDomainService systemAreaDomainService, IFileRepository fileRepository, ISystemDicDataCacheManager systemDicDataCacheManager, ISnapshotOrderPublishRepository snapshotOrderPublishRepository, IRepository<WorkflowTrace> workflowTraceRepository, IPractitionerRepository practitionerRepository, IRepository<SystemArea> systemAreaRepository, IVolunteerRepository volunteerRepository, IVolunteerReportRepository volunteerReportRepository, ISystemLogRepository systemLog, IGuiderSystemService guiderSystemService, ICapPublisher capPublisher, Publisher publisher, IGuiderInfoRepository guiderInfoRepository, IFileDomainService fileDomainService, ICommunityInfoRepository communityInfoRepository, IRedPackAuditRepository redPackAuditRepository, IOrderVisitRepository orderVisitRepository, IOrderVisitDetailRepository orderVisitDetailRepository, IRedPackGuiderAuditRepository redPackGuiderAuditRepository) : base(thirdLoginService, industryRepository, bulletinRepository, sessionContext, redPackRecordRepository, orderRepository, thirdAccountRepository, orderSnapshotRepository, systemSettingCacheManager, systemAreaDomainService, fileRepository, systemDicDataCacheManager, snapshotOrderPublishRepository, workflowTraceRepository, practitionerRepository, systemAreaRepository, volunteerRepository, volunteerReportRepository, systemLog, guiderSystemService, capPublisher, publisher, guiderInfoRepository, fileDomainService, communityInfoRepository, redPackAuditRepository, orderVisitRepository, orderVisitDetailRepository, redPackGuiderAuditRepository)
+    public ZiGongSnapshotApplication(IThirdIdentiyService thirdLoginService, IIndustryRepository industryRepository, ISnapshotBulletinRepository bulletinRepository, ISessionContext sessionContext, IRepository<RedPackRecord> redPackRecordRepository, IRepository<Order> orderRepository, IThirdAccountRepository thirdAccountRepository, IOrderSnapshotRepository orderSnapshotRepository, ISystemSettingCacheManager systemSettingCacheManager, ISystemAreaDomainService systemAreaDomainService, IFileRepository fileRepository, ISystemDicDataCacheManager systemDicDataCacheManager, ISnapshotOrderPublishRepository snapshotOrderPublishRepository, IRepository<WorkflowTrace> workflowTraceRepository, IPractitionerRepository practitionerRepository, IRepository<SystemArea> systemAreaRepository, IVolunteerRepository volunteerRepository, IVolunteerReportRepository volunteerReportRepository, ISystemLogRepository systemLog, IGuiderSystemService guiderSystemService, ICapPublisher capPublisher, Publisher publisher, IGuiderInfoRepository guiderInfoRepository, IFileDomainService fileDomainService, ICommunityInfoRepository communityInfoRepository, IRedPackAuditRepository redPackAuditRepository, IOrderVisitRepository orderVisitRepository, IOrderVisitDetailRepository orderVisitDetailRepository, IRedPackGuiderAuditRepository redPackGuiderAuditRepository) : base(thirdLoginService, industryRepository, bulletinRepository, sessionContext, redPackRecordRepository, orderRepository, thirdAccountRepository, orderSnapshotRepository, systemSettingCacheManager, systemAreaDomainService, fileRepository, systemDicDataCacheManager, snapshotOrderPublishRepository, workflowTraceRepository, practitionerRepository, systemAreaRepository, volunteerRepository, volunteerReportRepository, systemLog, guiderSystemService, capPublisher, publisher, guiderInfoRepository, fileDomainService, communityInfoRepository, redPackAuditRepository, orderVisitRepository, orderVisitDetailRepository, redPackGuiderAuditRepository)
     {
     }
 }

+ 2 - 2
src/Hotline.Application/StatisticalReport/OrderReportApplication.cs

@@ -1654,7 +1654,7 @@ namespace Hotline.Application.StatisticalReport
 
             var centerOrgName = _systemSettingCacheManager.GetSetting(SettingConstants.CenterOrgName)?.SettingValue[0];
             var orderData = _orderRepository.Queryable()
-              .Where(it => it.CreationTime >= dto.StartTime && it.CreationTime <= dto.EndTime && it.Status >= EOrderStatus.Filed)
+              .Where(it => it.FiledTime >= dto.StartTime && it.FiledTime <= dto.EndTime && it.Status >= EOrderStatus.Filed)
             .WhereIF(dto.TypeId != null && dto.TypeId == 1, it => it.IdentityType == EIdentityType.Citizen)
             .WhereIF(dto.TypeId != null && dto.TypeId == 2, it => it.IdentityType == EIdentityType.Enterprise)
               .Select(it => new
@@ -1728,7 +1728,7 @@ namespace Hotline.Application.StatisticalReport
         public ISugarQueryable<Order> DepartmentAcceptanceTypeOrderList(DepartmentKeyWordRequest dto)
         {
             return _orderRepository.Queryable()
-                 .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime && p.Status >= EOrderStatus.Filed)
+                 .Where(p => p.FiledTime >= dto.StartTime && p.FiledTime <= dto.EndTime && p.Status >= EOrderStatus.Filed)
                  .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode == "001", p => p.ActualHandleOrgCode == dto.OrgCode)
                  .WhereIF(dto.TypeId != null && dto.TypeId == 1, p => p.IdentityType == EIdentityType.Citizen)
                  .WhereIF(dto.TypeId != null && dto.TypeId == 2, p => p.IdentityType == EIdentityType.Enterprise)

+ 8 - 0
src/Hotline.Repository.SqlSugar/Snapshot/IndustryRepository.cs

@@ -16,4 +16,12 @@ public class IndustryRepository : BaseRepository<Industry>, IIndustryRepository,
     public IndustryRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
     {
     }
+
+    public async Task<double> GetIntervalTimeAsync(string industryId, double defaultValue,  CancellationToken cancellationToken)
+    {
+        var time = await Queryable().Where(m => m.Id == industryId).Select(m => m.IntervalTime).FirstAsync(cancellationToken);
+        if (time <= 0)
+            return defaultValue;
+        return time;
+    }
 }

+ 2 - 1
src/Hotline.Repository.SqlSugar/System/SystemLogRepository.cs

@@ -18,7 +18,7 @@ public class SystemLogRepository : BaseRepository<SystemLog>, ISystemLogReposito
     {
     }
 
-    public void Add(string name, string executeParam = "", string remark = "", [CallerMemberName]string executeUrl = "", int status = 0, string ipUrl = "")
+    public void Add(string name, string executeParam = "", string remark = "", [CallerMemberName]string executeUrl = "", int status = 0, string ipUrl = "", string executeResult = "")
     {
         try
         {
@@ -26,6 +26,7 @@ public class SystemLogRepository : BaseRepository<SystemLog>, ISystemLogReposito
             {
                 Name = name,
                 ExecuteParam = executeParam,
+                ExecuteResult = executeResult,
                 ExecuteUrl = executeUrl,
                 Remark = remark,
                 Status = status,

+ 119 - 2
src/Hotline.Share/Dtos/Snapshot/OrderDto.cs

@@ -981,6 +981,118 @@ public class GuiderReplyItemsOutDto
     public string? NetworkENumber { get; set; }
 }
 
+public record SignedOrderSnapshotItemsInDto : PagedRequest
+{
+    /// <summary>
+    /// 受理编号
+    /// </summary>
+    public string? No { get; set; }
+
+    /// <summary>
+    /// 标题
+    /// </summary>
+    public string? Title { get; set; }
+
+    /// <summary>
+    /// 来电人
+    /// </summary>
+    public string? FromName { get; set; }
+
+    /// <summary>
+    /// 来电人电话
+    /// </summary>
+    public string? FromPhone { get; set; }
+
+    /// <summary>
+    /// 标注类型
+    /// </summary>
+    public string? Label { get; set; }
+
+    /// <summary>
+    /// 标注开始时间
+    /// </summary>
+    public DateTime? BeginSignTime { get; set; }
+
+    /// <summary>
+    /// 标注结束时间
+    /// </summary>
+    public DateTime? EndSignTime { get; set; }
+}
+
+
+public class SignedOrderSnapshotItemsOutDto
+{
+    /// <summary>
+    /// Id
+    /// </summary>
+    public string OrderId { get; set; }
+
+    /// <summary>
+    /// 受理编号
+    /// </summary>
+    public string No { get; set; }
+
+    /// <summary>
+    /// 信件状态
+    /// </summary>
+    public EOrderStatus Status { get; set; }
+
+    /// <summary>
+    /// 信件状态
+    /// </summary>
+    public string StatusTxt => Status.GetDescription();
+
+    /// <summary>
+    /// 来源
+    /// </summary>
+    public string SourceChannel { get; set; }
+
+    /// <summary>
+    /// 标题
+    /// </summary>
+    public string Title { get; set; }
+
+    /// <summary>
+    /// 来电人姓名
+    /// </summary>
+    public string FromName { get; set; }
+
+    /// <summary>
+    /// 来电人电话
+    /// </summary>
+    public string FromPhone { get; set; }
+
+    /// <summary>
+    /// 区域
+    /// </summary>
+    public string County { get; set; }
+
+    /// <summary>
+    /// 行业
+    /// </summary>
+    public string IndustryName { get; set; }
+
+    /// <summary>
+    /// 受理时间
+    /// </summary>
+    public DateTime CreationTime { get; set; }
+
+    /// <summary>
+    /// 标注人
+    /// </summary>
+    public string? SignUserName { get; set; }
+
+    /// <summary>
+    /// 标注类型
+    /// </summary>
+    public string LabelName { get; set; }
+
+    /// <summary>
+    /// 标记时间
+    /// </summary>
+    public DateTime? SignTime { get; set; }
+}
+
 public record SignOrderSnapshotItemsInDto : PagedRequest
 {
     /// <summary>
@@ -1851,12 +1963,17 @@ public class SignOrderSnapshotDetailOutDto
     public string Id { get; set; }
 
     /// <summary>
-    /// 标签
+    /// 已选中的标签
     /// </summary>
-    public IReadOnlyCollection<SystemDicDataOutDto> Lables { get; set; }
+    public IList<Kv> Lables { get; set; }
 
     /// <summary>
     /// 标题
     /// </summary>
     public string Title { get; set; }
+
+    /// <summary>
+    /// 基础数据
+    /// </summary>
+    public IReadOnlyCollection<SystemDicDataOutDto> LabelsBaseData { get; set; }
 }

+ 51 - 0
src/Hotline.Share/Dtos/Snapshot/RedPackRecordDto.cs

@@ -12,6 +12,57 @@ internal class RedPackRecordDto
 {
 }
 
+public class SnapshotRedPackRecordSendOutDto
+{ }
+
+public record SnapshotRedPackRecordSendInDto : PagedRequest
+{
+    /// <summary>
+    /// 状态;
+    /// 0: 全部;
+    /// 1: 已领取;
+    /// 2: 已退款;
+    /// 3: 发放失败;
+    /// 4: 待领取;
+    /// </summary>
+    public int Status { get; set; }
+
+    /// <summary>
+    /// 行业
+    /// </summary>
+    public string? IndustryId { get; set; }
+
+    /// <summary>
+    /// 编号
+    /// </summary>
+    public string? No { get; set; }
+
+    /// <summary>
+    /// 发放用户类型
+    /// </summary>
+    public EReadPackUserType? UserType { get; set; }
+
+    /// <summary>
+    /// 用户OpenId
+    /// </summary>
+    public string? OpenId { get; set; }
+
+    /// <summary>
+    /// 发送状态
+    /// </summary>
+    public EReadPackSendStatus? SendStatus { get; set; }
+
+    /// <summary>
+    /// 是否领取
+    /// </summary>
+    public bool? IsReceive { get; set; }
+
+    /// <summary>
+    /// 是否补领
+    /// </summary>
+    public bool? IsReplace { get; set; }
+}
+
 public record SnapshotRedPackRecordItemsGuiderInDto : SnapshotRedPackRecordItemsInDto
 {
     /// <summary>

+ 2 - 0
src/Hotline/Ai/Quality/IAiQualityService.cs

@@ -15,5 +15,7 @@ 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);
 	}
 }

+ 1 - 1
src/Hotline/Caching/Interfaces/ISystemSettingCacheManager.cs

@@ -87,7 +87,7 @@ namespace Hotline.Caching.Interfaces
         /// 网格员回复等待时间(单位:小时)
         /// 超过该时间自动退回工单
         /// </summary>
-        int OvertimeBack { get; }
+        double OvertimeBack { get; }
 
         /// <summary>
         /// 天阙服务AppKey|AppSecret

+ 2 - 2
src/Hotline/Caching/Services/SystemSettingCacheManager.cs

@@ -179,8 +179,8 @@ namespace Hotline.Caching.Services
         /// 网格员回复等待时间(单位:小时)
         /// 超过该时间自动退回工单
         /// </summary>
-        public int OvertimeBack =>
-            GetOrDefault("08dd18e0-1c9e-4aa5-8dc6-f639e8d1b3ea", SettingConstants.OvertimeBack, "网格员回复等待时间(单元小时)", 4, "网格员回复等待时间(单位:小时), 超过该时间自动退回工单");
+        public double OvertimeBack =>
+            GetOrDefault("08dd18e0-1c9e-4aa5-8dc6-f639e8d1b3ea", SettingConstants.OvertimeBack, "网格员回复等待时间(单元小时)", 4d, "网格员回复等待时间(单位:小时), 超过该时间自动退回工单");
 
         /// <summary>
         /// 天阙服务AppKey|AppSecret

+ 2 - 1
src/Hotline/Configurations/AppConfiguration.cs

@@ -41,7 +41,8 @@ namespace Hotline.Configurations
 
     public class ZiGongConfiguration : DefaultAppScopeConfiguration
     {
-    }
+		public AiQualityConfiguration AiQuality { get; set; }
+	}
 
     public class LuZhouConfiguration : DefaultAppScopeConfiguration
     {

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

@@ -18,5 +18,5 @@ public interface ISystemLogRepository : IRepository<SystemLog>
     /// <param name="remark">备注</param>
     /// <param name="status">状态(0失败 1成功)</param>
     /// <returns></returns>
-    void Add(string name, string executeParam = "", string remark = "", [CallerMemberName]string executeUrl = "", int status = 0, string ipUrl = "");
+    void Add(string name, string executeParam = "", string remark = "", [CallerMemberName]string executeUrl = "", int status = 0, string ipUrl = "", string executeResult = "");
 }

+ 1 - 0
src/Hotline/Snapshot/Interfaces/IIndustryRepository.cs

@@ -9,4 +9,5 @@ using XF.Domain.Repository;
 namespace Hotline.Snapshot.Interfaces;
 public interface IIndustryRepository : IRepository<Industry>
 {
+    Task<double> GetIntervalTimeAsync(string industryId, double defaultValue, CancellationToken cancellationToken);
 }

+ 18 - 10
src/TianQue.Sdk/TiqnQueService.cs

@@ -38,12 +38,17 @@ public class TiqnQueService : IGuiderSystemService, IScopeDependency
     /// <returns></returns>
     public async Task<ApiResponse<GuiderSystemOutDto>> PostOrder(Order order, OrderSnapshot orderSnapshot, ThirdTokenDto tokenDto)
     {
+        var baseUrl = _sysSetting.TianQuanPostAcceptInfoApi;
         TQHttpClient httpClient;
-#if DEBUG
-         httpClient = new TQHttpClient(tokenDto.Secret, tokenDto.AppId, "171.94.154.2", 22, "root" , "ZGbyy@2024!", _logger);
-#else
-         httpClient = new TQHttpClient(tokenDto.Secret, tokenDto.AppId, _logger);
-#endif
+        var isDbueg = baseUrl.Contains("test");
+        if (isDbueg)
+        {
+            httpClient = new TQHttpClient(tokenDto.Secret, tokenDto.AppId, "171.94.154.2", 22, "root", "ZGbyy@2024!", _logger);
+        }
+        else
+        {
+            httpClient = new TQHttpClient(tokenDto.Secret, tokenDto.AppId, _logger);
+        }
         var acceptInfo = order.Adapt<AcceptInfo>();
         acceptInfo.ReplyCode = order.No!; // 唯一标识
         acceptInfo.TypeName = order.AcceptType!; // 诉求类型名称
@@ -56,11 +61,14 @@ public class TiqnQueService : IGuiderSystemService, IScopeDependency
         acceptInfo.RootCategoryInfo = ""; // order.HotspotName!; // 热点分类(大类)
         acceptInfo.CategoryInfo = "";// order.HotspotSpliceName!; // 热点分类(小类)
         acceptInfo.DeadLine = orderSnapshot.DeadLine!.Value; // 截止时间
-#if DEBUG
-        acceptInfo.Prod = false; // 正式/测试
-#else
-        acceptInfo.Prod = true; // 正式/测试
-#endif
+        if(isDbueg)
+        {
+            acceptInfo.Prod = false; // 正式/测试
+        }
+        else
+        {
+            acceptInfo.Prod = true; // 正式/测试
+        }
 
         // 反映人信息
         acceptInfo.PersonList = new List<PersonInfo>