贯穿案例:示例工厂
13 个对象类型、12 条关系、1 个接口、12 个 Action、6 条自动化,一次画全,留作速查。

本课目标
读完这一课,你将能够
- 说出示例工厂的 13 个对象类型,以及它们在销售、生产、供应、质量四块里的位置
- 沿着关系走:从一张销售订单走到工单、检验和缺陷
- 说出六条自动化各自的条件和效果,并判断该用数据变化触发还是定时触发
一家做电动自行车的工厂
示例工厂是虚构的离散制造企业,做电动自行车的整车装配。它的数据在五个系统里:ERP(订单、物料、采购)、MES(工单、产出)、质量系统(检验)、设备物联网(时间序列)和 OA(审批)。五个系统全部只读地进 Semantic。这一课把它一次画全,后面十一门课都在这张图上加东西,请留着当速查页。
十三个对象类型的速记如下。括号里是主键,-> 是外键,只列关键属性,不是完整定义。
Customer (customerId) name, tier: customerTier, city, location: geopoint,
contact: struct{name, email}, creditLimitUsd: decimal
SalesOrder (orderNo) status: orderStatus, orderDate, promisedDate: date,
totalUsd: decimal, customerId -> Customer
OrderLine (lineId) orderNo -> SalesOrder, sku -> Product,
quantity: integer, unitPriceUsd: decimal
Product (sku) name, category, standardCostUsd: decimal
WorkOrder (workOrderNo) status: planned|released|running|paused|done,
plannedQty, goodQty, scrapQty: integer, startAt, dueAt: timestamp, dueDate: date,
lineCode -> ProductionLine, sku -> Product, orderNo -> SalesOrder
ProductionLine (lineCode) name, capacityPerShift: integer, status
Machine (machineId) lineCode -> ProductionLine, model, installedOn: date,
vibration: timeseries, temperature: timeseries
Material (materialCode) name, unit, onHandQty, safetyStockQty, leadTimeDays: integer
Supplier (supplierId) name, rating: double, country
PurchaseOrder (poNo) status, qty: integer, expectedAt: date,
supplierId -> Supplier, materialCode -> Material
Inspection (inspectionId) result: pass|fail, inspectedAt: timestamp, workOrderNo -> WorkOrder
Defect (defectId) code, severity: minor|major|critical, description, status,
inspectionId -> Inspection
Shipment (shipmentNo) carrier, status, shippedAt: timestamp, orderNo -> SalesOrder
销售
客户 Customer、销售订单 SalesOrder、订单行 OrderLine、产品 Product、发运 Shipment。客户下单,订单拆成行,行对应产品,最后发运。
生产
工单 WorkOrder、产线 ProductionLine、设备 Machine。订单拆成工单,工单排上产线,产线上有设备。
供应
物料 Material、供应商 Supplier、采购订单 PurchaseOrder。物料不够,就向供应商下采购订单。
质量
检验 Inspection、缺陷 Defect。工单要检验,检验发现缺陷。
四块之间靠关系连着,所以从任何一个对象出发,都能走到别的块:从一张销售订单,可以走到它的工单、检验和缺陷,也可以走到它的发运。
十二条关系,一个接口
十二条关系连成五条链。大多数是一对多,orderLineProduct 是多对一,productMaterials 是多对多。
销售链
customerOrders、orderOrderLines、orderLineProduct、orderShipments:从客户一路走到产品和发运。
生产链
orderWorkOrders、lineWorkOrders、lineMachines:订单、工单、产线、设备。
质量链
workOrderInspections、inspectionDefects:工单有检验,检验有缺陷。
供应链
supplierPurchaseOrders、materialPurchaseOrders:采购订单连着供应商和物料。
物料清单
productMaterials 是多对多,每条链接带 quantityPerUnit:一个产品用多种物料,一种物料用在多个产品里。这就是 BOM。
customerOrders Customer.orders <-> SalesOrder.customer 1:N
orderOrderLines SalesOrder.lines <-> OrderLine.order 1:N
orderLineProduct OrderLine.product <-> Product.orderLines N:1
orderWorkOrders SalesOrder.workOrders <-> WorkOrder.order 1:N
lineWorkOrders ProductionLine.workOrders <-> WorkOrder.line 1:N
lineMachines ProductionLine.machines <-> Machine.line 1:N
workOrderInspections WorkOrder.inspections <-> Inspection.workOrder 1:N
inspectionDefects Inspection.defects <-> Defect.inspection 1:N
supplierPurchaseOrders Supplier.purchaseOrders <-> PurchaseOrder.supplier 1:N
materialPurchaseOrders Material.purchaseOrders <-> PurchaseOrder.material 1:N
orderShipments SalesOrder.shipments <-> Shipment.order 1:N
productMaterials Product.materials <-> Material.products N:M (quantityPerUnit)
Interface Schedulable { dueAt: date, status }
SalesOrder promisedDate -> dueAt, status
WorkOrder dueDate -> dueAt, status
PurchaseOrder expectedAt -> dueAt, status
shared properties: ownerId, createdAt
关系的名字读起来像一句话:SalesOrder.workOrders 是「这张订单的工单」,WorkOrder.order 是「这张工单的订单」,从哪一头出发都能走过去。
接口 Schedulable 有 dueAt 和 status,由销售订单、工单、采购订单实现。有了它,「所有快到期的」一个对象集就能找出来,不用分类型各查一遍。接口属性要映射到类型相同的属性,销售订单和采购订单的到期日是 date,所以工单另加一个 date 类型的 dueDate 来映射(细节见关系课)。共享属性 ownerId 和 createdAt 则供多个对象类型共用。
十二个 Action,六条自动化
动词有十二个 Action,按业务分组:
- 订单与生产:
confirm-order、release-work-order、report-output、hold-work-order、ship-order - 质量:
flag-defect、close-defect - 采购与物料:
create-purchase-order、approve-purchase-order、receive-material - 通用:
assign-owner、request-maintenance(新建维保工单,对象类型MaintenanceTask到第 12 门课再加)
六条自动化把它们串起来。每一条都是「条件加效果」,先写下来,后面的课再逐条做出来:
- 01订单确认且物料齐套智能体建议并创建工单数据变化触发
- 02物料低于安全库存智能体起草采购订单,采购员批准数据变化触发
- 03检验失败建缺陷、暂停工单、通知质量负责人数据变化触发
- 04设备振动超阈值建维保工单触发方式见第 12 门课
- 05每天早上提醒可能延期的订单定时触发
- 06ERP 数据两小时没来告警,这就是看门狗定时触发
第 3 条里的通知步骤有限额:每个应用每天最多发 20 条通知(缺省值),同一件事 6 小时内不重复发。
第 4 条要读设备的时间序列:vibration 存的是一串带时间的点,可以取最新的一点,也可以取一段。
最后一条有个常见的坑:它只能用定时。数据没来,就没有「变化」可以触发,只能定时去看一眼。
后面每门课加一块
- 第 2 门课:把这些对象类型建出来
- 第 3 门课:连上关系,加上接口
- 第 4 门课:接入 ERP、MES 的数据
- 第 5 门课:写出十二个 Action
- 第 11 门课:让六条自动化转起来
- 第 12 门课:用它走通四个闭环
案例只加不改:后面的课会给它补几个小对象和小属性,比如 MaintenanceTask,但这张图上已有的名字和含义不会变。
下一门课「对象类型与属性」从这张图里的对象类型开始,一个个把它们建出来。
要点
- 十三个对象类型分四块:销售、生产、供应、质量;检验和发运是事件,也是对象类型。
- 十二条关系里只有
productMaterials是多对多,它带quantityPerUnit,就是 BOM。 - 接口
Schedulable让订单、工单、采购订单能被一起找出快到期的。 - 六条自动化都是条件加效果:数据一变才需要做的用数据变化触发,时间本身是条件的用定时。
练一练
在示例工厂里走一走
拿一张纸,把上面的速记抄一遍,再做下面三件事。
从一张 SalesOrder 出发,写出走到它的 Defect 要经过的三条关系,再写出反过来走的三个名字。
画出 13 个对象类型和 12 条关系,多对多的用虚线。数一数,每个对象类型有几条关系。
拆第 3 条:写出触发条件、三个效果各对应哪一个 Action(或者不是 Action 的那一步)、哪一步该由人来批准。
小测
选一个答案,马上看解析。
Q1从一张销售订单出发,要找到它的全部缺陷,沿着哪几条关系走?
缺陷来自检验,检验属于工单,工单属于销售订单。每一步都是一条定义好的关系。
Q2为什么「ERP 数据两小时没来就告警」不能用数据变化触发?
change 触发靠对象的新建或修改。数据该来没来,没有任何变化可等,只能定时看一眼。
Q3物料清单(BOM)在示例工厂里是什么?
一个产品用多种物料,一种物料用在多个产品里,还要记每个产品用几件,所以是带属性的多对多关系。