Jelajahi Sumber

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

田爽 8 bulan lalu
induk
melakukan
3d94db6ecf

+ 56 - 55
src/Hotline.Api/Controllers/TestController.cs

@@ -220,6 +220,62 @@ ICallApplication callApplication,
     }
 
 
+    [HttpGet("time")]
+    [AllowAnonymous]
+    public async Task<OpenResponse> GetTime(string batchId, string taskId)
+    {
+        //await _repositoryts.AddVectorAsync("f595e730-909a-45e4-9138-a84bf15f4662", DateTime.Now,
+        //    new List<string> { "xx", "bb" }, HttpContext.RequestAborted);
+
+        //await _repositoryts.AddVectorAsync("f595e730-909a-45e4-9138-a84bf15f4663", DateTime.Now,
+        //    new List<string> { "aa", "bb", "cc" }, HttpContext.RequestAborted);
+
+        var result0 = await _repositoryts.SearchAsync(new List<string> { "xx", "aa" }, HttpContext.RequestAborted);
+        var result = await _repositoryts.SearchAsync(new List<string> { "bb" }, HttpContext.RequestAborted);
+        var result1 = await _repositoryts.SearchAsync(new List<string> { "cc", "bb" }, HttpContext.RequestAborted);
+        var result2 = await _repositoryts.SearchAsync(new List<string> { "cc", "xx" }, HttpContext.RequestAborted);
+        var result3 = await _repositoryts.SearchAsync(new List<string> { "aa", "bb", "ss" }, HttpContext.RequestAborted);
+
+
+        //await _orderDomainService.SendOverTimeSms(HttpContext.RequestAborted);
+        //await _repositoryts.UpdateVectorAsync("f595e730-909a-45e4-9138-a84bf15f4662",
+        //    new List<string> { "ss", "bb" }, HttpContext.RequestAborted);
+
+        //_uow.Db.Ado.SqlQueryAsync<OrderUrge>("SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat')")
+
+        //var tests = _uowWex.Db.Ado.SqlQuery<Test>("select * from view_telinfo_full where IsSynch=@IsSynch", new { IsSynch = 0 });
+        //var a = _uowWex.Db.Ado.ExecuteCommand("update telinfo set IsSynch=1 where GUID=@CallId", new { CallId = "b1f97f3c-88b6-4f42-b8de-83ed448854b0" });
+        //var rsp = await _wexClient.QueryTelsAsync(new QueryTelRequest {  }, HttpContext.RequestAborted);
+
+        //int a = _timeLimitDomainService.CalcWorkTime(DateTime.Now, DateTime.Parse("2023-09-11 16:21:00"));
+        //int m = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2023-09-19 12:00:00"), DateTime.Parse("2023-09-20 18:00:00"), false);
+        //var r = _timeLimitDomainService.CalcEndTime(DateTime.Parse("2024-6-06 14:32:47"),"40");
+        //var r = _timeLimitDomainService.CalcExpiredTime(DateTime.Parse("2024-02-29 10:12:33"), Share.Enums.FlowEngine.EFlowDirection.OrgToCenter, "10");
+        //await _wfModuleDomainService.PersistenceModulesAsync(HttpContext.RequestAborted);
+
+        //var rsp = await _daprClient.InvokeMethodAsync<ApiResponse<string>>(HttpMethod.Get, "identity", "api/v1/Test/time", HttpContext.RequestAborted);
+        //var rsp1 = await _daprClient.InvokeMethodAsync<int, ApiResponse<string>>(HttpMethod.Post, "identity", "api/v1/Test/time1", 222, HttpContext.RequestAborted);
+        //var a = await _trClient.QueryTelsAsync(new Tr.Sdk.Tels.QueryTelRequest() { }, HttpContext.RequestAborted);
+        //await _daySettingRepository.IsWorkDay(DateTime.Now);
+
+        //var r = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2024-6-06 14:32:47"), DateTime.Parse("2024-3-22 06:00:00"), false);
+        //var r = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2024-3-24 17:20:00"), DateTime.Parse("2024-3-24 17:21:00"), false);
+        //await _aiVisitService.QueryAiVisitTask(batchId, taskId, HttpContext.RequestAborted);
+        //var r = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
+        //var r = _timeLimitDomainService.CalcWorkTimeToDecimal(DateTime.Parse("2024-07-09 14:57:51"), DateTime.Parse("2024-07-10 14:20:42"), false);
+        //var endTime = _timeLimitDomainService
+        //.CalcEndTime(DateTime.Parse("2024-07-09 14:57:51"), ETimeType.WorkDay, -3, 0, 0);///.EndTime;
+        //var timeResult = _timeLimitDomainService.CalcEndTime(DateTime.Now, ETimeType.WorkDay, 3, 80, 50);
+        //var t = _timeLimitDomainService.CalcWorkTimeEx(DateTime.Parse("2024-07-22 11:30:00"), DateTime.Parse("2024-07-23 14:00:00"), false);
+        //var r = await _aiVisitService.QueryAiVisitTaskEx("MTAwMDAx173ASS0kSUAqK2rl2sFGME", "", HttpContext.RequestAborted);
+        //var r = await _aiVisitService.QueryAiVisitTaskResult(batchId, DateTime.Parse("2024-07-28"), DateTime.Parse("2024-08-01"), HttpContext.RequestAborted);
+
+        //var r = _timeLimitDomainService.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToCenter, batchId);
+
+        return OpenResponse.Ok(DateTime.Now.ToString("F"));
+    }
+
+
     /// <summary>
     /// 推送回访到省上
     /// </summary>
