Dun.Jason 1 gadu atpakaļ
vecāks
revīzija
ee80a07b72

+ 4 - 2
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -321,7 +321,7 @@ namespace Hotline.Api.Controllers
 			var knowledge = await _knowledgeDomainService.KnowledgeInfo(Id, HttpContext.RequestAborted);
 			if (knowledge is null)
 				throw UserFriendlyException.SameMessage("知识查询失败!");
-			knowledge.IsCanHandle = knowledge.Workflow.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId);
+			if (knowledge.Workflow != null ) knowledge.IsCanHandle = knowledge.Workflow.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId);
 			//转化
 			var knowledgeShowInfoDto = _mapper.Map<KnowledgeInfoDto>(knowledge);
 
@@ -460,7 +460,7 @@ namespace Hotline.Api.Controllers
 				.WhereIF(!string.IsNullOrEmpty(pagedDto.CreateOrgId), x => x.HotspotType.CreatorId != null && x.HotspotType.CreatorId.EndsWith(pagedDto.CreateOrgId!))
 				.OrderByDescending(d => d.CreationTime)
 				.ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize, HttpContext.RequestAborted);
-			temp.ForEach(x => x.IsCanHandle = x.Workflow.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId));
+			//temp.ForEach(x => x.IsCanHandle = x.Workflow.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId));
 			//返回数据
 			return new PagedDto<KnowledgeDataDto>(total, _mapper.Map<IReadOnlyList<KnowledgeDataDto>>(temp));
 		}
@@ -493,6 +493,7 @@ namespace Hotline.Api.Controllers
 				.Includes(x => x.KnowledgeType)
 				.Includes(x => x.HotspotType)
 				.Where(x => x.IsDeleted == false)
+				.Where(x=>x.Status == EKnowledgeStatus.OnShelf)
 				.WhereIF(pagedDto.RetrievalType == EKnowledgeRetrievalType.All && !string.IsNullOrEmpty(pagedDto.Keyword), d => d.Title.Contains(pagedDto.Keyword!) || d.Content.Contains(pagedDto.Keyword!))// || d.Additions.Contains(pagedDto.Keyword)
 				.WhereIF(pagedDto.RetrievalType == EKnowledgeRetrievalType.Title && !string.IsNullOrEmpty(pagedDto.Keyword), d => d.Title.Contains(pagedDto.Keyword!))
 				.WhereIF(pagedDto.RetrievalType == EKnowledgeRetrievalType.Content && !string.IsNullOrEmpty(pagedDto.Keyword), d => d.Content.Contains(pagedDto.Keyword!))
@@ -1026,6 +1027,7 @@ namespace Hotline.Api.Controllers
 		{
 			var (total, items) = await _knowledgeCollectRepository.Queryable()
 				.Includes(x=>x.Knowledge)
+				.Includes(x=>x.Knowledge,t=>t.KnowledgeType)
 				.WhereIF(!string.IsNullOrEmpty(dto.Keyword),x=>x.Knowledge.Title.Contains(dto.Keyword!)||( x.Knowledge.Summary != null &&  x.Knowledge.Summary.Contains(dto.Keyword!)))
 				.Where(x=>x.CreatorId == _sessionContext.UserId)
 				.OrderByDescending(x => x.CreationTime)

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

@@ -36,6 +36,7 @@ using XF.Utility.EnumExtensions;
 using Microsoft.IdentityModel.Tokens;
 using System.Linq;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
+using System.Diagnostics;
 using System.Transactions;
 
 namespace Hotline.Api.Controllers;
@@ -82,6 +83,8 @@ public class OrderController : BaseController
     private readonly IRepository<OrderVisitApply> _orderVisitApplyRepository;
     private readonly IRepository<OrderFinality> _orderFinalityRepository;
     private readonly IRepository<OrderSendBack> _orderSendBackRepository;
+    private readonly IRepository<OrderSpecial> _orderSpecialRepository;
+    private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
 
 
 
@@ -122,7 +125,9 @@ public class OrderController : BaseController
         IRepository<OrderObserve> orderObserveRepository,
         IRepository<OrderFinality> orderFinalityRepository,
         IRepository<OrderVisitApply> orderVisitApplyRepository,
-        IRepository<OrderSendBack> orderSendBackRepository
+        IRepository<OrderSendBack> orderSendBackRepository,
+        IRepository<OrderSpecial> orderSpecialRepository,
+        IRepository<WorkflowTrace> workflowTraceRepository
 	)
     {
         _orderDomainService = orderDomainService;
@@ -162,8 +167,8 @@ public class OrderController : BaseController
         _orderFinalityRepository = orderFinalityRepository;
         _orderVisitApplyRepository = orderVisitApplyRepository;
         _orderSendBackRepository = orderSendBackRepository;
-
-
+        _orderSpecialRepository = orderSpecialRepository;
+        _workflowTraceRepository = workflowTraceRepository;
 	}
 
     #region 工单发布
