Переглянути джерело

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

xf 1 рік тому
батько
коміт
9aceae98e5

+ 2 - 2
src/Hotline.Api/Controllers/ArticleController.cs

@@ -163,7 +163,7 @@ namespace Hotline.Api.Controllers
                 startDto.DefinitionModuleCode = WorkflowModuleConsts.CircularApply;
                 startDto.Title = model.Title;
                 var workFlowId = await _workflowApplication.StartWorkflowAsync(startDto, id, HttpContext.RequestAborted);
-                model.WorkFlowId = workFlowId;
+                model.WorkflowId = workFlowId;
                 await _circularRepository.UpdateAsync(model,HttpContext.RequestAborted);
             }
             catch (Exception ex)
@@ -346,7 +346,7 @@ namespace Hotline.Api.Controllers
                 startDto.DefinitionModuleCode = WorkflowModuleConsts.BulletinApply;
                 startDto.Title = model.Title;
                 string workFlowId = await _workflowApplication.StartWorkflowAsync(startDto, id, HttpContext.RequestAborted);
-                model.WorkFlowId = workFlowId;
+                model.WorkflowId = workFlowId;
                 await _bulletinRepository.UpdateAsync(model, HttpContext.RequestAborted);
             }
             catch (Exception ex)

+ 8 - 3
src/Hotline.Api/Controllers/IPPbxController.cs

@@ -1,4 +1,5 @@
-using Hotline.Permissions;
+using Hotline.CallCenter.Calls;
+using Hotline.Permissions;
 using Hotline.Share.Dtos.TrCallCenter;
 using Hotline.Users;
 using MapsterMapper;
@@ -8,6 +9,7 @@ using Tr.Sdk;
 using Tr.Sdk.Blacklist;
 using Tr.Sdk.Tels;
 using XF.Domain.Authentications;
+using XF.Domain.Repository;
 
 namespace Hotline.Api.Controllers
 {
@@ -17,13 +19,15 @@ namespace Hotline.Api.Controllers
         private readonly IMapper _mapper;
         private readonly IUserDomainService _userDomainService;
         private readonly ISessionContext _sessionContext;
+        private readonly IRepository<TrCallRecord> _trCallRecordRepository;
 
-        public IPPbxController(ITrClient trClient,IMapper mapper,IUserDomainService userDomainService,ISessionContext sessionContext)
+        public IPPbxController(ITrClient trClient,IMapper mapper,IUserDomainService userDomainService,ISessionContext sessionContext,IRepository<TrCallRecord> trCallRecordRepository)
         {
             _trClient = trClient;
             _mapper = mapper;
             _userDomainService = userDomainService;
             _sessionContext = sessionContext;
+            _trCallRecordRepository = trCallRecordRepository;
         }
 
         #region 添添呼
@@ -121,7 +125,8 @@ namespace Hotline.Api.Controllers
         [HttpPost("receiveCallRecord")]
         public async Task ReceiveCallRecord([FromBody]ReceiveCallRecordDto dto)
         {
-
+            var model = _mapper.Map<TrCallRecord>(dto);
+            await _trCallRecordRepository.AddAsync(model, HttpContext.RequestAborted);
         }
 
         #endregion

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

@@ -111,7 +111,7 @@ namespace Hotline.Api.Controllers
 		[HttpPost("add")]
 		public async Task<string> AddKnowledge([FromBody] AddStartFlowDto dto)
 		{
-			var addDto = _mapper.Map<AddKnowledgeDto>(dto.Data);
+			//var addDto = _mapper.Map<AddKnowledgeDto>(dto.Data);
 			var kn = _mapper.Map<Knowledge>(dto.Data);
 			//Code为空,从新生成Code
 			if (string.IsNullOrEmpty(kn.Code))

+ 15 - 13
src/Hotline.Api/Controllers/OrderController.cs

@@ -756,7 +756,7 @@ public class OrderController : BaseController
             startDto.DefinitionModuleCode = WorkflowModuleConsts.OrderDelay;
             startDto.Title = model.DelayReason;
             string workFlowId = await _workflowApplication.StartWorkflowAsync(startDto, id, HttpContext.RequestAborted);
-            model.WorkFlowId = workFlowId;
+            model.WorkflowId = workFlowId;
             await _orderDelayRepository.UpdateAsync(model, HttpContext.RequestAborted);
         }
         catch (Exception ex)
@@ -772,11 +772,12 @@ public class OrderController : BaseController
     /// <returns></returns>
     //[Permission(EPermission.DelayList)]
     [HttpGet("delay")]
-    public async Task<PagedDto<OrderDelay>> DelayList([FromQuery] DelayListDto dto)
+    public async Task<PagedDto<OrderDelayDto>> DelayList([FromQuery] DelayListDto dto)
     {
         var (total, items) = await _orderDelayRepository.Queryable()
             .Includes(x => x.Order)
             .Includes(x => x.Employee)
+            .Includes(x => x.Workflow)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
                 d => d.Order.Title.Contains(dto.Keyword!) || d.Order.No.Contains(dto.Keyword!))
             .WhereIF(dto.IsApply, x => x.DelayState != EDelayState.Examining)
@@ -785,7 +786,7 @@ public class OrderController : BaseController
             .OrderByDescending(x => x.CreationTime)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 
-        return new PagedDto<OrderDelay>(total, _mapper.Map<IReadOnlyList<OrderDelay>>(items));
+        return new PagedDto<OrderDelayDto>(total, _mapper.Map<IReadOnlyList<OrderDelayDto>>(items));
     }
 
     /// <summary>
