Parcourir la source

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

xf il y a 6 mois
Parent
commit
74d90010b4

+ 9 - 8
src/Hotline.Api/Controllers/CommonPController.cs

@@ -256,13 +256,13 @@ namespace Hotline.Api.Controllers
 					})
 					.ToListAsync();
 				var waitedList = waitedDataList.Where(x => x.Status != EOrderStatus.Countersigning && 
-				((x.Time > DateTime.Now && x.Status < EOrderStatus.Filed) || (x.Time > x.ActualHandleTime && x.Status >= EOrderStatus.Filed))).Take(40).ToList();
+				((x.Time > DateTime.Now && x.Status < EOrderStatus.Filed) || (x.Time > x.ActualHandleTime && x.Status >= EOrderStatus.Filed))).OrderBy(x=> x.Time).Take(40).ToList();
 				waitedList = waitedList.Count > 0 ? waitedList.Copy() : waitedList;
 				//allNum += waitedList.Count > 40 ? 40 : waitedList.Count;
 				//allList.AddRange(waitedList);
 				// 已超期
 				var waitedExpiredDataList = waitedDataList.Where(x => (x.Time < DateTime.Now && x.Status < EOrderStatus.Filed) ||
-				                                                      (x.Time < x.ActualHandleTime && x.Status >= EOrderStatus.Filed)).Take(40).ToList();
+				                                                      (x.Time < x.ActualHandleTime && x.Status >= EOrderStatus.Filed)).OrderBy(x=>x.Time).Take(40).ToList();
 				waitedExpiredDataList = waitedExpiredDataList.Count > 0 ? waitedExpiredDataList.Copy() : waitedExpiredDataList;
 				waitedExpiredDataList.ForEach(x => x.Type = "WaitedExpired");
 				//allNum += waitedExpiredDataList.Count;
@@ -290,7 +290,7 @@ namespace Hotline.Api.Controllers
 				//allNum += visitDataList.Count;
 				//allList.AddRange(visitDataList);
 				//会签待办
-				var signDataList = waitedDataList.Where(x => x.Status == EOrderStatus.Countersigning).Take(40).ToList();
+				var signDataList = waitedDataList.Where(x => x.Status == EOrderStatus.Countersigning).OrderBy(x => x.Time).Take(40).ToList();
 				signDataList = signDataList.Count > 0 ? signDataList.Copy() : signDataList;
 				signDataList.ForEach(x => x.Type = "Sign");
 				//allNum += signDataList.Count;
@@ -325,7 +325,7 @@ namespace Hotline.Api.Controllers
 						                (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId))))
 						.Any())
 					.Where(d => d.Status < EOrderStatus.Filed && DateTime.Now > d.NearlyExpiredTime && DateTime.Now < d.ExpiredTime)
-					.OrderByDescending(d => d.CreationTime)
+					.OrderBy(d => d.NearlyExpiredTime)
 					.Select(d => new HomeOrderDto
 					{
 						No = d.No,
@@ -436,19 +436,20 @@ namespace Hotline.Api.Controllers
 					})
 					.ToListAsync();
 				var waitedList = waitedDataList.Where(x => x.Status != EOrderStatus.Countersigning &&
-				((x.Time > DateTime.Now && x.Status < EOrderStatus.Filed) || (x.Time > x.ActualHandleTime && x.Status >= EOrderStatus.Filed))).Take(40).ToList();
+				((x.Time > DateTime.Now && x.Status < EOrderStatus.Filed) || (x.Time > x.ActualHandleTime && x.Status >= EOrderStatus.Filed))).OrderBy(x=>x.Time).Take(40).ToList();
 				waitedList = waitedList.Count > 0 ? waitedList.Copy() : waitedList;
 				//allNum += waitedList.Count > 40 ? 40 : waitedList.Count;
 				//allList.AddRange(waitedList);
 				//已超期
 				var waitedExpiredDataList = waitedDataList.Where(x => (x.Time < DateTime.Now && x.Status < EOrderStatus.Filed) ||
-				                                                      (x.Time < x.ActualHandleTime && x.Status >= EOrderStatus.Filed)).Take(40).ToList();
+				                                                      (x.Time < x.ActualHandleTime && x.Status >= EOrderStatus.Filed))
+														  .OrderBy(x=> x.Time).Take(40).ToList();
 				waitedExpiredDataList = waitedExpiredDataList.Count > 0 ? waitedExpiredDataList.Copy() : waitedExpiredDataList;
 				waitedExpiredDataList.ForEach(x => x.Type = "WaitedExpired");
 				//allNum += waitedExpiredDataList.Count;
 				//allList.AddRange(waitedExpiredDataList);
 				//会签待办