@@ -1111,16 +1116,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, "Value") == "不满意" || SqlFunc.JsonField(d.OrgProcessingResults, "Value") == "非常不满意" ||
-                    SqlFunc.JsonField(d.OrgHandledAttitude, "Value") == "不满意" || SqlFunc.JsonField(d.OrgHandledAttitude, "Value") == "非常不满意"
+                    SqlFunc.JsonField(d.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(d.OrgProcessingResults, "Key") == "2" ||
+                    SqlFunc.JsonField(d.OrgHandledAttitude, "Key") == "1" || SqlFunc.JsonField(d.OrgHandledAttitude, "Key") == "2"
                 ));
         }
         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, "Value") == "不满意" || SqlFunc.JsonField(d.OrgProcessingResults, "Value") == "非常不满意" ||
-                    SqlFunc.JsonField(d.OrgHandledAttitude, "Value") == "不满意" || SqlFunc.JsonField(d.OrgHandledAttitude, "Value") == "非常不满意"
+                    SqlFunc.JsonField(d.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(d.OrgProcessingResults, "Key") == "2" ||
+                    SqlFunc.JsonField(d.OrgHandledAttitude, "Key") == "1" || SqlFunc.JsonField(d.OrgHandledAttitude, "Key") == "2"
                 ));
         }
         var (total, items) = await query
@@ -1977,12 +1982,14 @@ public class OrderController : BaseController
     [HttpGet("send_back")]
 	public async Task<PagedDto<OrderSendBackDto>> UrgeList([FromQuery] OrderSendBackListDto dto)
 	{
-		var (total, items) = await _orderSendBackRepository.Queryable()
-			.Includes(x => x.Order)
-			.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-				d => d.Order.Title.Contains(dto.Keyword!) || d.Order.No.Contains(dto.Keyword!))
-			.WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
-			.WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
+        var (total, items) = await _orderSendBackRepository.Queryable()
+            .Includes(x => x.Order)
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
+                d => d.Order.Title.Contains(dto.Keyword!) || d.Order.No.Contains(dto.Keyword!))
+            .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
+            .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
+            .WhereIF(dto.State is > 0, d => d.State > 0)
+            .WhereIF(dto.State is 0, d => d.State == 0)
 			.OrderByDescending(x => x.CreationTime)
 			.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 
@@ -2087,6 +2094,154 @@ public class OrderController : BaseController
 	#endregion
 
 	#region 工单特提