@@ -795,12 +796,13 @@ public class OrderController : BaseController
     /// <returns></returns>
     //[Permission(EPermission.DelayEntity)]
     [HttpGet("delay/{id}")]
-    public async Task<OrderDelay> DelayEntity(string id)
+    public async Task<OrderDelayDto> DelayEntity(string id)
     {
-        return await _orderDelayRepository.Queryable()
+        var model = await _orderDelayRepository.Queryable()
             .Includes(x => x.Order)
             .Includes(x => x.Employee)
             .FirstAsync(x => x.Id == id);
+        return _mapper.Map<OrderDelayDto>(model);
     }
 
     /// <summary>
@@ -869,16 +871,16 @@ public class OrderController : BaseController
         {
             query.WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.OrderVisit.Order.Title.Contains(dto.Keyword!) || d.OrderVisit.Order.No.Contains(dto.Keyword!))
                 .Where(d => d.VisitTarget == EVisitTarget.Org && d.VisitOrgCode == _sessionContext.OrgId && (
-                    SqlFunc.JsonField(d.OrgProcessingResults, "Name") == "不满意" || SqlFunc.JsonField(d.OrgProcessingResults, "Name") == "非常不满意" ||
-                    SqlFunc.JsonField(d.OrgHandledAttitude, "Name") == "不满意" || SqlFunc.JsonField(d.OrgHandledAttitude, "Name") == "非常不满意"
+                    SqlFunc.JsonField(d.OrgProcessingResults, "Value") == "不满意" || SqlFunc.JsonField(d.OrgProcessingResults, "Value") == "非常不满意" ||
+                    SqlFunc.JsonField(d.OrgHandledAttitude, "Value") == "不满意" || SqlFunc.JsonField(d.OrgHandledAttitude, "Value") == "非常不满意"
                 ));
         }
         else
         {
             query.WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.OrderVisit.Order.Title.Contains(dto.Keyword!) || d.OrderVisit.Order.No.Contains(dto.Keyword!))
                 .Where(d => d.VisitTarget == EVisitTarget.Org && (
-                    SqlFunc.JsonField(d.OrgProcessingResults, "Name") == "不满意" || SqlFunc.JsonField(d.OrgProcessingResults, "Name") == "非常不满意" ||
-                    SqlFunc.JsonField(d.OrgHandledAttitude, "Name") == "不满意" || SqlFunc.JsonField(d.OrgHandledAttitude, "Name") == "非常不满意"
+                    SqlFunc.JsonField(d.OrgProcessingResults, "Value") == "不满意" || SqlFunc.JsonField(d.OrgProcessingResults, "Value") == "非常不满意" ||
+                    SqlFunc.JsonField(d.OrgHandledAttitude, "Value") == "不满意" || SqlFunc.JsonField(d.OrgHandledAttitude, "Value") == "非常不满意"
                 ));
         }
         var (total, items) = await query
