ソースを参照

Merge branch 'cd299' into dev

田爽 7 ヶ月 前
コミット
8c19673c16

+ 26 - 5
src/Hotline.Api/Controllers/OrderController.cs

@@ -3968,7 +3968,18 @@ public class OrderController : BaseController
             Status = order.Status,
             TraceId = currentStep.Id
         };
-        if (oneSendBack || twoSendBack)
+        if (_appOptions.Value.IsZiGong && prevStep.BusinessType == EBusinessType.Send)
+        {
+	        // 平均派单
+	        var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
+	        if (averageSendOrder)
+	        {
+		        var handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
+                dto.NextHandlers = new List<FlowStepHandler> { handler };
+			}
+        }
+
+		if (oneSendBack || twoSendBack)
         {
             var sendBack = await _orderSendBackAuditRepository.Queryable()
                 .Where(x => x.OrderId == workflow.ExternalId && x.State == ESendBackAuditState.Apply).AnyAsync();
@@ -3979,7 +3990,15 @@ public class OrderController : BaseController
                 .AnyAsync();
             if (specialAny) throw UserFriendlyException.SameMessage("工单已存在待审批特提信息!");
             if (order.Workflow.IsInCountersign) throw UserFriendlyException.SameMessage("工单会签中,无法进行退回!");
-            if ((oneSendBack && isOrgToCenter) || (twoSendBack && isSecondToFirstOrgLevel))
+            if (oneSendBack && isOrgToCenter &&  _appOptions.Value.IsZiGong)
+            {
+	            if (order.SendBackAuditEndTime.HasValue && order.SendBackAuditEndTime.Value < DateTime.Now )
+		            throw UserFriendlyException.SameMessage("工单截至退回时间【" + order.SendBackAuditEndTime.Value.ToString("yyyy-MM-dd HH:mm:ss") + "】,无法进行退回!");
+				var sendBackAgain = await _orderSendBackAuditRepository.Queryable().Where(x => x.OrderId == workflow.ExternalId && x.IsReturnAgain == true).AnyAsync();
+	            if (sendBackAgain)
+		            throw UserFriendlyException.SameMessage("工单已不允许退回!");
+			}                
+			if ((oneSendBack && isOrgToCenter) || (twoSendBack && isSecondToFirstOrgLevel))
             {
 
                 await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { Status = EOrderStatus.SendBackAudit })
@@ -3991,7 +4010,7 @@ public class OrderController : BaseController
                 audit.AuditUser = "默认通过";
                 audit.AuditTime = DateTime.Now;
                 dto.ExpiredTime = order.ExpiredTime;
-                var flowDirection = await _workflowApplication.PreviousAsync(dto, HttpContext.RequestAborted);
+				var flowDirection = await _workflowApplication.PreviousAsync(dto, HttpContext.RequestAborted);
                 var processType = flowDirection == EFlowDirection.OrgToCenter || flowDirection == EFlowDirection.CenterToCenter
                     ? EProcessType.Zhiban
                     : EProcessType.Jiaoban;
@@ -5080,7 +5099,8 @@ public class OrderController : BaseController
         {
             SpecialTimeType = EnumExts.GetDescriptions<ETimeType>(),
             SpecialReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SpecialReason),
-            Step = step,
+            InstaShotSpecialReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.InstaShotSpecialReason),
+			Step = step,
             BaseTypeId = baseTypeId
         };
         return rsp;
@@ -5106,7 +5126,8 @@ public class OrderController : BaseController
             SpecialTimeType = EnumExts.GetDescriptions<ETimeType>(),
             SpecialReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SpecialReason),
             ReTransactErrorType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.ReTransactErrorType),
-            Step = step,
+            InstaShotSpecialReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.InstaShotSpecialReason),
+			Step = step,
             Orgs = orgs,
         };
         return rsp;

+ 11 - 4
src/Hotline.Application/Handlers/FlowEngine/WorkflowNextHandler.cs

@@ -11,6 +11,7 @@ using Hotline.KnowledgeBase;
 using Hotline.Orders;
 using Hotline.Push.Notifies;
 using Hotline.Settings;
+using Hotline.Settings.TimeLimitDomain;
 using Hotline.Settings.TimeLimits;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
@@ -45,8 +46,9 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
     private readonly IMediator _mediator;
     private readonly ISystemSettingCacheManager _systemSettingCacheManager;
     private readonly Publisher _publisher;
+    private readonly ICalcExpireTime _expireTime;
 
