# 闭环：从 ERP 到持续变好的应用

这一页用吉兴天津 8100 生产进度的真实做法，把五个 SDK 串成一条线：**连接**（ERP 只读）→ **数据**（数据层）→ **语义**（对象、Action）→ **权限**（谁能看、谁能改、分享）→ **日志**（用得怎么样）→ **自提升**（下一个版本）。恒田缅甸二厂车缝产量是同一套做法。

```
SAP / MES（只读）
   │  连接 SDK：发布端（客户箱上的 systemd 服务，不是 cron）
   ▼
数据层（AIDC 中枢）── 数据 SDK：同步绑定、增删改查、实时订阅
   ▼
语义层 ── 语义 SDK：工单线体 / 线体、链接、Action「登记异常」「解决异常」「维护线体」
   ▼
Nexus 应用 · 智能体 ── 权限 SDK：成员可改、公开链接只读 ── 日志 SDK：打开、操作、反馈、版本
   ▲                                                                     │
   └──────────────── 自提升 SDK：证据 → 提案 → 新语义版本 / 新应用版本 ◀──┘
```

## 1. 连接：数据源只读地推上来

发布端装在客户箱上，读 SAP 的报工确认（AFRU）与生产进度报表（ZPP015），有变化才推一批到数据流 `tj8100-progress`（见[连接 SDK · 实时数据流](connect.md)）。它只有一把只能往这条流发布的 Key，**永远不会写 SAP**。

## 2. 语义：先定义「这是什么」

```bash
aidc semantic define ontology/          # production.issue_status（枚举）、production.line、production.order_line、三个 Action
aidc semantic publish --notes "天津 8100 生产进度首版"
```

`production.order_line` 的属性分两类：工单、线体、计划、累计合格、实际 JPH……来自 SAP（只读）；异常状态、异常说明、登记人、处理说明……只在语义层维护（`writeback`）。Action 定义「登记异常」要哪些参数、改哪些属性、谁能做（见[语义 SDK](semantic.md)）。

## 3. 数据：把数据流同步进语义层

```bash
aidc data bind tj8100-progress production.order_line --map order_no=order,line_code=line,material=material,product=product,shift=shift,plan=plan,ok=ok,gap=gap,jph_actual=jph_actual,jph_std=jph_std,last_op=last_op,day=day
aidc data bind tj8100-progress production.line --map line_code=line --mode upsert
aidc data query production.order_line --sort -gap --limit 5
```

从这一刻起，SAP 每一次变化都进语义层：数据源层更新、人改过的值不动。应用和智能体不再碰数据流，更不碰 SAP。

## 4. 应用：读语义层、用 Action 改

```js
import { data, semantic, auth, log } from "/developer/sdk/v1/aidc.js";

const view = data.table("production.order_line").live({ sort: "-gap", onUpdate: render });  // 实时
const me = await auth.me();                                                                // 我能做什么
await semantic.action("production.flag_issue").apply({ issue: "缺料", severity: "异常" }, { object: row.pk });
log.feedback({ topic: "看板", message: "希望按班次筛选" });
```

清单登记用到的 SDK 与语义资源（部署时会核对 import，用了没登记的直接拒收）：

```json
{
  "sdk": ["data", "semantic", "auth", "log"],
  "semantic": { "types": ["production.order_line", "production.line"], "actions": ["production.flag_issue", "production.resolve_issue", "production.update_line"] }
}
```

```bash
aidc app deploy app/        # → Developer 预览（test），版本号 = 清单 version
aidc app publish tj8100-live --notes "语义层 + 异常登记"   # 测过的版本 → Nexus
aidc app registry           # 登记表：这个应用用了哪些 SDK、读写哪些类型 / Action
```

## 5. 权限：给谁用

- 本公司成员打开 `/nexus/cell-gissing-ai/apps/tj8100-live` 就能看、能执行「登记异常」（Action 的 roles 含 member）。
- 班组长在别的公司账号下？`aidc share tj8100-live --user 他的邮箱 --role editor --days 30`。
- 给客户或领导一个只读大屏链接：`aidc share tj8100-live --public`（真实数据，发之前确认；随时 `aidc share revoke`）。

## 6. 日志：用得怎么样

```bash
aidc log summary tj8100-live --days 7
```

打开几次、谁在用、登记了多少次异常、哪些反馈还没处理、每个版本号的状态（已上线 / 已被替换…）、语义版本——都在这里。Action 的记录还能从对象上反查：`aidc data get production.order_line <主键> --history`。

## 7. 自提升：下一个版本

```bash
aidc improve suggest tj8100-live --file 生产日报口径.md --conversation 班组长群.txt
aidc improve proposals --status open
aidc improve accept <id> && aidc improve apply <id>      # 语义类：改说明 / 同义词 / 加属性 → 自动发 v2
```

应用类提案（「加按班次筛选」）由开发者或智能体改代码，`aidc app deploy` → 测试 → `aidc app publish`，最后 `aidc improve apply <id> --version 1.2.0`；提案关联的反馈自动标记为已处理，反馈人下次打开就能看到改进。

## 数据放在哪里

- 语义层对象、变化记录、日志、分享、提案都在 AIDC 中枢（Supabase Postgres），按公司隔离；只存看板与协作需要的业务字段，身份证、银行卡、密码之类的字段在定义层就被拒收。
- ERP / MES 只被发布端读；发布 Key 只能往一条流发。
- 删掉一个数据流会连带停止同步；删掉对象类型的定义会归档它（对象保留，直到开发者清理）。