@@ -902,7 +904,7 @@ public class OrderController : BaseController
             .Includes(x => x.VisitDetail)
             .Includes(x => x.Visit, d => d.Order)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Visit.Order.Title.Contains(dto.Keyword!) || d.Visit.Order.No.Contains(dto.Keyword!))
-            .WhereIF(dto.Status == EScreenStatus.Apply || dto.Status == EScreenStatus.Approval || dto.Status == EScreenStatus.End, x => x.Status == dto.Status)
+            .WhereIF(dto.Status.HasValue, x => x.Status == dto.Status)
             .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
             .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
             .OrderByDescending(x => x.CreationTime)
@@ -948,7 +950,7 @@ public class OrderController : BaseController
             var screen = await _orderScreenRepository.GetAsync(id, HttpContext.RequestAborted);
             if (screen != null)
             {
-                screen.WorkFlowId = workflowId;
+                screen.WorkflowId = workflowId;
                 await _orderScreenRepository.UpdateAsync(screen, HttpContext.RequestAborted);
             }
         }
@@ -958,7 +960,7 @@ public class OrderController : BaseController
             id = string.Empty;
             throw new UserFriendlyException($"工单开启甄别流程失败!, {e.Message}", "工单开启甄别流程失败");
         }
-        if (!string.IsNullOrEmpty(id))
+        if (model.Publish.HasValue && model.Publish.Value && !string.IsNullOrEmpty(id))
         {
             var screen = await _orderScreenRepository.GetAsync(x => x.Id == id);
             if (screen != null)
@@ -1816,7 +1818,7 @@ public class OrderController : BaseController
         var handOrderNum = oders.Count(x => x.Status == EOrderStatus.Handling || x.Status == EOrderStatus.Countersigning);
         var DissatisfactionNum = await _orderVisitedDetailRepository.Queryable()
             .Includes(x => x.OrderVisit)
-            .Where(x => SqlFunc.JsonField(x.OrgProcessingResults, "Name") == "不满意" || SqlFunc.JsonField(x.OrgProcessingResults, "Name") == "非常不满意")
+            .Where(x => SqlFunc.JsonField(x.OrgProcessingResults, "Value") == "不满意" || SqlFunc.JsonField(x.OrgProcessingResults, "Value") == "非常不满意")
             .Distinct().Select(s => new { s.OrderVisit.OrderId }).CountAsync();
         //来电历史
         //TODO 等待通讯对接完成 还缺少 上次来电时间 

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

@@ -95,7 +95,8 @@
     //"Password": "123456",
     "Address": "http://222.213.23.229:29003/",
     "Username": "root",
-    "Password": "12345678aa"
+    "Password": "12345678aa",
+    "Ip": "222.213.23.229"
   }
 
 }

+ 49 - 5
src/Hotline.Application/Handlers/FlowEngine/EndWorkflowHandler.cs

@@ -36,8 +36,10 @@ public class EndWorkflowHandler : INotificationHandler<EndWorkflowNotify>
     private readonly IRepositorySqlSugar<CircularReadGroup> _circularReadGroupRepository;
     private readonly IRepositorySqlSugar<CircularRecord> _circularRecordRepository;
     private readonly ICircularRecordDomainService _circularRecordDomainService;