-    public WorkflowNextHandler(
+	public WorkflowNextHandler(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         ICapPublisher capPublisher,
@@ -59,7 +61,8 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
         IRepository<User> userRepository,
         IMediator mediator,
         ISystemSettingCacheManager systemSettingCacheManager,
-        Publisher publisher)
+        ICalcExpireTime expireTime,
+		Publisher publisher)
     {
         _orderDomainService = orderDomainService;
         _orderRepository = orderRepository;
@@ -74,7 +77,9 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
         _mediator = mediator;
         _systemSettingCacheManager = systemSettingCacheManager;
         _publisher = publisher;
-    }
+        _expireTime = expireTime;
+
+	}
 
     /// <summary>Handles a notification</summary>
     /// <param name="notification">The notification</param>
@@ -138,7 +143,9 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
 
                     //    expiredTimeChanged = true;
                     //}
-                    await _orderRepository.Updateable(order).ExecuteCommandAsync(cancellationToken);
+                    if (data.FlowDirection is EFlowDirection.CenterToOrg)
+                        order.SendBackAuditEndTime = await _expireTime.WorkDay_ZG(DateTime.Now);
+					await _orderRepository.Updateable(order).ExecuteCommandAsync(cancellationToken);
                     //await _orderRepository.UpdateAsync(order, cancellationToken);
 
                     //司法行政监督管理-推诿工单

+ 8 - 0
src/Hotline.Share/Dtos/FlowEngine/PreviousWorkflowDto.cs

@@ -12,4 +12,12 @@ public class PreviousWorkflowDto : EndWorkflowIdDto
     /// </summary>
     public DateTime? ExpiredTime { get; set; }
 
+    /// <summary>
+    /// 根据办理者类型不同,此字段为不同内容
+    /// <example>
+    /// 部门等级/分类为:depCodes, 角色为:userIds
+    /// </example>
+    /// </summary>
+    public List<FlowStepHandler> NextHandlers { get; set; } = new();
+
 }

+ 1 - 0
src/Hotline.Share/Dtos/Order/OrderPreviousDto.cs

@@ -5,4 +5,5 @@ namespace Hotline.Share.Dtos.Order;
 public class OrderPreviousDto : PreviousWorkflowDto
 {
     public string OrderId { get; set; }
+
 }

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

@@ -25,6 +25,12 @@ namespace Hotline.Share.Dtos.Order
 		/// </summary>
 		public string? AuditContent { get; set; }
 
