Procházet zdrojové kódy

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

Dun.Jason před 4 měsíci
rodič
revize
04c7f5f313

+ 112 - 77
src/Hotline.Api/Controllers/OrderController.cs

@@ -69,6 +69,7 @@ using Hotline.Share.Dtos.CallCenter;
 using NPOI.SS.Formula.Functions;
 using System.Threading;
 using Hotline.Share.Mq;
+using Hotline.CallCenter.Calls;
 
 namespace Hotline.Api.Controllers;
 
@@ -923,11 +924,14 @@ public class OrderController : BaseController
             .WhereIF(dto.VisitStateQuery == EVisitStateQuery.SMSUnsatisfied, d => d.VisitState == EVisitState.SMSUnsatisfied)
             .WhereIF(dto.VisitStateQuery == EVisitStateQuery.SMSVisiting, d => d.VisitState == EVisitState.SMSVisiting)
             .WhereIF(dto.VisitStateQuery == EVisitStateQuery.NoPutThrough, d => d.IsPutThrough == false && d.VisitState != EVisitState.Visited)
+            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.ChipVoiceVisiting, d => d.VisitState == EVisitState.AiVisiting)//任务 162:回访状态快捷查询条件
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Order.Title.StartsWith(dto.Keyword!))
             .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
             .WhereIF(dto.VisitType != null, d => d.VisitType == dto.VisitType)
-            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.Order.ProcessType == EProcessType.Zhiban)
-            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.Order.ProcessType == EProcessType.Jiaoban)
+              //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.Order.ProcessType == EProcessType.Zhiban)
+              //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.Order.ProcessType == EProcessType.Jiaoban)
+              .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.Order.FileOrgIsCenter == true)
+            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.Order.FileOrgIsCenter == false)
             .WhereIF(dto.IsCountersign != null && dto.IsCountersign == true, d => d.Order.CounterSignType != null)
             .WhereIF(dto.IsCountersign != null && dto.IsCountersign == false, d => d.Order.CounterSignType == null)
             .WhereIF(dto.QuerySelf.HasValue && dto.QuerySelf.Value, d => d.EmployeeId == _sessionContext.RequiredUserId)
@@ -1037,12 +1041,24 @@ public class OrderController : BaseController
         }
         else if (_appOptions.Value.GetDefaultAppScopeConfiguration().CallCenterType == AppDefaults.CallCenterType.XingTang)
         {
-            var call = await _callApplication.GetCallAsync(orderVisit.CallId, HttpContext.RequestAborted);
+            CallNative? call = null;
+            if (orderVisit.CallId == null && orderVisit.VisitTime.HasValue)
+            { 
+                call = await _callApplication.GetCallByTimeAndToNoAsync(orderVisit.Order.Contact, orderVisit.VisitTime.Value,  HttpContext.RequestAborted);
+            }
+            call = await _callApplication.GetCallAsync(orderVisit.CallId, HttpContext.RequestAborted);
             if (call is not null)
             {
-                recordingFileUrl = call.AudioFile;
-                recordingBaseAddress = call.AudioFile;
-                recordingAbsolutePath = call.AudioFile;
+                if (call.AudioFile.IsNullOrEmpty())
+                {
+                    call = await _callApplication.GetCallByCallNoAsync(call.CallNo, HttpContext.RequestAborted);
+                }
+                if (call is not null)
+                {
+                    recordingFileUrl = call.AudioFile;
+                    recordingBaseAddress = call.AudioFile;
+                    recordingAbsolutePath = call.AudioFile;
+                }
             }
         }
 
@@ -3374,7 +3390,6 @@ public class OrderController : BaseController
             orderTerminateList.Any(x => x.Status == ETerminateStatus.Refuse) ? "不同意" :
             orderTerminateList.Any(x => x.Status == ETerminateStatus.Approval || x.Status == ETerminateStatus.SendBack) ? "审批中" : null;
 
-
         return _sessionContext.OrgIsCenter ? dto : dto.DataMask();
     }
 
@@ -3673,7 +3688,7 @@ public class OrderController : BaseController
             }
         }
 
-        await _orderRepository.UpdateNav(order).Include(d => d.OrderExtension).ExecuteCommandAsync();
+        await _orderRepository.UpdateNav(order, new UpdateNavRootOptions { IgnoreColumns = ["CallId"] }).Include(d => d.OrderExtension).ExecuteCommandAsync();
 
         //订阅此事件的内部处理工单数据只能更新各自业务的字段,不能全部更新
         //修改工单其他处理事件  (受理短信)
@@ -4307,6 +4322,23 @@ public class OrderController : BaseController
     //    return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
     //}
 
+    /// <summary>
+    /// 列表页面基础数据
+    /// </summary>
+    /// <returns></returns>
+    [HttpGet("waited/base-data")]
+    public async Task<object> WaitedBaseData()
+    {
+        var wfModule = await _workflowApplication.GetWorkflowModuleAsync(WorkflowModuleConsts.OrderHandle, HttpContext.RequestAborted);
+        var definition = wfModule.Definition;
+        var rsp = new
+        {
+            OrderStatusOptions = EnumExts.GetDescriptions<EOrderStatus>(),
+            CurrentStepOptions = definition?.Steps.Select(x => new Kv(x.Code, x.Name))
+        };
+        return rsp;
+    }
+
     /// <summary>
     /// 工单待办
     /// </summary>