+    private readonly IRepository<OrderVisit> _orderVisitRepository;
+    private readonly IRepository<OrderDelay> _orderDelayRepository;
 
-    public EndWorkflowHandler(
+	public EndWorkflowHandler(
         IKnowledgeDomainService knowledgeDomainService,
         IOrderDomainService orderDomainService,
         ITelDomainService telDomainService,
@@ -50,8 +52,10 @@ public class EndWorkflowHandler : INotificationHandler<EndWorkflowNotify>
         IRepository<Circular> circularRepository,
         IRepository<CircularReadGroup> circularReadGroupRepository,
         IRepository<CircularRecord> circularRecordRepository,
-        ICircularRecordDomainService circularRecordDomainService
-        )
+        ICircularRecordDomainService circularRecordDomainService,
+        IRepository<OrderDelay> orderDelayRepository,
+        IRepository<OrderVisit> orderVisitRepository
+		)
     {
         _knowledgeDomainService = knowledgeDomainService;
         _orderDomainService = orderDomainService;
@@ -66,7 +70,9 @@ public class EndWorkflowHandler : INotificationHandler<EndWorkflowNotify>
         _circularReadGroupRepository = circularReadGroupRepository;
         _circularRecordRepository = circularRecordRepository;
         _circularRecordDomainService = circularRecordDomainService;
-    }
+        _orderDelayRepository = orderDelayRepository;
+        _orderVisitRepository = orderVisitRepository; 
+	}
 
     /// <summary>Handles a notification</summary>
     /// <param name="notification">The notification</param>
@@ -115,8 +121,36 @@ public class EndWorkflowHandler : INotificationHandler<EndWorkflowNotify>
                         visitDetail.OrgProcessingResults = screenSatisfy;
                         visitDetail.OrgHandledAttitude = screenSatisfy;
                         await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken);
+                        //推省上数据
+                        if (screen.Publish != null && screen.Publish.Value)
+                        {
+                            //获取回访信息
+	                        var visit = await _orderVisitRepository.Queryable().Includes(x=>x.Order).Includes(x=>x.OrderVisitDetails)
+                                .Where(x=>x.Id == screen.VisitId).FirstAsync(cancellationToken);
+	                        if (visit != null)
+	                        {
+                                //获取回访明细
+		                        var visitDe = visit.OrderVisitDetails.First(x => x.Id == screen.VisitDetailId);
+								//推省上
+								_capPublisher.Publish(EventNames.HotlineOrderVisited,
+									new PublishVisitDto()
+									{
+										Order = _mapper.Map<OrderDto>(visit.Order),
+										No = visit.No,
+										VisitType = visit.VisitType,
+										VisitName = visit.CreatorName,
+										VisitTime = visit.VisitTime,
+										VisitRemark = visitDe.VisitContent,
+										AreaCode = visit.Order.AreaCode!,
+										SubjectResultSatifyCode = visitDe.OrgProcessingResults?.Key,
+										FirstSatisfactionCode = visit.Order.FirstVisitResultCode!,
+										ClientGuid = ""
+									});
+							}
+
+						}
                     }
-                }
+				}
                 break;
             case WorkflowModuleConsts.BulletinApply:
                 var bulletin = await _bulletinRepository.GetAsync(workflow.ExternalId, cancellationToken);
@@ -162,6 +196,16 @@ public class EndWorkflowHandler : INotificationHandler<EndWorkflowNotify>
                     }
                 }
                 break;
+            case WorkflowModuleConsts.OrderDelay:
+                var delay = await _orderDelayRepository.GetAsync(workflow.ExternalId, cancellationToken);
+                if (delay!=null)
+                {
+                    delay.DelayState = EDelayState.Pass;
+                    await _orderDelayRepository.UpdateAsync(delay, cancellationToken);
+
+                    //处理工单延期TODO
+                }
+                break;
         }
     }
 }

