// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 // // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 // // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! using System.Text.Json.Serialization; namespace Admin.NET.Plugin.ApprovalFlow.Service; public class ApprovalFlowItem { [JsonPropertyName("nodes")] public List Nodes { get; set; } [JsonPropertyName("edges")] public List Edges { get; set; } } public class ApprovalFlowNodeItem { [JsonPropertyName("id")] public string Id { get; set; } [JsonPropertyName("type")] public string Type { get; set; } [JsonPropertyName("x")] public float X { get; set; } [JsonPropertyName("y")] public float Y { get; set; } [JsonPropertyName("properties")] public FlowProperties Properties { get; set; } [JsonPropertyName("text")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public FlowTextItem Text { get; set; } } public class ApprovalFlowEdgeItem { [JsonPropertyName("id")] public string Id { get; set; } [JsonPropertyName("type")] public string Type { get; set; } [JsonPropertyName("sourceNodeId")] public string SourceNodeId { get; set; } [JsonPropertyName("targetNodeId")] public string TargetNodeId { get; set; } [JsonPropertyName("startPoint")] public FlowEdgePointItem StartPoint { get; set; } [JsonPropertyName("endPoint")] public FlowEdgePointItem EndPoint { get; set; } [JsonPropertyName("properties")] public FlowProperties Properties { get; set; } [JsonPropertyName("text")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public FlowTextItem Text { get; set; } [JsonPropertyName("pointsList")] public List PointsList { get; set; } } /// /// 节点属性(存储在 FlowJson 中每个 node/edge 的 properties) /// 向后兼容:所有字段可空,旧数据反序列化不会报错 /// public class FlowProperties { // ── 用户任务节点属性 ── [JsonPropertyName("nodeName")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? NodeName { get; set; } /// /// 审批人类型:SpecificUser / Role / Department / Initiator /// [JsonPropertyName("approverType")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? ApproverType { get; set; } /// /// 审批人/角色/部门 Id,逗号分隔 /// [JsonPropertyName("approverIds")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? ApproverIds { get; set; } /// /// 审批人/角色/部门名称,逗号分隔(冗余,便于前端展示) /// [JsonPropertyName("approverNames")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? ApproverNames { get; set; } /// /// 多人审批模式:Any(或签) / All(会签) /// [JsonPropertyName("multiApproveMode")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? MultiApproveMode { get; set; } [JsonPropertyName("timeoutHours")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public double? TimeoutHours { get; set; } /// /// 超时动作:AutoApprove / AutoReject / Notify / AutoEscalate /// [JsonPropertyName("timeoutAction")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? TimeoutAction { get; set; } // ── 升级配置 ── /// /// 升级审批人类型:SpecificUser / Role / Department /// [JsonPropertyName("escalationApproverType")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? EscalationApproverType { get; set; } /// /// 升级审批人/角色/部门 Id,逗号分隔 /// [JsonPropertyName("escalationApproverIds")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? EscalationApproverIds { get; set; } /// /// 升级审批人/角色/部门名称,逗号分隔(冗余,便于前端展示) /// [JsonPropertyName("escalationApproverNames")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? EscalationApproverNames { get; set; } /// /// 是否允许手动升级(true 时审批面板显示"升级"按钮) /// [JsonPropertyName("enableManualEscalation")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public bool? EnableManualEscalation { get; set; } // ── 网关节点属性 ── [JsonPropertyName("conditions")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public List? Conditions { get; set; } } /// /// 排他网关条件分支 /// public class GatewayCondition { [JsonPropertyName("targetNodeId")] public string TargetNodeId { get; set; } = ""; [JsonPropertyName("expression")] public string Expression { get; set; } = ""; [JsonPropertyName("label")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? Label { get; set; } [JsonPropertyName("isDefault")] public bool IsDefault { get; set; } } public class FlowTextItem { [JsonPropertyName("x")] public float X { get; set; } [JsonPropertyName("y")] public float Y { get; set; } [JsonPropertyName("value")] public string Value { get; set; } } public class FlowEdgePointItem { [JsonPropertyName("x")] public float X { get; set; } [JsonPropertyName("y")] public float Y { get; set; } }