@@ -512,61 +568,6 @@ ICallApplication callApplication,
     }
 
 
-
-    [HttpGet("time")]
-    [AllowAnonymous]
-    public async Task<OpenResponse> GetTime(string batchId, string taskId)
-    {
-        //await _repositoryts.AddVectorAsync("f595e730-909a-45e4-9138-a84bf15f4662", DateTime.Now,
-        //    new List<string> { "xx", "bb" }, HttpContext.RequestAborted);
-
-        //await _repositoryts.AddVectorAsync("f595e730-909a-45e4-9138-a84bf15f4663", DateTime.Now,
-        //    new List<string> { "aa", "bb", "cc" }, HttpContext.RequestAborted);
-
-        var result0 = await _repositoryts.SearchAsync(new List<string> { "xx", "aa" }, HttpContext.RequestAborted);
-        var result = await _repositoryts.SearchAsync(new List<string> { "bb" }, HttpContext.RequestAborted);
-        var result1 = await _repositoryts.SearchAsync(new List<string> { "cc", "bb" }, HttpContext.RequestAborted);
-        var result2 = await _repositoryts.SearchAsync(new List<string> { "cc", "xx" }, HttpContext.RequestAborted);
-        var result3 = await _repositoryts.SearchAsync(new List<string> { "aa", "bb", "ss" }, HttpContext.RequestAborted);
-
-        //await _repositoryts.UpdateVectorAsync("f595e730-909a-45e4-9138-a84bf15f4662",
-        //    new List<string> { "ss", "bb" }, HttpContext.RequestAborted);
-
-        //_uow.Db.Ado.SqlQueryAsync<OrderUrge>("SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat')")
-
-        //var tests = _uowWex.Db.Ado.SqlQuery<Test>("select * from view_telinfo_full where IsSynch=@IsSynch", new { IsSynch = 0 });
-        //var a = _uowWex.Db.Ado.ExecuteCommand("update telinfo set IsSynch=1 where GUID=@CallId", new { CallId = "b1f97f3c-88b6-4f42-b8de-83ed448854b0" });
-        //var rsp = await _wexClient.QueryTelsAsync(new QueryTelRequest {  }, HttpContext.RequestAborted);
-
-        //int a = _timeLimitDomainService.CalcWorkTime(DateTime.Now, DateTime.Parse("2023-09-11 16:21:00"));
-        //int m = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2023-09-19 12:00:00"), DateTime.Parse("2023-09-20 18:00:00"), false);
-        //var r = _timeLimitDomainService.CalcEndTime(DateTime.Parse("2024-6-06 14:32:47"),"40");
-        //var r = _timeLimitDomainService.CalcExpiredTime(DateTime.Parse("2024-02-29 10:12:33"), Share.Enums.FlowEngine.EFlowDirection.OrgToCenter, "10");
-        //await _wfModuleDomainService.PersistenceModulesAsync(HttpContext.RequestAborted);
-
-        //var rsp = await _daprClient.InvokeMethodAsync<ApiResponse<string>>(HttpMethod.Get, "identity", "api/v1/Test/time", HttpContext.RequestAborted);
-        //var rsp1 = await _daprClient.InvokeMethodAsync<int, ApiResponse<string>>(HttpMethod.Post, "identity", "api/v1/Test/time1", 222, HttpContext.RequestAborted);
-        //var a = await _trClient.QueryTelsAsync(new Tr.Sdk.Tels.QueryTelRequest() { }, HttpContext.RequestAborted);
-        //await _daySettingRepository.IsWorkDay(DateTime.Now);
-
-        //var r = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2024-6-06 14:32:47"), DateTime.Parse("2024-3-22 06:00:00"), false);
-        //var r = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2024-3-24 17:20:00"), DateTime.Parse("2024-3-24 17:21:00"), false);
-        //await _aiVisitService.QueryAiVisitTask(batchId, taskId, HttpContext.RequestAborted);
-        //var r = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
-        //var r = _timeLimitDomainService.CalcWorkTimeToDecimal(DateTime.Parse("2024-07-09 14:57:51"), DateTime.Parse("2024-07-10 14:20:42"), false);
-        //var endTime = _timeLimitDomainService
-        //.CalcEndTime(DateTime.Parse("2024-07-09 14:57:51"), ETimeType.WorkDay, -3, 0, 0);///.EndTime;
-        //var timeResult = _timeLimitDomainService.CalcEndTime(DateTime.Now, ETimeType.WorkDay, 3, 80, 50);
-        //var t = _timeLimitDomainService.CalcWorkTimeEx(DateTime.Parse("2024-07-22 11:30:00"), DateTime.Parse("2024-07-23 14:00:00"), false);
-        //var r = await _aiVisitService.QueryAiVisitTaskEx("MTAwMDAx173ASS0kSUAqK2rl2sFGME", "", HttpContext.RequestAborted);
-        //var r = await _aiVisitService.QueryAiVisitTaskResult(batchId, DateTime.Parse("2024-07-28"), DateTime.Parse("2024-08-01"), HttpContext.RequestAborted);
-
-        //var r = _timeLimitDomainService.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToCenter, batchId);
-        //_capPublisher.PublishDelay(DateTime.Now.AddSeconds(10) - DateTime.Now, EventNames.HotlineBatchSmsTask, new PublishBatchSmsTaskDto() { TaskId = "123123" });
-
-        return OpenResponse.Ok(DateTime.Now.ToString("F"));
-    }
-
     [HttpGet("pgsql")]
     public async Task<string> Pgsql()
     {

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

@@ -175,7 +175,7 @@ internal static class StartupExtensions
         services.AddMq(configuration);
 
         //job
-        services.RegisterJob(callcenterType);
+        services.RegisterJob(appConfiguration);
 
         services.AddSingleton<IAuthorizationPolicyProvider, AuthorizationPolicyProvider>();
         services.AddSingleton<IAuthorizationHandler, PermissionHandler>();

+ 27 - 2
src/Hotline.Api/StartupHelper.cs

@@ -246,7 +246,7 @@ namespace Hotline.Api
             return services;
         }
 