+
+	/// <summary>
+	/// 工单特提信息
+	/// </summary>
+	/// <param name="dtos"></param>
+	/// <returns></returns>
+	//[Permission(EPermission.AddCitizen)]
+	[HttpPost("special")]
+	public async Task Add([FromBody] OrderSpecialAddDto dto)
+	{
+        var specialAny =await _orderSpecialRepository.Queryable().Where(x => x.OrderId == dto.OrderId && x.State == 0).AnyAsync();
+        if(specialAny) throw UserFriendlyException.SameMessage("工单已存在待审批特提信息!");
+		var model = _mapper.Map<OrderSpecial>(dto);
+        model.OrgId = _sessionContext.OrgId;
+        model.OrgName = _sessionContext.OrgName;
+        if (!dto.Audit) model.State = 1;
+        await _orderSpecialRepository.AddAsync(model, HttpContext.RequestAborted);
+        if (model.State == 1)
+        {
+	        //TODO 调用流程
+        }
+	}
+
+	/// <summary>
+	/// 审批工单特提信息
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	//[Permission(EPermission.UpdateCitizen)]
+	[HttpPut("special")]
+	public async Task Update([FromBody] AuditOrderSpecialDto dto)
+	{
+		var special = await _orderSpecialRepository.GetAsync(dto.Id);
+		if (special is null) throw UserFriendlyException.SameMessage("无效特提审批信息!");
+		if (special.State != 0) throw UserFriendlyException.SameMessage("无效特提审批信息,特提审批信息错误,该信息已审核!");
+		_mapper.Map(dto, special);
+		await _orderSpecialRepository.UpdateAsync(special, HttpContext.RequestAborted);
+		if (special.State == 1)
+		{
+			//TODO 调用流程
+		}
+	}
+
+	/// <summary>
+	/// 获取工单特提信息列表
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	//[Permission(EPermission.CitizenList)]
+	[HttpGet("special/list")]
+	public async Task<PagedDto<OrderSpecialDto>> List([FromQuery] OrderSpecialListDto dto)
+	{
+		var (total, items) = await _orderSpecialRepository.Queryable()
+            .Includes(x=>x.Order)
+            .Includes(x=>x.Trace)
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword),x=>x.Order.No.Contains(dto.Keyword!) || x.Order.Title.Contains(dto.Keyword!))
+            .WhereIF(dto.State.HasValue, x=>x.State == dto.State)
+			.OrderByDescending(x => x.CreationTime)
+			.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+		return new PagedDto<OrderSpecialDto>(total, _mapper.Map<IReadOnlyList<OrderSpecialDto>>(items));
+	}
+
+	/// <summary>
+	/// 工单列表
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	[HttpGet("special/apply_list")]
+	public async Task<PagedDto<OrderDto>> SpecialList([FromQuery] QueryOrderDto dto)
+	{
+        var query = _orderRepository.Queryable()
+           .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
+               d => d.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
+           .WhereIF(!string.IsNullOrEmpty(dto.Content), d => d.Content.Contains(dto.Content!))
+           .WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptType))
+           .WhereIF(dto.Channels.Any(), d => dto.Channels.Contains(d.SourceChannel))
+           .WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId))
+           .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone.Contains(dto.TransferPhone!))
+           .WhereIF(dto.OrgCodes.Any(), d => dto.OrgCodes.Contains(d.Workflow.ActualHandleOrgCode))
+           .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo),
+               d => d.AcceptorName.Contains(dto.NameOrNo!) || d.AcceptorStaffNo.Contains(dto.NameOrNo!))
+           .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
+           .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
+           .WhereIF(dto.EmergencyLevels.Any(), d => dto.EmergencyLevels.Contains(d.EmergencyLevel))
+           .WhereIF(!string.IsNullOrEmpty(dto.PhoneNo),
+               d => d.FromPhone.Contains(dto.PhoneNo!) || d.Contact.Contains(dto.PhoneNo!))
+           .WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.PushTypeCode == dto.PushTypeCode)
+           .WhereIF(dto.ExpiredTimeStart.HasValue, d => d.ExpiredTime >= dto.ExpiredTimeStart)
+           .WhereIF(dto.ExpiredTimeEnd.HasValue, d => d.ExpiredTime <= dto.ExpiredTimeEnd)
+           .WhereIF(dto.Statuses.Any(), d => dto.Statuses.Contains(d.Status))
+           .WhereIF(dto.Statuses.Any(d => d == EOrderStatus.BackToUnAccept), d => d.Status <= EOrderStatus.BackToUnAccept);
+        if (!_sessionContext.OrgIsCenter && _sessionContext.OrgId.Length >= 6)
+        {
+            var oneCode = _sessionContext.OrgId.Substring(0, 6);
+            query = query.Where(x => x.AcceptorOrgCode.StartsWith(oneCode) && !x.AcceptorOrgCode.StartsWith(_sessionContext.OrgId));
+        }
+        var (total, items) = await query
+			.OrderByDescending(d => d.CreationTime)
+			.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+		return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
+	}
+
+	/// <summary>
+	/// 获取工单特提信息
+	/// </summary>
+	/// <param name="id"></param>
+	/// <returns></returns>
+	//[Permission(EPermission.CitizenEntity)]
+	[HttpGet("special/{id}")]
+	public async Task<OrderSpecialDto> SpecialEntity(string id)
+	{
+		 var item = await _orderSpecialRepository.Queryable()
+			.Includes(x => x.Order)
+			.Includes(x => x.Trace)
+			.FirstAsync(x => x.Id == id);
+        return _mapper.Map<OrderSpecialDto>(item);
+	}
+
+	/// <summary>
+	/// 列表页面基础数据
+	/// </summary>
+	/// <returns></returns>
+	[HttpGet("special/base/{id}")]
+	public async Task<object> SpecialBaseData(string id)
+	{
+		var rsp = new
+		{
+			SpecialTimeType = EnumExts.GetDescriptions<ETimeType>(),
+			SpecialReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SpecialReason),
+			Traces = await _workflowTraceRepository.Queryable().Where(x=>x.WorkflowId == id).ToListAsync()
+		};
+		return rsp;
+	}
+
+    /// <summary>
+    /// 获取办理时限
+    /// </summary>
+    /// <param name="id"></param>
+    /// <returns></returns>
+	[HttpGet("special/handle_time")]
+	public async Task<int> SpecialHandleTime([FromQuery] OrderSpecialHandleTime dto) 
+    {
+        var order = await _orderRepository.GetAsync(dto.OrderId);
+        var trace = await _workflowTraceRepository.GetAsync(dto.TraceId);
+        var org = await _organizeRepository.GetAsync(trace.HandlerOrgId);
+        if (org != null && org.IsCenter) return _timeLimitDomainService.GetOrderTimeLimitConfig(string.Empty);
+        return _timeLimitDomainService.GetOrderTimeLimitConfig(order.AcceptTypeCode);
+	}
 	#endregion
 
 	#region  市民信息