@@ -4321,7 +4353,7 @@ public class OrderController : BaseController
     }
 
     [HttpGet("waited/count")]
-    public async Task<int> QueryWaitedCount([FromQuery]QueryOrderWaitedDto dto)
+    public async Task<int> QueryWaitedCount([FromQuery] QueryOrderWaitedDto dto)
     {
         return await _orderApplication
             .QueryWaited(dto)
@@ -4332,11 +4364,13 @@ public class OrderController : BaseController
     /// 查询坐席待办
     /// </summary>
     [HttpGet("waited/sign")]
-    public async Task<List<OrderListOutDto>> QueryWaitedForSeat([FromQuery] QueryOrderWaitedDto dto)
+    public async Task<IReadOnlyList<OrderListOutDto>> QueryWaitedForSeat([FromQuery] QueryOrderWaitedDto dto)
     {
-        return await _orderApplication
+        var orders = await _orderApplication
             .QueryWaitedForSeat(dto)
             .ToPageListWithoutTotalAsync(dto, HttpContext.RequestAborted);
+
+        return _mapper.Map<IReadOnlyList<OrderListOutDto>>(orders);
     }
 
     [HttpGet("waited/sign/count")]
@@ -5480,7 +5514,8 @@ public class OrderController : BaseController
                 NextStepCode = special.NextStepCode,
                 NextStepName = special.NextStepName,
                 NextHandlers = special.NextHandlers,
-                Opinion = dto.Opinion,
+                // Opinion = dto.Opinion,
+                Opinion = "【特提理由】" + special.Reason,
                 FlowDirection = special.FlowDirection,
                 HandlerType = special.HandlerType.Value,
                 BusinessType = special.BusinessType.Value
@@ -5982,71 +6017,71 @@ public class OrderController : BaseController
     [HttpGet("sendback/base/{id}")]
     public async Task<object> SendBackBaseData(string id)
     {
-	    var order = await _orderRepository.GetAsync(id, HttpContext.RequestAborted);
-	    var isInstaShot = order.SourceChannel.Contains("随手拍");
-	    var defaultStepKey = string.Empty;
-	    var defaultHandlerKey = string.Empty;
-	    List<Kv> orgs = new();
-	    if (order == null) throw UserFriendlyException.SameMessage("无效工单信息!");
-	    //中心会签调取方法
-	    var org = await _workflowDomainService.GetLevelOneOrgsAsync(order.WorkflowId, HttpContext.RequestAborted);
-	    orgs.AddRange(org);
-	    var step = await _workflowApplication.GetRecallStepsAsync(order.WorkflowId, HttpContext.RequestAborted);
-	    if (_appOptions.Value.IsZiGong)
-	    {
-		    step.Steps = step.Steps.Where(x => x.Key.ToLower() != "start").ToList();
-		    if (step.Steps.Where(x => x.BusinessType == EBusinessType.Department && x.OrgLevel == 1).Any())
-		    {
-			    var stepdDefault = step.Steps.Where(x => x.BusinessType == EBusinessType.Department && x.OrgLevel == 1)
-				    .FirstOrDefault();
-			    defaultStepKey = stepdDefault.Key;
-		    }
-	    }
-
-	    if (_appOptions.Value.IsYiBin)
-	    {
-		    if (order.ProcessType == EProcessType.Zhiban)
-		    {
-			    var stepdDefault = step.Steps.Where(x => x.Key.ToLower() == "start").FirstOrDefault();
-			    defaultStepKey = stepdDefault.Key;
-			    defaultHandlerKey = stepdDefault.Handler.Key;
-
-			}
-		    if (order.ProcessType == EProcessType.Jiaoban)
-		    {
-			    if (step.Steps.Where(x => x.BusinessType == EBusinessType.Department && x.OrgLevel == 1).Any())
-			    {
-				    var stepdDefault = step.Steps.Where(x => x.BusinessType == EBusinessType.Department && x.OrgLevel == 1)
-					    .FirstOrDefault();
-				    defaultStepKey = stepdDefault.Key;
-				    defaultHandlerKey = stepdDefault.Handler.Key;
-
-			    }
-			}
-		}
-	    //获取部门信息
-	    var rsp = new
-	    {
-		    SpecialTimeType = EnumExts.GetDescriptions<ETimeType>(),
-		    SpecialReason = isInstaShot
-			    ? _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.InstaShotSpecialReason)
-			    : _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SpecialReason),
-		    ReTransactErrorType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.ReTransactErrorType),
-		    IsTerminate =
-			    await _orderTerminateRepository.Queryable().Where(d => d.OrderId == order.Id && d.Status == ETerminateStatus.End).AnyAsync(),
-		    Step = step,
-		    Orgs = orgs,
-		    DefaultStepKey = defaultStepKey,
-		    DefaultHandlerKey= defaultHandlerKey
-		};
-	    return rsp;
-    }
-
-	/// <summary>
-	/// 部门批量重提 该部门及下级部门回访结果 不满意 未评价 视为满意 
-	/// </summary>
-	/// <returns></returns>
-	[HttpPost("org_batch_special")]
+        var order = await _orderRepository.GetAsync(id, HttpContext.RequestAborted);
+        var isInstaShot = order.SourceChannel.Contains("随手拍");
+        var defaultStepKey = string.Empty;
+        var defaultHandlerKey = string.Empty;
+        List<Kv> orgs = new();
+        if (order == null) throw UserFriendlyException.SameMessage("无效工单信息!");
+        //中心会签调取方法
+        var org = await _workflowDomainService.GetLevelOneOrgsAsync(order.WorkflowId, HttpContext.RequestAborted);
+        orgs.AddRange(org);
+        var step = await _workflowApplication.GetRecallStepsAsync(order.WorkflowId, HttpContext.RequestAborted);
+        if (_appOptions.Value.IsZiGong)
+        {
+            step.Steps = step.Steps.Where(x => x.Key.ToLower() != "start").ToList();
+            if (step.Steps.Where(x => x.BusinessType == EBusinessType.Department && x.OrgLevel == 1).Any())
+            {
+                var stepdDefault = step.Steps.Where(x => x.BusinessType == EBusinessType.Department && x.OrgLevel == 1)
+                    .FirstOrDefault();
+                defaultStepKey = stepdDefault.Key;
+            }
+        }
+
+        if (_appOptions.Value.IsYiBin)
+        {
+            if (order.ProcessType == EProcessType.Zhiban)
+            {
+                var stepdDefault = step.Steps.Where(x => x.Key.ToLower() == "start").FirstOrDefault();
+                defaultStepKey = stepdDefault.Key;
+                defaultHandlerKey = stepdDefault.Handler.Key;
+
+            }
+            if (order.ProcessType == EProcessType.Jiaoban)
+            {
+                if (step.Steps.Where(x => x.BusinessType == EBusinessType.Department && x.OrgLevel == 1).Any())
+                {
+                    var stepdDefault = step.Steps.Where(x => x.BusinessType == EBusinessType.Department && x.OrgLevel == 1)
+                        .FirstOrDefault();
+                    defaultStepKey = stepdDefault.Key;
+                    defaultHandlerKey = stepdDefault.Handler.Key;
+
+                }
+            }
+        }
+        //获取部门信息
+        var rsp = new
+        {
+            SpecialTimeType = EnumExts.GetDescriptions<ETimeType>(),
+            SpecialReason = isInstaShot
+                ? _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.InstaShotSpecialReason)
+                : _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SpecialReason),
+            ReTransactErrorType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.ReTransactErrorType),
+            IsTerminate =
+                await _orderTerminateRepository.Queryable().Where(d => d.OrderId == order.Id && d.Status == ETerminateStatus.End).AnyAsync(),
+            Step = step,
+            Orgs = orgs,
+            DefaultStepKey = defaultStepKey,
+            DefaultHandlerKey = defaultHandlerKey
+        };
+        return rsp;
+    }
+
+    /// <summary>
+    /// 部门批量重提 该部门及下级部门回访结果 不满意 未评价 视为满意 
+    /// </summary>
+    /// <returns></returns>
+    [HttpPost("org_batch_special")]
     [AllowAnonymous]
     public async Task OrgBatchSpecial([FromBody] OrgBatchSpecialDto model)
     {

+ 45 - 3
src/Hotline.Api/Controllers/PushProvinceController.cs

@@ -12,7 +12,9 @@ using MapsterMapper;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
+using Microsoft.VisualBasic;
 using SqlSugar;
+using System.Text;
 using XF.Domain.Repository;
 
 namespace Hotline.Api.Controllers
@@ -55,7 +57,7 @@ namespace Hotline.Api.Controllers
         {
             Provinces = Provinces.Trim();
             string[] provinceNos = Provinces.Split(',');
-            for (int i = 0; i < provinceNos.Length; i++)
+            for (int i = 0;i < provinceNos.Length;i++)
             {
                 provinceNos[i] = provinceNos[i].Trim();
             }
@@ -84,7 +86,7 @@ namespace Hotline.Api.Controllers
         {
             Provinces = Provinces.Trim();
             string[] provinceNos = Provinces.Split(',');
-            for (int i = 0; i < provinceNos.Length; i++)
+            for (int i = 0;i < provinceNos.Length;i++)
             {
                 provinceNos[i] = provinceNos[i].Trim();
             }
@@ -135,7 +137,7 @@ namespace Hotline.Api.Controllers
         {
             Provinces = Provinces.Trim();
             string[] provinceNos = Provinces.Split(',');
-            for (int i = 0; i < provinceNos.Length; i++)
+            for (int i = 0;i < provinceNos.Length;i++)
             {
                 provinceNos[i] = provinceNos[i].Trim();
             }
@@ -182,6 +184,46 @@ namespace Hotline.Api.Controllers
             }
         }
 
+        /// <summary>
+        /// 根据省编号重新执行工单和通话记录关联并推送省上
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("OrderRelateCallHandler")]
+        [AllowAnonymous]
+        public async Task<dynamic> OrderRelateCallHandlerAsync([FromBody] string provinces)
+        {
+            provinces = provinces.Trim();
+            var provinceNos = provinces.Split(',');
+            for (int i = 0;i < provinceNos.Length;i++)
+            {
+                provinceNos[i] = provinceNos[i].Trim();
+            }
+
+            var orders = await _orderRepository.Queryable()
+                .Where(d => provinceNos.Contains(d.ProvinceNo))
+                .Select(d => new { d.Id, d.ProvinceNo })
+                .ToListAsync(HttpContext.RequestAborted);
 
+            dynamic sb = new System.Dynamic.ExpandoObject();
+            var sbs = new List<dynamic>();
+            foreach (var order in orders)
+            {
+                sb.OrderId = order.Id;
+                sb.ProvinceNo = order.ProvinceNo;
+                try
+                {
+                    sb.Message = await _callApplication.OrderRelateCallHandlerAsync(order.Id, HttpContext.RequestAborted);
+                }
+                catch (ArgumentException e)
+                {
+                    sb.Message = e.Message;
+                }
+                finally
+                {
+                    sbs.Add(sb);
+                }
+            }
+            return sbs;
+        }
     }
 }

