using System.Diagnostics;
using Admin.NET.Plugin.AiDOP.Entity.S8;
using SqlSugar;
namespace Admin.NET.Plugin.AiDOP.Infrastructure;
///
/// CONFIG-MONITOR-DICT-READONLY-SEED-1:S8 监控对象/指标 baseline 种子。
/// 6 个对象 + 10 条指标,与原前端 BUSINESS_MONITOR_OPTIONS 一一对应。
/// 幂等:按 (tenant_id=0, factory_id=0, object_code/metric_code) Any() 检查后插入。
/// RATIO 类指标 enabled=false + is_result_kpi=true(S9 结果 KPI 范畴),不进入演示路径。
///
public static class AidopMonitorDictionarySeed
{
private const string DefaultObjectIdField = "source_object_id";
private const string DefaultObjectCodeField = "related_object_code";
private const string DefaultObjectNameField = "related_object_name";
public static void EnsureSeed(ISqlSugarClient db)
{
try
{
var ct = DateTime.Parse("2026-05-09 00:00:00");
// 6 监控对象
EnsureObject(db, "ORDER_DELIVERY", "ORDER", "订单交付", 10, ct);
EnsureObject(db, "ORDER_CHANGE", "ORDER", "订单变更", 20, ct);
EnsureObject(db, "PURCHASE_DELIVERY", "PURCHASE_ORDER", "供应商交付", 30, ct);
EnsureObject(db, "IQC_INSPECTION", "IQC", "IQC 检验", 40, ct);
EnsureObject(db, "WORK_ORDER_PRODUCTION", "WORK_ORDER", "生产工单", 50, ct);
EnsureObject(db, "INVENTORY_STOCK", "INVENTORY", "库存", 60, ct);
// DATE 指标 enabled=true / is_result_kpi=false
EnsureMetricDate(db, "ORDER_DUE_AT", "计划交付时间", "ORDER_DELIVERY", "分钟", "due_at", "status", 110, ct);
EnsureMetricDate(db, "PO_DUE_AT", "计划到货时间", "PURCHASE_DELIVERY", "分钟", "due_at", "status", 310, ct);
EnsureMetricDate(db, "WO_DUE_AT", "计划完工时间", "WORK_ORDER_PRODUCTION", "分钟", "due_at", "status", 510, ct);
// VALUE_RANGE 指标 enabled=true / is_result_kpi=false
EnsureMetricValueRange(db, "ORDER_CHANGE_COUNT", "订单变更次数", "ORDER_CHANGE", "次", "measured_value", 210, ct);
EnsureMetricValueRange(db, "IQC_VALUE", "检验值", "IQC_INSPECTION", null, "measured_value", 410, ct);
EnsureMetricValueRange(db, "INV_QTY", "当前库存量", "INVENTORY_STOCK", null, "measured_value", 610, ct);
// RATIO 指标 enabled=false / is_result_kpi=true(S9 结果 KPI 范畴;本轮 seed 入库但默认禁用)
EnsureMetricRatio(db, "ORDER_DELIVERY_RATE", "订单交付满足率", "ORDER_DELIVERY", "%", "measured_value", 120, ct);
EnsureMetricRatio(db, "PO_DELIVERY_RATE", "到货达成率", "PURCHASE_DELIVERY", "%", "measured_value", 320, ct);
EnsureMetricRatio(db, "IQC_PASS_RATE", "检验合格率", "IQC_INSPECTION", "%", "measured_value", 420, ct);
EnsureMetricRatio(db, "WO_COMPLETION_RATE", "工单完工率", "WORK_ORDER_PRODUCTION", "%", "measured_value", 520, ct);
}
catch (Exception ex)
{
Trace.TraceWarning("AidopMonitorDictionarySeed: " + ex);
}
}
private static void EnsureObject(ISqlSugarClient db, string objectCode, string objectType, string objectName, int sortNo, DateTime ct)
{
var exists = db.Queryable()
.Any(x => x.TenantId == 0 && x.FactoryId == 0 && x.ObjectCode == objectCode);
if (exists) return;
db.Insertable(new AdoS8MonitorObject
{
TenantId = 0,
FactoryId = 0,
ObjectCode = objectCode,
ObjectType = objectType,
ObjectName = objectName,
Enabled = true,
SortNo = sortNo,
CreatedAt = ct,
}).ExecuteCommand();
}
private static void EnsureMetricDate(ISqlSugarClient db, string metricCode, string metricName, string objectCode, string? unit, string dueAtField, string statusField, int sortNo, DateTime ct)
{
if (db.Queryable()
.Any(x => x.TenantId == 0 && x.FactoryId == 0 && x.MetricCode == metricCode)) return;
db.Insertable(new AdoS8MonitorMetric
{
TenantId = 0,
FactoryId = 0,
ObjectCode = objectCode,
MetricCode = metricCode,
MetricName = metricName,
Mechanism = "DATE",
Unit = unit,
DueAtField = dueAtField,
StatusField = statusField,
ObjectIdField = DefaultObjectIdField,
ObjectCodeField = DefaultObjectCodeField,
ObjectNameField = DefaultObjectNameField,
IsResultKpi = false,
Enabled = true,
SortNo = sortNo,
CreatedAt = ct,
}).ExecuteCommand();
}
private static void EnsureMetricValueRange(ISqlSugarClient db, string metricCode, string metricName, string objectCode, string? unit, string measuredValueField, int sortNo, DateTime ct)
{
if (db.Queryable()
.Any(x => x.TenantId == 0 && x.FactoryId == 0 && x.MetricCode == metricCode)) return;
db.Insertable(new AdoS8MonitorMetric
{
TenantId = 0,
FactoryId = 0,
ObjectCode = objectCode,
MetricCode = metricCode,
MetricName = metricName,
Mechanism = "VALUE_RANGE",
Unit = unit,
MeasuredValueField = measuredValueField,
ObjectIdField = DefaultObjectIdField,
ObjectCodeField = DefaultObjectCodeField,
ObjectNameField = DefaultObjectNameField,
IsResultKpi = false,
Enabled = true,
SortNo = sortNo,
CreatedAt = ct,
}).ExecuteCommand();
}
private static void EnsureMetricRatio(ISqlSugarClient db, string metricCode, string metricName, string objectCode, string? unit, string measuredValueField, int sortNo, DateTime ct)
{
if (db.Queryable()
.Any(x => x.TenantId == 0 && x.FactoryId == 0 && x.MetricCode == metricCode)) return;
db.Insertable(new AdoS8MonitorMetric
{
TenantId = 0,
FactoryId = 0,
ObjectCode = objectCode,
MetricCode = metricCode,
MetricName = metricName,
Mechanism = "RATIO",
Unit = unit,
MeasuredValueField = measuredValueField,
ObjectIdField = DefaultObjectIdField,
ObjectCodeField = DefaultObjectCodeField,
ObjectNameField = DefaultObjectNameField,
IsResultKpi = true,
Enabled = false,
SortNo = sortNo,
CreatedAt = ct,
Remark = "[RESERVED] S9 result KPI; enable explicitly when S8/S9 boundary task lands",
}).ExecuteCommand();
}
}