-				var signDataList = waitedDataList.Where(x => x.Status == EOrderStatus.Countersigning).Take(40).ToList();
+				var signDataList = waitedDataList.Where(x => x.Status == EOrderStatus.Countersigning).OrderBy(x => x.Time).Take(40).ToList();
 				signDataList = signDataList.Count > 0 ? signDataList.Copy() : signDataList;
 				signDataList.ForEach(x => x.Type = "Sign");
 				
@@ -554,7 +555,7 @@ namespace Hotline.Api.Controllers
 						                (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId))))
 						.Any())
 					.Where(d => d.Status < EOrderStatus.Filed && DateTime.Now > d.NearlyExpiredTime && DateTime.Now < d.ExpiredTime)
-					.OrderByDescending(d => d.CreationTime)
+					.OrderBy(d => d.NearlyExpiredTime)
 					.Select(d => new HomeOrderDto
 					{
 						No = d.No,

+ 81 - 2
src/Hotline.Api/Controllers/DataSharingController.cs

@@ -16,6 +16,7 @@ using Hotline.Share.Enums.Article;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Push;
+using Hotline.WebPortal;
 using MapsterMapper;
 using MediatR;
 using Microsoft.AspNetCore.Authorization;
@@ -40,6 +41,7 @@ namespace Hotline.Api.Controllers
         private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
         private readonly IRepository<Hotspot> _hotspotTypeRepository;
         private readonly IMediator _mediator;
+        private readonly IRepository<OldPublicData> _oldPublicDataRepository;
 
         /// <summary>
         /// 
@@ -52,6 +54,7 @@ namespace Hotline.Api.Controllers
         /// <param name="workflowTraceRepository"></param>
         /// <param name="hotspotTypeRepository"></param>
         /// <param name="mediator"></param>
+        /// <param name="oldPublicDataRepository"></param>
         public DataSharingController(IMapper mapper,
             IOrderRepository orderRepository,
             IRepository<Bulletin> bulletinRepository,
@@ -59,7 +62,8 @@ namespace Hotline.Api.Controllers
             ISystemDicDataCacheManager sysDicDataCacheManager,
             IRepository<WorkflowTrace> workflowTraceRepository,
             IRepository<Hotspot> hotspotTypeRepository,
-            IMediator mediator)
+            IMediator mediator,
+            IRepository<OldPublicData> oldPublicDataRepository)
         {
             _mapper = mapper;
             _orderRepository = orderRepository;
@@ -69,6 +73,7 @@ namespace Hotline.Api.Controllers
             _workflowTraceRepository = workflowTraceRepository;
             _hotspotTypeRepository = hotspotTypeRepository;
             _mediator = mediator;
+            _oldPublicDataRepository = oldPublicDataRepository;
         }
 
         /// <summary>
@@ -193,6 +198,80 @@ namespace Hotline.Api.Controllers
             return new PagedDto<PublishDto>(total, _mapper.Map<IReadOnlyList<PublishDto>>(items));
         }
 