+ 65 - 0
src/Hotline.Api/Controllers/WebPortalController.cs

@@ -491,6 +491,51 @@ namespace Hotline.Api.Controllers
             }
             return OpenResponse.Ok(WebPortalDeResponse<OrderListReturnDto>.Success(new OrderListReturnDto(), "成功"));
 
+        }
+
+        /// <summary>
+        /// 用户中心用户写信数据
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("getorderbyuserphonelist")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> GetOrderByUserPhoneList([FromBody] QueryOrderListByUserDto dto)
+        {
+            RefAsync<int> total = 0;
+            var items = await _webFlowAcceptRepository.Queryable()
+               .LeftJoin<Hotline.Orders.Order>((o, or) => o.OrderId == or.Id)
+               .Where(o => o.Mobile == dto.PhoneNum)
+           //重新构建数据
+           .Select((o, or) => new
+           {
+               FlowID = o.OrderId,
+               FlowCode = o.Code,
+               FlowPwd = o.Pwd,
+               FlowTitle = o.Title,
+               FlowFromName = or.SourceChannel,
+               FlowPurTypeName = o.PurTypeName,
+               ConTypeName = or.HotspotName,
+               FlowAddDate = o.CreationTime,
+               RSFlagName = or.Status < EOrderStatus.Filed ? "办理中" : "办理完成",
+               Mobile = o.Mobile
+           })
+           //将结果合并成一个表
+           .MergeTable()
+           .Where(p => p.Mobile == dto.PhoneNum)
+           .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
+
+            //计算总页数
+            int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize));
+            OrderListReturnDto returnDto = new()
+            {
+                PageNum = dto.PageIndex,
+                PageCount = nPageCount,
+                Data = _mapper.Map<IReadOnlyList<OrderListDto>>(items)
+            };
+
+            return OpenResponse.Ok(WebPortalDeResponse<OrderListReturnDto>.Success(returnDto, "成功"));
+
         }
         #endregion
 
