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,
};
}
}