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
}