using Hotline.FlowEngine.Definitions; using Hotline.Share.Enums.FlowEngine; using SqlSugar; using XF.Domain.Repository; namespace Hotline.FlowEngine.Workflows; public class Workflow : CreationEntity { public string DefinitionId { get; set; } [SugarColumn(IsNullable = true)] public string? ModuleId { get; set; } /// /// 业务模块名称 /// [SugarColumn(IsNullable = true)] public string? ModuleName { get; set; } [SugarColumn(IsNullable = true)] public string? ModuleCode { get; set; } [SugarColumn(Length = 2000)] public string Title { get; set; } /// /// 到期时间 /// public DateTime ExpiredTime { get; set; } public DateTime? CompleteTime { get; set; } public EWorkflowStatus Status { get; set; } /// /// 当前节点名称(会签状态此字段保存最外层会签办理节点名称) /// [SugarColumn(IsNullable = true)] public string? CurrentStepName { get; set; } /// /// 到达当前节点时间(stepBox创建时间) /// public DateTime? CurrentStepTime { get; set; } /// /// 当前会签办理节点code,嵌套会签为最外层会签办理节点code(不处于会签状态则无值) /// [SugarColumn(IsNullable = true)] public string? CurrentCountersignStepCode { get; set; } /// /// 中心直办件 /// public bool IsStraight { get; set; } = true; /// /// 交办时间 /// public DateTime AssignTime { get; set; } /// /// 办理时间限制(如:24小时、7个工作日) /// public string TimeLimit { get; set; } /// /// 办理意见(冗余,办理中...or 最终办理意见) /// [SugarColumn(Length = 2000)] public string Opinion { get; set; } = "办理中..."; ///// ///// 外部业务唯一标识 ///// //public string ExternalId { get; set; } [Navigate(NavigateType.OneToOne, nameof(DefinitionId))] public Definition Definition { get; set; } /// /// 补充信息 /// [Navigate(NavigateType.OneToMany, nameof(WorkflowSupplement.WorkflowId))] public List Supplements { get; set; } /// /// 接办信息 /// [Navigate(NavigateType.OneToMany, nameof(WorkflowAssign.WorkflowId))] public List Assigns { get; set; } /// /// 主节点,依据流转进度动态生成或删除 /// [SugarColumn(IsIgnore = true)] public List StepBoxes { get; set; } [SugarColumn(IsIgnore = true)] public List Traces { get; set; } = new(); #region Mehod /// /// 流程结束 /// public void Complete() { Status = EWorkflowStatus.Completed; CompleteTime = DateTime.Now; } public void Terminate() { Status = EWorkflowStatus.Terminated; CompleteTime = DateTime.Now; } /// /// 流程进行流转 /// public void FLow(string currentStepName, DateTime currentStepTime, string? currentCountersignCode = null) { CurrentStepName = currentStepName; CurrentStepTime = currentStepTime; if (!string.IsNullOrEmpty(currentCountersignCode)) CurrentCountersignStepCode = currentCountersignCode; } /// /// 检查会签是否结束 /// public void CompleteCountersign() { if (IsInCountersign()) { var countersignStepBox = StepBoxes.First(d => d.Code == CurrentCountersignStepCode); var isCountersignOver = countersignStepBox.Steps.All(d => d.Status is EWorkflowStepStatus.Completed && (!d.HasStartCountersign || d.IsCountersignComplete.GetValueOrDefault())); if (isCountersignOver) //会签结束 CurrentCountersignStepCode = null; } } public bool CheckIfCountersignOver() { var countersignStepBox = StepBoxes.First(d => d.Code == CurrentCountersignStepCode); var isCountersignOver = countersignStepBox.Steps.All(d => d.Status is EWorkflowStepStatus.Completed && (!d.HasStartCountersign || d.IsCountersignComplete.GetValueOrDefault())); return isCountersignOver; } public void EndCountersign() => CurrentCountersignStepCode = null; /// /// 更新workflow中当前停留节点,时间和会签开始节点code /// /// /// public void SetWorkflowCurrentStepInfo(bool isStartCountersign, WorkflowStep stepBox) { //1.不在会签中,未发起会签(普通处理) 2.不在会签中,发起会签(保存会签节点),3.会签中,不更新 if (IsInCountersign()) return; if (isStartCountersign) { FLow(stepBox.Name, stepBox.CreationTime, stepBox.Code); } else { FLow(stepBox.Name, stepBox.CreationTime); } } /// /// 流程是否处于会签中 /// /// public bool IsInCountersign() => !string.IsNullOrEmpty(CurrentCountersignStepCode); /// /// 结束流程会签状态 /// public void CloseCountersignStatus() => CurrentCountersignStepCode = null; #endregion }