using Admin.NET.Plugin.AiDOP.Entity; using Admin.NET.Plugin.AiDOP.Infrastructure; using Admin.NET.Plugin.AiDOP.SmartOps; using Admin.NET.Plugin.ApprovalFlow; using Admin.NET.Plugin.ApprovalFlow.Service; namespace Admin.NET.Plugin.AiDOP.Service; /// /// 智慧运营改善计划审批回调。 /// public class SmartOpsImprovementBizHandler : IFlowBizHandler, ITransient { public const string BizTypeCode = "SMART_OPS_IMPROVEMENT"; public string BizType => BizTypeCode; private readonly SqlSugarRepository _rep; private readonly SmartOpsImprovementActionService _actions; public SmartOpsImprovementBizHandler( SqlSugarRepository rep, SmartOpsImprovementActionService actions) { _rep = rep; _actions = actions; } public async Task OnFlowStarted(long bizId, long instanceId) { var plan = await _rep.GetByIdAsync(bizId); if (plan == null) return; await _rep.AsUpdateable() .SetColumns(x => x.Status == "approving") .SetColumns(x => x.FlowInstanceId == instanceId) .SetColumns(x => x.UpdateTime == DateTime.Now) .Where(x => x.Id == bizId && x.TenantId == plan.TenantId) .ExecuteCommandAsync(); } public async Task OnFlowCompleted(long bizId, long instanceId, FlowInstanceStatusEnum finalStatus, long? lastApproverId) { var plan = await _rep.GetByIdAsync(bizId); if (plan == null) return; var status = SmartOpsImprovementApprovalRules.MapCompletedStatus(finalStatus); var ownerId = plan.OwnerUserId; if (status == "approved" && ownerId is not > 0) ownerId = await _actions.ResolveOwnerUserIdAsync(plan); if (ownerId is > 0 && plan.OwnerUserId != ownerId) { await _rep.AsUpdateable() .SetColumns(x => x.Status == status) .SetColumns(x => x.OwnerUserId == ownerId) .SetColumns(x => x.UpdateTime == DateTime.Now) .Where(x => x.Id == bizId && x.TenantId == plan.TenantId) .ExecuteCommandAsync(); plan.OwnerUserId = ownerId; } else { await _rep.AsUpdateable() .SetColumns(x => x.Status == status) .SetColumns(x => x.UpdateTime == DateTime.Now) .Where(x => x.Id == bizId && x.TenantId == plan.TenantId) .ExecuteCommandAsync(); } if (status != "approved") return; plan.Status = status; await _actions.NotifyOwnerToStartAsync(plan, lastApproverId ?? 0); } public async Task> GetBizData(long bizId) { var plan = await _rep.GetByIdAsync(bizId); if (plan == null) return new Dictionary(); var route = SmartOpsImprovementApprovalRules.ResolveRoute(plan); return new Dictionary { ["moduleCode"] = plan.ModuleCode, ["metricCode"] = plan.MetricCode ?? "", ["problemLevel"] = plan.ProblemLevel, ["problemName"] = plan.ProblemName, ["problemDept"] = plan.ProblemDept ?? "", ["problemSeverity"] = SmartOpsImprovementApprovalRules.NormalizeSeverity(plan.ProblemSeverity), ["isCrossDept"] = plan.IsCrossDept ? 1 : 0, ["route"] = route, ["status"] = plan.Status, }; } }