@@ -1143,6 +1188,26 @@ namespace Hotline.Api.Controllers
           .FirstAsync();
             return OpenResponse.Ok(WebPortalDeResponse<GetStatistDto>.Success(getStatistDto));
         }
+
+        /// <summary>
+        /// 获取统计数据 今日数据
+        /// </summary>
+        /// <returns></returns>
+        [AllowAnonymous]
+        [HttpPost("todaygetstatist")]
+        public async Task<OpenResponse> GetTodayStatist()
+        {
+            var startDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
+            var endDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"));
+            var getStatistDto = await _orderRepository.Queryable()
+          .Select(p => new GetStatistDto
+          {
+              DayCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.CreationTime >= startDate && p.CreationTime <= endDate && p.Status > EOrderStatus.WaitForAccept, 1, 0)),
+              DayTrandCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.CreationTime >= startDate && p.CreationTime <= endDate && p.FiledTime >= startDate && p.FiledTime <= endDate && p.Status >= EOrderStatus.Filed, 1, 0)),
+          })
+          .FirstAsync();
+            return OpenResponse.Ok(WebPortalDeResponse<GetStatistDto>.Success(getStatistDto));
+        }
         #endregion
 
         #region 评价

+ 39 - 7
src/Hotline.Application/CallCenter/DefaultCallApplication.cs

@@ -240,6 +240,7 @@ public abstract class DefaultCallApplication : ICallApplication
         var query = _callNativeRepository.Queryable(includeDeleted: true)
             .LeftJoin<Order>((d, o) => d.Id == o.CallId)
             .LeftJoin<OrderVisit>((d, o, v) => d.Id == v.CallId)
+            .Where((d, o, v) => d.IsDeleted == false)
             // .WhereIF(string.IsNullOrEmpty(dto.ToNo), (d, o, v) => d.GroupId != "0")
             .WhereIF(!string.IsNullOrEmpty(dto.OrderNo), (d, o, v) => o.No == dto.OrderNo)
             .WhereIF(!string.IsNullOrEmpty(dto.FromNo), d => d.FromNo.Contains(dto.FromNo!))