+
+		/// <summary>
+		/// 是否允许再次退回
+		/// </summary>
+		public bool? IsReturnAgain { get; set; }
+
 	}
 
 	public class BatchAuditSendBackDto : AuditSendBackDto {

+ 9 - 7
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -637,8 +637,14 @@ namespace Hotline.FlowEngine.Workflows
 			//如果有传入期满时间 新节点为传入的期满时间
 			if (dto.ExpiredTime.HasValue)
                 prevStep.StepExpiredTime = dto.ExpiredTime;
-			//复制上一个节点为待接办
-			var newPrevStep =
+			//退给派单组节点,需按照平均分配原则派给一个派单员 禅道299 TODO
+			if (dto.NextHandlers.Any())
+            {
+                var handle = dto.NextHandlers.FirstOrDefault();
+                prevStep.Assign(handle.UserId, handle.Username, handle.OrgId, handle.OrgName, handle.RoleId, handle.RoleName);
+			}
+            //复制上一个节点为待接办
+            var newPrevStep =
                 await DuplicateStepWithTraceAsync(workflow, prevStep, EWorkflowTraceType.Previous, cancellationToken);
 
             //remove workflow.steps
@@ -2007,11 +2013,7 @@ namespace Hotline.FlowEngine.Workflows
             {
                 //newStep.FlowAssignType = EFlowAssignType.User;
                 // 是否中心  临时紧急修改 后续在流程模版定义是否原办理人退回类型 来实现流程 禅道200
-                newStep.FlowAssignType = step.HandlerOrgIsCenter!.Value
-                    ? step.BusinessType is EBusinessType.Send
-                        ? EFlowAssignType.User
-                        : EFlowAssignType.Role
-                    : EFlowAssignType.Org;
+                newStep.FlowAssignType = step.HandlerOrgIsCenter!.Value ? step.BusinessType is EBusinessType.Send ? EFlowAssignType.User : EFlowAssignType.Role : EFlowAssignType.Org;
                 //if (newStep is { FlowAssignType: EFlowAssignType.Role, BusinessType: EBusinessType.Send })
                 //    newStep.FlowAssignType = EFlowAssignType.User;
 

+ 8 - 1
src/Hotline/Orders/Order.cs

@@ -872,7 +872,14 @@ namespace Hotline.Orders
         /// </summary>
         [SugarColumn(IsIgnore = true)]
         public string? DaysOverdueOrgName { get; set; }
-    }
+
+		/// <summary>
+		/// 退回截至时间
+		/// </summary>
+		[SugarColumn(ColumnDescription = "退回截至时间")]
+		public DateTime? SendBackAuditEndTime { get; set; }
+
+	}
 
     public partial class Order
     {

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

@@ -20,6 +20,15 @@ namespace Hotline.Orders
 		[SugarColumn(ColumnDescription = "工单ID")]
 		public string OrderId { get; set; }
 
+
+		/// <summary>
+		/// 根据办理者类型不同,此字段为不同内容
+		/// <example>
+		/// 部门等级/分类为:depCodes, 角色为:userIds
+		/// </example>
+		/// </summary>
+		public List<FlowStepHandler> NextHandlers { get; set; } = new();
+
 		/// <summary>
 		/// 流程快照ID
 		/// </summary>
@@ -111,6 +120,11 @@ namespace Hotline.Orders
 		[SugarColumn(ColumnDescription = "流程退回发起用户ID")]
 		public string WorkflowUserId { get; set; }
 
+		/// <summary>
+		/// 是否允许再次退回
+		/// </summary>
+		[SugarColumn(ColumnDescription = "是否允许再次退回",DefaultValue = "f")]
+		public bool? IsReturnAgain { get; set; }
 
 		/// <summary>
 		/// 流程退回发起用户角色ID

+ 8 - 2
src/Hotline/Settings/SysDicTypeConsts.cs

@@ -200,9 +200,15 @@ public class SysDicTypeConsts
     public const string SpecialReason = "SpecialReason";
 
     /// <summary>
-    /// 网民评价类型
+    /// 随手拍特提原因
     /// </summary>
-    public const string NetizenEvaluateType = "NetizenEvaluateType";
+    public const string InstaShotSpecialReason = "InstaShotSpecialReason";
+	
+
+	/// <summary>
+	/// 网民评价类型
+	/// </summary>
+	public const string NetizenEvaluateType = "NetizenEvaluateType";
 
 
 	/// <summary>

+ 29 - 1
src/Hotline/Settings/TimeLimitDomain/ExpireTimeLimitBase.cs

@@ -76,7 +76,35 @@ public abstract class ExpireTimeLimitBase
         return date;
     }
 
-    public async Task<DateTime?> CalcWorkTimeReduce(DateTime now, int timeValue)
+    public virtual async Task<DateTime> WorkDay_ZG(DateTime date)
+    {
+	    //一级部门退回中心的可退回时间为1个工作日(从派单组交办给部门就开始倒计时);节假日派单组派给部门的工单,一级部门退回截止时间该为第2个工作日18: 00
+		var workTime = GetWorkTimes(SettingConstants.WorkTime);
+	    var (WorkBeginTime, WorkEndTime) = GetWorkTime(DateTime.Now, workTime);
+	    if (await IsWorkDay(date))
+	    {
+		    if (date < WorkBeginTime || date > WorkEndTime)
+		    {
+			    date = date.AddDays(1);
+		    }
+	    }
+	    else
+	    {
+		    while (await NotWorkDay(date))
+		    {
+			    date = date.AddDays(1);
+		    }
+		    while (await NotWorkDay(date))
+		    {
+			    date = date.AddDays(1);
+		    }
+		    date = DateTime.Parse(date.ToShortDateString() + "18:00");
+		}
+	    return date;
+    }
+
+
+	public async Task<DateTime?> CalcWorkTimeReduce(DateTime now, int timeValue)
     {
         return await _expireTimeHandler.CalcWorkTimeReduceAsync(now, timeValue);
     }

+ 2 - 1
src/Hotline/Settings/TimeLimitDomain/ICalcExpireTime.cs

@@ -27,8 +27,9 @@ public interface ICalcExpireTime
     Task<int> CalcWorkTime(DateTime beginTime, DateTime endTime, bool isCenter);
     Task<int> CalcWorkTimeEx(DateTime beginTime, DateTime endTime, bool isCenter);
     Task<DateTime> WorkDay(DateTime now);
+    Task<DateTime> WorkDay_ZG(DateTime now);
 
-    Task<TimeResult> CalcEndTime(DateTime beginTime, ETimeType timeType, int timeValue, int Percentage, int PercentageOne);
+	Task<TimeResult> CalcEndTime(DateTime beginTime, ETimeType timeType, int timeValue, int Percentage, int PercentageOne);
 
     /// <summary>
     /// 倒推工作日