-        public static IServiceCollection RegisterJob(this IServiceCollection services, string callcenterType)
+        public static IServiceCollection RegisterJob(this IServiceCollection services,AppConfiguration appConfiguration )
         {
             services.AddQuartz(d =>
             {
@@ -265,7 +265,32 @@ namespace Hotline.Api
                     .WithCronSchedule("0 10 9 * * ?")
                 );
 
-                switch (callcenterType)
+                //即将超期和超期短信
+                var autoSendOverTimeSmsKey = new JobKey(nameof(SendOverTimeSmsJob), "send overtime order task");
+                d.AddJob<SendOverTimeSmsJob>(autoSendOverTimeSmsKey);
+                d.AddTrigger(t => t
+                    .WithIdentity("task-send-overtime-order-trigger")
+                    .ForJob(autoSendOverTimeSmsKey)
+                    .StartNow()
+                    .WithCronSchedule("0 10 11,14 * * ?"));
+
+                switch (appConfiguration.AppScope)
+                {
+                    //智能化任务
+                    case AppDefaults.AppScope.YiBin:
+                        var aiVisitStatusKey = new JobKey(nameof(CheckAiVisitStateJob), "check aivisit state task");
+                        d.AddJob<CheckAiVisitStateJob>(aiVisitStatusKey);
+                        d.AddTrigger(t => t
+                        .WithIdentity("task-check-aivisit-state-trigger")
+                        .ForJob(aiVisitStatusKey)
+                        .StartNow()
+                        .WithCronSchedule("0 0/5 * * * ? *"));
+                        break;
+                    default:
+                        break;
+                }
+
+                switch (appConfiguration.GetDefaultAppScopeConfiguration().CallCenterType)
                 {
                     case AppDefaults.CallCenterType.XingTang:
                         var getCallsJobKey = new JobKey(nameof(XingTangCallsSyncJob));

+ 1 - 1
src/Hotline.Api/config/appsettings.Development.json

@@ -1,7 +1,7 @@
 {
   "AllowedHosts": "*",
   "AppConfiguration": {
-    "AppScope": "ZiGong",
+    "AppScope": "YiBin",
     "YiBin": {
       "CallCenterType": "TianRun", //XunShi、WeiErXin、TianRun、XingTang
       //智能回访

+ 29 - 0
src/Hotline.Application/Jobs/CheckAiVisitStateJob.cs

@@ -0,0 +1,29 @@
+using Hotline.Orders;
+using Quartz;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Application.Jobs
+{
+    public class CheckAiVisitStateJob : IJob, IDisposable
+    {
+        private readonly IAiVisitDomainService _aiVisitDomainService;
+        public CheckAiVisitStateJob(IAiVisitDomainService aiVisitDomainService)
+        {
+                _aiVisitDomainService = aiVisitDomainService;
+        }
+        public void Dispose()
+        {
+            
+        }
+
+        public async Task Execute(IJobExecutionContext context)
+        {
+            Console.WriteLine($"{nameof(SendOrderJob)} 执行, {DateTime.Now}");
+            await _aiVisitDomainService.OrderVisitStatusService(context.CancellationToken);
+        }
+    }
+}

+ 32 - 0
src/Hotline.Application/Jobs/SendOverTimeSmsJob.cs

@@ -0,0 +1,32 @@
+using Hotline.Orders;
+using Quartz;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Application.Jobs
+{
+    public class SendOverTimeSmsJob : IJob, IDisposable
+    {
+        private readonly IOrderDomainService _orderDomainService;
+
+        public SendOverTimeSmsJob(IOrderDomainService orderDomainService)
+        {
+            _orderDomainService = orderDomainService;
+        }
+
+
+        public void Dispose()
+        {
+            
+        }
+
+        public async Task Execute(IJobExecutionContext context)
+        {
+            Console.WriteLine($"{nameof(SendOrderJob)} 执行, {DateTime.Now}");
+            await _orderDomainService.SendOverTimeSms(context.CancellationToken);
+        }
+    }
+}

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

@@ -1067,4 +1067,13 @@ namespace Hotline.Share.Dtos.Order
     {
         public string OrderId { get; set; }
     }
+
+    public class OverTimeOrderDto
+    {
+        public string OrgId { get; set; }
+
+        public int NearlyOrderCount { get; set; }
+
+        public int ExpiredTimeOrderCount { get; set; }
+    }
 }

+ 67 - 0
src/Hotline/Orders/AiVisitDomainService.cs

@@ -0,0 +1,67 @@
+using Hotline.Ai.Visit;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Dependency;
+using XF.Domain.Repository;
+
+namespace Hotline.Orders
+{
+    public class AiVisitDomainService : IAiVisitDomainService, IScopeDependency
+    {
+        private readonly IAiVisitService _aiVisitService;
+        private readonly IRepository<AiOrderVisit> _aiOrderVisitRepository;
+        private readonly IRepository<AiOrderVisitDetail> _aiOrderVisitDetailRepository;
+        private readonly IRepository<OrderVisit> _orderVisitRepository;
+
+        public AiVisitDomainService(IAiVisitService aiVisitService,IRepository<AiOrderVisit> aiOrderVisitRepository, IRepository<AiOrderVisitDetail> aiOrderVisitDetailRepository, IRepository<OrderVisit> orderVisitRepository)
+        {
+            _aiVisitService = aiVisitService;
+            _aiOrderVisitRepository = aiOrderVisitRepository;
+            _aiOrderVisitDetailRepository = aiOrderVisitDetailRepository;
+            _orderVisitRepository = orderVisitRepository;
+        }
+
+
+        public async Task OrderVisitStatusService(CancellationToken cancellationToken)
+        {
+            try
+            {
+                var aivisitList = await _aiOrderVisitRepository.Queryable()
+                .Includes(x => x.AiOrderVisitDetails, d => d.OrderVisit).Where(x => x.TaskState == Share.Enums.Ai.EAiOrderVisitTaskState.InProgress).ToListAsync();
+                if (aivisitList != null)
+                {
+                    foreach (var aivisit in aivisitList)
+                    {
+                        foreach (var aivisitDetail in aivisit.AiOrderVisitDetails)
+                        {
+                            if (!string.IsNullOrEmpty(aivisit.BatchUid) && !string.IsNullOrEmpty(aivisitDetail.TaskUid))
+                            {
+                                var res = await _aiVisitService.QueryAiVisitTask(aivisit.BatchUid, aivisitDetail.TaskUid, cancellationToken);
+                                if (res != null && res.Status == 4)
+                                {
+                                    aivisitDetail.AiOrderVisitState = Share.Enums.Ai.EAiOrderVisitState.LoseEfficacy;
+                                    await _aiOrderVisitDetailRepository.UpdateAsync(aivisitDetail, cancellationToken);
+                                    aivisitDetail.OrderVisit.VisitState = Share.Enums.Order.EVisitState.WaitForVisit;
+                                    aivisitDetail.OrderVisit.IsCanAiVisit = true;
+                                    await _orderVisitRepository.UpdateAsync(aivisitDetail.OrderVisit, cancellationToken);
+                                    aivisit.VisitedFailCount++;
+                                    if ((aivisit.VisitedFailCount + aivisit.VisitedCount) == aivisit.HasVisitCount)
+                                    {
+                                        aivisit.TaskState = Share.Enums.Ai.EAiOrderVisitTaskState.Ended;
+                                    }
+                                    await _aiOrderVisitRepository.UpdateAsync(aivisit, cancellationToken);
+                                }
+                            }
+
+                        }
+                    }
+                }
+
+            }
+            catch { }
+        }
+    }
+}

+ 13 - 0
src/Hotline/Orders/IAiVisitDomainService.cs

@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Orders
+{
+    public interface IAiVisitDomainService
+    {
+        Task OrderVisitStatusService(CancellationToken cancellationToken);
+    }
+}

+ 7 - 0
src/Hotline/Orders/IOrderDomainService.cs

@@ -97,5 +97,12 @@ namespace Hotline.Orders
         /// <returns></returns>
         bool IsCheckAdmin();
 
+        /// <summary>
+        /// 推送即将超期和超期短信
+        /// </summary>
+        /// <returns></returns>
+        Task SendOverTimeSms(CancellationToken cancellationToken);
+
+
     }
 }

+ 57 - 1
src/Hotline/Orders/OrderDomainService.cs

@@ -20,6 +20,10 @@ using Hotline.Settings.Hotspots;
 using Hotline.Share.Dtos.FlowEngine;
 using Microsoft.AspNetCore.Http;
 using Hotline.Settings;
+using SqlSugar;
+using Hotline.Push.Notifies;
+using Hotline.Share.Enums.Push;
+using MediatR;
 
 namespace Hotline.Orders;
 
@@ -42,6 +46,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     private readonly ISystemSettingCacheManager _systemSettingCacheManager;
     private readonly IWorkflowDomainService _workflowDomainService;
     private readonly IRepository<Hotspot> _hotspotRepository;
+    private readonly IMediator _mediator;
 
 
     public OrderDomainService(
@@ -62,7 +67,8 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         ISystemSettingCacheManager systemSettingCacheManager,
         IRepository<Scheduling> schedulingRepository,
         IWorkflowDomainService workflowDomainService,
-        IRepository<Hotspot> hotspotRepository)
+        IRepository<Hotspot> hotspotRepository,
+        IMediator mediator)
     {
         _orderRepository = orderRepository;
         _orderRedoRepository = orderRedoRepository;
@@ -81,6 +87,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         _systemSettingCacheManager = systemSettingCacheManager;
         _workflowDomainService = workflowDomainService;
         _hotspotRepository = hotspotRepository;
+        _mediator = mediator;
     }
 
     public async Task<Order> GetOrderAsync(string? orderId, bool withHotspot = false, bool withAcceptor = false,
@@ -400,6 +407,55 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     }
     #endregion
 
+
+    #region 即将超期和超期短信
+
+    /// <summary>
+    ///  即将超期和超期短信
+    /// </summary>
+    /// <returns></returns>
+    public async Task SendOverTimeSms(CancellationToken cancellationToken)
+    {
+        var now = DateTime.Now;
+        //查询即将超期和超期工单
+        var orderList = await _orderRepository.Queryable()
+            .Where(x=>x.NearlyExpiredTime> now && x.Status< EOrderStatus.Filed && !string.IsNullOrEmpty(x.CurrentHandleOrgId))
+            .GroupBy(x=>x.CurrentHandleOrgId)
+            .Select(x => new OverTimeOrderDto
+            { 
+                 OrgId = x.CurrentHandleOrgId,
+                 NearlyOrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.NearlyExpiredTime >= now && x.ExpiredTime > now,1,0)),
+                 ExpiredTimeOrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.ExpiredTime>now,1,0))
+            })
+            .ToListAsync(cancellationToken);
+
+        foreach (var item in orderList)
+        {
+            var acceptSmsRoleIds = _systemSettingCacheManager.GetSetting(SettingConstants.AcceptSmsRoleIds)?.SettingValue;
+            //查询部门所有账号
+            var userlist = await _userRepository.Queryable().Where(x =>
+                x.OrgId == item.OrgId && !string.IsNullOrEmpty(x.PhoneNo) &&
+                x.Roles.Any(d => acceptSmsRoleIds.Contains(d.Id))).ToListAsync();
+            //发送短信
+            foreach (var user in userlist)
+            {
+                var messageDto = new Share.Dtos.Push.MessageDto
+                {
+                    PushBusiness = EPushBusiness.OrderExpire,
+                    PushPlatform = EPushPlatform.Sms,
+                    Name = user.Name,
+                    TemplateCode = "1009",
+                    Params = new List<string>() { item.NearlyOrderCount.ToString(), item.ExpiredTimeOrderCount.ToString() },
+                    TelNumber = user.PhoneNo,
+                };
+                await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
+            }
+        }
+    }
+
+    #endregion
+
+
     #region private
 
     private async Task<Order> GetOrderByFlowIdAsync(string workflowId, CancellationToken cancellationToken)