@@ -377,8 +378,36 @@ public abstract class DefaultCallApplication : ICallApplication
     {
         if (string.IsNullOrEmpty(callId)) return null;
         if (callId.StartsWith("2024"))
-            return await _callNativeRepository.GetAsync(m => m.CallNo == callId, cancellationToken);
-        return await _callNativeRepository.GetAsync(callId, cancellationToken);
+            return await _callNativeRepository.GetAsync(m => m.CallNo == callId && m.IsDeleted == false, cancellationToken);
+        return await _callNativeRepository.GetAsync(m => m.Id == callId && m.IsDeleted == false, cancellationToken);
+    }
+
+    /// <summary>
+    /// 查询通话记录
+    /// 因为自贡的系统中有回访和通话记录未关联的异常数据, 使用此方法查询通话记录
+    /// </summary>
+    public virtual async Task<CallNative> GetCallByTimeAndToNoAsync(string toNo, DateTime time, CancellationToken cancellationToken)
+    {
+        var beginTime = time.AddMinutes(-5);
+        var items = await _callNativeRepository.Queryable()
+            .Where(m => m.BeginIvrTime >= beginTime && m.BeginIvrTime <= time)
+            .Where(m => m.ToNo == toNo && m.Direction == ECallDirection.Out && !string.IsNullOrEmpty(m.AudioFile) && m.IsDeleted == false)
+            .OrderBy(m => m.BeginIvrTime)
+            .ToListAsync(cancellationToken);
+        if (items.NotNullOrEmpty())
+            return items.First();
+        return null;
+    }
+
+    /// <summary>
+    /// 查询通话记录
+    /// 因为自贡的系统中有回访和通话记录未关联的异常数据, 使用此方法查询通话记录
+    /// </summary>
+    public virtual async Task<CallNative> GetCallByCallNoAsync(string callNo, CancellationToken cancellationToken)
+    {
+        return  await _callNativeRepository.Queryable()
+            .Where(m => m.CallNo == callNo && !string.IsNullOrEmpty(m.AudioFile))
+            .FirstAsync(cancellationToken);
     }
 
     /// <summary>
@@ -498,7 +527,7 @@ public abstract class DefaultCallApplication : ICallApplication
     /// <param name="orderId"></param>
     /// <param name="cancellationToken"></param>
     /// <returns></returns>
-    public virtual async Task OrderRelateCallHandlerAsync(string orderId, CancellationToken cancellationToken)
+    public virtual async Task<string> OrderRelateCallHandlerAsync(string orderId, CancellationToken cancellationToken)
     {
         var orderCall = await _orderRepository.Queryable()
             .LeftJoin<CallNative>((o, c) => o.CallId == c.Id)
@@ -507,8 +536,9 @@ public abstract class DefaultCallApplication : ICallApplication
             .FirstAsync(cancellationToken);
         if (orderCall is null || orderCall.CallNo.IsNullOrEmpty())
         {
-            _logger.LogInformation($"延迟更新工单通话, 工单: {orderId} 根据 order.id left join call_native 信息为空; 消息队列无须重试");
-            return;
+            string message = $"延迟更新工单通话, 工单: {orderId} 根据 order.id left join call_native 信息为空; 消息队列无须重试";
+            _logger.LogInformation(message);
+            return message;
         }
 
         var call = await _callNativeRepository.Queryable()
@@ -530,7 +560,7 @@ public abstract class DefaultCallApplication : ICallApplication
                 Order = (await _orderRepository.GetAsync(orderId, cancellationToken)).Adapt<OrderDto>(),
                 TrCallRecordDto = call.Adapt<TrCallDto>()
             }, cancellationToken: cancellationToken);
-            return;
+            return "需要更新的callId 和 order.callId 相同(完成推省上)";
         }
 
         await _orderRepository.Updateable()
@@ -549,7 +579,9 @@ public abstract class DefaultCallApplication : ICallApplication
             Order = (await _orderRepository.GetAsync(orderId, cancellationToken)).Adapt<OrderDto>(),
             TrCallRecordDto = call.Adapt<TrCallDto>()
         }, cancellationToken: cancellationToken);
-        _systemLogRepository.Add("延迟更新工单通话", orderId, $"原CallId: {orderCall.CallId}, 更新CallId: {call.Id}", status: 1);
+        var msg = $"原CallId: {orderCall.CallId}, 更新CallId: {call.Id}";
+        _systemLogRepository.Add("延迟更新工单通话", orderId, msg, status: 1);
+        return msg + "(完成推省上)";
     }
 
     /// <summary>

+ 13 - 1
src/Hotline.Application/CallCenter/ICallApplication.cs

@@ -108,6 +108,18 @@ namespace Hotline.Application.CallCenter
         /// <returns></returns>
         Task<CallNative?> GetCallAsync(string callId, CancellationToken cancellationToken);
 
+        /// <summary>
+        /// 查询通话记录
+        /// 因为自贡的系统中有回访和通话记录未关联的异常数据, 使用此方法查询通话记录
+        /// </summary>
+        Task<CallNative> GetCallByTimeAndToNoAsync(string toNo, DateTime time, CancellationToken cancellationToken);
+
+        /// <summary>
+        /// 查询通话记录
+        /// 因为自贡的系统中有回访和通话记录未关联的异常数据, 使用此方法查询通话记录
+        /// </summary>
+        Task<CallNative> GetCallByCallNoAsync(string callNo, CancellationToken cancellationToken);
+
         /// <summary>
         /// 查询通话记录
         /// </summary>
@@ -144,7 +156,7 @@ namespace Hotline.Application.CallCenter
         /// <param name="orderId"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        Task OrderRelateCallHandlerAsync(string orderId, CancellationToken cancellationToken);
+        Task<string> OrderRelateCallHandlerAsync(string orderId, CancellationToken cancellationToken);
 
         /// <summary>
         /// 查询通话记录

