namespace Admin.NET.Plugin.AiDOP.Entity.S8.OrderFlow;
///
/// S8-ORDER-CHAIN-PRODUCT-DESIGN-DRAWING-PERSIST-1:S8 订单链路产品设计图号事实表。
/// 承载 PRODUCT_DESIGN 阶段图号粒度的产品设计阶段基准业务初始化数据:
/// - 1 行 = 1 张图号绑定 1 个订单(OrderCode + DrawingNo 为业务唯一);
/// - 台数 / 占比 / 加权达成率 全部由 product_quantity 字段单一来源驱动;
/// - 平均设计周期 由 actual_days 算术平均;
/// - 达标判定 由 is_achieved + 当前 KPI=3 天为阈值(actual_days <= kpi_days);
/// 设计语义独立,不复用 ado_s8_order_flow_substep / substep_unit 的工时小时口径,
/// 也不与 ado_product_design(独立 Order 域表)建立物理依赖。
///
[SugarTable("ado_s8_order_flow_product_design_drawing", "S8 订单链路产品设计图号事实表")]
[SugarIndex("uk_order_flow_pdd_drawing",
nameof(TenantId), OrderByType.Asc,
nameof(FactoryId), OrderByType.Asc,
nameof(OrderCode), OrderByType.Asc,
nameof(DrawingNo), OrderByType.Asc,
IsUnique = true)]
[SugarIndex("idx_order_flow_pdd_order_code",
nameof(TenantId), OrderByType.Asc,
nameof(FactoryId), OrderByType.Asc,
nameof(OrderCode), OrderByType.Asc)]
[SugarIndex("idx_order_flow_pdd_product_type",
nameof(TenantId), OrderByType.Asc,
nameof(FactoryId), OrderByType.Asc,
nameof(ProductType), OrderByType.Asc)]
public class AdoS8OrderFlowProductDesignDrawing
{
[SugarColumn(ColumnName = "id", IsPrimaryKey = true, ColumnDataType = "bigint")]
public long Id { get; set; }
[SugarColumn(ColumnName = "tenant_id", ColumnDataType = "bigint")]
public long TenantId { get; set; }
[SugarColumn(ColumnName = "factory_id", ColumnDataType = "bigint")]
public long FactoryId { get; set; }
/// 订单业务键,引用 ado_s8_order_flow_order.order_code(无物理 FK,逻辑一致性由 service 保证)。
[SugarColumn(ColumnName = "order_code", Length = 64)]
public string OrderCode { get; set; } = string.Empty;
/// 图号编码:常规 D-{OrderCode}-G{NN};非标 D-{OrderCode}-X{NN}。租户/工厂内 OrderCode + DrawingNo 业务唯一。
[SugarColumn(ColumnName = "drawing_no", Length = 64)]
public string DrawingNo { get; set; } = string.Empty;
/// 产品类型:STANDARD(常规产品)/ NON_STANDARD(非标产品)。白名单由 service / seed 约束。
[SugarColumn(ColumnName = "product_type", Length = 16)]
public string ProductType { get; set; } = string.Empty;
/// 该图号对应台数。前端"台数 / 占比 / 加权达成率"三种口径的唯一数据源。
[SugarColumn(ColumnName = "product_quantity")]
public int ProductQuantity { get; set; }
/// 负责人字段,承载责任单位/岗位(研发中心 / 结构设计组 / 电气设计组 / 工艺设计组 / 设计审核组)。
[SugarColumn(ColumnName = "responsible_person", Length = 64)]
public string ResponsiblePerson { get; set; } = string.Empty;
/// 图号粒度计划开始日期(订单 PRODUCT_DESIGN 阶段区间内)。
[SugarColumn(ColumnName = "planned_start_date")]
public DateTime PlannedStartDate { get; set; }
/// 图号粒度计划结束日期。
[SugarColumn(ColumnName = "planned_end_date")]
public DateTime PlannedEndDate { get; set; }
/// 图号粒度实际开始日期;未开工时为 null。
[SugarColumn(ColumnName = "actual_start_date", IsNullable = true)]
public DateTime? ActualStartDate { get; set; }
/// 图号粒度实际结束日期;未完成时为 null。
[SugarColumn(ColumnName = "actual_end_date", IsNullable = true)]
public DateTime? ActualEndDate { get; set; }
/// KPI 标准设计天数。PRODUCT_DESIGN 阶段固定 3 天,落库为常量字段以支持后续 KPI 调整。
[SugarColumn(ColumnName = "kpi_days", DecimalDigits = 2, Length = 6)]
public decimal KpiDays { get; set; }
/// 实际设计周期(天)。actual_end_date - actual_start_date 派生;未完成时为 null。
[SugarColumn(ColumnName = "actual_days", DecimalDigits = 2, Length = 6, IsNullable = true)]
public decimal? ActualDays { get; set; }
/// 是否达标:actual_days <= kpi_days。未完成图号此列 false。
[SugarColumn(ColumnName = "is_achieved", ColumnDataType = "boolean")]
public bool IsAchieved { get; set; }
/// green / yellow / red / pending。green = actual_days <= kpi_days;yellow = (actual - kpi)/kpi <= 0.20;red = 其余;pending = 未完成。
[SugarColumn(ColumnName = "status", Length = 16)]
public string Status { get; set; } = "pending";
/// 同订单内图号展示顺序,从 1 起。
[SugarColumn(ColumnName = "sort_no")]
public int SortNo { get; set; }
[SugarColumn(ColumnName = "is_deleted", ColumnDataType = "boolean")]
public bool IsDeleted { get; set; }
[SugarColumn(ColumnName = "create_time")]
public DateTime CreateTime { get; set; } = DateTime.Now;
[SugarColumn(ColumnName = "update_time", IsNullable = true)]
public DateTime? UpdateTime { get; set; }
}