123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- using Hotline.FlowEngine.Definitions;
- using Hotline.Share.Enums.FlowEngine;
- using SqlSugar;
- using XF.Domain.Entities;
- 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; }
- /// <summary>
- /// 业务模块名称
- /// </summary>
- [SugarColumn(IsNullable = true)]
- public string? ModuleName { get; set; }
- [SugarColumn(IsNullable = true)]
- public string? ModuleCode { get; set; }
- [SugarColumn(Length = 2000)]
- public string Title { get; set; }
- /// <summary>
- /// 到期时间
- /// </summary>
- public DateTime ExpiredTime { get; set; }
- /// <summary>
- /// 流程流转到end节点的时间(配置模板的end节点前一个节点办理完成时间)
- /// </summary>
- public DateTime? CompleteTime { get; set; }
- public EWorkflowStatus Status { get; set; }
- /// <summary>
- /// 当前办理节点名称(会签状态此字段保存最外层会签办理节点名称)
- /// </summary>
- [SugarColumn(IsNullable = true)]
- public string? CurrentStepName { get; set; }
- /// <summary>
- /// 到达当前办理节点时间(stepBox创建时间)
- /// </summary>
- public DateTime? CurrentStepTime { get; set; }
- /// <summary>
- /// 会签办理节点code,嵌套会签为最外层会签办理节点code(不处于会签状态则无值)
- /// </summary>
- [SugarColumn(IsNullable = true)]
- public string? TopCountersignStepCode { get; set; }
- /// <summary>
- /// 中心直办件
- /// </summary>
- public bool IsStraight { get; set; } = true;
- /// <summary>
- /// 交办时间
- /// </summary>
- public DateTime AssignTime { get; set; }
- /// <summary>
- /// 办理时间限制(如:24小时、7个工作日)
- /// </summary>
- public string TimeLimit { get; set; }
- /// <summary>
- /// 办理意见(冗余,办理中...or 最终办理意见)
- /// </summary>
- [SugarColumn(Length = 2000)]
- public string Opinion { get; set; } = "办理中...";
- /// <summary>
- /// 办理人id
- /// </summary>
- [SugarColumn(ColumnDataType = "varchar(1000)", IsJson = true)]
- public List<string> HandlerUsers { get; set; } = new();
- /// <summary>
- /// 办理部门code
- /// </summary>
- [SugarColumn(ColumnDataType = "varchar(1000)", IsJson = true)]
- public List<string> HandlerOrgs { get; set; } = new();
- ///// <summary>
- ///// 外部业务唯一标识
- ///// </summary>
- //public string ExternalId { get; set; }
- [Navigate(NavigateType.OneToOne, nameof(DefinitionId))]
- public Definition Definition { get; set; }
- /// <summary>
- /// 补充信息
- /// </summary>
- [Navigate(NavigateType.OneToMany, nameof(WorkflowSupplement.WorkflowId))]
- public List<WorkflowSupplement> Supplements { get; set; }
- /// <summary>
- /// 接办信息
- /// </summary>
- [Navigate(NavigateType.OneToMany, nameof(WorkflowAssign.WorkflowId))]
- public List<WorkflowAssign> Assigns { get; set; }
- /// <summary>
- /// 会签
- /// </summary>
- [Navigate(NavigateType.OneToMany, nameof(WorkflowCountersign.WorkflowId))]
- public List<WorkflowCountersign> Countersigns { get; set; }
- /// <summary>
- /// 主节点,依据流转进度动态生成或删除
- /// </summary>
- [SugarColumn(IsIgnore = true)]
- public List<WorkflowStep> StepBoxes { get; set; }
- [SugarColumn(IsIgnore = true)]
- public List<WorkflowTrace> Traces { get; set; } = new();
- #region Mehod
- /// <summary>
- /// 流程结束
- /// </summary>
- public void Complete()
- {
- Status = EWorkflowStatus.Completed;
- CompleteTime = DateTime.Now;
- }
- public void Terminate()
- {
- Status = EWorkflowStatus.Terminated;
- CompleteTime = DateTime.Now;
- }
- /// <summary>
- /// 流程进行流转
- /// </summary>
- public void FLow(string currentStepName, DateTime currentStepTime, string? currentCountersignCode = null)
- {
- CurrentStepName = currentStepName;
- CurrentStepTime = currentStepTime;
- if (!string.IsNullOrEmpty(currentCountersignCode))
- TopCountersignStepCode = currentCountersignCode;
- }
- /// <summary>
- /// 检查会签是否结束
- /// </summary>
- public bool CheckIfCountersignOver()
- {
- //var countersignStepBox = StepBoxes.First(d => d.Code == TopCountersignStepCode);
- //var isCountersignOver = countersignStepBox.Steps.All(d =>
- // d.Status is EWorkflowStepStatus.Completed &&
- // (!d.HasStartCountersign || d.IsCountersignComplete.GetValueOrDefault()));
- //return isCountersignOver;
- return Countersigns.All(d => d.IsCompleted());
- }
- public void EndCountersign() => TopCountersignStepCode = null;
- /// <summary>
- /// 更新workflow中当前停留节点,时间和会签开始节点code
- /// </summary>
- /// <param name="isStartCountersign"></param>
- /// <param name="stepBox"></param>
- 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);
- }
- }
- /// <summary>
- /// 流程是否处于会签中
- /// </summary>
- /// <returns></returns>
- public bool IsInCountersign() => !string.IsNullOrEmpty(TopCountersignStepCode);
- /// <summary>
- /// 结束流程会签状态
- /// </summary>
- public void CloseCountersignStatus() => TopCountersignStepCode = null;
- /// <summary>
- /// 重置最终办理意见
- /// </summary>
- public void ResetOption() => Opinion = "办理中...";
- /// <summary>
- /// 更新当前办理人(代办人或部门)
- /// </summary>
- public void UpdateHandlers(string handlerId, string handlerOrg, EFlowAssignType assignType, IEnumerable<string> handlers)
- {
- HandlerUsers.Remove(handlerId);
- HandlerOrgs.Remove(handlerOrg);
- switch (assignType)
- {
- case EFlowAssignType.Org:
- HandlerOrgs.AddRange(handlers);
- HandlerOrgs = HandlerOrgs.Distinct().ToList();
- break;
- case EFlowAssignType.User:
- HandlerUsers.AddRange(handlers);
- HandlerUsers = HandlerUsers.Distinct().ToList();
- break;
- default:
- throw new ArgumentOutOfRangeException(nameof(assignType), assignType, null);
- }
- }
- /// <summary>
- /// 当前用户是否可以办理该流程
- /// </summary>
- /// <returns></returns>
- public bool CanHandle(string userId, string orgCode) =>
- HandlerUsers.Contains(userId) || HandlerOrgs.Contains(orgCode);
- #endregion
- }
|