原材料
定义原材料身份的属性表——材质、形态、尺寸、表面处理、牌号和类型。
原材料(material)是一类 Material 类型的物料,用作库存原料。结构化的属性表定义了它的材质、形态、尺寸,以及可选的表面处理、牌号和类型。Carbon 使用这些值生成原材料的身份、显示名称和编码。
每条原材料记录(material 表)只保存指向这些查找表的外键:materialSubstanceId、materialFormId、dimensionId、finishId、gradeId 和 materialTypeId。六个字段都可为空,因此原材料可以按需要精确或宽松地定义。
属性表
六个查找表共同构成一个原材料。材质和形态相互独立;其余选项受其中一个或两者约束,因此会级联。
name 和 code。name 和 code。isMetric。name 和 code。查找表是级联的
材质和形态相互独立。牌号和表面处理从所选材质的列表中选择;尺寸从所选形态的列表中选择;类型取两者的交集。更换材质后,可选的牌号和表面处理列表随之变化。这就是新建原材料界面的表单自上而下依次填写的原因。
作用域:系统级或公司级
Carbon 提供一套初始分类。每个查找表都有可为空的 companyId。companyId 为空的记录是系统值,对所有公司可见;带公司 ID 的记录是该公司的自定义补充。
唯一性按作用域约束,因此系统值和公司值不会冲突:
code 唯一。code 唯一。code 和名称均唯一。材质和形态字段更完整,其余更精简
只有 materialSubstance 和 materialForm 有 code、自定义字段和审计字段。materialDimension、materialFinish、materialGrade 和 materialType 是精简查找表,没有自定义字段和审计记录,其预置 ID 是可读字符串(如 steel-1018),而非生成的键。
原材料如何引用这些属性
原材料通过位置关系关联到它的物料记录,而不是外键。创建原材料时,Carbon 先插入 type 为 Material 的 item 记录,再以物料的可读 ID 作为 material.id 插入 material 记录。这里没有 itemId 列。两者在同一公司内通过 item.readableId = material.id 关联,因此原材料的部件号就是它的原材料 ID。
由于关联基于可读 ID,一个原材料可以横跨多条 item 记录:不同的版本,以及每种库存规格各一条 item。你分配的 sizes 会成为生产订单和采购订单上的可选变体,每个变体都是一条共享该原材料 ID 的 item 记录。
生成原材料只要求材质和形态
Carbon 生成原材料及其 ID 时,materialSubstanceId 和 materialFormId 是必填项;尺寸、表面处理、牌号和类型可选。原材料最少就是「某种形态的某种材质」,其余属性用于进一步细化。
命名与唯一性
Carbon 用材质、形态以及可选的表面处理、牌号、尺寸名称组合出原材料的显示名称;用材质、形态和类型的编码组合出原材料编码。属性组合提供结构化的身份,而不是依赖自由文本。
由于尺寸属于形态、牌号和表面处理属于材质,合法的原材料始终是一组内部一致的选择。你无法为板材选择棒材的尺寸,也无法为铝选择不锈钢的牌号,因为这些列表已按先选的父级过滤。