+        /// <summary>
+        /// 查询工单发布后公开的数据
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("get_order_list_publish_all")]
+        [AllowAnonymous]
+        public async Task<PagedDto<PublishOrderAllDto>> GetOrderByListAllOpen([FromBody] GetOrderList dto)
+        {
+            var queryNew = _orderRepository.Queryable()
+                .Where(p => p.IsPublicity == true)
+                .WhereIF(!string.IsNullOrEmpty(dto.No), p => p.No == dto.No)
+                .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Title.Contains(dto.Title))
+                .WhereIF(!string.IsNullOrEmpty(dto.Mobile), p => p.Contact.Contains(dto.Mobile))
+                .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), p => p.AcceptTypeCode == dto.AcceptTypeCode)
+                .WhereIF(dto.StartTime.HasValue, p => p.CreationTime >= dto.StartTime)
+                .WhereIF(dto.EndTime.HasValue, p => p.CreationTime < dto.EndTime)
+                .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), p => p.AreaCode == dto.AreaCode)
+                .OrderByDescending(p => p.CreationTime)
+               .Select(p => new PublishOrderAllDto
+               {
+                   OrderId = p.Id,
+                   FromName = p.FromName,
+                   Contact = p.Contact,
+                   OrderNo = p.No,
+                   Title = p.Title,
+                   SourceChannel = p.SourceChannel,
+                   SourceChannelCode = p.SourceChannelCode,
+                   AcceptType = p.AcceptType,
+                   AcceptTypeCode = p.AcceptTypeCode,
+                   HotspotName = p.HotspotName,
+                   Content = p.Content,
+                   State = p.Status >= EOrderStatus.Filed ? "办理完成" : "办理中",
+                   ActualOpinion = p.ActualOpinion,
+                   AcceptTime = p.CreationTime,
+                   PubDate = p.OrderPublish.CreationTime,
+                   FiledTime = p.FiledTime
+               });
+
+            var queryold = _oldPublicDataRepository.Queryable()
+                      .WhereIF(!string.IsNullOrEmpty(dto.No), p => p.OrderNo == dto.No)
+                      .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Title.Contains(dto.Title))
+                      .WhereIF(!string.IsNullOrEmpty(dto.Mobile), p => p.Contact.Contains(dto.Mobile))
+                      .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), p => p.AcceptTypeCode == dto.AcceptTypeCode)
+                      .WhereIF(dto.StartTime.HasValue, p => p.PubDate >= dto.StartTime)
+                      .WhereIF(dto.EndTime.HasValue, p => p.PubDate < dto.EndTime)
+                      .OrderByDescending(p => p.PubDate)
+                       .Select(p => new PublishOrderAllDto
+                       {
+                           OrderId = p.OrderId,
+                           FromName = p.FromName,
+                           Contact = p.Contact,
+                           OrderNo = p.OrderNo,
+                           Title = p.Title,
+                           SourceChannel = p.SourceChannel,
+                           SourceChannelCode = p.SourceChannelCode,
+                           AcceptType = p.AcceptType,
+                           AcceptTypeCode = p.AcceptTypeCode,
+                           HotspotName = p.HotspotName,
+                           Content = p.Content,
+                           State = p.State == "1" ? "办理完成" : "办理中",
+                           ActualOpinion = p.ActualOpinion,
+                           AcceptTime = p.CreationTime,
+                           PubDate = p.PubDate,
+                           FiledTime = p.FiledTime
+                       });
+
+            var (total, items) = await _orderRepository.UnionAll(queryNew, queryold)
+                .OrderByDescending(p => p.PubDate)
+                 .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+
+            return new PagedDto<PublishOrderAllDto>(total, items);
+        }
+
         /// <summary>
         /// 根据工单编号和密码查询流程
         /// </summary>
@@ -379,7 +458,7 @@ namespace Hotline.Api.Controllers
             if (dto.SendType == "2")
             {
                 messageDto.TemplateCode = "1011";
-                messageDto.PushBusiness= EPushBusiness.OrderExpire;
+                messageDto.PushBusiness = EPushBusiness.OrderExpire;
             }
 
             await _mediator.Publish(new PushMessageNotify(messageDto), HttpContext.RequestAborted);

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

@@ -432,9 +432,9 @@ namespace Hotline.Api.Controllers
                 var result = Newtonsoft.Json.JsonConvert.DeserializeObject<HotlineStateResult>(respContentString);
                 return result?.Result;
             }