+ 2 - 1
src/Hotline.Application/CallCenter/TianRunCallApplication.cs

@@ -192,7 +192,7 @@ namespace Hotline.Application.CallCenter
         /// <param name="orderId"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        public override async Task OrderRelateCallHandlerAsync(string orderId, CancellationToken cancellationToken)
+        public override async Task<string> OrderRelateCallHandlerAsync(string orderId, CancellationToken cancellationToken)
         {
             var order = await _orderRepository.GetAsync(orderId, cancellationToken);
             if (order != null)
@@ -211,6 +211,7 @@ namespace Hotline.Application.CallCenter
                     }
                 }
             }
+            return "ok";
         }
 
         /// <summary>

+ 1 - 1
src/Hotline.Application/Orders/IOrderApplication.cs

@@ -330,7 +330,7 @@ namespace Hotline.Application.Orders
         ISugarQueryable<OrderVisitDetail> MayScreenList(MayScreenListDto dto);
 
 
-		ISugarQueryable<OrderListOutDto> QueryWaitedForSeat(QueryOrderWaitedDto dto);
+		ISugarQueryable<Order> QueryWaitedForSeat(QueryOrderWaitedDto dto);
 
 
 		ISugarQueryable<Order> QueryWaited(QueryOrderWaitedDto dto);

+ 20 - 12
src/Hotline.Application/Orders/OrderApplication.cs

@@ -688,8 +688,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                                                                                               //.WhereIF(dto.PubRange == EPublicState.NoPub, d => !d.OrderPublish.PublishState)
             .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, d => d.Source == ESource.ProvinceStraight)
             .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, d => d.Source != ESource.ProvinceStraight)
-            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.ProcessType == EProcessType.Zhiban)
-            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.ProcessType == EProcessType.Jiaoban)
+            //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.ProcessType == EProcessType.Zhiban)
+            //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.ProcessType == EProcessType.Jiaoban)
+            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.FileOrgIsCenter == true)
+            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d =>d. FileOrgIsCenter == false)
             .WhereIF(dto.IsCountersign != null && dto.IsCountersign == true, d => d.CounterSignType != null)
             .WhereIF(dto.IsCountersign != null && dto.IsCountersign == false, d => d.CounterSignType == null)
             .WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptType))
@@ -751,7 +753,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .LeftJoin<User>((order, user) => order.WaitForPublisherId == user.Id)
             .Where((order, user) => order.CreationTime >= dto.StartTime && order.CreationTime <= dto.EndTime &&
                                     !string.IsNullOrEmpty(order.WaitForPublisherId))
-            .WhereIF(dto.ProcessType != null, (order, user) => order.ProcessType == dto.ProcessType)
+                 //  .WhereIF(dto.ProcessType != null, (order, user) => order.ProcessType == dto.ProcessType)
+             .WhereIF(dto.ProcessType != null && dto.ProcessType ==EProcessType.Zhiban, (order, user) => order.FileOrgIsCenter == true)
+            .WhereIF(dto.ProcessType != null && dto.ProcessType == EProcessType.Jiaoban, (order, user) => order.FileOrgIsCenter == false)
+
             .GroupBy((order, user) => new { order.WaitForPublisherId, user.Name })
             .Select((order, user) => new PublishedOrderStatisticsDto
             {
@@ -989,7 +994,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             {
                 throw new UserFriendlyException("暂不支持该方案");
             }
-           
+
             var canUpdateOrderSender = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.CanUpdateOrderSender).SettingValue[0]);
             order.CenterToOrg(
                 expiredTimeConfig.TimeText, expiredTimeConfig.Count,
@@ -1335,8 +1340,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
              d => d.Title.Contains(dto.ContentRetrieval) || d.Content.Contains(dto.ContentRetrieval) || d.FileOpinion.Contains(dto.ContentRetrieval) || d.ActualOpinion.Contains(dto.ContentRetrieval))
          .WhereIF(dto.IsSgin.HasValue && dto.IsSgin == true, d => d.CurrentStepAcceptTime != null)
          .WhereIF(dto.IsSgin.HasValue && dto.IsSgin == false, d => d.CurrentStepAcceptTime == null)
-         .WhereIF(dto.FiledType is FiledType.CenterFiled, d => d.ProcessType == EProcessType.Zhiban)
-         .WhereIF(dto.FiledType is FiledType.OrgFiled, d => d.ProcessType == EProcessType.Jiaoban)
+         .WhereIF(dto.FiledType is FiledType.CenterFiled, d => d.FileOrgIsCenter == true)//d => d.ProcessType == EProcessType.Zhiban
+         .WhereIF(dto.FiledType is FiledType.OrgFiled, d => d.FileOrgIsCenter == false)//d => d.ProcessType == EProcessType.Jiaoban
          .WhereIF(!string.IsNullOrEmpty(dto.OrderTagCode), d => d.OrderTagCode == dto.OrderTagCode)
          .WhereIF(!string.IsNullOrEmpty(dto.FocusOnEvents), d => SqlFunc.SplitIn(d.FocusOnEvents, dto.FocusOnEvents))
          .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.CreationTime, OrderByType.Desc)//默认排序时间为创建时间
