贯穿案例:示例工厂

第 6 课 · 共 6 课 约 9 分钟

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
SALES

销售

客户 Customer、销售订单 SalesOrder、订单行 OrderLine、产品 Product、发运 Shipment。客户下单,订单拆成行,行对应产品,最后发运。

PRODUCTION

生产

工单 WorkOrder、产线 ProductionLine、设备 Machine。订单拆成工单,工单排上产线,产线上有设备。

SUPPLY

供应

物料 Material、供应商 Supplier、采购订单 PurchaseOrder。物料不够,就向供应商下采购订单。

QUALITY

质量

检验 Inspection、缺陷 Defect。工单要检验,检验发现缺陷。

四块之间靠关系连着,所以从任何一个对象出发,都能走到别的块:从一张销售订单,可以走到它的工单、检验和缺陷,也可以走到它的发运。

十二条关系,一个接口

十二条关系连成五条链。大多数是一对多,orderLineProduct 是多对一,productMaterials 是多对多。

SALES

销售链

customerOrders、orderOrderLines、orderLineProduct、orderShipments:从客户一路走到产品和发运。

PRODUCTION

生产链

orderWorkOrders、lineWorkOrders、lineMachines:订单、工单、产线、设备。

QUALITY

质量链

workOrderInspections、inspectionDefects:工单有检验,检验有缺陷。

SUPPLY

供应链

supplierPurchaseOrders、materialPurchaseOrders:采购订单连着供应商和物料。

BOM

物料清单

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 门课再加)

六条自动化把它们串起来。每一条都是「条件加效果」,先写下来,后面的课再逐条做出来:

  1. 01订单确认且物料齐套智能体建议并创建工单数据变化触发
  2. 02物料低于安全库存智能体起草采购订单,采购员批准数据变化触发
  3. 03检验失败建缺陷、暂停工单、通知质量负责人数据变化触发
  4. 04设备振动超阈值建维保工单触发方式见第 12 门课
  5. 05每天早上提醒可能延期的订单定时触发
  6. 06ERP 数据两小时没来告警,这就是看门狗定时触发

第 3 条里的通知步骤有限额:每个应用每天最多发 20 条通知(缺省值),同一件事 6 小时内不重复发。

第 4 条要读设备的时间序列:vibration 存的是一串带时间的点,可以取最新的一点,也可以取一段。

最后一条有个常见的坑:它只能用定时。数据没来,就没有「变化」可以触发,只能定时去看一眼。

后面每门课加一块

  • 第 2 门课:把这些对象类型建出来
  • 第 3 门课:连上关系,加上接口
  • 第 4 门课:接入 ERP、MES 的数据
  • 第 5 门课:写出十二个 Action
  • 第 11 门课:让六条自动化转起来
  • 第 12 门课:用它走通四个闭环

案例只加不改:后面的课会给它补几个小对象和小属性,比如 MaintenanceTask,但这张图上已有的名字和含义不会变。

下一门课「对象类型与属性」从这张图里的对象类型开始,一个个把它们建出来。

要点

  • 十三个对象类型分四块:销售、生产、供应、质量;检验和发运是事件,也是对象类型。
  • 十二条关系里只有 productMaterials 是多对多,它带 quantityPerUnit,就是 BOM。
  • 接口 Schedulable 让订单、工单、采购订单能被一起找出快到期的。
  • 六条自动化都是条件加效果:数据一变才需要做的用数据变化触发,时间本身是条件的用定时。

练一练

在示例工厂里走一走

拿一张纸,把上面的速记抄一遍,再做下面三件事。

从一张 SalesOrder 出发,写出走到它的 Defect 要经过的三条关系,再写出反过来走的三个名字。

小测

选一个答案,马上看解析。

Q1从一张销售订单出发,要找到它的全部缺陷,沿着哪几条关系走?

Q2为什么「ERP 数据两小时没来就告警」不能用数据变化触发?

Q3物料清单(BOM)在示例工厂里是什么?

延伸阅读