-            catch
+            catch (Exception ex)
             {
-                throw UserFriendlyException.SameMessage("账号加密失败!");
+                throw UserFriendlyException.SameMessage("账号加密失败!"+ex.Message);
             }
         }
     }

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

@@ -347,7 +347,7 @@ public class OrderController : BaseController
         foreach (var item in dto.Ids)
         {
             var order = await _orderRepository.GetAsync(item, HttpContext.RequestAborted);
-            if (order != null)
+            if (order != null &&  order.Status == EOrderStatus.Filed)
             {
                 try
                 {
@@ -2153,6 +2153,18 @@ public class OrderController : BaseController
             }
         }
 
+        var order = await _orderRepository.GetAsync(dto.Data.OrderId, HttpContext.RequestAborted);
+        if (order.IsProvince)
+        {
+			var orderAny = await _orderScreenRepository.AnyAsync(x =>
+				x.OrderId == dto.Data.OrderId &&
+				(x.Status == EScreenStatus.Apply || x.Status == EScreenStatus.Approval));
+			if (orderAny)
+			{
+				throw UserFriendlyException.SameMessage("当前工单为省工单,已发起甄别申请,请等待省上返回结果!");
+			}
+		}
+
         var model = _mapper.Map<OrderScreen>(dto.Data);
         model.Status = EScreenStatus.Approval;
         model.ApplyEndTime = endTime;
@@ -3529,8 +3541,11 @@ public class OrderController : BaseController
             var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
             if (dto.Workflow.BusinessType == EBusinessType.Send && averageSendOrder)
             {
-                var handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
-                dto.Workflow.NextHandlers = new List<FlowStepHandler> { handler };
+	            if (!dto.Workflow.NextHandlers.Any())
+	            {
+					var handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
+					dto.Workflow.NextHandlers = new List<FlowStepHandler> { handler };
+				}
             }
 
             var startDto = _mapper.Map<StartWorkflowDto>(dto.Workflow);

+ 2 - 2
src/Hotline.Application/Handlers/FlowEngine/WorkflowRecallHandler.cs

@@ -78,7 +78,8 @@ public class WorkflowRecallHandler : INotificationHandler<RecallNotify>
                         withExtension: true, cancellationToken: cancellationToken);
                     //order.UpdateHandlingStatus(workflow.IsInCountersign);
                     _mapper.Map(workflow, order);
-                    if (notification.TargetStep.StepType is EStepType.Start)
+                    order.FileEmpty();
+					if (notification.TargetStep.StepType is EStepType.Start)
                     {
                         //if (!bool.TryParse(
                         //        _systemSettingCacheManager.GetSetting(SettingConstants.IsRecallToSeatDesignated)?.SettingValue[0],
@@ -86,7 +87,6 @@ public class WorkflowRecallHandler : INotificationHandler<RecallNotify>
                         //    isRecallToSeatDesignated = false;
                         //var isRecallToSeatDesignated = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsRecallToSeatDesignated).SettingValue[0]);
                         order.Status = EOrderStatus.SpecialToUnAccept;
-                        order.FileEmpty();
                         //if (isRecallToSeatDesignated)
                         //{
                         //    if (data.HandlerType is EHandlerType.Role or EHandlerType.AssignedUser)

+ 44 - 4
src/Hotline.Application/Orders/OrderApplication.cs

@@ -66,6 +66,7 @@ using Hotline.EventBus;
 using Hotline.Orders.Notifications;
 using Hotline.OrderTranspond;
 using Newtonsoft.Json;
+using static NPOI.SS.Format.CellNumberFormatter;
 
 namespace Hotline.Application.Orders;
 
@@ -107,8 +108,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     private readonly ICalcExpireTime _expireTime;
     private readonly IRepository<OrderObserve> _orderObserveRepository;
     private readonly IOrderTerminateRepository _orderTerminateRepository;
+    private readonly IRepository<OrderPublishHistory> _orderPublishHistoryRepository;
 
-	public OrderApplication(
+    public OrderApplication(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         IWorkflowDomainService workflowDomainService,
@@ -143,7 +145,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         ISessionContextProvider sessionContextProvider,
         IRepository<TranspondCityRawData> transpondCityRawDataRepository,
         IRepository<OrderObserve> orderObserveRepository,
-        IOrderTerminateRepository orderTerminateRepository)
+        IOrderTerminateRepository orderTerminateRepository,
+        IRepository<OrderPublishHistory> orderPublishHistoryRepository)
     {
         _orderDomainService = orderDomainService;
         _workflowDomainService = workflowDomainService;
@@ -179,7 +182,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         _transpondCityRawDataRepository = transpondCityRawDataRepository;
         _orderObserveRepository = orderObserveRepository;
         _orderTerminateRepository = orderTerminateRepository;
-	}
+        _orderPublishHistoryRepository = orderPublishHistoryRepository;
+    }
 
     /// <summary>
     /// 更新工单办理期满时间(延期调用,其他不调用)