+ 10 - 2
src/Hotline.Application/Handlers/FlowEngine/RejectHandler.cs

@@ -24,6 +24,7 @@ public class RejectHandler : INotificationHandler<RejectNotify>
     private readonly IRepository<OrderScreen> _orderScreenRepository;
     private readonly IRepository<Bulletin> _bulletinRepository;
     private readonly IRepository<Circular> _circularRepository;
+    private readonly IRepository<OrderDelay> _orderDelayRepository;
 
 	public RejectHandler(
         IOrderDomainService orderDomainService,
@@ -33,7 +34,8 @@ public class RejectHandler : INotificationHandler<RejectNotify>
         ILogger<RejectHandler> logger,
         IRepository<OrderScreen> orderScreenRepository,
         IRepository<Bulletin> bulletinRepository,
-        IRepository<Circular> circularRepository)
+        IRepository<Circular> circularRepository,
+        IRepository<OrderDelay> orderDelayRepository)
     {
         _orderDomainService = orderDomainService;
         _orderRepository = orderRepository;
@@ -43,6 +45,7 @@ public class RejectHandler : INotificationHandler<RejectNotify>
         _orderScreenRepository = orderScreenRepository;
         _bulletinRepository = bulletinRepository;
         _circularRepository = circularRepository;
+        _orderDelayRepository = orderDelayRepository;
 	}
 
     /// <summary>Handles a notification</summary>
@@ -56,7 +59,12 @@ public class RejectHandler : INotificationHandler<RejectNotify>
         switch (workflow.ModuleCode)
         {
             case WorkflowModuleConsts.OrderDelay:
-
+                var delay = await _orderDelayRepository.GetAsync(workflow.ExternalId, cancellationToken);
+                if (delay!=null)
+                {
+                    delay.DelayState = EDelayState.NoPass;
+                    await _orderDelayRepository.UpdateAsync(delay, cancellationToken);
+                }
                 break;
             case WorkflowModuleConsts.OrderScreen:
 	            var screen = await _orderScreenRepository.GetAsync(workflow.ExternalId, cancellationToken);

+ 38 - 2
src/Hotline.Application/Mappers/CallMapperConfigs.cs

@@ -1,4 +1,7 @@
-using Mapster;
+using Hotline.CallCenter.Calls;
+using Hotline.Share.Dtos.TrCallCenter;
+using Hotline.Share.Enums.CallCenter;
+using Mapster;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -11,7 +14,40 @@ namespace Hotline.Application.Mappers
     {
         public void Register(TypeAdapterConfig config)
         {
-            //config
+            config.ForType<ReceiveCallRecordDto, TrCallRecord>()
+                .Map(d => d.User, x => x.user)
+                .Map(d => d.RecordingFileName, x => x.recording_file_name)
+                .Map(d => d.CallDirection, x => x.call_direction == "in" ? ECallDirection.In : ECallDirection.Out)
+                .Map(d => d.EndBy, x => x.hangup_side == "caller" ? EEndBy.From : (x.hangup_side == "callee" ? EEndBy.To : EEndBy.None))
+                .Map(d => d.CallAccept, x => x.call_accept)
+                .Map(d => d.CPN, x => x.caller_id_number)
+                .Map(d => d.CPNName, x => x.caller_id_name)
+                .Map(d=>d.CDPN,x=>x.destination_number)
+                .Map(d => d.RecordingFileUrl, x => x.recording_file_url)
+                .Map(d => d.CreatedTime, x => x.created_time)
+                .Map(d=> d.AnsweredTime,x=>x.answered_time)
+                //.IgnoreIf((s, d) => s.answered_time == null, d => d.AnsweredTime)
+                .Map(d => d.OverTime, x => x.over_time)
+                .Map(d => d.Gateway, x => x.gateway)
+                .Map(d => d.OtherStr, x => x.other_str)
+                .Map(d => d.OtherAccept, x => x.other_accept)
+                .Map(d => d.Status, x => x.status)
+                .Map(d=>d.BeginIvrTime,x=>x.beginIvrTime)
+                .Map(d=>d.EndIvrTime,x=>x.endIvrTime)
+                .Map(d=>d.BeginQueueTime,x=>x.beginQueueTime)
+                .Map(d=>d.EndQueueTime,x=>x.endQueueTime)
+                .Map(d=>d.BeginRingTime,x=>x.beginRingTime)
+                .Map(d=>d.EndRingTimg,x=>x.endRingTime)
+                //.IgnoreIf((s, d) => s.beginIvrTime == null, d => d.BeginIvrTime)
+                //.IgnoreIf((s, d) => s.endIvrTime == null, d => d.EndIvrTime)
+                //.IgnoreIf((s, d) => s.beginQueueTime == null, d => d.BeginQueueTime)
+                //.IgnoreIf((s, d) => s.endQueueTime == null, d => d.EndQueueTime)
+                //.IgnoreIf((s, d) => s.beginRingTime == null, d => d.BeginRingTime)
+                //.IgnoreIf((s, d) => s.endRingTime == null, d => d.EndRingTimg)
+                .Map(d => d.OlaQueue, x => x.ola_queue)
+                .Map(d => d.BatchAccept, x => x.batch_accept)
+                .Map(d => d.IvrDtmf, x => x.ivr_dtmf)
+                .Map(d => d.DtmfType, x => x.dtmf_type);
         }
     }
 }