+ 12 - 4
src/Hotline/dataview.md

@@ -1,5 +1,5 @@
 ### 信件数据查询
-select aaa.*,bbb."SeatVisitResult" from 
+select aaa.*,bbb."SeatVisitResult",ccc."OrgProcessingResults" from 
 (select 
 CASE "ordertemp"."Status"
 	WHEN 500 THEN '已回访'
@@ -83,12 +83,12 @@ CASE "FromGender"
 	ELSE '未知'
 END AS "FromGender" , 
 '-' AS "SeatVisitResult",
-"FirstVisitResult" AS "FirstVisitResult" , 
+'-' AS "NowEvaluate",
 "PushType" AS "PushType" , 
 "Content" AS "Content" , 
 "ActualOpinion" AS "ActualOpinion" ,
 "FileOpinion" AS "FileOpinion" ,
-"Id" AS "SugarNav_Id" FROM "order" ordertemp  WHERE (( "CreationTime" >= '2024-07-17' ) AND ( "CreationTime" < '2024-07-24' ))  AND ( "IsDeleted" = FALSE )ORDER BY "CreationTime" ASC) aaa
+"Id" AS "SugarNav_Id" FROM "order" ordertemp  WHERE (( "CreationTime" >= '2024-07-29' ) AND ( "CreationTime" < '2024-08-10' ))  AND ( "IsDeleted" = FALSE )ORDER BY "CreationTime" ASC) aaa
 left join 
 (select DISTINCT CASE visitdetailtemp."SeatEvaluate"
 	WHEN 0 THEN '默认满意'
@@ -102,7 +102,15 @@ left join
 END AS "SeatVisitResult",visittemp."OrderId" as "OrderId"
  from order_visit visittemp
 left join order_visit_detail visitdetailtemp on visittemp."Id"= visitdetailtemp."VisitId"  
-where visittemp."CreationTime">='2024-07-17' and visitdetailtemp."VisitTarget"=10 AND visittemp."VisitState"=30 ) bbb on aaa."SugarNav_Id"=bbb."OrderId";
+where visittemp."CreationTime">='2024-07-29' and visitdetailtemp."VisitTarget"=10 AND visittemp."VisitState"=30 ) bbb
+on aaa."SugarNav_Id"=bbb."OrderId"
+left join 
+(select DISTINCT
+visitdetailtemptwo."OrgProcessingResults"::JSON->>'Value' as "OrgProcessingResults",visittemptwo."OrderId"
+from order_visit visittemptwo
+left join order_visit_detail visitdetailtemptwo on visittemptwo."Id" = visitdetailtemptwo."VisitId"
+where visittemptwo."CreationTime">='2024-07-29' and visitdetailtemptwo."VisitTarget"=20 AND visittemptwo."VisitState"=30) ccc
+on aaa."SugarNav_Id"=ccc."OrderId";
 
 
 ### 超期件查询