@@ -1798,7 +1803,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(dto.TypeCode != null && dto.TypeCode == 1, (x, it) => it.OrderVisit.Order.IdentityType == EIdentityType.Citizen)
             .WhereIF(dto.TypeCode != null && dto.TypeCode == 2, (x, it) => it.OrderVisit.Order.IdentityType == EIdentityType.Enterprise)
             .WhereIF(IsCenter == false, (x, it) => it.VisitOrgCode.StartsWith(_sessionContextProvider.SessionContext.OrgId))
-            .WhereIF(dto.VisitType !=null, (x,it)=> it.OrderVisit.VisitType==dto.VisitType)
+            .WhereIF(dto.VisitType != null, (x, it) => it.OrderVisit.VisitType == dto.VisitType)
             .GroupBy((x, it) => new
             {
                 VisitOrgCode = it.VisitOrgCode
@@ -3185,7 +3190,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .OrderByDescending(d => d.CreationTime);
     }
 
-    public ISugarQueryable<OrderListOutDto> QueryWaitedForSeat(QueryOrderWaitedDto dto)
+    public ISugarQueryable<Order> QueryWaitedForSeat(QueryOrderWaitedDto dto)
     {
         EOrderStatus[] handleStatuses = EnumExts.GetFields<EOrderStatus>().Select(d => (EOrderStatus)d.Key).ToArray();
         handleStatuses = handleStatuses.WhereIF(dto.IsHandled.HasValue,
@@ -3279,7 +3284,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, d => d.StartTime, OrderByType.Desc) //受理时间降序
             .OrderByIF(dto is { SortField: "expiredTime", SortRule: 0 }, d => d.ExpiredTime, OrderByType.Asc) //期满时间升序
             .OrderByIF(dto is { SortField: "expiredTime", SortRule: 1 }, d => d.ExpiredTime, OrderByType.Desc) //期满时间降序
-            .Select<OrderListOutDto>();
+        ;
+        return query;
     }
 
     public ISugarQueryable<Order> QueryWaited(QueryOrderWaitedDto dto)
@@ -3353,14 +3359,16 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 d => d.NearlyExpiredTime < DateTime.Now && d.ExpiredTime > DateTime.Now) //即将超期 未办
             .Where(d => d.Source < ESource.MLSQ || d.Source > ESource.WZSC)
             .Where(d => d.Status != EOrderStatus.BackToProvince)
-            .WhereIF(!hasHandled, d => d.Status < EOrderStatus.Filed)
+            //.WhereIF(!hasHandled, d => d.Status < EOrderStatus.Filed)
+            .WhereIF(!hasHandled || _appOptions.Value.IsYiBin, d => d.Status < EOrderStatus.Filed)
             //.Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id).NotAny())
             //.Where(d => d.OrderSpecials.Any() == false || d.OrderSpecials.Any(s => s.State > 0))
             .WhereIF(dto.StartTime.HasValue, d => d.StartTime >= dto.StartTime)
             .WhereIF(dto.EndTime.HasValue, d => d.StartTime <= dto.EndTime)
             .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent!.Value)
-            .WhereIF(dto.Status.HasValue, d => d.Status == dto.Status)
-            //.OrderByDescending(d => d.IsUrgent)
+            .WhereIF(dto.Status.HasValue, d => d.Status == dto.Status) //工单状态
+           .WhereIF(!string.IsNullOrEmpty(dto.CurrentStepCode), d => d.CurrentStepCode == dto.CurrentStepCode) //当前办理节点
+                                                                                                               //.OrderByDescending(d => d.IsUrgent)
             .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.StartTime, OrderByType.Desc)
             .OrderByIF(dto is { SortField: "creationTime", SortRule: 0 }, d => d.CreationTime, OrderByType.Asc) //创建时间升序
             .OrderByIF(dto is { SortField: "creationTime", SortRule: 1 }, d => d.CreationTime, OrderByType.Desc) //创建时间降序

+ 15 - 11
src/Hotline.Application/StatisticalReport/OrderReportApplication.cs

@@ -1507,15 +1507,17 @@ namespace Hotline.Application.StatisticalReport
                   OrgCode = IsCenter == true ? it.ActualHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) : it.ActualHandleOrgCode.Substring(0, _sessionContext.RequiredOrgId.Length + 3),
                   AcceptTypeCode = it.AcceptTypeCode,
                   ProcessType = it.ProcessType,
-                  AllTime = it.ProcessType == EProcessType.Zhiban ? it.CreationTimeHandleDurationWorkday : it.CenterToOrgHandleDurationWorkday
-
+                  AllTime = it.ProcessType == EProcessType.Zhiban ? it.CreationTimeHandleDurationWorkday : it.CenterToOrgHandleDurationWorkday,
+                  FileOrgIsCenter = it.FileOrgIsCenter
               })
               .MergeTable()
               .LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