+ 5 - 1
src/Hotline.Application/Mappers/OrderMapperConfigs.cs

@@ -91,7 +91,11 @@ public class OrderMapperConfigs : IRegister
             .Map(d => d.VoiceEvaluate, s => s.VoiceEvaluate)
             .Map(d => d.SeatEvaluate, s => s.SeatEvaluate);
 
-        
+        config.ForType<OrderDelay, OrderDelayDto>()
+            //.Inherits<Order, OrderDto>()
+            .IgnoreIf((s, d) => s.Employee == null, d => d.EmployeeName)
+            .IgnoreIf((s, d) => s.Workflow == null, d => d.CurrentStepName)
+            .IgnoreIf((s, d) => s.Workflow == null, d => d.ActualHandlerName);
 
     }
 }

+ 2 - 2
src/Hotline.Share/Dtos/Article/BulletinDto.cs

@@ -46,7 +46,7 @@ namespace Hotline.Share.Dtos.Article
         /// <summary>
         /// 流程ID
         /// </summary>
-        public string? WorkFlowId { get; set; }
+        public string? WorkflowId { get; set; }
 
         /// <summary>
         /// 发布范围(多选)  位枚举  EPushRange
@@ -160,7 +160,7 @@ namespace Hotline.Share.Dtos.Article
         /// <summary>
         /// 流程ID
         /// </summary>
-        public string? WorkFlowId { get; set; }
+        public string? WorkflowId { get; set; }
 
         /// <summary>
         /// 阅读明细

+ 1 - 1
src/Hotline.Share/Dtos/Order/OrderScreenDto.cs

@@ -174,7 +174,7 @@ namespace Hotline.Share.Dtos.Order
 		/// <summary>
 		/// 业务流程ID
 		/// </summary>
