소스 검색

工单退回审批

田爽 1 년 전
부모
커밋
e29d7a01d0

+ 117 - 16
src/Hotline.Api/Controllers/OrderController.cs

@@ -41,6 +41,7 @@ using Hotline.Share.Dtos.Push;
 using Hotline.Share.Enums.Push;
 using XF.Domain.Cache;
 using Hotline.Api.Filter;
+using XF.Domain.Entities;
 
 namespace Hotline.Api.Controllers;
 
@@ -94,9 +95,9 @@ public class OrderController : BaseController
     private readonly IPushDomainService _pushDomainService;
     private readonly ILogger<OrderController> _logger;
     private readonly ITypedCache<EnterpriseVo> _cacheResponse;
+    private readonly IRepository<OrderSendBackAudit> _orderSendBackAuditRepository;
 
-
-    public OrderController(
+	public OrderController(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         IWorkflowApplication workflowApplication,
@@ -141,8 +142,9 @@ public class OrderController : BaseController
         IEnterpriseService enterpriseService,
         IPushDomainService pushDomainService,
         ILogger<OrderController> logger,
-        ITypedCache<EnterpriseVo> cacheResponse
-        )
+        ITypedCache<EnterpriseVo> cacheResponse,
+        IRepository<OrderSendBackAudit> orderSendBackAuditRepository
+		)
     {
         _orderDomainService = orderDomainService;
         _orderRepository = orderRepository;
@@ -189,7 +191,9 @@ public class OrderController : BaseController
         _enterpriseService = enterpriseService;
         _pushDomainService = pushDomainService;
         _cacheResponse = cacheResponse;
-    }
+        _orderSendBackAuditRepository = orderSendBackAuditRepository;
+
+	}
 
     #region 工单发布
 
@@ -2277,15 +2281,14 @@ public class OrderController : BaseController
         var setting = _systemSettingCacheManager.GetSetting(SettingConstants.RepeatableEventNum);
         return count >= int.Parse(setting?.SettingValue[0] ?? "0");
     }
+	#endregion
 
-    #endregion
-
-    #region 工单待办
+	#region 工单待办
 
-    /// <summary>
-    /// 查询待办工单
-    /// </summary>
-    [HttpGet("waited")]
+	/// <summary>
+	/// 查询待办工单
+	/// </summary>
+	[HttpGet("waited")]
     public async Task<PagedDto<OrderDto>> QueryWaited([FromQuery] QueryOrderWaitedDto dto)
     {
         EWorkflowStepStatus[] handleStatuses = Array.Empty<EWorkflowStepStatus>();
@@ -2336,16 +2339,114 @@ public class OrderController : BaseController
         return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
     }
 
-    #endregion
+	#endregion
+	#region 业务工单退回
+
+	/// <summary>
+	/// 工单退回退回(返回前一节点)
+	/// </summary>
+	[HttpPost("order_previous")]
+	public async Task Previous([FromBody] PreviousWorkflowDto dto)
+	{
+		var oneSendBack = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.OneOrgSendBack)?.SettingValue[0]);
+		var twoSendBack = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.TwoOrgSendBack)?.SettingValue[0]);
+        if (oneSendBack || twoSendBack)
+        {
+            var workflow =
+                await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true, cancellationToken: HttpContext.RequestAborted);
+            var currentStep = _workflowDomainService.GetUnHandleStep(workflow.Steps, _sessionContext.RequiredOrgId,
+                _sessionContext.RequiredUserId);
 
-    #region 工单退回
+            if (currentStep.StepType is EStepType.Start)
+                throw UserFriendlyException.SameMessage("当前流程已退回到开始节点");
+
+            var prevStep = workflow.Steps.FirstOrDefault(d => d.Id == currentStep.PrevStepId);
+            if (prevStep == null)
+                throw UserFriendlyException.SameMessage("未查询到前一节点");
+
+            var applyOrg = _organizeRepository.Get(currentStep.AcceptorOrgId);
+            var sendBackOrg = _organizeRepository.Get(prevStep.AcceptorOrgId);
+            if ((twoSendBack && 2.Equals(applyOrg.Level) && 1.Equals(sendBackOrg.Level)) || (oneSendBack && 1.Equals(applyOrg.Level) && sendBackOrg.IsCenter))
+            {
+                var audit = new OrderSendBackAudit
+                {
+                    OrderId = workflow.ExternalId,
+                    State = ESendBackAuditState.Apply,
+                    Content = dto.Opinion,
+                    SendBackData = dto,
+                    ApplyOrgId = applyOrg.Id,
+                    ApplyOrgName = applyOrg.Name,
+                    SendBackOrgId = sendBackOrg.Id,
+                    SendBackOrgName = sendBackOrg.Name
+                };
+                await _orderSendBackAuditRepository.AddAsync(audit, HttpContext.RequestAborted);
+            }
+        }
+        else {
+			await _workflowApplication.PreviousAsync(dto, HttpContext.RequestAborted);
+		}
+	}
 
     /// <summary>
