using Hotline.Share.Dtos;
using SqlSugar;
using XF.Domain.Entities;
using XF.Domain.Exceptions;
using XF.Domain.Repository;
namespace Hotline.FlowEngine.Workflows;
public class WorkflowStepHandler : CreationEntity
{
public string WorkflowId { get; set; }
public string ExternalId { get; set; }
public string WorkflowStepId { get; set; }
///
/// 流程指派类型
///
public EFlowAssignType FlowAssignType { get; set; }
public string? UserId { get; set; }
public string? Username { get; set; }
public string? OrgId { get; set; }
public string? OrgName { get; set; }
public string? RoleId { get; set; }
public string? RoleName { get; set; }
///
/// 是否为实际办理者
///
public bool IsActualHandler { get; set; }
[Navigate(NavigateType.ManyToOne, nameof(WorkflowStepId))]
public WorkflowStep WorkflowStep { get; set; }
#region method
public static WorkflowStepHandler Create(string workflowId, string externalId, EFlowAssignType flowAssignType, string? userId = null, string? username = null,
string? orgId = null, string? orgName = null, string? roleId = null, string? roleName = null)
{
var handler = new WorkflowStepHandler
{
WorkflowId = workflowId,
ExternalId = externalId,
};
handler.Assign(flowAssignType, userId, username, orgId, orgName, roleId, roleName);
return handler;
}
public void Assign(EFlowAssignType assignType, string? userId, string? username,
string? orgId, string? orgName, string? roleId, string? roleName)
{
FlowAssignType = assignType;
switch (assignType)
{
case EFlowAssignType.Org:
if (string.IsNullOrEmpty(orgId) || string.IsNullOrEmpty(orgName))
throw new ArgumentNullException(nameof(orgId));
OrgId = orgId;
OrgName = orgName;
break;
case EFlowAssignType.User:
if (string.IsNullOrEmpty(userId) || string.IsNullOrEmpty(username) ||
string.IsNullOrEmpty(orgId) || string.IsNullOrEmpty(orgName))
throw new ArgumentNullException(nameof(userId));
UserId = userId;
Username = username;
OrgId = orgId;
OrgName = orgName;
break;
//case EFlowAssignType.Role:
// if (string.IsNullOrEmpty(roleId) || string.IsNullOrEmpty(roleName))
// throw new ArgumentNullException(nameof(roleId));
// RoleId = roleId;
// RoleName = roleName;
// break;
default:
throw new ArgumentOutOfRangeException(nameof(assignType), assignType, null);
}
}
public bool IsHandler(ICollection roleIds, string? userId = null, string? orgId = null)
{
switch (FlowAssignType)
{
case EFlowAssignType.Org:
if (string.IsNullOrEmpty(OrgId))
throw new UserFriendlyException($"数据异常, {nameof(OrgId)}");
return OrgId.Equals(orgId, StringComparison.OrdinalIgnoreCase);
case EFlowAssignType.User:
if (string.IsNullOrEmpty(UserId))
throw new UserFriendlyException($"数据异常, {nameof(UserId)}");
return UserId.Equals(userId, StringComparison.OrdinalIgnoreCase);
//case EFlowAssignType.Role:
// if (string.IsNullOrEmpty(RoleId))
// throw new UserFriendlyException($"数据异常, {nameof(RoleId)}");
// return roleIds.Any() && roleIds.Contains(RoleId, StringComparer.OrdinalIgnoreCase);
default:
throw new ArgumentOutOfRangeException();
}
}
public Kv GetHandler()
{
return FlowAssignType switch
{
EFlowAssignType.Org => new Kv(OrgId, OrgName),
EFlowAssignType.User => new Kv(UserId, Username),
//EFlowAssignType.Role => new Kv(RoleId, RoleName),
_ => throw new ArgumentOutOfRangeException()
};
}
#endregion
}