@@ -2367,9 +2371,45 @@ public class OrderApplication : IOrderApplication, IScopeDependency
 
             //特提(撤回至发起)
             if (!string.IsNullOrEmpty(order.WorkflowId))
+            {
                 //await _workflowDomainService.RecallToStartStepAsync(order.WorkflowId, "省工单重派", current, order.Status >= EOrderStatus.Filed, cancellationToken);
-                await _workflowDomainService.RecallToCenterFirstToSendAsync(order.WorkflowId, "省工单重派", order.Status >= EOrderStatus.Filed,
+                var isPaiDan = await _workflowDomainService.RecallToCenterFirstToSendAsync(order.WorkflowId, "省工单重派", order.Status >= EOrderStatus.Filed,
                     order.ExpiredTime, cancellationToken);
+                order.FileEmpty();
+                if (isPaiDan)
+                {
+                    order.Status = EOrderStatus.Handling;
+                }
+                else
+                {
+                    order.Status = EOrderStatus.WaitForAccept;
+                }
+                await _orderRepository.UpdateAsync(order, cancellationToken);
+                //处理回访和发布信息
+              
+                var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == order.Id);
+                if (publish != null)
+                {
+                    var publishHistory = _mapper.Map<OrderPublishHistory>(publish);
+                    publishHistory.OrderPublishId = publish.Id;
+                    publishHistory.ArrangeTitleAfter = publish.ArrangeTitle;
+                    publishHistory.ArrangeTitleBefor = publish.ArrangeTitle;
+                    publishHistory.ArrangeContentAfter = publish.ArrangeContent;
+                    publishHistory.ArrangeContentBefor = publish.ArrangeContent;
+                    publishHistory.ArrangeOpinionAfter = publish.ArrangeOpinion;
+                    publishHistory.ArrangeOpinionBefor = publish.ArrangeOpinion;
+                    await _orderPublishHistoryRepository.AddAsync(publishHistory, cancellationToken);
+                    await _orderPublishRepository.RemoveAsync(publish, false, cancellationToken);
+                }
+
+                var visit = await _orderVisitRepository.GetAsync(x => x.OrderId == order.Id&& x.VisitState != EVisitState.None);
+                if (visit != null)
+                {
+                    visit.VisitState = EVisitState.None;
+                    await _orderVisitRepository.UpdateAsync(visit,cancellationToken);
+                }
+
+            }
             //await _workflowDomainService.RecallToStartStepAsync(order.WorkflowId, "省工单重派", current, cancellationToken);
         }
         return _mapper.Map<AddOrderResponse>(order);

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

@@ -24,7 +24,7 @@ public class OrderVisitApplication : IOrderVisitApplication, IScopeDependency
         var query = _orderVisitRepository
             .Queryable()
             .WhereIF(dto.EmployeeName.NotNullOrEmpty(), m => m.Employee.Name.Contains(dto.EmployeeName))