-		public string? WorkFlowId { get; set; }
+		public string? WorkflowId { get; set; }
 	}
 
 	public class PublishScreenDto {

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

@@ -7,6 +7,7 @@ using System.Threading.Tasks;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Settings;
 using Hotline.Share.Requests;
+using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.Order
 {
@@ -249,6 +250,121 @@ namespace Hotline.Share.Dtos.Order
         public List<string> FileIds { get; set; }
     }
 
+
+    public record OrderDelayDto
+    {
+        /// <summary>
+        /// 工单编号(冗余)
+        /// </summary>
+        public string No { get; set; }
+
+        /// <summary>
+        /// 工单ID
+        /// </summary>
+        public string OrderId { get; set; }
+
+        public OrderDto? Order { get; set; }
+
+        /// <summary>
+        /// 延期申请时间
+        /// </summary>
+        public DateTime ApplyDelayTime { get; set; }
+
+        /// <summary>
+        /// 申请部门Code
+        /// </summary>
+        public string ApplyOrgCode { get; set; }
+
+        /// <summary>
+        /// 申请部门名称
+        /// </summary>
+        public string ApplyOrgName { get; set; }
+
+        /// <summary>
+        /// 申请人
+        /// </summary>
+        public string EmployeeId { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public string? EmployeeName { get; set; }
+
+        /// <summary>
+        /// 延期申请时限
+        /// </summary>
+        public int DelayNum { get; set; }
+
+        /// <summary>
+        /// 延期申请单位
+        /// </summary>
+        public ETimeType DelayUnit { get; set; }
+
+        public string DelayUnitText => DelayUnit.GetDescription();
+
+        /// <summary>
+        /// 延期申请理由
+        /// </summary>
+        public string DelayReason { get; set; }
+
+        /// <summary>
+        /// 申请前期满时间
+        /// </summary>
+        public DateTime? BeforeDelay { get; set; }
+
+        /// <summary>
+        /// 申请后期满时间
+        /// </summary>
+        public DateTime? AfterDelay { get; set; }
+
+        /// <summary>
+        /// 审批状态
+        /// </summary>
+        public EDelayState DelayState { get; set; }
+
+        public string DelayStateText => DelayState.GetDescription();
+
+        /// <summary>
+        /// 是否省延期
+        /// </summary>
+        public bool IsProDelay { get; set; }
+
+        /// <summary>
+        /// 流程ID
+        /// </summary>
+        public string? WorkflowId { get; set; }
+
+        public DateTime CreationTime { get; set; }
+
+        public string Id { get; set; }
+
+        public string? CreatorId { get; set; }
+
+        public string? CreatorName { get; set; }
+
+        public string? CreatorOrgId { get; set; }
+
+        public string? CreatorOrgName { get; set; }
+
+        public int CreatorOrgLevel { get; set; }
+
+        /// <summary>
+        /// 一级部门Id
+        /// </summary>
+        public string? AreaId { get; set; }
+
+        /// <summary>
+        /// 当前办理节点
+        /// </summary>
+        public string? CurrentStepName { get; set; }
+        /// <summary>
+        /// 当前办理人
+        /// </summary>
+        public string? ActualHandlerName { get; set; }
+    }
+
+
+
     public record DelayCalcEndTimeDto
     {
         public DateTime BeginTime { get; set; }
@@ -289,7 +405,7 @@ namespace Hotline.Share.Dtos.Order
 		/// <summary>
 		/// 甄别申请状态
 		/// </summary>
-		public EScreenStatus Status { get; set; }
+		public EScreenStatus? Status { get; set; }
 
 		public DateTime? CreationTimeStart { get; set; }
 	    public DateTime? CreationTimeEnd { get; set; }

+ 1 - 1
src/Hotline.Share/Dtos/Quality/QualityDto.cs

@@ -47,7 +47,7 @@ namespace Hotline.Share.Dtos.Quality
 		/// <summary>
 		/// 质检明细
 		/// </summary>
-		public List<QualityDetailDto> QualityDetails { get; set; }
+		public List<QualityDetailDto> QualityDetails { get; set; } = new List<QualityDetailDto>();	
 	}
 	public class UpdateQualityDto : QualityAddDto
 	{

+ 6 - 0
src/Hotline.Share/Enums/CallCenter/EEndBy.cs

@@ -18,4 +18,10 @@ public enum EEndBy
     /// </summary>
     [Description("被叫方结束")]
     To = 1,
+
+    /// <summary>
+    /// 其他位置情况
+    /// </summary>
+    [Description("其他未知情况")]
+    None = 2,
 }

+ 7 - 2
src/Hotline.Share/Mq/EventNames.Order.cs

@@ -39,9 +39,14 @@ namespace Hotline.Share.Mq
         public const string HotlineOrderScreenApply = "hotline.order.screen.apply";
 
         /// <summary>
-        /// 督办过程
+        /// 甄别申请完成
         /// </summary>
-        public const string HotlineOrderSuperviseCourse = "hotline.order.supervise.course";
+        public const string HotlineOrderScreenApplyed = "hotline.order.screen.applyed";
+
+		/// <summary>
+		/// 督办过程
+		/// </summary>
+		public const string HotlineOrderSuperviseCourse = "hotline.order.supervise.course";
 
         /// <summary>
         /// 督办结果

+ 1 - 1
src/Hotline/Article/Bulletin.cs

@@ -58,7 +58,7 @@ namespace Hotline.Article
         /// <summary>
         /// 流程ID
         /// </summary>
-        public string? WorkFlowId { get; set; }
+        public string? WorkflowId { get; set; }
 
         /// <summary>
         /// 阅读量+1

+ 1 - 1
src/Hotline/Article/Circular.cs

@@ -78,7 +78,7 @@ namespace Hotline.Article
         /// <summary>
         /// 流程ID
         /// </summary>
-        public string? WorkFlowId { get; set; }
+        public string? WorkflowId { get; set; }
 
         /// <summary>
         /// 阅读明细

+ 1 - 1
src/Hotline/CallCenter/Calls/TrCallRecord.cs

@@ -57,7 +57,7 @@ namespace Hotline.CallCenter.Calls
         /// <summary>
         /// 线路号
         /// </summary>
-        public string gateway { get; set; }
+        public string Gateway { get; set; }
         /// <summary>
         /// 呼出时自定义的内容
         /// </summary>

+ 6 - 2
src/Hotline/Orders/OrderDelay.cs

@@ -1,4 +1,5 @@
-using Hotline.Share.Enums.Order;
+using Hotline.FlowEngine.Workflows;
+using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Settings;
 using Hotline.Users;
 using SqlSugar;
@@ -98,6 +99,9 @@ namespace Hotline.Orders
         /// <summary>
         /// 流程ID
         /// </summary>
-        public string? WorkFlowId { get; set; }
+        public string? WorkflowId { get; set; }
+
+        [Navigate(NavigateType.OneToOne, nameof(WorkflowId))]
+        public Workflow Workflow { get; set; }
     }
 }

