package schema import ( "time" "bj_power_mes/constants" "entgo.io/ent" "entgo.io/ent/dialect" "entgo.io/ent/dialect/entsql" "entgo.io/ent/schema" "entgo.io/ent/schema/edge" "entgo.io/ent/schema/field" "entgo.io/ent/schema/index" ) // Job 工件,工单下独立加工的最小单元,贯穿整个工艺路线 // // 字段说明? // - dockEquipmentID/dockSlotNo: 接驳台设备ID及槽位,工件入线/出线位置 // - tempSlotNo: 缓存台槽位号,工件在缓存区中的位? // - cncStartedAt/cncCompletedAt: 加工计时字段,记录设备加工起止时刻(磨床/转台等) type Job struct { ent.Schema } func (Job) Annotations() []schema.Annotation { return []schema.Annotation{ entsql.Annotation{ Table: "job", Options: "COMMENT='工件? 工单下独立加工的最小单元,记录工件完整生命周期:状态、位置、步骤、事件版?", }, entsql.WithComments(true), } } func (Job) Fields() []ent.Field { return []ent.Field{ field.Int("id").Positive().Comment("主键ID"), field.Int("workOrderId").Comment("所属工单ID"), field.Int("productTypeId").Comment("产品类型ID,决定工艺路?), field.Int("recipeId").Comment("工艺路线ID,当前工件使用的配方"), field.String("currentStepId").MaxLen(20).Default("").Comment("当前加工步骤业务ID,如 OP10/OP20/OP90"), field.Enum("status"). GoType(constants.JobStatus("")). Default(string(constants.JobStatus_Created)). Comment("工件状态:Created/Queued/Processing/Completed/Suspended/Failed"), field.Enum("positionType"). GoType(constants.PositionType("")). Default(string(constants.PositionType_OnDock)). Comment("位置类型:ON_DOCK(接驳台? ON_EQUIPMENT(设备)/ ON_CACHE(缓存台?), field.String("positionRefId").Default("").Comment("位置引用ID,格?设备ID:槽位?), field.Int("tempSlotNo").Optional().Nillable().Comment("缓存台槽位号,工件在缓存台中的位?), field.Int("dockEquipmentId").Optional().Nillable().Comment("接驳台设备ID,工件所在接驳台"), field.Int("dockSlotNo").Optional().Nillable().Comment("接驳台槽位号,取值范?-42"), field.JSON("context", map[string]any{}).Optional().SchemaType(map[string]string{ dialect.Postgres: "jsonb", }).Comment("运行时上下文,存储形状判断、检测结果等动态数?), field.Int("priority").Default(2).Comment("调度优先级,数值越小优先级越高"), field.String("suspendedReason").Default("").Comment("挂起原因,记录工件被暂停的具体原?), field.Int("version").Default(0).Comment("事件版本号,乐观锁并发控制,每次状态变?1"), field.Int("totalStepCount").Default(0).Comment("累计步骤数,死循环防护:超过 maxStepCount 标记为异?), field.Int("maxStepCount").Default(200).Comment("最大步骤数限制,防止死循环"), field.String("lastEventId").Default("").Comment("最后处理事件ID,用于事件去重和溯源"), field.Time("completedAt").Optional().Comment("完工时间,所有工序执行完毕的时刻"), field.Time("cncStartedAt").Optional().Comment("加工开始时间,设备加工开始时?), field.Time("cncCompletedAt").Optional().Comment("加工完成时间,设备加工完成时?), field.Time("createdAt").Default(time.Now).Immutable().Comment("创建时间"), field.Time("updatedAt").Default(time.Now).UpdateDefault(time.Now).Optional().Nillable().Comment("最后更新时?), field.Bool("isDel").Default(false).Comment("软删除标记:TRUE=已删除(工单删除时软删,保留审计数据);查询需过滤 is_del = FALSE"), } } func (Job) Edges() []ent.Edge { return []ent.Edge{ edge.From("workOrder", WorkOrder.Type).Ref("jobs").Field("workOrderId").Unique().Required().Comment("所属工?), edge.From("productType", ProductType.Type).Ref("jobs").Field("productTypeId").Unique().Required().Comment("产品类型"), edge.From("recipe", Recipe.Type).Ref("jobs").Field("recipeId").Unique().Required().Comment("工艺路线"), edge.To("taskLogs", TaskLog.Type).Comment("任务执行日志"), edge.To("tasks", Task.Type).Comment("领域任务"), edge.To("stepInstances", JobStepInstance.Type).Comment("步骤执行实例"), } } func (Job) Indexes() []ent.Index { return []ent.Index{ index.Fields("workOrderId"), index.Fields("status"), index.Fields("positionType"), index.Fields("version"), } }