using System.Diagnostics;
using System.Text.Json;
using Admin.NET.Plugin.AiDOP.Service;
using Admin.NET.Plugin.ApprovalFlow;
using Admin.NET.Plugin.ApprovalFlow.Service;
using Yitter.IdGenerator;
using ApprovalFlowEntity = Admin.NET.Plugin.ApprovalFlow.ApprovalFlow;
namespace Admin.NET.Plugin.AiDOP.Infrastructure;
///
/// 智慧诊断改善计划默认审批流种子。
///
public static class AidopImprovementApprovalSeed
{
public static void EnsureSeed(ISqlSugarClient db)
{
try
{
db.CodeFirst.InitTables(
typeof(ApprovalBizType),
typeof(ApprovalFlowEntity),
typeof(ApprovalFlowVersion));
EnsureBizType(db);
EnsurePublishedFlow(db);
}
catch (Exception ex)
{
Trace.TraceWarning("Ai-DOP improvement approval seed: " + ex);
}
}
private static void EnsureBizType(ISqlSugarClient db)
{
var exists = db.Queryable()
.Any(x => x.Code == SmartOpsImprovementBizHandler.BizTypeCode);
if (exists) return;
db.Insertable(new ApprovalBizType
{
Id = YitIdHelper.NextId(),
Code = SmartOpsImprovementBizHandler.BizTypeCode,
Name = "智慧诊断改善计划",
Remark = "智慧运营诊断问题生成的改善计划审批",
IsEnabled = true,
CreateTime = DateTime.Now,
UpdateTime = DateTime.Now,
}).ExecuteCommand();
}
private static void EnsurePublishedFlow(ISqlSugarClient db)
{
var orgIds = db.Queryable()
.Select(x => x.Id)
.ToList()
.Where(x => x > 0)
.Distinct()
.ToList();
if (orgIds.Count == 0) orgIds.Add(0);
var now = DateTime.Now;
var flowJson = BuildDefaultFlowJson();
foreach (var orgId in orgIds)
{
var existing = db.Queryable()
.Where(x => x.BizType == SmartOpsImprovementBizHandler.BizTypeCode && x.OrgId == orgId && x.IsPublished && !x.IsDelete)
.OrderByDescending(x => x.Version)
.First();
if (existing != null) continue;
var flow = new ApprovalFlowEntity
{
Id = YitIdHelper.NextId(),
Code = $"SMART_OPS_IMPROVE_{orgId}",
Name = "智慧诊断改善计划审批",
BizType = SmartOpsImprovementBizHandler.BizTypeCode,
FormJson = "{}",
FlowJson = flowJson,
Status = 1,
Remark = "系统默认流程:开始-改善计划审批-结束",
Version = 1,
IsPublished = true,
OrgId = orgId,
CreateTime = now,
UpdateTime = now,
};
db.Insertable(flow).ExecuteCommand();
db.Insertable(new ApprovalFlowVersion
{
Id = YitIdHelper.NextId(),
FlowId = flow.Id,
Version = flow.Version,
FlowJson = flow.FlowJson,
FormJson = flow.FormJson,
PublishTime = now,
PublisherName = "系统初始化",
CreateTime = now,
UpdateTime = now,
}).ExecuteCommand();
}
}
private static string BuildDefaultFlowJson()
{
var item = new ApprovalFlowItem
{
Nodes = new List
{
new()
{
Id = "start",
Type = "bpmn:startEvent",
X = 100,
Y = 120,
Properties = new FlowProperties { NodeName = "开始" },
Text = new FlowTextItem { X = 100, Y = 154, Value = "开始" },
},
new()
{
Id = "approve",
Type = "bpmn:userTask",
X = 300,
Y = 120,
Properties = new FlowProperties
{
NodeName = "改善计划审批",
ApproverType = nameof(ApproverTypeEnum.Initiator),
ApproverNames = "发起人",
MultiApproveMode = "Any",
},
Text = new FlowTextItem { X = 300, Y = 154, Value = "改善计划审批" },
},
new()
{
Id = "end",
Type = "bpmn:endEvent",
X = 500,
Y = 120,
Properties = new FlowProperties { NodeName = "结束" },
Text = new FlowTextItem { X = 500, Y = 154, Value = "结束" },
},
},
Edges = new List
{
BuildEdge("edge-start-approve", "start", "approve", 140, 120, 260, 120),
BuildEdge("edge-approve-end", "approve", "end", 340, 120, 460, 120),
}
};
return JsonSerializer.Serialize(item);
}
private static ApprovalFlowEdgeItem BuildEdge(string id, string source, string target, float sx, float sy, float ex, float ey)
{
return new ApprovalFlowEdgeItem
{
Id = id,
Type = "bpmn:sequenceFlow",
SourceNodeId = source,
TargetNodeId = target,
StartPoint = new FlowEdgePointItem { X = sx, Y = sy },
EndPoint = new FlowEdgePointItem { X = ex, Y = ey },
Properties = new FlowProperties(),
PointsList = new List
{
new() { X = sx, Y = sy },
new() { X = ex, Y = ey },
},
};
}
}