-            .Where(m => m.VisitTime >= dto.StartTime && m.VisitTime <= dto.EndTime && m.VisitType != null)
+            .Where(m => m.VisitTime >= dto.StartTime && m.VisitTime <= dto.EndTime && m.VisitType != null && m.EmployeeId != "" && m.EmployeeId != null)
             .GroupBy(m => m.EmployeeId)
             .Select(m => new OrderVisitQuantityOutDto
             {

+ 33 - 2
src/Hotline.Application/Subscribers/DatasharingSubscriber.cs

@@ -31,6 +31,7 @@ using MapsterMapper;
 using Microsoft.AspNetCore.Http;
 using Microsoft.Extensions.Options;
 using Newtonsoft.Json;
+using SqlSugar;
 using XF.Domain.Authentications;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
@@ -297,8 +298,18 @@ namespace Hotline.Application.Subscribers
             }
             else
             {
-                await _workflowDomainService.RecallToCenterFirstToSendAsync(order.WorkflowId, dto.Opinion,
+                var isPaiDan = await _workflowDomainService.RecallToCenterFirstToSendAsync(order.WorkflowId, dto.Opinion,
                     order.Status >= EOrderStatus.Filed, order.ExpiredTime, cancellationToken);
+                order.FiledTime = null;
+                if (isPaiDan)
+                {
+                    order.Status = EOrderStatus.Handling;
+                }
+                else
+                {
+                    order.Status = EOrderStatus.WaitForAccept;
+                }
+                await _orderRepository.UpdateAsync(order, cancellationToken);
             }
         }
 
@@ -487,7 +498,27 @@ namespace Hotline.Application.Subscribers
                 orderScreen.FileJson =
                     await _fileRepository.AddFileAsync(dto.Files, orderScreen.Id, "", cancellationToken);
             await _orderScreenRepository.UpdateAsync(orderScreen, cancellationToken);
-        }
+            //多部门甄别回访 省上结果处理
+            if (orderScreen.Status == Share.Enums.Order.EScreenStatus.End)
+            {
+                var visitDetails = await _orderVisitedDetailRepository.Queryable().Where(x=>x.OrderVisit.OrderId == orderScreen.OrderId && x.VisitTarget == EVisitTarget.Org  && (
+	                SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
+	                SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2" ||
+	                SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
+	                SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
+                ) && x.Id != orderScreen.VisitDetailId).ToListAsync();
+                foreach (var visitDetail in visitDetails)
+                {
+					if (visitDetail != null)
+					{
+						var screenSatisfy = new Kv() { Key = "-1", Value = "视为满意" };
+						visitDetail.OrgProcessingResults = screenSatisfy;
+						visitDetail.OrgHandledAttitude = screenSatisfy;
+						await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken);
+					}
+				}
+            }
+		}
 
         /// <summary>
         /// 更新工单受理附件

+ 80 - 0
src/Hotline.Share/Dtos/Order/PublishedDto.cs

@@ -606,4 +606,84 @@ public record AboutToExpireListDto : PagedKeywordRequest
     /// 0 全部  1 是  2 否
     /// </summary>
     public int? Delay { get; set; }