+ 7 - 1
src/Hotline/Orders/OrderScreen.cs

@@ -90,7 +90,13 @@ namespace Hotline.Orders
 		/// 业务流程ID
 		/// </summary>
 		[SugarColumn(ColumnDescription = "业务流程ID")]
-		public string? WorkFlowId {  get; set; }
+		public string? WorkflowId {  get; set; }
+
+		/// <summary>
+		/// 是否推送省上
+		/// </summary>
+		[SugarColumn(ColumnDescription = "是否推送省上")]
+		public bool? Publish { get; set; } = false;
 
 	}
 }

+ 1 - 0
src/Tr.Sdk/TrConfiguration.cs

@@ -5,4 +5,5 @@ public class TrConfiguration
     public string Address { get; set; }
     public string Username { get; set; }
     public string Password { get; set; }
+    public string Ip { get; set; }
 }

+ 1 - 2
src/XF.Domain.Repository/Entity.cs

@@ -22,8 +22,7 @@ public abstract class Entity : IEntity<string>, IDomainEvents, IDataPermission,
 
     public string? CreatorOrgName { get; set; }
 
-    [SugarColumn(DefaultValue = "0")]
-    public int CreatorOrgLevel { get; set; }
+    public int CreatorOrgLevel { get; set; } = 0;
 
     /// <summary>
     /// 一级部门Id