-              //.WhereIF(TypeCode == 1, (it, o) => it.OrgCode == "001")
-              //.WhereIF(TypeCode == 2, (it, o) => it.OrgCode != "001")
-              .WhereIF(dto.TypeCode == 1, (it, o) => it.ProcessType == EProcessType.Zhiban)
-              .WhereIF(dto.TypeCode == 2, (it, o) => it.ProcessType == EProcessType.Jiaoban)
+               //.WhereIF(TypeCode == 1, (it, o) => it.OrgCode == "001")
+               //.WhereIF(TypeCode == 2, (it, o) => it.OrgCode != "001")
+               //.WhereIF(dto.TypeCode == 1, (it, o) => it.ProcessType == EProcessType.Zhiban)
+               //.WhereIF(dto.TypeCode == 2, (it, o) => it.ProcessType == EProcessType.Jiaoban)
+               .WhereIF(dto.TypeCode == 1, (it, o) => it.FileOrgIsCenter == true)
+              .WhereIF(dto.TypeCode == 2, (it, o) => it.FileOrgIsCenter == false)
               .WhereIF(IsCenter == false, (it, o) => it.OrgCode.StartsWith(_sessionContext.RequiredOrgId))
                .GroupBy((it, o) => new
                {
@@ -1578,13 +1580,15 @@ namespace Hotline.Application.StatisticalReport
                  .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode != "001" && _sessionContext.RequiredOrgId != dto.OrgCode, p => p.ActualHandleOrgCode.StartsWith(dto.OrgCode))
                  .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode != "001" && _sessionContext.RequiredOrgId == dto.OrgCode, p => p.ActualHandleOrgCode == dto.OrgCode)
                  .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), p => p.AcceptTypeCode == dto.AcceptTypeCode)
-                 .WhereIF(dto.TypeCode == 1, p => p.ProcessType == EProcessType.Zhiban)
-                 .WhereIF(dto.TypeCode == 2, p => p.ProcessType == EProcessType.Jiaoban)
+                   //.WhereIF(dto.TypeCode == 1, p => p.ProcessType == EProcessType.Zhiban)
+                   //.WhereIF(dto.TypeCode == 2, p => p.ProcessType == EProcessType.Jiaoban)
+                   .WhereIF(dto.TypeCode == 1, p => p.FileOrgIsCenter == true)
+                 .WhereIF(dto.TypeCode == 2, p => p.FileOrgIsCenter == false)
                  .OrderByDescending(d => d.CreationTime)
                  .MergeTable();
         }
 
-        
+
 
         /// <summary>
         /// 受理类型统计
@@ -1658,7 +1662,7 @@ namespace Hotline.Application.StatisticalReport
 
                 list.AddRange(table);
             }
- 
+
             return (dissatisfiedReason, list);
         }
 
@@ -1734,7 +1738,7 @@ namespace Hotline.Application.StatisticalReport
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpGet("visit-nosatisfied-detail")]
-        public ISugarQueryable<OrderVisitDetail> BiQueryVisitNoSatisfiedDetail( BiQueryVisitNoSatisfiedDetailDto dto)
+        public ISugarQueryable<OrderVisitDetail> BiQueryVisitNoSatisfiedDetail(BiQueryVisitNoSatisfiedDetailDto dto)
         {
             var IsCenter = _sessionContext.OrgIsCenter;
 

+ 4 - 2
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -1236,8 +1236,10 @@ namespace Hotline.Repository.SqlSugar.Orders
             .WhereIF(dto.JudgeState != null, d => d.JudgeState == dto.JudgeState)
             .WhereIF(dto.OrgJudge != null, d => d.OrgJudge == dto.OrgJudge)
             .WhereIF(dto.SeatJudge != null, d => d.SeatJudge == dto.SeatJudge)
-            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.Order.ProcessType == EProcessType.Zhiban)
-            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.Order.ProcessType == EProcessType.Jiaoban)
+            //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.Order.ProcessType == EProcessType.Zhiban)
+            //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.Order.ProcessType == EProcessType.Jiaoban)
+                  .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.Order.FileOrgIsCenter == true)
+            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.Order.FileOrgIsCenter == false)
             .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), x => x.Order.TransferPhone == dto.TransferPhone)
             .OrderByDescending(x => x.VisitTime);
         }

+ 6 - 0
src/Hotline.Share/Dtos/Order/OrderVisitDto.cs

@@ -668,6 +668,12 @@ namespace Hotline.Share.Dtos.Order
 
         [Description("未接通")]
         NoPutThrough = 51,
+
+        /// <summary>
+        /// 智能回访中
+        /// </summary>
+        [Description("智能回访中")]
+        ChipVoiceVisiting = 61,
     }
 
 

+ 5 - 0
src/Hotline.Share/Dtos/Order/OrderWaitedDto.cs

@@ -83,6 +83,11 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public string? AcceptorName { get; set; }
 
+        /// <summary>
+        /// 当前办理节点
+        /// </summary>
+        public string? CurrentStepCode { get; set; }
+
     }
 
     /// <summary>

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

@@ -68,6 +68,11 @@ namespace Hotline.Share.Dtos.WebPortal
         /// 信件编号
         /// </summary>
         public string? UserId { get; set; }
+
+        /// <summary>
+        /// 手机号码
+        /// </summary>
+        public string? PhoneNum { get; set; }
     }
 
     /// <summary>

+ 6 - 0
src/Hotline/CallCenter/Calls/CallNative.cs

@@ -172,5 +172,11 @@ namespace Hotline.CallCenter.Calls
         /// </summary>
         [SugarColumn(ColumnDescription = "呼叫状态")]
         public ECallState? CallState { get; set; }
+
+        /// <summary>
+        /// 软删除
+        /// </summary>
+        [SugarColumn(ColumnDescription = "软删除", DefaultValue = "f")]
+        public bool IsDeleted { get; set; }
     }
 }