-    /// 工单退回列表
+    /// 工单业务退回审批
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+	[Permission(EPermission.OrderPreviousAudit)]
+	[HttpPost("order_previous_audit")]
+	public async Task Audit([FromBody] AuditSendBackDto dto)
+	{
+		//验证是否存在退回
+		var sendBack = await _orderSendBackAuditRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
+		if (sendBack is null)
+			throw UserFriendlyException.SameMessage("无效退回");
+		if (sendBack.State != ESendBackAuditState.Apply)
+			throw UserFriendlyException.SameMessage("退回已审批,请勿重复审批");
+
+		_mapper.Map(dto, sendBack);
+		sendBack.AuditId = _sessionContext.UserId;
+		sendBack.AuditUser = _sessionContext.UserName;
+		sendBack.AuditTime = DateTime.Now;
+		await _orderSendBackAuditRepository.UpdateAsync(sendBack, HttpContext.RequestAborted);
+		//执行退回
+		if (sendBack.State ==  ESendBackAuditState.End)
+		{
+			await _workflowApplication.PreviousAsync(sendBack.SendBackData, HttpContext.RequestAborted);
+		}
+	}
+    
+    /// <summary>
+    /// 工单业务退回审批列表
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.SendBackOrderList)]
+	[Permission(EPermission.OrderPreviousList)]
+	[HttpPost("order_previous_list")]
+	public async Task<PagedDto<SendBackDto>> AuditList([FromQuery] SendBackListDto dto)
+	{
+		var (total, items) = await _orderSendBackAuditRepository.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.HasValue, d => d.State == dto.State)
+			.OrderByDescending(x => x.CreationTime)
+			.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+
+		return new PagedDto<SendBackDto>(total, _mapper.Map<IReadOnlyList<SendBackDto>>(items));
+	}
+
+	#endregion
+
+	#region 省工单退回
+
+	/// <summary>
+	/// 工单退回列表
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	[Permission(EPermission.SendBackOrderList)]
     [HttpGet("send_back")]
     public async Task<PagedDto<OrderSendBackDto>> UrgeList([FromQuery] OrderSendBackListDto dto)
     {

+ 135 - 0
src/Hotline.Share/Dtos/Order/SendBackDto.cs

@@ -0,0 +1,135 @@
+using Hotline.Share.Dtos.File;
+using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Enums.Order;
+using Hotline.Share.Requests;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Utility.EnumExtensions;
+
+namespace Hotline.Share.Dtos.Order
+{
+	public class AuditSendBackDto
+	{
+		public string Id { get; set; }
+
+		/// <summary>
+		///  审核结果
+		/// </summary>
+		public ESendBackAuditState State { get; set; }
+
+		/// <summary>
+		/// 审核意见
+		/// </summary>
+		public string? AuditOpinion { get; set; }
+
+	}
+	public class SendBackDto : SendBackBaseDto
+	{
+		/// <summary>
+		/// 工单ID
+		/// </summary>
+		public string OrderId { get; set; }
+
+
+		/// <summary>
+		/// 退回原因
+		/// </summary>
+		public string? Content { get; set; }
+
+		/// <summary>
+		/// 审批意见
+		/// </summary>
+		public string? AuditContent { get; set; }
+
+		/// <summary>
+		/// 工单
+		/// </summary>
+		public OrderDto Order { get; set; }
+
+		/// <summary>
+		/// 退回数据
+		/// </summary>
+		public PreviousWorkflowDto SendBackData { get; set; }
+
+		/// <summary>
+		/// 审批人ID
+		/// </summary>
+		public string? AuditId { get; set; }
+
+		public string? AuditUser { get; set; }
+
+		/// <summary>
+		/// 申请部门ID
+		/// </summary>
+		public string ApplyOrgId { get; set; }
+
+		/// <summary>
+		/// 申请部门名称
+		/// </summary>
+		public string ApplyOrgName { get; set; }
+
+		/// <summary>
+		/// 退回部门ID
+		/// </summary>
+		public string SendBackOrgId { get; set; }
+
+		/// <summary>
+		/// 退回部门名称
+		/// </summary>
+		public string SendBackOrgName { get; set; }
+
+		/// <summary>
+		///  审核结果  0  待审核  1 审核通过  2 审核不通过
+		/// </summary>
+		public ESendBackAuditState State { get; set; }
+
+		public string StateText => State.GetDescription();
+
+	}
+	public class SendBackBaseDto
+	{
+		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 SendBackListDto : PagedKeywordRequest
+	{
+		public DateTime? CreationTimeStart { get; set; }
+		public DateTime? CreationTimeEnd { get; set; }
+
+		/// <summary>
+		/// </summary>
+		public ESendBackAuditState? State { get; set; }
+	}
+}

+ 31 - 0
src/Hotline.Share/Enums/Order/ESendBackAuditState.cs

@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Enums.Order
+{
+
+	public enum ESendBackAuditState
+	{
+		/// <summary>
+		/// 待办
+		/// </summary>
+		[Description("待办")]
+		Apply = 0,
+
+		/// <summary>
+		/// 审批通过
+		/// </summary>
+		[Description("审批通过")]
+		End = 1,
+
+		/// <summary>
+		/// 审批拒绝
+		/// </summary>
+		[Description("审批拒绝")]
+		Refuse = 2,
+	}
+}

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

@@ -139,5 +139,15 @@ namespace Hotline.FlowEngine.Workflows
         /// 结束会签(会签未办理节点无需再办,由发起会签节点继续办理)
         /// </summary>
         Task EndCountersignAsync(string workflowId, CancellationToken cancellationToken);
-    }
+
+		/// <summary>
+		/// 查询未完成节点
+		/// </summary>
+		/// <param name="steps"></param>
+		/// <param name="orgCode"></param>
+		/// <param name="userId"></param>
+		/// <returns></returns>
+		WorkflowStep GetUnHandleStep(List<WorkflowStep> steps, string orgCode, string userId);
+
+	}
 }

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