+}
+
+public class PublishOrderAllDto
+{
+    /// <summary>
+    /// 工单id
+    /// </summary>
+    public string OrderId { get; set; }
+
+    /// <summary>
+    /// 来电/信人姓名
+    /// </summary>
+    public string? FromName { get; set; }
+
+    /// <summary>
+    /// 联系电话
+    /// </summary>
+    public string? Contact { get; set; }
+
+    /// <summary>
+    /// 工单编号
+    /// </summary>
+    public string OrderNo { get; set; }
+
+    /// <summary>
+    /// 工单标题
+    /// </summary>
+    public string Title { get; set; }
+
+    /// <summary>
+    /// 来源渠道(电话、网站、APP等)
+    /// </summary>
+    public string? SourceChannel { get; set; }
+
+    public string? SourceChannelCode { get; set; }
+
+    /// <summary>
+    /// 受理类型(咨询、投诉等)
+    /// </summary>
+    public string? AcceptType { get; set; }
+
+    /// <summary>
+    /// 受理类型代码
+    /// </summary>
+    public string? AcceptTypeCode { get; set; }
+
+    /// <summary>
+    /// 热点名称
+    /// </summary>
+    public string? HotspotName { get; set; }
+
+    /// <summary>
+    /// 诉求内容
+    /// </summary>
+    public string Content { get; set; }
+
+    /// <summary>
+    /// 工单状态 0:办理中;1办理完成
+    /// </summary>
+    public string State { get; set; }
+
+    /// <summary>
+    /// 实际办理意见(办理中...or 最终办理意见)
+    /// </summary>
+    public string ActualOpinion { get; set; }
+
+    /// <summary>
+    /// 工单创建时间
+    /// </summary>
+    public DateTime? AcceptTime { get; set; }
+
+    /// <summary>
+    /// 发布时间
+    /// </summary>
+    public DateTime? PubDate { get; set; }
+
+    /// <summary>
+    /// 归档时间
+    /// </summary>
+    public DateTime? FiledTime { get; set; }
 }

+ 3 - 3
src/Hotline.Share/Enums/Order/EComplainType.cs

@@ -27,9 +27,9 @@ public enum EComplainType
     [Description("赔偿损失")]
     Compensation = 7,
 
-    [Description("停止侵权")]
+    [Description("停止侵权、核定侵权责任")]
     StopInfringement = 8,
 
-    [Description("核定侵权责任")]
-    AuthorizedInfringement = 9
+    //[Description("核定侵权责任")]
+    //AuthorizedInfringement = 9
 }

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

@@ -25,7 +25,7 @@ namespace Hotline.Caching.Services
             {
                 var dbsetting = _systemSettingRepository.GetAsync(d => d.Code == code).GetAwaiter().GetResult();
                 if (dbsetting == null)
-                    throw new UserFriendlyException("无效系统设置");
+                    throw new UserFriendlyException($"{code} 无效系统设置");
                 return dbsetting;
             });
             return setting;

+ 1 - 1
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -84,7 +84,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 特提至中心(优先派单组其次坐席)
         /// </summary>
         /// <returns></returns>
-        Task RecallToCenterFirstToSendAsync(string workflowId, string opinion, bool isOrderFiled, DateTime? expiredTime,
+        Task<bool> RecallToCenterFirstToSendAsync(string workflowId, string opinion, bool isOrderFiled, DateTime? expiredTime,
             CancellationToken cancellationToken);
 
         ///// <summary>

+ 5 - 2
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -1180,10 +1180,11 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 特提至中心(优先派单组其次坐席)
         /// </summary>
-        /// <returns></returns>
-        public async Task RecallToCenterFirstToSendAsync(string workflowId, string opinion, bool isOrderFiled,
+        /// <returns>true 派单组  false 话务部</returns>
+        public async Task<bool> RecallToCenterFirstToSendAsync(string workflowId, string opinion, bool isOrderFiled,
             DateTime? expiredTime, CancellationToken cancellationToken)
         {
+            bool isPaiDan = true;
             var workflow = await GetWorkflowAsync(workflowId, withDefine: true, withSteps: true, withTraces: true, withCountersigns: true,
                 cancellationToken: cancellationToken);
             var sendStep = workflow.Steps.FirstOrDefault(d => d.BusinessType == EBusinessType.Send);
@@ -1255,7 +1256,9 @@ namespace Hotline.FlowEngine.Workflows
                 //flowAssignInfo.FlowAssignType = EFlowAssignType.Role;
                 await RecallAsync(workflow, dto, targetStepDefine, flowAssignInfo, EWorkflowTraceType.Recall, expiredTime, isOrderFiled,
                     cancellationToken);
+                isPaiDan = false;
             }
+            return isPaiDan;
         }
 
         //private async Task RecallToTargetStepAsync(Workflow workflow, WorkflowStep targetStep, string opinion, ISessionContext current,