+ 12 - 5
src/Hotline.Share/Dtos/Knowledge/KnowledgeDto.cs

@@ -78,7 +78,12 @@ namespace Hotline.Share.Dtos.Knowledge
         /// 流程Id
         /// </summary>
         public string? WorkflowId { get; set; }
-    }
+
+        /// <summary>
+        /// 是否可办理
+        /// </summary>
+        public bool? IsCanHandle { get; set; }
+	}
 
     /// <summary>
     /// 基础
@@ -90,10 +95,12 @@ namespace Hotline.Share.Dtos.Knowledge
         /// </summary>
         public string KnowledgeTypeId { get; set; }
 
-        /// <summary>
-        /// 热点
-        /// </summary>
-        public string HotspotId { get; set; }
+        public string KnowledgeTypeText => KnowledgeType != null ? KnowledgeType.SpliceName : "-";
+
+		/// <summary>
+		/// 热点
+		/// </summary>
+		public string HotspotId { get; set; }
 
         /// <summary>
         /// 标题

+ 17 - 2
src/Hotline.Share/Dtos/Order/OrderSendBackDto.cs

@@ -38,6 +38,11 @@ namespace Hotline.Share.Dtos.Order
 		/// </summary>
 		public int State { get; set; }
 
+		/// <summary>
+		/// 审核意见
+		/// </summary>
+		public string? AuditOpinion { get; set; }
+
 	}
 	public class OrderSendBackResultDto
 	{
@@ -92,6 +97,13 @@ namespace Hotline.Share.Dtos.Order
 		/// </summary>
 		public int State { get; set; }
 
+		public string StateText => State == 0 ? "待审核" : State == 1 ? "审核通过" : State == 2 ? "审核不通过" : "-";
+
+		/// <summary>
+		/// 审核意见
+		/// </summary>
+		public string? AuditOpinion { get; set; }
+
 		/// <summary>
 		/// 工单
 		/// </summary>
@@ -140,9 +152,12 @@ namespace Hotline.Share.Dtos.Order
 	{
 		public DateTime? CreationTimeStart { get; set; }
 		public DateTime? CreationTimeEnd { get; set; }
-	}
-
 
+		/// <summary>
+		///  审核结果  0  待审核  1 审核通过  2 审核不通过
+		/// </summary>
+		public int? State { get; set; }
+	}
 	public class PublishOrderSendBackDto
 	{
 		// <summary>

+ 199 - 2
src/Hotline.Share/Dtos/Order/OrderSpecialDto.cs

@@ -1,12 +1,209 @@
-using System;
+using Hotline.Share.Dtos.File;
+using Hotline.Share.Enums.Order;
+using Hotline.Share.Enums.Settings;
+using Hotline.Share.Requests;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
+using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.Order
 {
-	internal class OrderSpecialDto
+	public class OrderSpecialAddDto
 	{
+		public string OrderId { get; set; }
+
+		/// <summary>
+		/// 节点Id
+		/// </summary>
+		public string TraceId { get; set; }
+
+		/// <summary>
+		/// 特提原因
+		/// </summary>
+		public string? Cause { get; set; }
+
+		/// <summary>
+		/// 特提理由
+		/// </summary>
+		public string? Reason { get; set; }
+
+		/// <summary>
+		/// 是否审批
+		/// </summary>
+		public bool Audit { get; set; } = false;
+
+		/// <summary>
+		/// 办理时间限制(如:24小时、7个工作日)
+		/// </summary>
+		public int? TimeLimit { get; set; }
+
+		public ETimeType? TimeLimitUnit { get; set; } = ETimeType.WorkDay;
+
+		/// <summary>
+		/// 是否修改期满时间
+		/// </summary>
+		public bool AlterTime { get; set; }
+
+		/// <summary>
+		/// 附件列表
+		/// </summary>
+		public List<FileDto> Files { get; set; } = new();
+
+	}
+	public class AuditOrderSpecialDto
+	{
+		public string Id { get; set; }
+
+		/// <summary>
+		/// 节点Id
+		/// </summary>
+		public string TraceId { get; set; }
+
+		public string? OrgId { get; set; }
+
+		public string? OrgName { get; set; }
+
+		/// <summary>
+		///  审核结果  0  待审核  1 审核通过  2 审核不通过
+		/// </summary>
+		public int State { get; set; }
+
+		/// <summary>
+		/// 办理时间限制(如:24小时、7个工作日)
+		/// </summary>
+		public int? TimeLimit { get; set; }
+
+		public ETimeType? TimeLimitUnit { get; set; } = ETimeType.WorkDay;
+
+		/// <summary>
+		/// 特提原因
+		/// </summary>
+		public string? Cause { get; set; }
+
+		/// <summary>
+		/// 特提意见
+		/// </summary>
+		public string? Opinion { get; set; }
+
+		/// <summary>
+		/// 是否修改期满时间
+		/// </summary>
+		public bool AlterTime { get; set; }
+
+	}
+	public class OrderSpecialDto : OrderSpecialBaseDto
+	{
+
+		public string OrderId { get; set; }
+
+		/// <summary>
+		/// 节点Id
+		/// </summary>
+		public string TraceId { get; set; }
+
+		/// <summary>
+		/// 特提原因
+		/// </summary>
+		public string? Cause { get; set; }
+
+		/// <summary>
+		/// 特提理由
+		/// </summary>
+		public string? Reason { get; set; }
+
+		/// <summary>
+		/// 发送短信
+		/// </summary>
+		public bool? AcceptSms { get; set; }
+
+		/// <summary>
+		/// 办理时间限制(如:24小时、7个工作日)
+		/// </summary>
+		public int? TimeLimit { get; set; }
+
+		public ETimeType? TimeLimitUnit { get; set; } = ETimeType.WorkDay;
+
+		public string TimeLimitUnitText => TimeLimitUnit.GetDescription();
+
+		/// <summary>
+		/// 特提意见
+		/// </summary>
+		public string? Opinion { get; set; }
+
+		/// <summary>
+		///  审核结果  0  待审核  1 审核通过  2 审核不通过
+		/// </summary>
+		public int State { get; set; }
+
+		public string StateText => State == 0 ? "待审核" : State == 1 ? "审核通过" : State == 2 ? "审核不通过" : "-";
+
+		public string? OrgId { get; set; }
+
+		public string? OrgName { get; set; }
+
+
+		/// <summary>
+		/// 特提节点
+		/// </summary>
+		public WorkflowTraceDto Trace { get; set; }
+
+		/// <summary>
+		/// 工单
+		/// </summary>
+		public OrderDto Order { get; set; }
+	}
+	public class OrderSpecialBaseDto
+	{
+		public DateTime? LastModificationTime { get; set; }
+
+		public bool IsDeleted { get; set; }
+
+		/// <summary>
+		/// 删除时间
+		/// </summary>
+		public DateTime? DeletionTime { get; set; }
+
+
+		/// <summary>
+		/// 创建时间
+		/// </summary>
+		public DateTime CreationTime { get; set; }
+
+		public string Id { get; set; }
+
+		/// <summary>
+		/// 组织Id
+		/// </summary>
+		public string? CreatorOrgId { get; set; }
+
+
+		public string? CreatorOrgName { get; set; }
+
+		/// <summary>
+		/// 创建人
+		/// </summary>
+		public string? CreatorId { get; set; }
+
+		public string? CreatorName { get; set; }
+	}
+	public record OrderSpecialListDto : PagedKeywordRequest
+	{
+		public DateTime? CreationTimeStart { get; set; }
+		public DateTime? CreationTimeEnd { get; set; }
+
+		/// <summary>
+		///  审核结果  0  待审核  1 审核通过  2 审核不通过
+		/// </summary>
+		public int? State { get; set; }
+	}
+	public class OrderSpecialHandleTime 
+	{
+		public string OrderId { get; set; }
+
+		public string TraceId { get; set; }
 	}
 }

+ 3 - 3
src/Hotline.Share/Dtos/Settings/BusinessTagDto.cs

@@ -109,14 +109,14 @@ namespace Hotline.Share.Dtos.Settings
 		/// </summary>
 		public ETagType Type { get; set; }
 
-		public string TypeText => Type.GetDescription();
+		public string TypeText => (int)Type > 0 ? Type.GetDescription() : "";
 
 		/// <summary>
 		/// 业务标签类型
 		/// </summary>
 		public EBusinessTagType BusinessType { get; set; }
-
-		public string BusinessTypeText => BusinessType.GetDescription();
+	
+		public string BusinessTypeText => (int)BusinessType > 0 ? BusinessType.GetDescription():"";
 
 		public DateTime? LastModificationTime { get; set; }
 

+ 1 - 1
src/Hotline.Share/Hotline.Share.csproj

@@ -7,7 +7,7 @@
     <GenerateDocumentationFile>True</GenerateDocumentationFile>
     <NoWarn>$(NoWarn);1591;8618;</NoWarn>
     <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
-    <Version>1.0.33</Version>
+    <Version>1.0.34</Version>
   </PropertyGroup>
 
   <ItemGroup>

+ 1 - 1
src/Hotline/KnowledgeBase/Knowledge.cs

@@ -178,7 +178,7 @@ public class Knowledge : WorkflowEntity//   WorkflowEntity  FullStateEntity
 	public SystemOrganize SourceOrganize { get; set; }
 
 	[Navigate(NavigateType.OneToOne, nameof(WorkflowId))]
-	public Workflow Workflow { get; set; } = new Workflow();
+	public Workflow Workflow { get; set; }
 
 	/// <summary>
 	/// 是否可办理

+ 1 - 1
src/Hotline/KnowledgeBase/KnowledgeDomainService.cs

@@ -46,7 +46,7 @@ namespace Hotline.KnowledgeBase
         /// <returns></returns>
         public async Task<Knowledge> KnowledgeInfo(string Id, CancellationToken cancellationToken)
         {
-            var know = await _knowledgeRepository.Queryable(includeDeleted: true).FirstAsync(p => p.Id == Id);
+			var know = await _knowledgeRepository.Queryable(includeDeleted: true).Includes(x=>x.Workflow).FirstAsync(p => p.Id == Id);
             if (know is null)
                 throw UserFriendlyException.SameMessage("知识查询失败!");
             return know;

+ 6 - 0
src/Hotline/Orders/OrderSendback.cs

@@ -48,6 +48,12 @@ namespace Hotline.Orders
 		/// </summary>
 		public DateTime? AuditTime { get; set; }
 
+		/// <summary>
+		/// 审核意见
+		/// </summary>
+		[SugarColumn(ColumnDescription = "审核意见", ColumnDataType = "varchar(2000)")]
+		public string? AuditOpinion { get; set; }
+
 		/// <summary>
 		///  审核结果  0  待审核  1 审核通过  2 审核不通过
 		/// </summary>

+ 63 - 3
src/Hotline/Orders/OrderSpecial.cs

@@ -3,6 +3,9 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Hotline.FlowEngine.Workflows;
+using Hotline.Share.Enums.Settings;
+using SqlSugar;
 using XF.Domain.Repository;
 
 namespace Hotline.Orders
@@ -10,8 +13,65 @@ namespace Hotline.Orders
     /// <summary>
     /// 特提
     /// </summary>
-    public class OrderSpecial : CreationEntity
-    {
+    public class OrderSpecial : FullStateEntity
+	{
         public string OrderId { get; set; }
-    }
+
+        /// <summary>
+        /// 节点Id
+        /// </summary>
+        public string TraceId { get; set; }
+
+        /// <summary>
+        /// 特提原因
+        /// </summary>
+        [SugarColumn(ColumnDescription = "特提原因")]
+        public string? Cause { get; set; }
+
+		/// <summary>
+		/// 特提理由
+		/// </summary>
+		[SugarColumn(ColumnDescription = "特提理由", ColumnDataType = "varchar(2000)")]
+        public string? Reason { get; set; }
+
+        /// <summary>
+        /// 办理时间限制(如:24小时、7个工作日)
+        /// </summary>
+        public int? TimeLimit { get; set; }
+
+        public ETimeType? TimeLimitUnit { get; set; } = ETimeType.WorkDay;
+
+        /// <summary>
+        /// 是否修改期满时间
+        /// </summary>
+        public bool AlterTime { get; set; }
+
+		/// <summary>
+		/// 特提意见
+		/// </summary>
+		[SugarColumn(ColumnDescription = "特提意见", ColumnDataType = "varchar(2000)")]
+        public string? Opinion { get; set; }
+
+		/// <summary>
+		///  审核结果  0  待审核  1 审核通过  2 审核不通过
+		/// </summary>
+		public int State { get; set; }
+
+		[SugarColumn(ColumnDescription = "组织Id")]
+		public string? OrgId { get; set; }
+
+		public string? OrgName { get; set; }
+
+		/// <summary>
+		/// 特提节点
+		/// </summary>
+		[Navigate(NavigateType.OneToOne, nameof(TraceId))]
+		public WorkflowTrace Trace { get; set; }
+
+        /// <summary>
+        /// 工单
+        /// </summary>
+        [Navigate(NavigateType.OneToOne, nameof(OrderId))]
+        public Order Order { get; set; }
+	}
 }

+ 5 - 0
src/Hotline/Settings/SysDicTypeConsts.cs

@@ -193,4 +193,9 @@ public class SysDicTypeConsts
     /// 小休原因
     /// </summary>
     public const string RestReason = "RestReason";
+
+    /// <summary>
+    /// 特提原因
+    /// </summary>
+    public const string SpecialReason = "SpecialReason";
 }