@@ -1593,7 +1593,7 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 查询未完成节点
         /// </summary>
-        private WorkflowStep GetUnHandleStep(List<WorkflowStep> steps, string orgCode, string userId)
+        public WorkflowStep GetUnHandleStep(List<WorkflowStep> steps, string orgCode, string userId)
         {
             var step = GetStep(steps, orgCode, userId, d => d != EWorkflowStepStatus.Handled);
             if (step == null)

+ 91 - 0
src/Hotline/Orders/OrderSendBackAudit.cs

@@ -0,0 +1,91 @@
+using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Enums.Order;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.Orders
+{
+	[Description("退回审批")]
+	public class OrderSendBackAudit: FullStateEntity
+	{
+		/// <summary>
+		/// 工单ID
+		/// </summary>
+		[SugarColumn(ColumnDescription = "工单ID")]
+		public string OrderId { get; set; }
+
+		/// <summary>
+		/// 状态
+		/// </summary>
+		[SugarColumn(ColumnDescription = "状态")]
+		public ESendBackAuditState? State { get; set; }
+
+		/// <summary>
+		/// 退回原因
+		/// </summary>
+		[SugarColumn(ColumnDescription = "退回原因", ColumnDataType = "varchar(2000)")]
+		public string? Content { get; set; }
+
+		/// <summary>
+		/// 审批意见
+		/// </summary>
+		[SugarColumn(ColumnDescription = "审批意见", ColumnDataType = "varchar(2000)")]
+		public string? AuditContent { get; set; }
+
+		/// <summary>
+		/// 工单
+		/// </summary>
+		[Navigate(NavigateType.OneToOne, nameof(OrderId))]
+		public Order Order { get; set; }
+
+		/// <summary>
+		/// 退回数据
+		/// </summary>
+		[SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
+		public PreviousWorkflowDto SendBackData { get; set; }
+
+		/// <summary>
+		/// 审批人ID
+		/// </summary>
+		[SugarColumn(ColumnDescription = "审批人ID")]
+		public string? AuditId { get; set; }
+
+		[SugarColumn(ColumnDescription = "审批人")]
+		public string? AuditUser { get; set; }
+
+		/// <summary>
+		/// 审批时间
+		/// </summary>
+		public DateTime? AuditTime { get; set; }
+
+		/// <summary>
+		/// 申请部门ID
+		/// </summary>
+		[SugarColumn(ColumnDescription = "申请部门ID")]
+		public string ApplyOrgId { get; set; }
+
+		/// <summary>
+		/// 申请部门名称
+		/// </summary>
+		[SugarColumn(ColumnDescription = "申请部门名称")]
+		public string ApplyOrgName { get; set; }
+
+		/// <summary>
+		/// 退回部门ID
+		/// </summary>
+		[SugarColumn(ColumnDescription = "退回部门ID")]
+		public string SendBackOrgId { get; set; }
+
+		/// <summary>
+		/// 退回部门名称
+		/// </summary>
+		[SugarColumn(ColumnDescription = "退回部门名称")]
+		public string SendBackOrgName { get; set; }
+	}
+}

+ 27 - 14
src/Hotline/Permissions/EPermission.cs

@@ -371,13 +371,13 @@ namespace Hotline.Permissions
         /// </summary>
 		[Display(GroupName = "OrderSupervise", Name = "回复督办", Description = "回复督办")]
         ReplySuperviseOrder = 200701,
-        #endregion
+		#endregion
 
-        #region 省退回申请
-        /// <summary>
-        /// 省退回申请
-        /// </summary>
-        [Display(GroupName = "省退回申请",Name ="省退回申请",Description ="省退回申请")]
+		#region 省退回申请
+		/// <summary>
+		/// 省退回申请
+		/// </summary>
+		[Display(GroupName = "省退回申请",Name ="省退回申请",Description ="省退回申请")]
         SendBackOrder = 200800,
 
         /// <summary>
@@ -521,7 +521,7 @@ namespace Hotline.Permissions
         /// <summary>
 		///工单特提申请列表
 		/// </summary>
-		[Display(GroupName = "OrderSpecial", Name = "工单特提申请列表", Description = "工单特提申请列表")]
+		[Display(GroupName = "特提审核", Name = "工单特提申请列表", Description = "工单特提申请列表")]
         ApplySpecialOrderList = 201301,
 
         /// <summary>
@@ -530,14 +530,27 @@ namespace Hotline.Permissions
 		[Display(GroupName = "特提审核", Name = "特提审核", Description = "特提审核")]
         AuditSpecial = 201302,
 
-        #endregion
-        #endregion
+		#region 业务退回审批
+		/// <summary>
+		///工单业务退回审批列表
+		/// </summary>
+		[Display(GroupName = "业务退回审批", Name = "工单业务退回审批列表", Description = "工单业务退回审批列表")]
+		OrderPreviousList = 201401,
 
-        #region 业务查询(30,00,00)
-        /// <summary>
-        /// 业务查询
-        /// </summary>
-        [Display(GroupName = "业务查询",Name ="业务查询",Description = "业务查询")]
+		/// <summary>
+		/// 工单业务退回审批
+		/// </summary>
+		[Display(GroupName = "业务退回审批", Name = "业务退回审批", Description = "业务退回审批")]
+		OrderPreviousAudit = 204302,
+		#endregion
+		#endregion
+		#endregion
+
+		#region 业务查询(30,00,00)
+		/// <summary>
+		/// 业务查询
+		/// </summary>
+		[Display(GroupName = "业务查询",Name ="业务查询",Description = "业务查询")]
         BugQuery = 300000,
 
         #region 观察件查询

+ 11 - 1
src/XF.Domain/Constants/SettingConstants.cs

@@ -123,5 +123,15 @@ namespace XF.Domain.Constants
         /// 大屏坐席监控推送间隔时间
         /// </summary>
         public const string BsDataStateChangedTimes = "BsDataStateChangedTimes";
-    }
+
+        /// <summary>
+        /// 二级部门退回
+        /// </summary>
+        public const string TwoOrgSendBack = "TwoOrgSendBack";
+
+        /// <summary>
+        /// 一级部门退回
+        /// </summary>
+        public const string OneOrgSendBack = "OneOrgSendBack";
+	}
 }