docs/agent-material-import-¿ª·¢½ø¶È.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,109 @@ # æºè½ä½ç©æå¯¼å ¥ - å¼åè¿åº¦ > æ´æ°æ¶é´ï¼2026-10-22 > å ³è项ç®ï¼`D:\ç马\åé\å端\mom-industrial-agent`ï¼Python æºè½ä½ï¼+ æ¬é¡¹ç®ï¼Java Bridgeï¼ > æµè¯åºï¼æ¬å° `ruoyi-vue-pro`ï¼Docker å®¹å¨ `mysql8`ï¼MySQL 8.4.8ï¼ ## æ»ä½ç¶æ 端å°ç«¯é¾è·¯å·²æé并宿è´ä¾éªæ¶ï¼ ``` å建补å½ä¼è¯ â ä¸ä¼ CSV â ç»å®éä»¶ â Python åå»ºä»»å¡ â Java åªè¯»é¢æ£ â äººå·¥å®¡æ ¸ç¡®è®¤ â å¹çæäº¤ â éè¡åæ§ ``` é¶æ®µ 1~6 å ¨é¨å®æï¼Java ä¸ Python æµè¯å ¨ç»¿ï¼æµè¯æ°æ®å·²é»è¾å é¤ã ## åé¶æ®µå®ææ åµ | é¶æ®µ | å 容 | ç¶æ | |------|------|------| | 1 | æ¡¥æ¥å置修å¤ï¼çå® HTTP ç¶æç ãç§æ·å åºãæå¡ä»¤çå®å«ãé件读åå¤ç¨ã403 æéæ å° | 宿 | | 2 | æ½åç©æå¯¼å ¥è§£æï¼`buildImportContext/resolveImportRow`ï¼åå¯¼å ¥è¡ä¸ºä¸åï¼ | 宿 | | 3 | Java åªè¯»é¢æ£ï¼åç±»/åä½è§£æãç¼ç å卿§ãCREATE/SKIP/BLOCKEDãç¡®å®æ§ preflight_hashï¼ | 宿 | | 4 | Java å¹çæäº¤ï¼command_id/idempotency_keyãPLAN_STALEãéè¡ç¬ç«äºå¡ãæ¥è¯¢åæ§ï¼ | 宿 | | 5 | Python æ¹é ï¼preflight/review/confirm/commit å¾ãCommonResult è§£æãè¶ æ¶å¯¹è´¦ãtoken ä¸å ¥ checkpointï¼ | 宿 | | 6 | çå®ç«¯å°ç«¯èè°ãè´ä¾ãæ°æ®åºæ ¸å¯¹ãæ¸ çãææ¡£ | 宿 | ## é¶æ®µ 6 宿µè®°å½ æ£åé¾è·¯ï¼ - 颿£ç»æ 2 è¡ `CREATE`ï¼æäº¤è¿å `SUCCEEDED`ï¼`targetItemId` = 1994 / 1995ã - `mdm_item` 1053 â 1055ï¼ä¸æåç§°è½åºæ£ç¡®ï¼`mes_md_item` æ ååï¼æªåæ¥ MESï¼ã - éå¤æäº¤åä¸è¯·æ±è¿åååæ§ï¼ä¸æ°å¢ç©æã - æ¸ çï¼æ `target_item_id` å°ä¸¤æ¡æµè¯ç©æç½® `deleted=1`ï¼æ°éåå° 1053ã è´ä¾éªæ¶ï¼ | åºæ¯ | ç»æ | |------|------| | æ Bearer token | 401 | | é误æå¡ä»¤ç | 403 | | ç¨æ·æ `mdm:item:import` æé | 403 `FORBIDDEN` | | è·¨ç¨æ·/è·¨ä¼è¯éä»¶ | 404 / æç» | | source_sha256 ç¯¡æ¹ | `SOURCE_DIGEST_MISMATCH` | | å commandId æ¹å 容 | 409 `COMMAND_ID_CONFLICT` | | åå¹ç鮿¹å 容 | 409 `IDEMPOTENCY_CONFLICT` | | 颿£è¾å ¥åååç¨æ§ hash æäº¤ | 409 `PLAN_STALE`ï¼body å¸¦ææ°é¢æ£ï¼ | | å ³é Java åå¼å ³ | 503 `WRITE_DISABLED` | | å ³é Python æäº¤å¼å ³ | 409 `COMMIT_DISABLED` | | ä¸ä¼ è¶ è¿ 8 MiB | æç» | æµè¯ç»æï¼ - Javaï¼13 个é对æ§åæµéè¿ï¼`mvn -pl yudao-server -am -DskipTests package` éè¿ã - Pythonï¼`uv run pytest -q` 14 项éè¿ï¼`uv run ruff check .` æ åè¦ã ## è¿è¡é ç½® | å¼å ³ | ä½ç½® | é»è®¤ | |------|------|------| | Java åå¼å ³ | `yudao.agent.bridge.write-enabled` | `false` | | Python æäº¤å¼å ³ | `MOM_COMMIT_ENABLED` | `false` | | æå¡ä»¤ç | `yudao.agent.bridge-service-token`ï¼gitignored `application-my.yaml`ï¼ | å¿ å¡«ï¼æªé ç½®åæç» | | MES 忥 | åºå® `syncMes=false` | å ³é | èè°æ¶éåæ¶æå¼ä¸¤ä¸ªåå¼å ³ï¼ä»»ä¸å ³éå³åæ¢åå ¥ç©æã ## æ°æ®åºåæ´ | èæ¬ | å 容 | |------|------| | `sql/mysql/system_agent_import_session_20261022.sql` | `system_agent_import_session` è¡¥å½ä¼è¯ | | `sql/mysql/mdm_agent_import_command_20261022.sql` | `mdm_agent_import_command`ã`mdm_agent_import_command_row` | | `docs/sql/config_export_all_20261022.sql` | åå¹¶åå§åèæ¬ï¼é¶æ®µä¸è¡¨æ° 416 â 419ï¼æ°å¢ä¸è¿° 3 å¼ è¡¨ï¼ | 以ä¸èæ¬å·²å¨æ¬å°å®¹å¨ `mysql8` ç `ruoyi-vue-pro` æ§è¡å¹¶å读éªè¯ã ## å·²ç¥éå¶ - åªæ°å»ºç©æï¼ä¸æ´æ°å·²æç©æï¼ç¼ç å·²å卿¶é¢æ£ `SKIP`ãæäº¤æ¶è·³è¿ã - ä¸åæ¥ MESï¼è¯·æ± `sync_mes=true` ç´æ¥é»æã - `mdm_item.code` æ å¯ä¸ç´¢å¼ï¼å¹¶ååå ¥çªå£ä¾èµå½ä»¤å¹çé®ä¸æäº¤å鿥ï¼éæ¡¥æ¥å¹¶ååå ¥ä»å¯è½éå¤ã - åä¸ä¼è¯éå¤ç»å®é件伿¿æ¢æ§éä»¶ï¼æ§ `attachmentId` 失æã - æäº¤ä¸ºåæ¥è¯·æ±ï¼å»ºè®®åç«¯è¶ æ¶ 120 ç§ï¼ï¼è¶ æ¶ååºæ¥è¯¢å½ä»¤åæ§ï¼ä¸è¦éè¯æäº¤ã - `@PreAuthorize` å åºæç»è¿å HTTP 200 + body 403ï¼Python ä¾§å·²å ¼å®¹è§£æï¼æ¡¥æ¥ä¸å¡å¼å¸¸è¿åçå®ç¶æç ã ## å端èè°ï¼2026-10-22ï¼ | 项 | å 容 | |------|------| | ä¾èµä»£ç | `vite.config.ts` æ°å¢ `/agent-api` â `127.0.0.1:8091`ï¼å»åç¼ï¼ | | API 客æ·ç«¯ | `src/api/mdm/item/agent.ts`ï¼ç¬ç« `RequestClient`ï¼body 模å¼ã120 ç§è¶ æ¶ãèªå¨å¸¦ç¨æ· tokenï¼ | | å¯¼å ¥å¼¹çª | `src/views/basicData/mdm/modules/agent-import.vue`ï¼ä¸æ¥ï¼ä¸ä¼ â å®¡æ ¸ä¿®è®¢/确认 â åæ§ | | å ¥å£ | ç©æåè¡¨å·¥å ·æ ãæºè½ä½å¯¼å ¥ãï¼æé `mdm:item:import`ï¼å AI æ»å¼å ³æ§å¶ | | æ ¡éª | `pnpm typecheck` 对æ¬è½®æ¹å¨æä»¶æ æ°å¢é误ï¼`mdm/index.vue` Switch ç `CheckedType` ä¸ºæ¢æé®é¢ï¼ | ### AI æ»å¼å ³ - `.env` æ°å¢ `VITE_APP_AI_ENABLE`ï¼`@vben/hooks` æä¾ `isAiEnable()`ã - å ³éåéèï¼`/ai` éæè·¯ç±ãç©æãæºè½ä½å¯¼å ¥ããCRM æ¥ä»·ä¸ ERP æ¥ç¥¨ãè¯å«å½å ¥ããå·¥ååç±» AI 颿µãè´¨æ£ AI å¤å®ãè´¨æ£å©æã - æªå®é å¯å¨æµè§å¨éªè¯ï¼æ¬å° Javaï¼48080ï¼ä¸ Pythonï¼8091ï¼åæªè¿è¡ï¼ç»å½ä¾èµå端ï¼å¯å¨ä¸¤ç«¯åæèè°æ¹æ¡å¤æµã ## åç»å¯éäºé¡¹ - å¢å å¹¶åæäº¤åæµä¸ `mdm_item.code` å¯ä¸æ§æ¹æ¡è¯ä¼°ã - è¯ä¼°ãæ´æ°å·²æç©æãçä¸ç¨å¯¼å ¥æ¹æ³ï¼ç¦æ¢å¤ç¨ä¼å é¤ MES ç©æç `updateItem`ï¼ã - å¯å¨ Java/Python åæ `docs/agent_material_import_integration.md` å䏿¬¡æµè§å¨ç«¯å°ç«¯å¤æµã docs/ai_model_capability_integration.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,107 @@ # AI 模å管ç - å¯ç¨ä¸åç±»èè°æ¹æ¡ ## æ¶åé¡µé¢ - AI 大模å â æ¨¡å管çï¼`ai/model/model/index`ï¼ - ä¾èµæ¨¡å䏿çä¸å¡é¡µé¢ï¼å¯¹è¯ãå¾åãç¥è¯åºã工使µï¼ ## ä¸å¡æµç¨ä¸æ°æ®å¸¦å ¥ 1. 模å管çå表æã模åç±»åãåç»å±ç¤ºï¼åä¸ç±»åçå¤è¡å¨ç±»åå纵ååå¹¶æä¸æ ¼ã 2. æ¯è¡ç¶æåæ¹ä¸ºãå¯ç¨ãå¼å ³ï¼ç´æ¥åæ¢è¯¥æ¨¡åçå¯ç¨/åç¨ã 3. å¯ç¨æä¸ªæ¨¡åæ¶ï¼å端èªå¨å ³é**åç±»å + åè½å**ä¸å·²å¯ç¨çå ¶ä»æ¨¡åï¼å端åªéæ´é¡µå·æ°ã 4. åç¨æ¨¡åä¸ä¼èªå¨å¯ç¨å ¶ä»æ¨¡åï¼è¯¥ç±»å该è½åå¯è½å æ¤æ²¡æå¯ç¨æ¨¡åã ## API | æ¹æ³ | è·¯å¾ | 说æ | |------|------|------| | PUT | `/ai/model/update-status` | æ´æ°æ¨¡åå¯ç¨ç¶æï¼æ¬æ¬¡æ°å¢ï¼ | | GET | `/ai/model/page` | 模ååé¡µï¼æ°å¢ `capability` æ¥è¯¢åæ° | | GET | `/ai/model/simple-list` | 模åä¸æï¼æ°å¢ `capability` æ¥è¯¢åæ° | **请æ±åæ°ï¼update-statusï¼ï¼** | åæ° | ç±»å | å¿ å¡« | 说æ | |------|------|------|------| | id | Long | æ¯ | 模åç¼å· | | status | Integer | æ¯ | 0-å¯ç¨ï¼1-åç¨ | **请æ±åæ°ï¼pageï¼ï¼** | åæ° | ç±»å | å¿ å¡« | 说æ | |------|------|------|------| | pageNo | Integer | æ¯ | 页ç | | pageSize | Integer | æ¯ | æ¯é¡µæ¡æ° | | name | String | å¦ | 模åååï¼æ¨¡ç³å¹é | | model | String | å¦ | æ¨¡åæ è¯ï¼æ¨¡ç³å¹é | | type | Integer | å¦ | 模åç±»å | | capability | String | å¦ | 模åè½åï¼text-ææ¬ï¼vision-è§è§ | | platform | String | å¦ | å¹³å° | | status | Integer | å¦ | ç¶æ | **ååºå段æ°å¢ï¼page / get / simple-listï¼ï¼** | åæ®µ | ç±»å | 说æ | |------|------|------| | capability | String | 模åè½åï¼text-ææ¬ï¼vision-è§è§ | **ååºç¤ºä¾ï¼** ```json { "code": 0, "data": { "list": [ { "id": 2, "name": "éä¹åé®å¯¹è¯æ¨¡å", "model": "qwen-max", "platform": "TongYi", "type": 1, "capability": "text", "status": 0 }, { "id": 4, "name": "éä¹åé®è§è§æ¨¡å", "model": "qwen-vl-plus", "platform": "TongYi", "type": 1, "capability": "vision", "status": 0 } ], "total": 4 } } ``` ## åæ®µå±ç¤ºè§å | åæ®µ | å±ç¤ºä½ç½® | 说æ | |------|----------|------| | 模åç±»å | å表é¦å | åç±»åå¤è¡çºµååå¹¶ï¼å½¢æåç±»åç» | | 模åè½å | å表ã表å | ææ¬/è§è§ï¼ä» 对è¯ç±»åéè¦åºå | | å¯ç¨ | åè¡¨ç¶æå | å¼å ³æ§ä»¶ï¼åæ¢å³è°ç¨ update-status | | æ¨¡åæ è¯ | æç´¢è¡¨å | æ¯ææ¨¡ç³æç´¢ | ## ä¸å¡è§å说æ | åºæ¯ | è§å | |------|------| | å¯ç¨æ¨¡å | èªå¨å ³éå `type + capability` çå ¶ä»å¯ç¨æ¨¡åï¼ä¿è¯æ¯ç»åªæä¸ä¸ªå¯ç¨ | | åç¨æ¨¡å | åªå ³éèªèº«ï¼ä¸èªå¨å¯ç¨å ¶ä»æ¨¡å | | æ°å»ºæ¨¡å | è¥ç¶æä¸ºå¯ç¨ï¼åæ ·ä¼å ³éåç»å ¶ä»æ¨¡å | | ç¼è¾æ¨¡å | 模åç±»åãè½åä¸å¯ä¿®æ¹ï¼å端已ç¦ç¨ï¼ï¼ä» æ°å»ºæ¶å¯é | | 对è¯ç±»å | ææ¬è½åä¸è§è§è½ååå¯å¯ç¨ä¸ä¸ªï¼äºä¸è¦ç | | é对è¯ç±»å | è½ååºå®ä¸ºææ¬ï¼æ¯ç»åªè½å¯ç¨ä¸ä¸ª | | å¾çè¯å« | åªä½¿ç¨è§è§è½åçå¯ç¨æ¨¡åï¼æªå¯ç¨æ¶æ¥å£ç´æ¥æ¥éæç¤ºå»å¯ç¨ | ## 注æäºé¡¹ - 模åç±»åãè½åå¨ç¼è¾æ¶ä¸å¯ä¿®æ¹ãè¥è¦æ¹å模åå½ç±»ï¼éå é¤åéæ°å建ã - å¯ç¨å¼å ³åæ¢åå¿ é¡»æ´é¡µå·æ°ï¼å 为åç»å ¶ä»è¡çç¶æå·²è¢«å端æ¹åã - å¾çè¯å«ï¼åç¥¨ãæ¥ä»·åãè´¨æ£æ¥åï¼ä¾èµè§è§è½å模åï¼å¦æåç¨äºå¯ä¸çè§è§æ¨¡åï¼è¿äºåè½ä¼æ¥éå¹¶æç¤ºå»å¯ç¨ã - è½ååæ®µå¨å岿°æ®ä¸ç±åç«¯ææ¨¡åæ è¯èªå¨å¤å®ï¼å« `vl` çå¯¹è¯æ¨¡åå½ä¸ºè§è§ï¼ï¼å端æ éè¿ç§»ã - é对è¯ç±»åä¸éè¦å±ç¤ºè½ååæ®µï¼æäº¤æ¶å¯ä¸ä¼ ï¼å端é»è®¤æ `text` å¤çã docs/industrial-agent-authorization-design.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,110 @@ # 工䏿ºè½ä½ææè®¾è®¡ï¼èåãæé®ä¸æ°æ®èå´ > 2026-10-21ï¼è®¾è®¡ç¨¿ãéç¨äºè¿è¥åºæ¯ãå·¥ä½æä»¶è¡¥å½ã宿¶ä»»å¡ãå®¡æ¹æ¢å¤åç»æå¯¼åºã模å便®æå¡ç«¯æä¾çå¯ç¨è½åè§åä»»å¡ï¼æç»ææç± Java æå¡ç«¯æ§è¡ã ## 1. ææååä¸é¡¹ç®ä¾æ® ç¨æ·éè¿æºè½ä½è®¿é®ä¸å¡æ¶ï¼æ¥æçè½åä¸å¾è¶ è¿å ¶éè¿æ£å¸¸ä¸å¡ç³»ç»è·å使ç¨çè½åãå·¥å ·ææç»¼åå¤ææ¨¡å/èåææãæä½æéç ãå¯¹è±¡æ°æ®èå´ãåæ®µçç¥ãä¸å¡ç¶æåå¨ä½å®¡æ¹è¦æ±ãä»»æä¸é¡¹ä¸æ»¡è¶³ï¼ç¦æ¢ç¸åºè°ç¨ã å·²æ ¸å¯¹ç代ç åºç¡ï¼ - `AuthController.getPermissionInfo()` è·åå½åç¨æ·ãå¯ç¨è§è²åè¿æ»¤ç¦ç¨é¡¹åçèåå表ã - `PermissionServiceImpl.hasAnyPermissions()` ä¸ `getDeptDataPermission()` æä¾åè½æéä¸é¨é¨èå´åºç¡è½åã - ä¸å¡ Controller ä½¿ç¨ `@PreAuthorize` æ£æ¥æéç ï¼ä¾å¦ååç `crm:contract:query/create/update/delete/import/export`ã - æ°æ®æéæ¡æ¶å¨æ¥è¯¢ä¾§åºç¨è§åï¼CRM è¿æ `CrmPermissionAspect` ç对象级æéä¸å ¬æµ·çé¢åè§åï¼å®åæç¬ç« `AfterSalePermissionService`ã è¿äºè§åç»åæ¹å¼ç±ç°æ Java æéæå¡åä¸å¡æå¡å³å®ï¼Python ä¸èªè¡ç¨è§è²åç§°æé¨é¨ ID æ¨ç®âåºè¯¥ææéâãä¸é¢çä»£ç æ ¸å¯¹ä¸ä»£è¡¨æ¯ä¸ªæ¨¡ååå·²å®ææ°æ®æéå®¡è®¡ï¼æ¥å ¥åééªè¯å表ã详æ ãèåä¸åå ¥çä¸è´æ§ã ## 2. èåãæé®ãæ°æ®ä¸å段çå ³ç³» | 屿¬¡ | ä½ç¨ | Agent çè¡ä¸º | | --- | --- | --- | | èå/æ¨¡åææ | ç¨æ·è·åè¿å ¥çä¸å¡å | æå¡ç«¯è½åç®å½å ³è menu_id/moduleï¼æ ææä¸å¼æ¾è¯¥åå·¥å · | | æé®/æä½æé | æ¥è¯¢ãæ°å¢ãä¿®æ¹ãå é¤ãå¯¼å ¥ã导åºãæäº¤ç | 精确æ å°å·¥å ·å°æéæé表达å¼ï¼ä¸ç¨âæèåâä»£æ¿æä½æé | | æ°æ®èå´ | æ¬äººãé¨é¨ãä¸çº§é¨é¨ãèªå®ä¹åé¢åå¯¹è±¡ææ | æ¥è¯¢æ¶å¨æå¡ç«¯çº¦æï¼ç»å® ID ä¹è¦å¯¹è±¡æ ¡éªï¼ä¸è½åªè¿æ»¤å表 | | åæ®µæé | ææ¬ãåºä»·ãèªé ¬ãè´¦å·ãèç³»æ¹å¼çææå段 | 卿°æ®è¿å ¥æ¨¡åä¹åè¿æ»¤ï¼è¥ç°æç³»ç»æªç»ä¸æä¾ï¼æ°å¢å段çç¥ | | ç¶æ/å®¡æ¹ | å·²å ³éã审æ¹ä¸ãå·²æ§è¡çä¸å¡éå¶ | ææé®æéä»éæ ¡éªç¶æï¼å®¡æ¹èµæ ¼ä¸æ§è¡èµæ ¼å嫿 ¸éª | èåçå端éè屿§ã页é¢è·¯ç±å¯è§æ§åæå¡ç«¯ææä¸åãéè详æ 页ä¸åºä¸å¾è§ä¸ºæªææï¼ä»¥æå¡ç«¯å®é ææå ³ç³»åè½åæ å°ä¸ºåãèåææä¸å®æ´ãæ 对åºèåç跨模åæå¡è½åï¼å¿ é¡»æ¾å¼ç»è®°ï¼ä¸è½ä»åç«¯ä¼ æ¥çèåæ å¤æã å¤è§è²çåè½æé䏿°æ®èå´å并沿ç¨ç°æç³»ç»è¯ä¹ï¼ä¸è½å¯¹å ¨é¨è§è²ç®åæ±äº¤é导è´è¯¯æï¼ä¹ä¸è½æä¸åä¸å¡å¯¹è±¡ä¸çææéææ±å¹¶å¯¼è´æ©å¤§èå´ãAgent å¨ä½çç¥å¯ä»¥æ¶ç´§ä¸å¡æéï¼ä¸å¾å°å ¶æ¾å®½ã ## 3. æå¡ç«¯è½åç®å½ä¸ LangGraph è·¯å¾ ææ°å¢ Java `AgentAuthorizationService`ï¼çæè½åç®å½ï¼æ§è¡å·¥å ·/对象/åæ®µå¤å®ï¼å¹¶è®°å½ææå³çãææä¾ `capabilities` å `check-action` å 鍿¥å£ï¼åè ç¨äºè§åï¼åè åä¸å¡æå¡ç¨äºå®é è°ç¨ã ```text éªè¯å½åç¨æ·/åæ§å§æ â Java 计ç®å¯ç¨è½åä¸ policy_revision â LangGraph åªç»å®å½ååºæ¯çå·²ææå·¥å · â æ¨¡åæåºç»æå计å â ä»£ç æ£æ¥è®¡åå·¥å ·ä¸åæ°èå´ â Java æ¯æ¬¡éæ°é´æå¹¶æ§è¡å¸¦èå´çä¸å¡æ¥è¯¢/å½ä»¤ â è¿æ»¤å段åäº¤ç»æ¨¡å â ç»ææ¥çãéä»¶ä¸è½½ã导åºä¸å鿶忬¡æ£æ¥ ``` è½åç®å½ç¤ºæï¼ ```json { "policy_revision": "server-generated-version", "capabilities": [{ "tool": "crm.contract.read", "module": "crm", "operation": "query", "scope_summary": "ä» å½åç¨æ·å¯è§åå", "allowed_fields": ["code", "customer_name", "delivery_date"], "can_execute": true }] } ``` ç®å½æ¯çæè§åæç¤ºï¼ä¸æ¯å¯é¿æä½¿ç¨çææåè¯ãæå¡ç«¯ä¿åç宿é表达å¼ä¸æ°æ®è§åï¼ä¸å¿ æå®æ´è§è²é ç½®ãå¯è®¿é® ID å表æå é¨ SQL åç»æ¨¡åãåæ®µç½ååæå ·ä½å¯¹è±¡ä¸ç¨æ·çç¥è¿ä¸æ¥æ¶ç´§ã LangGraph å¨å ¥å£å¢å `load_capabilities`ï¼å¨è®¡ååå¢å `authorize_plan`ï¼å·¥å ·å°è£ ç»ä¸ `authorize_and_invoke`ãæéä¸è¶³èµ° `access_limited` 忝ï¼åç¨æ·è¯´æå¯æ§è¡é¨åå缺å°çæä½æéï¼ä¸æ³é²æ æå¯¹è±¡çåç§°ãæ°éæå 容ã ## 4. Java Bridge çå¼ºå¶æ£æ¥ Bridge ç´æ¥è°ç¨ Service æ¶ï¼å Controller ä¸ç `@PreAuthorize` ä¸ä¼å æ¤èªå¨æ§è¡ï¼å¿ é¡»æ¾å¼æ£æ¥å¯¹åºåè½æéï¼å¯¹è±¡è§åä¹å¿ é¡»ç»è¿å®é çæç Service/AOP/æ¥è¯¢è·¯å¾ãä¸å¾ä¸ºè·¨æ¨¡åæ¹ä¾¿ä½¿ç¨å ¨å±ç®¡çå身份ã`executeIgnore` æå ³éæ°æ®è¿æ»¤æ¥ä»£æ¥ã æºèº«ä»½ç± Java é´å«å¹¶ç¾åçæ¶å§æä¸ä¸æï¼å å«ç¨æ·ãç§æ·ãaudienceãæææä¸å 许ç¨éãå·¥å ·åæ°ä¸ç user_id/dept_id/owner_id ä¸å ·ææææåãåå°çº¿ç¨æ§è¡æ¶å»ºç«æ£ç¡®çæå¡ç«¯èº«ä»½ä¸ä¸æå¹¶å¨ç»ææ¶æ¸ çï¼é²æ¢çº¿ç¨å¤ç¨ä¸²èº«ä»½ã æ¥è¯¢ã详æ ãå ³èæ¥è¯¢ãèåãæç´¢å»ºè®®ãæä»¶æ£ç´¢é½è¦æ§è¡ç¸åèå´è§åï¼ç¦æ¢âå æ¥å ¨éï¼æ¨¡ååçéâãæ´æ°/å é¤é¤äºæéç ï¼è¿æ ¡éªç®æ å¯¹è±¡ï¼æ°å¢æ ¡éªå¯æå®çé¨é¨ãè´è´£äººãä»åºã客æ·çå ³è对象ï¼ä¸è½åæ°å¢ææ°æ®æå°æ æé¨é¨ã ## 5. 跨模ååæä¸è¾åºæ§å¶ ä¾å¦é宿ååæ¥è¯¢æé使²¡æéè´ä»·æ ¼æéï¼å¯ä»¥å¨å·²ææèå´å åæååï¼ä¸è½æéè´åæç»åä»·æ ¼æä¾ç»æ¨¡åã妿ä¼ä¸å¸æéå®äºè§£äº¤ä»è½åï¼æ°å¢ç»è¿ææçâ交æè¯ä¼°æè¦âè½åï¼ç±æå¡ç«¯éå¶è¾åºåæ®µåæ¥æºèå´ï¼èéèªå¨ç»§æ¿éè´æç»æéã 跨模åä»»å¡éèç¹ææï¼å¿ éæ°æ®æ æéæ¶æ 注âå½åææèå´ä¸è¶³ä»¥å®æè¯ä¼°âï¼ä¸å¾æä¸å¯è§é¨åå½ä½ä¸å卿 0ãç»ææ³¨æâå½åå¯è§èå´âï¼ä¸å¾å®£ç§°æ¯å ¨ä¼ä¸ç»è®¡ãè¥æä¾è·¨èå´æ±æ»ï¼éæç¬ç«èåææåè¾åºçç¥ï¼ä¸è½åæ±æ»æ¨æéèå®¢æ·æææéé¢ã æéè¿æ»¤åæ ·è¦çè¯æ®é¾æ¥ãå¼ç¨æ é¢ãéä»¶é¢è§ãSSEãæ¥åä¸è½½ãå享ä¸éç¥ã导åºéè¦å¯¹åºå¯¼åºææï¼æ¥è¯¢æéä¸èªå¨å å«å¯¼åºæéãåéç»æåæ¶æ£æ¥å起人åéæé忥æ¶äººçå¯è§èå´ãåå§æ¥æºçæéä¸ä¼å ä¸ºåææè¦èæ¶å¤±ã ## 6. æä»¶è¡¥å½çæéè§å ä¸ä¼ æéãæ¥çæä»¶æéãå¹é ç³»ç»æ°æ®æéã建ç«ä¸»æ°æ®æéãå¯¼å ¥ä¸å¡æéåæ´æ°æ¢ææ°æ®æéåå«å¤æãç¨æ·ä¸ä¼ äºæä»¶ï¼ä¸ä»£è¡¨è·åæ¥è¯¢æä»¶ä¸æåçææç³»ç»è®°å½ï¼ä¹ä¸ä»£è¡¨è·åå¯¼å ¥å ¶ä¸å ¨é¨æ°æ®ã - å®ä½å¹é åªè¿åå¯è§åéï¼åç°å ¨å±å¯ä¸é®å²çªä½ç®æ ä¸å¯è§æ¶ï¼è¿åéç¨å²çªååæ§å¤çå ¥å£ï¼ä¸éé²ç®æ è®°å½ä¿¡æ¯ã - å¯¼å ¥å¨ä½éç¨ç»è¿è¯å®¡çæéç»åï¼ä¾å¦é模åå¯¼å ¥æéåç¸åºå建/æ´æ°è½åï¼å ·ä½ä¸ç°æå¯¼å ¥ Service è¯ä¹å¯¹é½ï¼ä¸è½æ èªå设ä¸ä¸ª import æéæ¶µçå ¨é¨æä½ã - æ¹æ¬¡ä¸ææåæ æè®°å½å嫿 è¯ï¼æ æè¡é»æå ¶ä¾èµé¾ãæç¡®å®¡æ¹è®¡ååæå 许ç¬ç«ææåç»ç»§ç»æ§è¡ã - è¡¥å½ä¸»æ°æ®ç¼ºå¤±æ¶ï¼æ æ°å¢æéçç¨æ·åªè½æåºç³è¯·ææååéï¼ä¸èªå¨æ°å»ºå®¢æ·ãç©æãä»åºã - è´è´£äºº/é¨é¨å½å±ãè¿ç§»åå²ç¶æãæåä½é¢çæ¶åé¢å¤æéï¼éåæ®µ/å¨ä½æ ¡éªãdry-runãæäº¤åå读é½éæ°ææã - åå§æä»¶ãåéãé®é¢æ¸ åã人工修订åå¯¼å ¥æ¥åè®¾æ¹æ¬¡ ACLï¼åä½äººåçå°çå 容æå ¶æéè£åªï¼ä¸è½å å䏿¹æ¬¡å°±è·åæ¥çææèªé ¬æææ¬ã ## 7. å®¡æ¹æ¢å¤ã宿¶ä»»å¡ä¸æéåå 审æ¹äººæå®¡æ¹æï¼ä¸ä»£è¡¨å起人èªå¨è·å¾æ§è¡æãé»è®¤æ§è¡è¦æ±å起人çå½åææä»ææï¼å¦ä¸å¡å 许ç±ç¬ç«æ§è¡ä¸»ä½æ¥ç®¡ï¼å¿ é¡»è®°å½æç¡®ç主ä½åæ¢ãå§æèå´å审æ¹ä¾æ®ï¼ä¸è½é»é»ä½¿ç¨å®¡æ¹äººæç®¡çå身份ã è§è²æ¤éãè´¦å·ç¦ç¨ã离è交æ¥ã对象å½å±ååãèåç¦ç¨æ¶ï¼æ´æ°ææçæ¬å¹¶å¤±æè½åç¼åãæèµ·å¾æ¢å¤æ¶éæ°å è½½æéï¼åå¤å¥½çæ¹æ¡ä¸ä¿çæ§ææãæ§è¡æ¶ä»æ£æ¥ææ°æéï¼é¿å åªä¾èµå¤±æéç¥ã ä¸ªäººå®æ¶ä»»å¡ä½¿ç¨æç¡®çåæ§å§æï¼ç¨æ·åç¨/æ¤æåæåãä¼ä¸å·¡æ£ä½¿ç¨ä¸é¨æå¡ä¸»ä½åæ¹åçæ°æ®èå´ï¼å个人æ¨éåææ¥æ¶äººæéè£åªã个人对è¯ä¸å¯åä¼ä¸å·¡æ£ä¸»ä½æ©å¤§æ¥è¯¢èå´ã ç¼åæç§æ·ã主ä½ãæéçæ¬ã对象/åæ®µèå´éç¦»ï¼æ£æ¥ç¹å产ç©ä¸ç´æ¥é¢åå端ãæéæ¶ç´§åï¼åæ¬¡è¯»åæ§ç»æãæ¢å¤ä¼è¯æé建模åä¸ä¸ææ¶éæ°ææï¼å¿ è¦æ¶é®è½æéæ°çæãå·²åç¨æ·å±ç¤ºè¿çä¿¡æ¯æ æ³æ¤åï¼ä½ç³»ç»ä¸è½ç»§ç»è¿åå·²æ¤æå 容ã ## 8. 审计ä¸éªæ¶ æ¯æ¬¡ææå³çè®°å½ä¸»ä½ã姿䏻ä½ãtool/actionã对象å¼ç¨ãæéçæ¬ãå³çãåå ç ãtask_idãapproval_idï¼éç¨æ¶ï¼ãæç»æ¥å¿é¿å è®°å½å®æ´ææå段ãå端åå åºåæ æä½æéãæ°æ®èå´ä¸è¶³ãç¶æä¸å 许ã审æ¹ç¼ºå¤±ä¸ææè¿æï¼ä¸å¾æ³é²æ æå¯¹è±¡å卿§ã éªæ¶å¿ é¡»å å«ï¼æèåæ æ¥è¯¢æé®ï¼å¯æ¥ä¸å¯æ¹ï¼å¯æ¥ä¸å¯å¯¼åºï¼æ¬äººæ°æ®è¶ç详æ IDï¼è·¨é¨é¨èåï¼CRM åªè¯»/读å/è´è´£äººï¼å®å对象æéï¼æ°å¢æ¶æå®æ æè´è´£äººï¼å¯¼å ¥å«æ æå ³è对象ï¼å®¡æ¹çå¾ ä¸æ¤æï¼æ§æ£æ¥ç¹ä¸ç¼åæ³æ¼ï¼æå¡è´¦å·å·¡æ£ç»ææ¨éï¼åæ®µè±æï¼Bridge ç»è¿ Controller ç鲿¤ã æ¬æ¬¡ä¸ºæ¹æ¡è¡¥å ï¼æªæ¹åç°ææé代ç ã宿½æ¶é模åç»è®°âèåç»å®ãå·¥å ·æé表达å¼ã对象è§åãåæ®µçç¥ãç¶æè§åã审æ¹é¨æ§âï¼æªç»è®°ææ ¸éªå¤±è´¥çè½åé»è®¤å ³éã docs/industrial-agent-document-onboarding-design.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,192 @@ # æ ¸å¿è½åï¼ä¼ä¸å·¥ä½æä»¶çè§£ãæ ¸å¯¹ä¸æ°æ®è¡¥å½ > ææ¯æ¹æ¡ v1ï¼2026-10-21ãä½ä¸º LangGraph å¹³å°çç¬¬äºæ¡æ ¸å¿ä¸»çº¿ï¼ä¸ä¹ä¸ªè¿è¥åºæ¯å¹¶åãé¢åä¼ä¸å次ä¸çº¿åæ¥å¸¸å¢éè¡¥å½ï¼æ¬è½®ä» è®¾è®¡ï¼æªå¤çç宿件æå¯¼å ¥ä¸å¡æ°æ®ã ææè§ååè§ [ç»ä¸æéæ¹æ¡](industrial-agent-authorization-design.md)ï¼ä¸ä¼ ãå®ä½å¹é ãåå»ºãæ´æ°ãå¯¼å ¥ã导åºå嫿æï¼æ¹æ¬¡ä¸çæ¯æ¡è®°å½åå ¶å ³è对象é½éè¦éªè¯æ°æ®èå´ã ## 1. ç®æ ä¸äº¤ä»ç»æ ä¼ä¸å¯ææä»¶å¤¹/æ¹æ¬¡æäº¤æ¥å¸¸ WPS 工使件ï¼ç³»ç»è¯å«å ¶ä¸ç客æ·ãä¾åºåãç©æã设å¤ãååã订åãåºåãæ¥å·¥ãè´¨æ£çå 容ï¼ç»è¿å¤è½®æ£æ¥ä¸äººåè¡¥å ï¼å½¢æå¯é¢è§ãå¯è¿½æº¯ã坿¢å¤çå¯¼å ¥æ¹æ¡ã æ¯æ¬¡å¯¼å ¥äº¤ä»äºé¡¹äº§ç©ï¼åå§æä»¶æ¸ åä¸çæ¬å ³ç³»ãåæ®µæ å°åæ¥æºè¯æ®ãå¾ è¡¥å /å²çªæ¸ åã带ä¾èµé¡ºåºçå ¥åºè®¡åãé项æ§è¡ä¸æ ¸å¯¹æ¥åãæä»¶å 容åå¨ä¸ç¡®å®æ§æ¶ä¿çåå¼ååéå¼ï¼æªç¡®è®¤çåå²äºå®ä¸è½éè¿æ¨¡åæ¨æµè¡¥é½ã ## 2. æä»¶èå´ä¸è§£æçç¥ | æä»¶ç±»å | è§£æç®æ | é级æéå¶ | | --- | --- | --- | | WPS ç¼è¾ç xlsx/xls/csv | å·¥ä½è¡¨ãåºåã表头ãåå æ ¼ãå ¬å¼ä¸å¯ç¨ç¼åå¼ã夿³¨ãéèè¡å | ç¼å缺失/å¤é¾æå¼æ ä¸ºå¾ æ ¸å®ï¼ä¸å¾æç©ºç¼åå½ 0 | | WPS ç¼è¾ç docx/doc | 段è½ãè¡¨æ ¼ã页ç页èãæ¹æ³¨/修订ãå åµå¾ç | åå²äºè¿å¶æ ¼å¼éè¿åæ¯æè½¬æ¢éé å¨å¤çå¹¶æ ¸å¯¹ååå 容 | | pptx/ppt åæ±æ¥ææ | è¡¨æ ¼ãææ¬ãå¾ç¤ºä¸çææ å对象线索 | æ±æ»ææ ä¸é»è®¤æææç»äº¤æï¼ç¼ºå°åå§å°è´¦æ¶åªå½æ¡£æçææ ¸å®ä»»å¡ | | PDFãæ«æä»¶ãç §ç | ææ¬å±ä¼å ï¼æ«æåºå OCRï¼é¡µç /åæ åçé¢è¯æ® | å°æ°ç¹ãè´å·ãç¼ç ãç¾ç« åè·¨é¡µè¡¨æ ¼è¿å ¥éç¹å¤æ ¸ | | WPS åç et/wps/dps | æä»¶è¯å«ã转æ¢åææ åæ ¼å¼å¤ç | 䏿¿è¯ºææçæ¬æ æï¼è½¬æ¢å¤±è´¥è¿å ¥å¾ å¤çï¼å¯è¦æ±å¦åæ åæ ¼å¼ | | æä»¶å¤¹ãå缩å | ä¿çè·¯å¾ãæä»¶é´å¼ç¨åç¸å¯¹å ³ç³»ï¼éæä»¶è§£æ | éå¶è§£åæ°é/深度/大å°ï¼å¼å¸¸æä»¶é离ï¼ä¸é»å¡æ ä¾èµæä»¶ | è§£æéç¨âæ ¼å¼ç»æè§£æ â çé¢/åºåè¯å« â å±é¨ OCR â è¯ä¹æ å°âãå ·ä½è§£æ/转æ¢ç»ä»¶éè¿ç宿 ·æ¬å ¼å®¹æµè¯åéåï¼ä¸å¨è®¾è®¡é¶æ®µå®£ç§°å·²å ¼å®¹ææ WPS çæ¬ãè½¬æ¢æå¡ç¬ç«é离ï¼ç¦æ¢èªå¨æ§è¡å®ãèæ¬æå¤é¨æ°æ®è¿æ¥ã ä¿çåå§æä»¶ä¸å¯å坿¬ãæä»¶ hashãåæ ¼å¼ãè§£æå¨çæ¬å转æ¢äº§ç©ãæä»¶å¯ç ç±å®å ¨è¾å ¥æµç¨å¤çï¼ä¸åè¿å¯¹è¯ãæ£æ¥ç¹ææ¥å¿ã失败åå å¿ é¡»å ·ä½å°âå å¯ââæåââæ ¼å¼ä¸æ¯æââOCR ä¸ç¡®å®âçã ## 3. è¡¥å½å¯¹è±¡ä¸è¾¹ç | æ°æ®å± | 对åºé¡¹ç® | å¤çè¦æ± | | --- | --- | --- | | åºç¡ä¸»æ°æ® | MDM ç©æ/SKUãåç±»ãåä½ãä»åºï¼CRM 客æ·è系人ï¼SRM ä¾åºåï¼è®¾å¤/çç» | ä¼å å¹é ç°æè®°å½ï¼åæåºæ°å¢ï¼å«å䏿£å¼åç§°åå«ç®¡ç | | ä¸å¡ç»æ | BOMãå·¥èºè·¯çº¿ãæ£éªæ åã客æ·äº§åå¯¹ç § | ä¿åéç¨èå´ãçæçæ¬ãæ°éåä½ï¼éªè¯å¾ªç¯ä¾èµä¸æ¿ä»£å ³ç³» | | è¿è¡ä¸åæ® | ååãéè´/éå®åãMPS/å·¥åãå¾ æ¶å¾ åãæªç»å®å | å¯¼å ¥å©ä½è´£ä»»ãå·²æ§è¡é䏿¥æºï¼ä¸éæ°æ§è¡å·²åççåè´§/仿¬¾ | | åå²äºå® | æ¥å·¥ãæ£éªãç»´ä¿®ãæ¶åè´§ãåå²å款 | 使ç¨ä¸é¨åå²è¿ç§»è¯ä¹åçå®ä¸å¡æ¥æï¼ä¿åè¡¥å½æ¶é´ä¸æä½è | | æåç¶æ | åºåãåºæ¶åºä»ãå¨å¶ãæªç»æ°é | 以忢æ¶ç¹ç»ä¸å¯¹è´¦ï¼æä¸å¡è®¤å¯çæåæ¥å£å ¥è´¦ | | ææ¡£ç¥è¯ | SOPãå¾çº¸ã纪è¦ãå¶åº¦ãæ¥å | è¿å ¥éä»¶/ç¥è¯åºï¼ä¸å ææ¡£åå¨å°±èæäº¤ææå®¡æ¹è®°å½ | 以䏿¯ç®æ èå´ï¼ä¸è¡¨ç¤ºç°æé¡¹ç®å·²ç»æä¾ææåå²è¿ç§»æ¥å£ãæ¯ç±»å¯¹è±¡éè¿è½åç»è®°è¿åâå¯å¯¼å ¥ / ä» è稿 / ä» å½æ¡£ / éæ°å¢ä¸å¡æ¥å£âãHR èªé ¬ã个人è¯ä»¶çåæ®µä» åææå²ä½å¼æ¾ï¼æ å°åé¢è§åæ ·åæ°æ®æéæ§å¶ã ## 4. LangGraph å¾è®¾è®¡ å¨ä¸»è·¯ç±æ°å¢ `document_onboarding`ï¼ä¸å¡æ¡ä»¶ä»¥ `import_batch_id` ä¸ºæ ¸å¿ï¼å任塿æä»¶/åºåè§£æï¼éå卿¹æ¬¡å±ç»ä¸æ¶æ§åæ ¸å¯¹ã ```mermaid flowchart TD A[建ç«å¯¼å ¥æ¹æ¬¡ä¸è¿ç§»èå´] --> B[æä»¶æ¸ å / å»é / çæ¬è¯å«] B --> C[å¹¶è¡è§£ææä»¶ä¸è¡¨æ ¼åºå] C --> D[è¯å«ä¸å¡ç±»åä¸å段æ å°] D --> E[è§èååéè®°å½ä¸åæ®µè¯æ®] E --> F[ä¸»æ°æ®å¹é / è·¨æä»¶å ³è] F --> G[ç»æ / ä¸å¡ / æ°ééé¢ / æ¶åºæ ¡éª] G --> H{åå¨é»æé®é¢ï¼} H -->|æ¯| I[èååç±»é®é¢ä¸å»ºè®®] I --> J[interrupt çå¾ ç¡®è®¤ / è¡¥æä»¶ / æ¹å¼] J --> K[åºç¨ä¿®è®¢ï¼æ è®°åå½±åä¾èµå¤±æ] K --> F H -->|å¦| L[çæä¾èµ DAG ä¸ Java dry-run] L --> M[å»ç»æ¹æ¡çæ¬ãå½±åé¢è§ä¸å®¡æ¹] M --> N[interrupt çå¾ æææ§è¡] N --> O[éæ°æ ¸éªæé / æ¹æ¡ hash / ç®æ çæ¬] O -->|åå| F O -->|ææ| P[æä¸å¡èååæ¹å¹çå¯¼å ¥] P --> Q[å读 / 对账 / 宿´æ§éªè¯] Q --> R{éè¿ï¼} R -->|å¦| S[æåç¸å ³é¾ï¼ä¿®å¤æä¸å¡è¡¥å¿] R -->|æ¯| T[彿¡£æ¥å / å ³éæ¹æ¬¡] ``` è§£æå徿æä»¶ç¬ç«è¿è¡ï¼å¯å¹¶è¡ï¼å¹é ãå»éåä¾åº/é颿±æ»å¨æ¹æ¬¡èå´å®æã审æ¹åå ¥åºéä¸å¨å½ä»¤æ§è¡å¾ï¼è§£æèç¹ä¸ç´æ¥åä¸å¡æ°æ®ã大æä»¶æç¨³å®ååºå¤çï¼è®°å½ååºè¿åº¦ï¼æ£æ¥ç¹ä¿åå¼ç¨ï¼ä¸ä¿åæ´æ¬è¡¨æ ¼æå¾çã é®é¢åé¦åªè§¦ååå½±åçè®°å½ãæ ¡éªå¨å䏿¸¸ä¾èµéæ°è¿è¡ãåæ´å使 å°è¦éç®ç¸å ³æ°éä¸éé¢ï¼åæ´å®¢æ·å½å±è¦éåæéåå ³èæ£æ¥ï¼ä¸ä¼ æ°æä»¶è¦å¤ææ¯è¡¥å è¯æ®è¿æ¯æ¿ä»£çæ¬ãè¿ä»£è½®æ°æé¢ç®ï¼æªè§£å³äºé¡¹è½¬äººå·¥å¤çï¼ä¸è½ä¸ºäºç»æå¾ªç¯èªå¨æè¦åæ¹æéè¿ã ## 5. å¤è½®æ£æ¥çå ·ä½åå·¥ | 轮次 | æ£æ¥å 容 | äº§ç© / è°è´è´£ | | --- | --- | --- | | 第ä¸è½®ï¼è¯»ææä»¶ | æä»¶ç±»åãå¤ä¸ªè¡¨æ ¼åºåã表头å±çº§ãæ±æ»/æç»åºãåä½ä¸æé´ | è§£æç»æå¾ãæ æ³è¯å«åºåï¼è§£æå¨ + 模åè¾ å© | | 第äºè½®ï¼å¯¹é½å¯¹è±¡ | åæ®µä¸ä¸å¡å¯¹è±¡æ å°ã客æ·/ä¾åºå/ç©æåéãåæ®åç» | æ å°è稿ãå®ä½åéãéè¦ç¡®è®¤çç®ç§° | | 第ä¸è½®ï¼äº¤åæ ¸å¯¹ | å¤æä»¶çæ¬å²çªã订åä¸åè´§/忬¾å ³èãè¡å°è®¡ä¸æ»è®¡ãåºå/æåå ³ç³» | è§åå差弿¥åï¼ç¡®å®æ§è®¡ç®å¨ | | 第åè½®ï¼ä¸å¡æ ¸éª | å¿ å¡«ãç¶ææºãå使¢ç®ã审æ¹è¦æ±ãæ°æ®èå´ãç®æ è®°å½å²çª | Java dry-run çéè®°å½ç»æä¸å¯ä½ç¨æ¸ å | | 第äºè½®ï¼äººå·¥è¡¥å | 缺å°ç责任人/ä»åº/ç¨çãæ§ä¹å¹é ãå岿¥æãéç¨çæ¬ | 带人åãæ¶é´ãéç¨èå´çå³çè¡¥ä¸ | | 第å è½®ï¼æäº¤å夿¥ | æ¹æ¡ hashãç®æ çæ¬ãä¾èµé½å¤ãæ»é/éé¢ä¸éå¤è®°å½ | 坿§è¡æ¹æ¡ä¸é»æé¡¹ï¼ç¡®è®¤åæ§è¡ | | 第ä¸è½®ï¼å ¥åºåæ ¸å¯¹ | éè®°å½åè¯»ãæ»ééé¢ãå ³è宿´ãæå¤å¯ä½ç¨ | æå/失败/ç»ææªç¥/æªå°è¯å项æ¥å | 模å夿 ¸å¯ä»¥æåºéæ¼æå²çªï¼ä½ä¸è½æ¿ä»£æ°éé颿 ¸ç®ä¸ Java ä¸å¡æ ¡éªãå®¡æ ¸ä»¥ç¬ç«è§åãæºæä»¶è¯æ®å人工å³çä¸ºä¾æ®ï¼å¤æ¬¡æ¨¡åç»åºç¸åçæ¡ä¸ä»£è¡¨éè¿ã ## 6. åæ®µçº§è¯æ®ä¸æåæ¨¡å æ¯ä¸ªåéåæ®µä¿å `raw_value`ã`normalized_value`ãç±»åãæ¥æºå®ä½ã忢è§åãæåå¯é 度ãå¹é 便®ä¸ç¡®è®¤ç¶æãè¡¨æ ¼å®ä½ä¸ºæä»¶çæ¬/å·¥ä½è¡¨/åå æ ¼æåºåï¼ææ¡£å®ä½ä¸ºé¡µç /段è½/è¡¨æ ¼ï¼æ«æä»¶ä¿å页ç /æ¡åæ ãæåºæéè§£æåä»ä¿çåå§å®ä½ã åéè®°å½æç¨³å® `candidate_id`ï¼ä¸ä¸å¡ ID åå¼ï¼åå§è¡ãä¸å¡åæ®å¤´ãåæ®è¡éç¨æ¾å¼åç»å ³ç³»ãä¸ä¸ªæºè¡å¯å¯¹åºå¤æ¡ä¸å¡è®°å½ï¼å¤ä¸ªæºè¡ä¹å¯ç»æä¸å¼ åæ®ï¼æ¯æ¬¡æå/åå¹¶ä¿ç转æ¢é¾ã æ°å¢æåè¡¨ï¼ - `import_batch`ï¼å¯¼å ¥æ¨¡å¼ã忢æ¶ç¹ãèå´ãè´è´£äººãå½å revision ä¸ç¶æã - `import_file_version / import_region`ï¼æä»¶è¡ç¼ãhashãçæ¬å ³ç³»ãè§£æåºåä¸ç¼åã - `import_candidate / import_field_evidence`ï¼åé对象ãåæ®µãæ¥æºä¸åæ¢è¿ç¨ã - `import_entity_match`ï¼ç³»ç»åéãå¹é ç¹å¾ãå³çä¸å«åéç¨èå´ã - `import_issue / import_resolution`ï¼é®é¢ç±»åãé»æçº§å«ãå½±å对象ã人工补ä¸ä¸å¤±æç¶æã - `import_plan / import_plan_item / import_dependency`ï¼ä¸å¯åæ¹æ¡ãç®æ çæ¬ãä¾èµ DAGã - `import_execution / import_record_link`ï¼å¹çé®ãä¸å¡ IDãæºå°ç®æ æ å°ãåè¯»ç»æã åéè®°å½ç¶æä¸º `å¾ è§£æ â å¾ å¹é â å¾ è¡¥å â 坿 ¡éª â å¯æäº¤ â å·²æäº¤ â å·²æ ¸å®`ï¼å¦æ `è·³è¿ / å²çª / 失败 / ç»ææªç¥`ãæä»¶è§£ææåä¸çäºåéè®°å½å¯æäº¤ãçé¢åå«ç»è®¡æä»¶æ°ãæºè¡æ°ãåé对象æ°ãä¸å¡åæ®æ°åæç»è¡æ°ï¼é¿å ä¸åè®¡æ°æ··å¨ä¸èµ·ã ## 7. 夿æ åµå¤çæ¸ å | æ åµ | è¯å«ä¸å¤çè§å | | --- | --- | | åå¹¶è¡¨å¤´ãæ æ é¢è¡¨ã横åæä»½ãå¤è¡¨å页ã跨页ç»è¡¨ | ååºåè¯å«ï¼ä¿çå±çº§ï¼éå¤é¡µçä¸å计ä¸å½ä½æç»ï¼å å±ç¤ºæ å°æ ·æ¬ | | åå¹¶åå æ ¼è¡¨ç¤ºâåä¸âã空ç½è¡¨ç¤ºæªç¥æ 0 | ä» å¨ç¡®è®¤çåºåè§åå åä¸å¡«å ï¼æªç¥ã空ã0 åå«ç¼ç | | éèè¡åãçéè¡ã夿³¨ãå é¤çº¿ã修订 | æç¤ºåå¨å¹¶ç¡®å®çº³å ¥æ¿çï¼ä¸è½é»è®¤éè项ä½åºæé»è®¤ä¿®è®¢å·²æ¥å | | å ¬å¼ç¼åæ§ãå¤é¾æå¼ãæå¡«å计ä¸çäºè¡å计 | åæ¶ä¿çå ¬å¼/æ¾ç¤ºå¼/ç¬ç«æ ¸ç®å¼ï¼å²çªé»æç¸å ³é颿°éæäº¤ | | ç¼ç å导 0ãé¿ç¼å·ç§å¦è®¡æ°æ³ãæ¥æåºåãååä½ | åå§ç±»åä¼å ï¼ç¼å·æææ¬ï¼ä¸å¯æ¢å¤ç精度æå¤±è¦æ±åä»¶æ ¸å® | | æ¥æç¼ºå¹´ãæ/æ¥æ§ä¹ãååãèªç¶è¯è¨æ¥æ | 使ç¨å·²ç¡®è®¤çæä»¶æé´è§£éï¼ä¸è½ç¨ä¸ä¼ æ¥æçåå²ä¸å¡æ¥æ | | ååä¸å客æ·ã客æ·ç®ç§°ãä¾åºåæ¾ç¨å | å¤ç¹å¾å¹é ãæ¾ç¤ºåéè¯æ®ï¼ä¸è·¨ä¼ä¸/é¨é¨æéèå´èªå¨åå¹¶ | | ååç©æä¸åè§æ ¼ãå®¢æ·æå·ä¸å 鍿å·ãåä½ä¸å | è§æ ¼/åå·/SKU/åä½ä¸èµ·å¹é ï¼å®¢æ·æå·æ 尿客æ·éç¦»ï¼æ¢ç®é确认 | | åæä»¶éå¤ä¸ä¼ ãæ¹åä¸ä¼ ãæ¹ä¸æ ¼åä¼ | hash é²æä»¶çº§éå¤ï¼ä¸å¡é®/å 容æçº¹é²è®°å½éå¤ï¼ä¿®æ¹çè¿è¡éåæ®µ diff | | âæç»çââæç»ç2â䏿¥æ/å 容çç¾ | 建ç«çæ¬å ³ç³»ï¼ç¨æ·ç¡®è®¤æå¨æ¥æºï¼ä¸ææä»¶åæä¿®æ¹æ¶é´èªå¨è¦ç | | æ±æ»è¡¨ä¸æç»è¡¨ã对账åä¸åè´§åéå¤æè¿°åä¸äº¤æ | åºåäºå®æ¥æºä¸æ ¸å¯¹æ¥æºï¼åªå»ºä¸æ¬¡äº¤æï¼æ±æ»ç¨äºæ§å¶æ»é¢ | | ä¸å夿¬¡åè´§ãå¤ç¬å款æµå¤åãåå¹¶å¼ç¥¨ãé补货 | 建ç«åé å ³ç³»åæªåé ä½é¢ï¼æ²¡æè¯æ®æ¶ä¸éæå¹³ååæ | | ç¨ç/å«ç¨ä»·/ææ£/è¿è´¹/å¸ç§å£å¾ä¸å | æç¡®åä»·/ç¨é¢/å«ç¨é¢ãèå ¥ä½æ°ä¸æ±çæ¥æï¼ä½¿ç¨ Decimal æ ¸ç® | | éè´ä¸éå®ãå¤ååæä¸æååæ¶æ°éä¸ç | æä¸å¡ç±»åãBOM/è®¡éæ¢ç®åååå 许æèæ ¡éªï¼ä¸ä»¥æ°éä¸åç´æ¥å¤é | | æ¹æ¬¡/SN 缺失ãåºååªææ»æ°ãä»åºå«å | å¯å½¢æå¾ åé æåè稿ï¼ä¸å¯ç¼é æ¹æ¬¡/SNãåºä½æä¾åºåå½å± | | æ§ç³»ç»å·²æ¹å/å·²æ¯ä»/å·²åè´§ï¼å½åç³»ç»æ æµç¨ | ä¿ååå²ç¶ææ¥æºï¼èµ°è¿ç§»æ¥å£ï¼ä¸ä¼ªé 审æ¹äººæéæ¾å®æ¶ä¸å¡å¨ä½ | | åè¡¨éæ¼è´æ°ã红åå²éãåæ¶å/ä½åºå | ä¿ç符å·ä¸å²éå ³ç³»ï¼ä¸å¯ç»ä¸åç»å¯¹å¼æå ¨é¨æææåå¯¼å ¥ | | OCR å° 0/Oã1/Iã8/Bãå°æ°ç¹/è´å·æ··æ· | ç¨ç¼ç åå ¸ãç®æ¯ä¸åå¾äº¤åéªè¯ï¼å ³é®å段ä¸ç¡®å®åäººå·¥å¤æ ¸ | | é¨åæä»¶æå/å å¯/缺éä»¶ | ç»åºåå½±åå¯¹è±¡ï¼æ ä¾èµåæ¯å¯ç»§ç»ï¼ä¾èµåæ¯ä¿æé»æ | | å¯¼å ¥æé´ç³»ç»è¢«å ¶å®äººä¿®æ¹ | ç®æ çæ¬/å 容 hash ä¹è§æ ¡éªï¼å²çªåå°é¢è§ï¼å·²å®¡æ¹æ§æ¹æ¡å¤±æ | | 大æä»¶ã夿件ãå¤ç¨æ·åæ¶æ¹æ å° | ååºè§£æãæ¹æ¬¡ revision ä¹è§éãå½±åèå´éç®ï¼ä¿çä¿®æ¹è®°å½ | | æä»¶å 容å 嫿令ãå®ãå¤é¨é¾æ¥ | ä½ä¸ºå¾ è§£ææ°æ®ï¼ä¸æ¹åå·¥å ·æéï¼ä¸èªå¨æ§è¡å®æè®¿é®å¤é¾ | ä¸åå¨å¯é å¹é çå®ä½å¯æè®®æ°å»ºï¼ä½é»è®¤âå¾ æ°å¢ç¡®è®¤âï¼ä¸æ¯èªå¨å¶é ç©ææå®¢æ·ã缺失æ³å®/è´¢å¡/è¿½æº¯å ³é®å段æ¶é»æç¸å ³å¯¹è±¡ï¼éå¿ å¡«åæ®µå¯ä¿ç空并åå ¥è¡¥å æ¸ åï¼ä¸è½å¡å ¥âé»è®¤å®¢æ·ââé»è®¤ä»åºâæ©çé®é¢ã ## 8. 人工补å ä¸å¤è½®äº¤äº å¯¼å ¥å·¥ä½å°éç¨âæºæä»¶è¯æ®âåéä¸å¡æ°æ®âé®é¢ä¸å¤çâ䏿 ãéæ©æå段æ¶å®ä½å表åå æ ¼æåæåºåï¼æ¹ééæ©åç±»é®é¢åå¯ä¸æ¬¡ç¡®è®¤æ å°ï¼ä¾å¦âè¿äºæä»¶éçâä»¶âåæ å°æç³»ç»åä½ PCSâãç¡®è®¤å¿ é¡»é宿件/åºå/ç©æç±»å«çèå´ï¼ä¸è½æ æ¡ä»¶æ©æ£å°å ¨ä¼ä¸ã æé®æå½±åé¢ä¼å ï¼å ç¡®è®¤å¯¼å ¥æ¨¡å¼ãæé´ã主ä½ãæå¨æä»¶ï¼åè§£å³å½±å大éè®°å½çåä½/å®ä½æ å°ï¼æåå¤ç个å«ç¼ºå¤±ãç¨æ·å¯è¡¥æä»¶ãä¿®æ£å段ãéæ©åéãæç¼ãè·³è¿æè¦æ±äººå·¥å¤çãæ¹éåºç¨åæ¾ç¤ºå½±åæ°éå示ä¾ï¼åºç¨åéè·ç¸å ³æ£æ¥ã æ¯æ¬¡åçæä¸ºçæ¬å `ResolutionPatch`ï¼å å«ç®æ åæ®µ/é®é¢ãåå¼ãæ°å¼ã便®ãæä½è ãæ¶é´ãä½ç¨èå´ä¸åºçº¿ revisionãé®é¢å¯ä»¥éæ°æå¼ï¼æ°è¯æ®æ¨ç¿»æ§å³çæ¶æ è®°æ§å³çè¿æãéé¢ãæ°éãåå²ç¶æçå¿ é¡»è½è§£ééç¨åªä¸ªæ¥æºã ## 9. åæä¸çº¿è¡¥å½ï¼åæ¢æ¶ç¹ä¸é²æ¢éå¤è®°è´¦ æ¹æ¬¡å¿ é¡»éæ©æ¨¡å¼ï¼â ä¸»æ°æ®åå§åï¼â¡åå²èµæå½æ¡£ï¼â¢æªç»ä¸å¡è¿ç§»ï¼â£æåä½é¢/åºåï¼â¤æ¥å¸¸æ°å¢/修订ãä¸åæ¨¡å¼æä¸åå 许å¨ä½åæ¥å£ï¼ä¸å ±ç¨ä¸ä¸ªâå ¨éå¯¼å ¥âå¼å ³ã å ç¡®å®åæ¢æ¶ç¹ Tãç»ç»/ä»åºèå´ãä¸å¡æé´ãæå¨å°è´¦åæ§å¶æ»é¢ãT ä¹åç累计åå²ä¸ T æ¶ç¹ä½é¢éç¨æç¡®è¿ç§»çç¥ï¼è¥å岿¶ååªä½å½æ¡£ï¼æååºåå ¥è´¦ä¸æ¬¡ï¼è¥éå»ºå®æ´äº¤æé¾ï¼åä¸å¾åæç¸åä½é¢ä½ä¸ºé¢å¤åºåå ¥è´¦ãåºæ¶åºä»ãå¨å¶ä¸æªç»è®¢ååæ ·å¤çã ä¾å¦åå²ååå·²çæè®¢åä¸å·²åé¨åè´§ï¼è¡¥å½ååæ¶ä¸è½å次触åâ审æ¹éè¿èªå¨çæéå®è®¢åâï¼ä¹ä¸è½éè·éå®åçæ MPSãæ¥å·¥åå²ãè´¨æ£åè°åéç¥ãJava éè¦æç¡®çè¿ç§»å ¥å£ãè¿ç§»æéä¸åæ§å¯ä½ç¨çç¥ï¼ä¸æ¯ææ¶ä» å¯¼å ¥è稿/彿¡£å¹¶æ è®°åç»å¾ 建设ï¼ä¸ç»è¿æå¡ååºã ä¸å¡åçæ¶é´ãåç³»ç»å建/å®¡æ¹æ¶é´ï¼æè¯æ®æ¶ï¼ãæ¬æ¬¡è¡¥å½æ¶é´åå«ä¿åãåå²å®¡æ¹è¯æ®ä½ä¸ºéä»¶/æ¥æºè®°å½ï¼å½åç³»ç»æä½æ¥å¿è®°å½çå®è¡¥å½æä½è ï¼ä¸è½åå åå²äººåæ§è¡å®¡æ¹ã ## 10. Java å¯¼å ¥åè®®ä¸æ§è¡é¡ºåº ç°æ `MdmItemController` ç©æå¯¼å ¥ãCRM ååå¯¼å ¥ãERP éè´ç³è¯·/éè´åå¯¼å ¥å¯ä½ä¸ºé¢åæ ¡éªä¸æ å°åèãå®ä»¬ç模æ¿å¯¼å ¥è¯ä¹ä¸çäºéç¨åå²è¿ç§»è¯ä¹ï¼éé¡¹å®¡æ¥ Service çé»è®¤å¼ãèªå¨ç¼å·ãæ´æ°çç¥ãç¶ææ¨è¿ä¸èªå¨çæä¸æ¸¸åæ®ååå¤ç¨ã æå¢å å 鍿¥å£ï¼`capabilities` è¿åæ¯æå¯¹è±¡/åæ®µ/模å¼/éå¶ï¼`validate` åæ å¯ä½ç¨æ ¡éªå¹¶è¿åå¼ç¨å²çªä¸å¯ä½ç¨é¢è§ï¼`plan` å»ç»æ§è¡è®¡åï¼`commit` ææ¹æ¡çæ¬ä¸ææä»¤çæ§è¡ï¼`status` æå½ä»¤å·æ¥è¯¢ï¼`reconcile` å读对账ãLLM ä» çæåé DTOï¼ä¸è½ç´æ¥è°ç¨ `commit`ã ä¾èµé常为åä½/åç±»/ä»åº â 客æ·/ä¾åºå/ç©æ â 产å BOM/å·¥èº â åå/订å â å·¥å/æ¶å/è´¨æ£çï¼ä½æç»ä»¥å¯¹è±¡ä¾èµ DAG å³å®ï¼ç¯ä¾èµåç¬æè§£ãæååééè¿ `candidate_id` å¼ç¨ï¼å ¥åºåçæåéå°çå® ID æ å°ä¾ä¸æ¸¸ä½¿ç¨ã 以宿´ä¸å¡èåï¼åæ®å¤´+å ¨é¨è¡ï¼ä¸ºååè¾¹çï¼ä¸éè¡æäº¤åå¼ åæ®ãé»è®¤ä¸ä¸ªä¾èµç»å¤±è´¥å黿¢ä¸æ¸¸ï¼æ ä¾èµç»å¯éæ©ç»§ç»ï¼å¹¶å¨å®¡æ¹æ¹æ¡éæç¡®çç¥ãå¤é¨æ¥å£è¿åæååå¿ é¡»å读éªè¯ã è®°å½å¹çé®ç±ä¼ä¸/è¿ç§»èå´ãç¨³å®æºè®°å½æ è¯ãç®æ å¯¹è±¡ãæ¹æ¡çæ¬åå¨ä½ç»æï¼å¦è®¾è·¨æ¹æ¬¡ä¸å¡å¯ä¸é®/å 容æçº¹å²çªæ£æµï¼é¿å æ°å»ºæ¹æ¬¡ç»è¿é²éãæºè®°å½ä¿®æ¹ä½¿ç¨æ¾å¼æ´æ°çç¥ä¸ææç®æ çæ¬ï¼ä¸è½é»é»è¦çå·²æäººå·¥ä¿®æ¹ã æäº¤è¶ æ¶å æ¥è¯¢ç»æãé¨åæåååªè¡¥å¤±è´¥/æªå°è¯é¡¹ï¼éè¯ä¸éæ°å¯¼å ¥æåè®°å½ãæ¤éæä¸å¡è½åæ§è¡ï¼æªè¢«å¼ç¨çè稿å¯ä»¥æ¤éï¼å·²åçåºå/èµé/䏿¸¸å¼ç¨çè®°å½èµ°å²éæåæ§æ´æ£ï¼ä¸è½æ¿è¯ºæ´æ¹ç¡¬å é¤åæ»ã ## 11. 对账ãéªæ¶ä¸å®æ½ä¼å 级 æäº¤ååæ§å¶æ»é¢è³å°å æ¬å¯¹è±¡æ°ãè¡æ°ãç©ææ°éï¼æåä½åç»ï¼ãéé¢ï¼æå¸ç§ä¸ç¨å£å¾åç»ï¼ãåºåï¼æä»åº/ç©æ/æ¹æ¬¡å£å¾ï¼ãåºæ¶åºä»/æªç»æ°éï¼ä»¥åå¼ç¨å®æ´çãè·¨åä½/å¸ç§ä¸è½ç´æ¥æ±æ»åãæ¥åæç¡®å¯æ ¸å¯¹ãä¸å¯æ ¸å¯¹ã人工确认差å¼ååå ã æ ·æ¬éè¦çï¼æ å表ã夿åå¹¶è¡¨ãæ«æä»¶ãè·¨æä»¶å²çªãååå®ä½ãéå¤çæ¬ãå ¬å¼éè¯¯ãæ¥æ/é颿§ä¹ãç¼ºå°æ¹æ¬¡ãåå²å·²æ§è¡åæ®ãåæ¶æåä¸åå²äº¤æãå¹¶åä¿®æ¹ãæ§è¡åæç½ãé¨åå¤±è´¥åæ´æ£é导ãå ³é®äºå®ä¸å¾ç±æ¨¡ååç©ºè¡¥å ¨ï¼é»æé®é¢æªè§£å³ä¸å¾æäº¤ã 交ä»é¡ºåºæå为ï¼A å¾è¿è¡ä¸æå/è¯æ®åºåº§ï¼B ä¸»æ°æ®æä»¶è¡¥å½éç¯ï¼C åå/éè´/éå®çä¸å¡èç¨¿ä¸æªç»è¿ç§»ï¼D æååºåå夿åå²è¿ç§»ï¼E ä¸è¿è¥ä¹åºæ¯èå¨ã夿åå²è¿ç§»æå®é ä¸å¡æ¥å£æçåº¦å¼æ¾ï¼ä¸è½ä¸ºäºè¡¥å½é度ç»è¿å®¡æ¹ååºåè§åã ä¸çº¿åéè¦ä¼ä¸æä¾è±æçå¸¸ç¨æ ·æ¬ä¸å¯¹åºæ£ç¡®ç»æï¼å»ºç«æ ¼å¼å ¼å®¹éåä¸å¡åºåéï¼å½åæ¹æ¡ä¸è¦æ±å ä¸ä¼ æä»¶æè½ç»§ç»ææ¯è®¾è®¡ãæç»éªæ¶çåæ®µåç¡®ãå®ä½å ³èãéå¤é²æ¤ãæ§å¶æ»é¢ã人工工ä½é䏿¢å¤è½åï¼åå«ç»è®¡èªå¨ç¡®è®¤ä¸äººå·¥ç¡®è®¤ç»æã ## 12. Python 模åå¢é ```text graphs/scenarios/document_onboarding.py graphs/documents/parse.py, resolve.py, review.py, import.py documents/adapters/ # æ ¼å¼è§£æã转æ¢ãOCR ç坿¿æ¢æ¥å£ documents/layout/ # åºåã表头ãåæ®åç»ä¸æ¥æºå®ä½ documents/normalization/ # æ¥æãéé¢ãåä½ãç¼ç ï¼ä¿çåå§å¼ documents/matching/ # å®ä½å¹é ãè·¨æä»¶çæ¬åä¸å¡å ³è documents/validation/ # ç»æãä¸å¡ãç®æ¯ãè·¨æä»¶ãè¿ç§»è§å documents/staging/ # åéãè¯æ®ãé®é¢ãä¿®è®¢ãæ¹æ¡çæ¬ documents/planning/ # ä¾èµ DAGãdry-runãå½±åé¢è§ documents/reconciliation/ # å ¥åºåè¯»ãæ§å¶æ»é¢ãå¼å¸¸æ¢å¤ ``` 该è½åå ±äº«ä¸»å¹³å°çæéãæ£æ¥ç¹ãå½ä»¤å¹çã审æ¹ä¸äºä»¶ç³»ç»ï¼å¹¶ç¬ç«ä¿åæä»¶è§£æååéæ°æ®ãè¿è¥å¾åªæå¨ç¸åºæ°æ®å·²æ ¸å®å ¥åºåï¼ææå®ä½ä¸ºå®æ¶ä¸å¡äºå®ä½¿ç¨ï¼æªç¡®è®¤åéä» ç¨äºè¡¥å½å·¥ä½å°ã docs/industrial-agent-langgraph-technical-design.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,285 @@ # MOM 工䏿ºè½ä½ï¼LangGraph å®å¶ææ¯æ¹æ¡ > è®¾è®¡çæ¬ï¼v1ï¼2026-10-21ãé¶æ®µï¼ææ¯æ¹æ¡è¯å®¡ï¼å°æªå®æ½ã > ä¸å¡èå´æ¿æ¥ [å ¨æ¨¡å设计](industrial-agent-python-design.md) ä¸ [ä¹åºæ¯èå¾](industrial-agent-scenario-blueprint.md)ãæ¬æ¹æ¡ç¡®å®ä½¿ç¨ Python + LangGraphï¼å ·ä½ä¾èµçæ¬å¨å®æ½æ¶å®æå ¼å®¹éªè¯ååå ¥éæä»¶ã æ°å¢å¹¶åæ ¸å¿è½åï¼[ä¼ä¸å·¥ä½æä»¶çè§£ä¸å¤è½®è¡¥å½](industrial-agent-document-onboarding-design.md)ãåè°ä¸»å¾å¢å `document_onboarding` è·¯ç±ï¼è¡¥å½æåãåæ®µè¯æ®ãå¤è½®äººå·¥ä¿®è®¢ãä¾èµå¯¼å ¥ä¸å¯¹è´¦ä½ä¸ºä¸ç¨åå¾ã宿½é¡ºåºè°æ´ä¸ºå å®æä¸»æ°æ®è¡¥å½éç¯ï¼å鿥èå¨è¿è¥åºæ¯ï¼æåä¸åå²è¿ç§»éç¨ä¸é¨ä¸å¡æ¥å£ã ç»ä¸ææè¯¦è§ [èåãæé®ä¸æ°æ®æéæ¹æ¡](industrial-agent-authorization-design.md)ï¼ä¸»å¾å¢å è½åå è½½ä¸è®¡åææèç¹ï¼æææ¥è¯¢/æä½å¤ç¨ Java å½åç¨æ·æéï¼æ¨¡åå¯ç¨å·¥å ·ãåæ®µã产ç©ä¸æ¢å¤è¿ç¨åå约æã ## 1. æ ¸å¿ææ¯å³ç éç¨ç¬ç« Python é¡¹ç® `mom-industrial-agent`ï¼ä»¥ LangGraph `StateGraph` ç¼æä¸å¡æµç¨ã设计为**åè°ä¸»å¾ + ä¹ä¸ªåºæ¯åå¾ + å ¨æ¨¡åé¢åå·¥å · + ç»ä¸å½ä»¤æ§è¡éé**ãæ¥è¯¢ã计ç®ãå»ºè®®ä¸æ§è¡ææç¡®èç¹åæ°æ®å¥çº¦ã LLM è´è´£èªç¶è¯è¨æå¾ãä¸å¡å¯¹è±¡æ¶æ§ãææ¡£è§£éãè¯æ®æ»ç»ååéè¡å¨ï¼åºåå¯ç¨éãéé¢ãå·¥åºçº¦æãæ£éªè§åãæéä¸å®¡æ¹ç»è®ºç±ç¡®å®æ§ä»£ç å Java ä¸å¡æå¡è´è´£ã模åè¾åºå¿ é¡»ç»è¿ç»ææ ¡éªåé¢åçç¥æ ¡éªï¼æè½æä¸ºå·¥å ·è¾å ¥ã 主å¾éç¨æç¡®è·¯ç±ï¼åºæ¯åå¾ä»¥é¢å®ä¹æµç¨ä¸ºä¸»ãä» å¨ç¥è¯æ£ç´¢æåå åæèç¹ä¸å 许æé¢ç®çå¨æå·¥å ·å¾ªç¯ãæ¡æ¶æ¯æç¨ç¶æãèç¹å边表达è¿ç§æµç¨ï¼èç¹å¯ä»¥æ§è¡æ®éè®¡ç®ææ¨¡åè°ç¨ã[LangGraph Graph API](https://docs.langchain.com/oss/python/langgraph/graph-api) ## 2. é¨ç½²ä¸ç³»ç»èè´£ ```mermaid flowchart TB UI[ç°æ Vue / ç§»å¨ç«¯] --> GW[Java Agent ç½å ³ï¼èº«ä»½ä¸æ°æ®èå´] GW --> API[Python FastAPIï¼ä»»å¡å ¥å£ / SSE] API --> DB[(Agent PostgreSQLï¼ä»»å¡ä¸æ£æ¥ç¹)] API --> Q[Redis Streamsï¼ä»»å¡åå] Q --> W[LangGraph Worker] W --> GRAPH[åè°å¾ä¸åºæ¯åå¾] GRAPH --> MODEL[模åéé å±] GRAPH --> KNOW[ç¥è¯æ£ç´¢éé å±] GRAPH --> BRIDGE[Java Agent Bridgeï¼é¢åæ¥è¯¢ä¸å½ä»¤] BRIDGE --> SVC[CRM / ERP / SRM / MES / HRM / BI / System] BRIDGE --> BPM[ç°æ BPM 审æ¹] SVC --> MYSQL[(ç°æä¸å¡ MySQL)] SVC --> OUT[ä¸å¡ Outbox] BPM --> OUT OUT --> EVENTS[äºä»¶æ¥å ¥ / å»é / è·¯ç±] EVENTS --> Q GRAPH --> DB ``` | ç»ä»¶ | éåä¸è´£ä»» | | --- | --- | | Python API | FastAPI + Pydanticï¼æ ¡éªè¾å ¥ãç»è®°ä»»å¡ã读åç»æãè¾åºä¸å¡äºä»¶æµ | | å¾è¿è¡ | LangGraphï¼èªå®ä¹ç¶æä¸èç¹ï¼å¼æ¥æ¨¡åå HTTP è°ç¨ | | ä¸å¡è¿æ¥ | httpx è®¿é® Java å é¨ Bridgeï¼æéè¿æ¥æ± ãæç¡®è¶ æ¶ãåªè¯»éè¯ | | æ£æ¥ç¹ | `langgraph-checkpoint-postgres` ç弿¥æä¹ åå®ç°ï¼åå§å/è¿ç§»å¨åå¸ä»»å¡æ§è¡ | | ä»»å¡è®°å½ | ç¬ç« PostgreSQL ä¿åä»»å¡ãæ¹æ¡ãäºä»¶ãæ§è¡è®°å½ï¼ä¸å¡åºç»§ç»ä½¿ç¨ç°æ MySQL | | éå | Redis Streams + consumer groupï¼PostgreSQL outbox ä¿è¯æäº¤ä»»å¡åå¯è¡¥åï¼Redis ä¸ä½ä¸ºå¯ä¸ä»»å¡äºå®æº | | 宿¶è§¦å | ä¼å å¤ç¨é¡¹ç®ç°æ Quartzï¼åéåºæ¯äºä»¶ï¼ä¼ä¸ç次/è忥é ç½®å³å®æ¶é´ | | ææ¡£ | å¤ç¨éä»¶ä¸ç¥è¯åºï¼å¤§æä»¶å¨å¯¹è±¡åå¨ï¼æ£æ¥ç¹ä» åå¼ç¨ä¸æè¦ | | å¯è§æµ | ç»æåæ¥å¿ãtrace_idãèç¹èæ¶ãå·¥å ·è°ç¨å®¡è®¡ãææ ï¼å¤é¨è¿½è¸ªå¹³å°æé¨ç½²è¦æ±éé | è¿ä¿®è®¢äºæ©æâå ¨é¨æ²¿ç¨ MySQL/Redisâç建议ï¼LangGraph çäº§æ£æ¥ç¹ä¼å éç¨å®æ¹ææ¡£ååºç PostgreSQL å®ç°ï¼åå°èªç æ£æ¥ç¹éé å·¥ä½ï¼å¼åå¯ç¨ SQLiteï¼å 忣æ¥ç¹ä» ä¾åå æµè¯ã[Persistence](https://docs.langchain.com/oss/python/langgraph/persistence) API ä¸ Worker å¯ç¬ç«æ©å®¹ãåä¸ä¸ªä¸å¡ä»»å¡åªå 许ä¸ä¸ª Worker æææ§è¡ç§çº¦ï¼ç»ç§ãfencing token åå½ä»¤å¹çå ±åå¤çè¿ç¨å¤±èãPython æå¡æ éè¿ç§» Java ä¸å¡æ°æ®ï¼ä¹ä¸ææä¸å¡æ°æ®åºåæéã ## 3. 主å¾è®¾è®¡ ```mermaid flowchart TD START([è¯·æ± / ä¸å¡äºä»¶]) --> AUTH[validate_contextï¼æ ¸éªèº«ä»½ä¸å¯¹è±¡èå´] AUTH --> INTENT[resolve_requestï¼ç»æåæå¾ä¸å¯¹è±¡] INTENT --> CLEAR{对象åèå´æç¡®ï¼} CLEAR -->|å¦| CLARIFY[clarifyï¼interrupt çå¾ è¡¥å ] CLARIFY --> INTENT CLEAR -->|æ¯| ROUTE[route_scenarioï¼ç½åååºæ¯è·¯ç±] ROUTE --> SUB[åºæ¯åå¾ï¼åè¯ / è®¡ç® / æ ¡éª] SUB --> CHECK[validate_evidenceï¼å®æ´åº¦ä¸æ°é²åº¦] CHECK -->|ä¸è¶³| PARTIAL[çæç¼ºå£æ¥å] CHECK -->|å å| PROPOSE[æå»ºç»æä¸å¨ä½æ¹æ¡] PROPOSE --> POLICY{å¨ä½çç¥å¤å®} POLICY -->|åªè¯»ç»æ| PUBLISH[ä¿åå¹¶åå¸ç»æ] POLICY -->|é审æ¹| SUBMIT[å¹çç»è®°æ¹æ¡ä¸ BPM ç³è¯·] SUBMIT --> WAIT[await_approvalï¼interrupt] WAIT --> RECHECK[éæ°æ ¸éªå®¡æ¹ / æé / æ°æ®çæ¬] RECHECK -->|éè¿| EXEC[æ§è¡æç¡®ææçå½ä»¤] RECHECK -->|è¿æ| SUB RECHECK -->|æç»| REJECT[è®°å½æç» / å ³éå¨ä½] POLICY -->|è§åææçå é¨å¾ å| EXEC EXEC --> VERIFY[æå½ä»¤å·æ¥è¯¢å¹¶éªè¯ç»æ] VERIFY --> PUBLISH PARTIAL --> PUBLISH REJECT --> PUBLISH PUBLISH --> END([ç»ææ¬è½® / ç»è®°åç»äºä»¶è®¢é ]) ``` èç¹èè´£ï¼ - `validate_context`ï¼æ¥å Java ç¾åçéæ¶ç¨æ·å§ææç³»ç»å·¡æ£èº«ä»½ï¼ä¸å¡å¯¹è±¡å¿ é¡»å¨å½åèå´å ã身份ä¸è®¿é®ä»¤ç䏿¾å ¥å¯æä¹ åå¾ç¶æã - `resolve_request`ï¼è¾åº `scenario_id + business_refs + time_window + requested_action`ã对象æ§ä¹æ¶äº§çå¾ è¡¥å 项ï¼ä¸è½èªè¡ä»åå客æ·ä¸éæ©ã - `route_scenario`ï¼æé ç½®å 许çåºæ¯ä¸æéè·¯ç±ï¼æ¨¡åä¸çæä»»æ Python 彿°åæ URLã - `validate_evidence`ï¼å¤ææ°æ®ç¼ºå¤±ãæ¥æºå²çªãåä½ä¸ä¸è´åå¿«ç §è¿æï¼å¤±è´¥æ¶å¯è¾åºé¨åç»æï¼ä½é»æ¢ç¸å ³åæä½ã - `POLICY`ï¼ç±ä»£ç æå¨ä½ç±»åä¸ç¨æ·ææå¤å®å®¡æ¹è¦æ±ï¼ææ¬ä¸åºç°âå·²æ¹åâä¸è½æ¹åè¯¥ç»æã - `VERIFY`ï¼åºåâå½ä»¤å·²æ¥æ¶ââ审æ¹ä¸ââ忮已å建ââä¸å¡å®æâï¼åç«¯æ®æ¤å±ç¤ºç¶æã ## 4. ä¹ä¸ªä¸å¡åå¾ä¸å¤ç¨èç¹ | åºæ¯åå¾ | æ ¸å¿èç¹é¡ºåº | Java é¢åä¾èµ | ä¸»è¦æ°å¢å 容 | | --- | --- | --- | --- | | `order_review` | 订åä¸ä¸æ â é½å¥ â äº§è½æ¨¡æ â äº¤ææ¯è¾ â è¯å®¡æ¹æ¡ | CRM ååãERP éå®åãMPS/å·¥åãåºåãæç¨ | 订åè¡å ³èèåãæ¿è¯ºæ¥è®¡ç®ãå½±å订åå表 | | `material_readiness` | å·¥åèå´ â BOM ä¸ç©ææ å° â å¯ç¨åºå/å¨é â ç¡®å®æ§åé â 缺å£åå¹¶ | MDMãMES BOM/WMSãERP éè´ãSRM | 跨工ååé çç¥ãå¬äº¤åæ§ä¸å缺å£å¿«ç § | | `progress_patrol` | 计ååºçº¿ â æææ¥å·¥ â æ¥å/æåè®°å½ â é¾æè®¡ç® â 责任å½å£ | å·¥å/ä»»å¡/æ¥å·¥ãæçãHRM | è¿ç»è¶ ææ£æµãå¾ åå»éä¸å级 | | `reschedule` | èµæºå¿«ç § â å½åæ¹æ¡ â æåé¢è§ â å½±åå·®å¼ â æäº¤åéæ¹æ¡ | MES æç¨ã设å¤ãçç»ãERP/CRM | 夿¹æ¡å¿«ç §ã审æ¹ä¸çæ¬åéªè¯ | | `shipment_check` | éå®è¡ â åºåº/åºå/è£ ç®± â OQC/å»ç» â å¯åé â 黿æ¥å | ERPãMES-WMãMES-QC | åè´§åèåè§å¾ | | `quality_containment` | æ£éªè§åçæ¬ â è¶éå¤å® â æ¹æ¬¡æµè½¬ â å½±åé¢ â NCR/å¤éªæ¹æ¡ | IQC/IPQC/OQC/RQCãNCRãåºå | æ£éªè®¾å¤æ¥å ¥ãé离ååå¤çº¿å®¡æ¹æµç¨ | | `equipment_patrol` | 计åçªå£ â ææè®°å½ â ç»´ä¿®å»é â å·¥åå½±å â è¡¥æ£/ä¿å »æ¹æ¡ | 设å¤ãç¹æ£/ä¿å »ãç»´ä¿®ãæç | å¯éªè¯çæºæ¶ééãå ³é®è®¾å¤æåº | | `outsource_reconciliation` | å¤åå â åæ¶éæ/IQC â ååçæ¬ â æ°éä»·å·® â æ ¸å®æ¸ å | å¤åä»å¨ãERPãSRM | ååæèçãå 工费å£å¾ä¸å·®å¼å¤ç | | `complaint_trace` | å®å/æ¹å·è§£æ â åå追溯 â æ£åå½±å â æ¥åéä»¶ â åå¤è稿 | å®åãCRMãERPãæ¹æ¬¡/SNãè´¨æ£æ¥å | 跨模åå ³ç³»è¡¥å ¨ä¸è¯æ®æç¹ä»»å¡ | åå¾ç¨ç¬ç« input/output schemaï¼éè¿å è£ èç¹è½¬æ¢ç¶åç¶æãé»è®¤éç¨æ¯æ¬¡è°ç¨ç¬ç«çåå¾ç¶æï¼ç»§æ¿ç¶å¾æ£æ¥ç¹ï¼ä¸è®©ä¸å订åå ±äº«é¢åæ¶æ¯åå²ãæ¹éå·¡æ£å¯ç¨ `Send` ååç¬ç«å·¥åï¼ç»ææå¯¹è±¡é®èåï¼æç¡®å页åå¹¶åä¸éãåå¾æä¹ åæ¨¡å¼åç¶å¾å ³ç³»è§ [Subgraphs](https://docs.langchain.com/oss/python/langgraph/use-subgraphs)ã å ¨æ¨¡å以é¢åå·¥å ·å è¦çï¼`mdm / crm / srm / erp / mes_pro / mes_wm / mes_qc / mes_dv / mes_cal / mes_energy / qcreport / aftersales / hrm / bpm / bi / system / infra / ai_knowledge`ãArchiveãFinanceãResearchãUMSãWXCP çå ç»è®°è½åæ¸ åï¼æ ¸å®å®é æ¥å£åå¯ç¨ï¼IM/Member é»è®¤å ³éãç»è¥é®çãææ¬åæä½ä¸ºåç»è·¨åå¾ï¼å¤ç¨åä¸å·¥å ·å±ã ## 5. ç¶æä¸èº«ä»½æ¨¡å ä¸è¦æææä¸å¡æ°æ®å¡è¿ `messages`ãå¾ç¶æéç¨æç¡®çä¸å¡å段ï¼è¾¹ç DTO ä½¿ç¨ Pydantic æ ¡éªï¼æ¶æ¯åªä¿åå¿ è¦ç人æºå¾æ¥ã | åæ®µ | ç±»å/å«ä¹ | åå¹¶çç¥ | | --- | --- | --- | | `task_id / case_id / graph_version` | æ§è¡ä»»å¡ãä¸å¡æ¡ä»¶ãå¾çæ¬ | åä¸åè°èç¹å | | `scenario_id / business_refs` | åºæ¯ä¸å¯¹è±¡å¼ç¨ | éªè¯ååºå®ï¼ä¿®æ¹éæ°æ¹æ¡çæ¬ | | `time_window / rule_versions` | æ¬æ¬¡è®¡ç®èå´ä¸è§åçæ¬ | åä¸åå ¥ | | `snapshot_refs` | åå·¥å ·ç»æçåå¨å¼ç¨ãä¸å¡çæ¬ãééæ¶é´ | æ source_key åå¹¶ | | `evidence` | è¯æ® IDãæ¥æºå¯¹è±¡ãåæ®µæè¦ãå¯ä¿¡ç¨åº¦ | æ evidence_id å»éåå¹¶ï¼å ID å²çªæ¥é | | `findings` | ç¡®å®äºå®ãæ¨æã缺å£ä¸é£é© | æ finding_id åå¹¶ | | `proposal_ref` | ä¸å¯åå¨ä½æ¹æ¡ IDãçæ¬ãhash | åä¸èç¹åå ¥ | | `approval_ref / command_refs` | BPM å®ä¾ä¸å½ä»¤è®°å½å¼ç¨ | æä¸å¡é®å»é | | `result_ref / status / errors` | è¾åºäº§ç©ä¸ä»»å¡ç¶æ | ç¶ææºæ§å¶ | å¹¶è¡èç¹ä» è¿åèªå·±è´è´£çå±é¨æ´æ°ï¼å ±äº«ç»æå段é ç½® reducerï¼é¿å å¹¶è¡è¦çãå䏿¡è¯æ®éæ¾åä¸éå¤è®¡æ°ãç¶æä¿å JSON å¯åºååå¼ä¸å¼ç¨ï¼ç¦æ¢æè¿æ¥æ± ãHTTP 客æ·ç«¯ãåæ®ã宿´éä»¶æ¾è¿æ£æ¥ç¹ã `conversation_id` æ¯ç¨æ·å¯¹è¯ï¼`case_id` æ¯ä¸å¡é®é¢çå½å¨æï¼`task_id` 对åºä¸æ¬¡å®æ´å¾æ§è¡ï¼ä½ä¸º `thread_id` çæå¡ç«¯æ å°ï¼`run_id` æ¯ä¸æ¬¡è¿è¡ææ¢å¤å°è¯ãä¸ä¸ªå¯¹è¯å¯æå¤ä¸ªæ¡ä»¶åä»»å¡ãå®¡æ¹æ¢å¤ä½¿ç¨å threadï¼å®æ¶å¤æ¥å»ºç«æ°ä»»å¡å¹¶å ³èå caseï¼é¿å æ§å¾ç¶ææ éå¢é¿ã è¯·æ±æ¶çæéå¿«ç §ä» ç¨äºå®¡è®¡ãæ¯æ¬¡æ¥è¯¢ãå®¡æ¹æ¢å¤ååå ¥é½ç± Java æ£æ¥ææ°æéãæ¢å¤ä»»å¡éæ°åå¾åæ§è®¿é®ä¸ä¸æï¼ä¸ä¾èµå 天åå·²è¿æçç»å½ tokenã ## 6. éç¹åå¾ï¼é½å¥åæççå®è®¡ç®å£å¾ ```text load_workorders â resolve_bom_and_units â fetch_material_snapshotï¼åºåãå»ç»ãå ç¨ãéè´å¨éï¼ â validate_snapshot â allocate_supply_across_orders â calculate_shortages â aggregate_by_material_and_supplier â explain_with_evidence â propose_expedite_tasks ``` ä¸ä¸ªæ¹æ¬¡å·¡æ£å ç»ä¸å è½½ç©æä¾åºå¿«ç §ï¼åæç¡®å®çå·¥åä¼å 级åé ä¾åºãéå·¥åç¬ç«è¯»ååä¸åºåä¼é夿¿è¯ºå䏿¹ç©æï¼å æ¤ä¸è½ç®åå¹¶è¡è®¡ç®åç¸å ãä¼å çº§ãæ¿ä»£æè§åã计éåä½åå 许æèå¿ é¡»çæ¬åã åºåæå¡æä¾æå¨çå¯åé éåå ¶å£å¾ãå»ç»ä¸å ç¨å¯è½éå ï¼ä¸è½æªç»éªè¯å°±é夿£åï¼ä¹è¦åºåæ¬å·¥åå ç¨ä¸å ¶å®å·¥åå ç¨ãå·²é¢ç©æåå¨éé¢è®¡å°è´§ãåæèå¾çç®ååå¯ç¨å ¬å¼ä»¥æ¬èä¸ºå®æ½ä¾æ®ã 跨模åè¯»åæªå¿ æ¯åä¸ä¸ªæ°æ®åºäºå¡å¿«ç §ï¼å æ¤ç»æè®°å½æ¯ä¸ªæ¥æºççæ¬ä¸ééæ¶é´ãä» å°ç»æç§°ä½âæªè³ææ¶ç¹çè¯ä¼°âï¼æ§è¡é¢ææéè´çå¨ä½æ¶ï¼ç±åä¸å¡äºå¡éæ°æ ¡éªï¼ä¸æåæå¿«ç §å½åºåéã ## 7. å·¥å ·åè®®ä¸ Java å¯¹æ¥ å 鍿¥å£å»ºè®®æ¾å¨ `yudao-module-ai` ç `bridge` å ¥å£ï¼è°ç¨å模åå·²æ Service/APIï¼å¹¶è¡¥è¶³ç¼ºå¤±çåªè¯»èå APIãå ¬å ± DTO æ¾å¨ç¸åº `*-api` 模åï¼éµå¾ªç°æ Maven ä¾èµæ¹åï¼é²æ¢ AI ä¸ MES ç¸äºä¾èµãå¤§åæ¥å ¥å¯ç¬ç«ä¸º `yudao-module-agent`ï¼éè¦å æ ¸å¯¹ç¼è¯ä¾èµå¾ã ```json { "tool": "mes.material.readiness_snapshot", "schema_version": "1", "request_id": "uuid", "task_id": "uuid", "arguments": {"work_order_ids": [101, 102]}, "response": { "data_ref": "snapshot-id", "source_versions": {"workorder:101": "revision"}, "observed_at": "ISO-8601", "completeness": "partial", "missing": ["purchase_delivery_confirmation"] } } ``` ä¸ä¾æ¯å¥çº¦å½¢ç¶ç¤ºæï¼å®é 请æ±åååºåå«ä¼ è¾ãç¨æ·/ç§æ·èº«ä»½æ¥èªæå¡ç«¯ç¾åçå§æä¸ä¸æï¼ä¸æ¥å模åçæçèº«ä»½åæ®µãå·¥å ·ç»è®°å æ¬é¢åã读å级å«ãæéç ãschemaãè¶ æ¶ãå页ä¸éãå¯éè¯éè¯¯åææåæ®µçç¥ã ç°æä»£ç å¯å©ç¨çå ·ä½å ¥å£å æ¬ï¼ - `MesProTaskController`ï¼`POST /mes/pro/task/auto-schedule/preview` ä¸ `/auto-schedule`ãæ£å¼æ§è¡è¯´æä¸ºéæ°æ ¡éªé¢è§å¹¶æ´æ¹ååæäº¤ï¼æ¥å ¥æ¶ç»§ç»è°ç¨è¯¥ä¸å¡è§åãå½åé¢è§è¯´ææ 09â18 ç¹å卿«/èåæ¥çº¦æï¼å¤çãå¤çä¸é¢å¤æ¢å约æéæ©å±å¹¶éªè¯ã - `MesProAiController`ï¼åç±»çäº§é¢æµï¼ä½ä¸ºæ¢æå»ºè®®è½å对æ¥ï¼ç¡®å®æ§è®¡ç®ç»æä¼å ã - `MesProWorkOrderController`ï¼å·¥åè¿åº¦ä¸è®¡åæ¥è¯¢ï¼`MesWmBatchController`ï¼ååååå·¥åºè¿½æº¯ã - ç¹æ£ãç»´ä¿®ãNCRãå¤ååæ/å ¥åºãéå®åºåºçæ§å¶å¨å·²æå¯¹è±¡å ¥å£ï¼ééè¿ Bridge æ´é²æå°å段éã è¿äº HTTP è·¯å¾æ¯æºç ä¸ç Controller ç¸å¯¹è·¯å¾ï¼é¨ç½²ç `/admin-api` çåç¼ãé´æåæ°æ®èå´é¡»å¨èè°ä¸ç¡®è®¤ãPython ä¸éè¿è¶ 级管çåè´¦å·è½¬åå ¨é¨ä¸å¡è¯·æ±ã ## 8. å®¡æ¹æ¢å¤ä¸ä¸å¡å¹ç LangGraph `interrupt()` ç¨äºæåçå¾ ï¼æ¢å¤ä½¿ç¨åä¸ thread ä¸ç `Command(resume=...)`ãæ¢å¤ä¼ä»ä¸æèç¹èµ·ç¹éè·ï¼å æ¤å®¡æ¹èç¹åªè¯»åå·²ç»è®°æ¹æ¡å¹¶ååºä¸æï¼å»ºåãåéç¥çå¯ä½ç¨æ¾å¨ç¬ç«çå¹çèç¹ãä¸è½ç¨æ³åå¼å¸¸æè·åæä¸æã[Interrupts](https://docs.langchain.com/oss/python/langgraph/interrupts) 宿´æµç¨ï¼ 1. `prepare_proposal` å»ç»åæ°ãä¸å¡çæ¬ãè¯æ®å¼ç¨ãæææï¼çæ `proposal_id + version + hash`ã 2. `register_approval` éè¿ Java å¹çå建审æ¹è®°å½ï¼äºå¡æäº¤åç± outbox éç¥ã 3. `await_approval` 䏿并鿾 Workerï¼ä¸ä¿æ HTTP ææ°æ®åºè¿æ¥çå¾ ã 4. BPM åè°å è½ inbox å»éï¼éªè¯å®¡æ¹å®ä¾ãå¨ä½ hash ä¸ç¾ç½²æéï¼è¥å¾å°æªå°ä¸æç¹ï¼äºä»¶ä¿ççå¾ ï¼ä¸è½ä¸¢å¼ã 5. Worker ææä»»å¡ç§çº¦ï¼è¯»åå¯¹åº interruptï¼ç¨ç»è¿éªè¯ç审æ¹è®°å½å¼ç¨æ¢å¤ï¼ç¦æ¢åç«¯ç´æ¥æäº¤ä»»æ `resume` å¼ã 6. `revalidate` 忥æéãå®¡æ¹æ¤éç¶æãåæ° hashãå¯¹è±¡çæ¬åæææãæ°æ®åæ´ééç®ï¼å¨ä½åæ°åæ´é¡»éæ°å®¡æ¹ã 7. `execute_command` å¸¦ç¨³å® `command_id`ãå¹çé®åææçæ¬äº¤ç» Javaãå¹çé®ç±åºæ¯ãæ¹æ¡çæ¬ãå¨ä½ç±»ååä¸å¡å¯¹è±¡ææï¼å䏿¹åå¨ä½éæ¾æ¶ä¿æä¸åã 8. Java å¨åä¸ä¸å¡äºå¡å ç»è®°å½ä»¤ç»æä¸ä¸å¡åæ´ï¼å¯ä¸çº¦ææ¦æªéå¤è¯·æ±ï¼éè¯è¿ååä¸å¡åå·ã 9. ç½ç»è¶ æ¶å±äºâç»ææªç¥âï¼æå½ä»¤ ID æ¥è¯¢ç»æï¼ä¸è½ç´æ¥å½å¤±è´¥å建æ°åãå读æååæåå端æ¾ç¤ºâå·²æ§è¡âã æ£æ¥ç¹ä¸æä¾å¤é¨ç³»ç»ç exactly-once ä¿è¯ãä¸å¡ä¸è´æ§ä¾èµ Java äºå¡ãå½ä»¤å»éãçæ¬æ ¡éªä¸å¯¹è´¦è¡¥å¿ã跨模åé¿æµç¨ææå¯æ ¸å¯¹çå½ä»¤åºåï¼ä¸éå¤±è´¥åæ¢åç»å¨ä½ï¼è¡¥å¿ä» è°ç¨ä¸å¡å è®¸çæ¤éæ¥å£ï¼å¹¶ä¿ç人工å¤çå ¥å£ã ## 9. äºä»¶ã主å¨å·¡æ£ä¸æ¢å¤ 建议äºä»¶ç±»åï¼`sales.delivery_changed`ã`purchase.delivery_confirmed`ã`production.feedback_approved`ã`quality.inspection_completed`ã`equipment.repair_changed`ã`warehouse.receipt_completed`ã`bpm.approval_decided`ãå称为æå®å¥çº¦ï¼éè¦æ°å¢åå¸éé ã äºä»¶è³å°å å« `event_id`ã`event_type`ã`aggregate_ref`ã`aggregate_version`ã`occurred_at`ã`schema_version` åç§æ·ãä¸å¡äºå¡å outboxï¼å¼æ¥åå¸ï¼Python inbox ç¨äºä»¶ ID å»éï¼æå¯¹è±¡çæ¬å¤çä¹±åºï¼æäºä»¶å ³èå¤éæ¡ä»¶æå¯å¨å¤æ¥ã 宿¶å¨ä¸äºä»¶æ¥å ¥è´è´£åèµ·/æ¢å¤å¾ï¼LangGraph æ¬èº«ä¸å å½çäº§å®æ¶è°åº¦æå¡ãçå¾ æé´ä¸ä½¿ç¨é¿æ¶é´ sleepãè·è¿è®°å½å«ä¸æ¬¡æ£æ¥æ¶é´ãè´£ä»»äººãæªæ¢æ¶é´ãå级çç¥ä¸åæ¢æ¡ä»¶ï¼éç¥è®°å½ä¿åæ¸ éåæ§ï¼æªååçå·¡æ£ç»æä¸å夿éã ## 10. æ°æ®è¡¨ä¸æä¹ åè¾¹ç | Agent èªæè¡¨ | æ ¸å¿ç¨é/约æ | | --- | --- | | `agent_case` | ä¸å¡æ¡ä»¶åå ³è对象ãå½åå¤çé¶æ®µ | | `agent_task` | case/thread æ å°ãå¾çæ¬ãç§çº¦ãç¶æï¼åä»»å¡åæ§è¡è | | `agent_run` | æ¯æ¬¡æ§è¡/æ¢å¤çè¾å ¥æè¦ãèµ·æ¢æ¶é´ãéè¯¯ä¸ææ¬ | | `agent_snapshot` | æ°æ®æ¥æºãçæ¬ãééæ¶é´ã宿´åº¦ã对象åå¨å¼ç¨ | | `agent_proposal` | ä¸å¯åæ¹æ¡çæ¬ãåæ° hashãæææ | | `agent_command` | å½ä»¤ IDãå¹çé®ãè¯·æ± hashãè¿ç«¯ç»æï¼æ§è¡æå¨ç»æå¨ Java | | `agent_inbox / agent_outbox` | å¯é äºä»¶æ¥æ¶ä¸åéï¼äºä»¶ ID å¯ä¸ | | `agent_followup` | 䏿¬¡å¤æ¥ä¸å级æ¡ä»¶ãå ³éåå | | `agent_ui_event` | æåºçé¢äºä»¶ãSSE éè¿æ¸¸æ | | æ¡æ¶æ£æ¥ç¹è¡¨ | ç±åºå®çæ¬ saver 管çï¼ä¸æå·¥ä¼ªé æä¿®æ¹ç¶æ | Checkpointer ä¿åçº¿ç¨æ§è¡ç¶æï¼è·¨ä»»å¡çå好ä¸åå®¡æ ¸ç¥è¯å¯ä»¥ä½¿ç¨ Store æåºç¨æ°æ®è¡¨ï¼å¹¶æç§æ·/ç¨æ·å½å空é´é离ã宿¶åºåã已忴审æ¹ã客æ·ä¿¡ç¨çäºå®æ¯æ¬¡éæ°æ¥è¯¢ï¼ä¸ä»è天记å¿å½ä½å½åçå¼ã[Checkpointers](https://docs.langchain.com/oss/python/langgraph/checkpointers) å¾çæ¬åºå®å°ä»»å¡ï¼å级ä¿çæ§çæ¬ Worker ç´è³æèµ·ä»»å¡ç»æï¼æåç»è¿æµè¯çç¶æè¿ç§»ãé¨ç½²æ¶ä¸è½éæéå½åçå¾ ä¸çèç¹/å é¤ç¶æå段ãé ç½®æ£æ¥ç¹ä¸äº§ç©ä¿çæï¼ä¸å¡å®¡è®¡æä¼ä¸è¦æ±åç¬çåã ## 11. 模åãç¥è¯ä¸çé¢åè®® 模åç½å ³æè½åéæ©ææ¬ãç»æåè¾åºåè§è§æ¨¡åï¼å¯é¥ä¿çæå¡ç«¯ãçæç¨ç°æ `AiChatApi` éé èªç¶è¯è¨è¯´æï¼è¥å ¶ä» è¿åææ¬ï¼å Python ä½¿ç¨ JSON schema æ ¡éªå¹¶æéä¿®å¤ãéè¦åçå·¥å ·è°ç¨æ¶æ°å¢åè®®éé ï¼ä¸åè®¾ç°æå符串æ¥å£å·²æä¾è¯¥è½åã ç¥è¯æ£ç´¢ä¼ å ¥é¢åãç©æ/产åãæ åçæ¬ãçææ¥æåæéè¿æ»¤ãè¯æ®è®°å½ææ¡£ IDãçæ¬ã页ç /段è½ãéä»¶å¼ç¨ï¼å·¥èºåæ´æä¸å¡åçæ¶é´éææçæ¬ãæ£ç´¢ææ¡£ä½ä¸ºå å®¹æ°æ®ï¼ä¸è½æ¹åå·¥å ·æéæä¸å¡è§åã å端éç¨ç¨³å®çä¸å¡ SSE åè®®ï¼`task_started`ã`step_completed`ã`evidence_added`ã`result_ready`ã`approval_required`ã`command_submitted`ã`command_verified`ã`task_failed`ãåç«¯ä¸æ¶è´¹åå§ checkpointãå é¨ prompt æå®æ´å·¥å ·è¿åãæå¡ç«¯å° LangGraph æµäºä»¶è½¬æ¢æä¸è¿°åè®®å¹¶è¿æ»¤æéï¼æçº¿åæ event_id è¡¥åã宿¹æ¯æç¶ææ´æ°ãæ¶æ¯åèªå®ä¹æµï¼éå®çæ¬ååºå®éé å¨å¹¶è¦çåè®®æµè¯ã[Streaming](https://docs.langchain.com/oss/python/langgraph/streaming) ## 12. Python å·¥ç¨ç®å½ä¸ä¾èµçç¥ ```text mom-industrial-agent/ pyproject.toml / uv.lock src/mom_agent/ api/ # tasksãcasesãresultsãSSEï¼å é¨äºä»¶æ¥å ¥ runtime/ # Workerãç§çº¦ãæ¢å¤ãå¾çæ¬æ³¨å graphs/ coordinator.py scenarios/ # ä¹ä¸ªåºæ¯ StateGraph shared/ # è¯æ®æ ¡éªãæ¹æ¡ã审æ¹ãå½ä»¤å读 state/ # ç¶åå¾ç¶æãreducerãschema è¿ç§» domains/ # è¦çææå®é ä¸å¡æ¨¡åçå·¥å ·å¥çº¦ calculators/ # é½å¥åé ãå·¥æ¶ãå·®å¼ç坿µè¯è®¡ç® integrations/ # Javaãæ¨¡åãç¥è¯åºãéç¥æ¸ é policies/ # æééæ±ãå¨ä½ç级ãé¢ç®ãæ°æ®æææ persistence/ # PostgreSQL æ£æ¥ç¹ä¸åºç¨è¡¨ events/ # inbox/outboxãäºä»¶å ³èãè·è¿ä»»å¡ observability/ # æ¥å¿ãææ ãtrace tests/unit/ contracts/ graph/ recovery/ scenarios/ evaluations/ # è±æç宿¡ä¾ãåºåç»æä¸æ 注 migrations/ deploy/ # 容å¨ãé 置示ä¾ãè¿è¡æå ``` Python 3.11+ï¼ä¾èµéå® LangGraphãcheckpoint-postgresãPydanticãFastAPIãhttpxãæ°æ®åºé©±å¨ä¸æ¨¡åéé å çå ¼å®¹ç»åãåªéç¨å·²éªè¯æé APIï¼ä¸èªå¨è·éææ°çæ¬ï¼ä¸ä¸ºåææ¹æ¡å¼å ¥é¢å¤å¤æºè½ä½æ¡æ¶ã ## 13. éªæ¶ä¸å®æ½æå 第ä¸å ï¼å¾è¿è¡åºåº§ãJava å§æèº«ä»½ãåªè¯»å·¥å ·ãæ£æ¥ç¹ãSSEãä»»å¡/äºä»¶è¡¨ãéè¿âæèµ·åéå¯ä»è½æ¢å¤ãåä»»å¡å¹¶ååæ§ãè¶æé离ãäºä»¶ä¸ä¸¢ä¸éå¤âçéªæ¶ã 第äºå ï¼é½å¥ãå·¥åå·¡æ£å交æè¯å®¡ä¸å¾ãç¨è±æçå®å·¥å对æ¯äººå·¥åºåï¼æ£éªåæ¹åºåä¸è¢«éå¤åé ãå»ç»å ç¨ä¸è¢«é夿£åãæ¥æºç¼ºå¤±ä¸çæç¡®å®æ§æ¿è¯ºã 第ä¸å ï¼å®¡æ¹ä¸åå½ä»¤ãè¦çåè°å å°/éå¤å°ã审æ¹åä¸å¡ååãæ§è¡åç½ç»æå¼ãåæå使£æ¥ç¹æªä¿åãå®¡æ¹æ¤éçæ éæ³¨å ¥ï¼éè·ä¸éå¤å»ºåã 第åå ï¼è´¨é/追溯ã设å¤ãåè´§ãå§å¤ï¼è¡¥å å ¨æ¨¡åæ¥è¯¢å¾ãç»è¥é®ç䏿æ¬å£å¾ãåºæ¯å¼æ¾åéé¡¹æ ¸å¯¹ç宿°æ®ä¸ä¸å¡æ¥å£ï¼ä¸ä»¥åå¨ Controller ä½ä¸ºå®æ´å¯ç¨çè¯æ®ã 宿æ åï¼ä¹åºæ¯åæèç¹å¾ãè¾å ¥è¾åºå¥çº¦ãæéæ¸ åã人工边çã失败路å¾åç宿 ·æ¬ï¼æ¯ä¸ªç»æå¯è¿½æº¯æ¥æºï¼æ¯ä¸ªå¨ä½å¯å ³è审æ¹åä¸å¡åå·ãæ¶å»¶ãæ¨¡åææ¬åå¹¶åç®æ å¨ç宿°æ®è§æ¨¡åæµå设å®ï¼ä¸æ²¿ç¨å®£ä¼ å¾ä¸çèæ¶æäº¤ä»å¨æã ## 14. æ¬è½®å·²ç¡®å®ä¸åç»è¯å®¡ç¹ 已确å®ï¼Python ç¬ç«é¡¹ç®ãLangGraph èªå®ä¹ç¼æã主å¾ä¸ä¹åºæ¯åå¾ãJava ä¿çä¸å¡æ§è¡ä¸å®¡æ¹ãç产æä¹ 忣æ¥ç¹ãäºä»¶é©±å¨è·è¿ãè¯æ®å¡è¾åºã åç»è¯å®¡ï¼æ°å¢ PostgreSQL çé¨ç½²èµæºï¼é¦æ¹æ¨¡å䏿°æ®åºåè¦æ±ï¼ç°æ BPM æ¯å¦è¦çå¬äº¤/åå¤çº¿çæ°æµç¨ï¼å§å¤ä»·æ ¼æè䏿ºæ¶æ¥æºï¼åå²ä½å¨ä½ææã以ä¸å½±åæ¥å£ä¸ä¸çº¿èå´ï¼ä¸å¦¨ç¢å 宿å¾ãå·¥å ·åæ°æ®å¥çº¦è®¾è®¡ã docs/industrial-agent-python-design.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,162 @@ # å ¨ä¸å¡å·¥ä¸æºè½ä½ Python 项ç®è®¾è®¡èæ¡ > ç¶æï¼æ¹æ¡è®¨è®ºç¨¿ï¼ä» 设计ï¼å°æªå®æ½ãç®æ æ¯ä¸ºæ¬ä»åºå»ºç«ç¬ç«ç Python æºè½ä½æå¡ï¼å¹¶éè¿åæ§æ¥å£è¦çå®é ä¸å¡é¾è·¯ã ä¹ä¸ªä¸å¡åºæ¯ç触åãåè¯ã计ç®ãç»æã审æ¹è¾¹çä¸ä»åºæ¥å ¥æ ¸å¯¹è§ [åºæ¯èå¾](industrial-agent-scenario-blueprint.md)ã æ¡æ¶å·²ç¡®å®ä¸º LangGraphï¼ä»¥ [LangGraph ææ¯æ¹æ¡](industrial-agent-langgraph-technical-design.md) 为工ç¨å®ç°ä¾æ®ï¼å ¶ä¸æç¡®äºæ£æ¥ç¹åå¨ãå¾ç¶æä¸å®¡æ¹æ¢å¤ç»èï¼å¹¶ä¿®è®¢æ©æåå¨å»ºè®®ã ä¼ä¸å次ä¸çº¿ä¸æ¥å¸¸è¡¥å½æ°å¢æ ¸å¿ä¸»çº¿ï¼[WPS ç工使件åæãå¤è½®æ ¸å¯¹ä¸ä¸å¡å ¥åº](industrial-agent-document-onboarding-design.md)ï¼ä¸è¿è¥åºæ¯å¹¶å建设ã ## 1. 项ç®å®ä½ä¸è¾¹ç æ¬ä»åºä»¥ Spring Boot æ¨¡åæ¿è½½ä¸å¡è§åãæéã审æ¹åæ°æ®ï¼Python 项ç®è´è´£è·¨æ¨¡åçè§£ãæ£ç´¢ãåæãè§åä¸å»ºè®®ãç¨æ·ä»ç°æå端æä¸å¡åæ®åèµ·ä»»å¡ï¼Java ç½å ³é´æå¹¶æä¾å·¥å ·æ¥å£ï¼Python æºè½ä½çæå¸¦è¯æ®ç建议æå¾ å®¡æ¹æä½ï¼ææä¸å¡åå ¥ä»ç»åæ Java æå¡å®æã è®¾è®¡ç®æ æ¯âä¸ä¸ªæºè½ä½å¹³å° + å¤ä¸ªé¢åè½åå + è·¨é¢åæµç¨âï¼è䏿¯ä¸ºæ¯ä¸ªæ¨¡åå¤å¶ä¸ä¸ªè天æºå¨äººãå¹³å°å æ¥å ¥å ¨é¨ä¸å¡å¯¹è±¡ç**ç®å½ååªè¯»è½å**ï¼åæé£é©éæ¥å¼æ¾å¯å®¡æ¹çå¨ä½ãç®å½è¦çä¸çäºç¬¬ä¸çå°±æå®æ´çèªå¨æ§è¡è½åã ### ä»åºä¾æ® - `docs/project-business/data/modules.json` ç»åºäº MDMãCRMãSRMãERPãç产ãä»å¨ãè´¨éãè´¨æ£æ¥åã设å¤ãå®åãHRMãBPMãAI çä¸å¡å¯¹è±¡ä¸ä¸ä¸æ¸¸ã - `yudao-module-ai` å·²ææ¨¡åé ç½®ãç¥è¯åºå `AiChatApi`ï¼CRM æ¥ä»· OCRãERP æ¥ç¥¨ OCRãMES è´¨æ£å»ºè®®ä¸åç±»çäº§é¢æµå·²æè°ç¨ç¹ãæ° Python æå¡åºå¯¹æ¥æéæ¥è¿ç§»è¿äºè½åï¼é¿å åå¥çæ¡ä¸é ç½®ã - `yudao-module-mes` æè®¾å¤ãç¹æ£ãç»´ä¿®ãå·¥åãåºåãæ£éªçé¢åï¼`yudao-module-bi` æä»ªè¡¨çä¸å¾è¡¨é ç½®ã`archive`ã`finance`ã`research`ã`ums`ã`wxcp` å¨å½åæºç ä¸ç¼ºå°å¯ç´æ¥è¯æç管ç端æ§å¶å¨ï¼å æ¾å ¥è½åç®å½ï¼å¾ é䏿 ¸å®æ¥å£å弿¾ã - `im` ä¸ `member` 模åè½æä»£ç ï¼ç°æä¸å¡å°å¾å°å ¶å为主é¾è·¯æªæ¶è´¹æéçè½åãé»è®¤ä¸æå®ä»¬ä½ä¸ºé¦æ¹çäº§å·¥å ·ã ## 2. æ»ä½æ¶æ ```mermaid flowchart LR U[Vue / ç§»å¨ç«¯ / åæ®æé®] --> J[Java æºè½ä½ç½å ³] J --> P[Python FastAPI æºè½ä½æå¡] P --> O[ä»»å¡ç¼æä¸ç¶ææº] O --> R[é¢åå·¥å ·ç®å½] O --> K[ç¥è¯æ£ç´¢] O --> M[模åä¸è§å / 颿µå¨] R --> J J --> B[ç°æ Java ä¸å¡ Service / API] B --> D[(ä¸å¡åº)] O --> A[(æºè½ä½ä¼è¯ / è¯æ® / 审计)] O --> H[人工审æ¹éå] H --> J ``` **责任åå** | å± | èè´£ | 䏿¿æ | | --- | --- | --- | | Java æºè½ä½ç½å ³ | ç°æç»å½æãRBACãæ°æ®èå´ãä¸å¡ API å°è£ ã审æ¹ä¸å¹çåå ¥ | æ¨¡åæ¨çä¸è·¨åè§å | | Python æºè½ä½æå¡ | æå¾è·¯ç±ãå·¥å ·è®¡åãè¯æ®æ±æ»ãçº¦ææ ¡éªã建议çæãä¼è¯å®¡è®¡ | ç´è¿å¹¶ä¿®æ¹ä¸å¡è¡¨ãç»è¿ BPM | | é¢åå·¥å · | ç»æåæ¥è¯¢ã计ç®ã模æä¸åæ§å½ä»¤ï¼æ¯ä¸ªå·¥å ·å£°ææéãåæ®µåçæ¬ | è¿åä¸åæ§çæ´åºæ°æ® | | ç¥è¯å± | SOPãå·¥èºãè´¨æ£è§èã产åæåãå¶åº¦çææ¡£æ£ç´¢ | æç¥è¯ææ¡£å½ä½å®æ¶åºåæå®¡æ¹ç¶æ | | è§å䏿¨¡åå± | ç¡®å®æ§æ ¡éªã颿µæ¨¡åãLLM è¯è¨è§£é | 让 LLM å³å®ç¡¬æ§ä¸å¡è§å | å ³é®è¯·æ±ä¸ä¸æï¼`user_id`ãé¨é¨/æ°æ®èå´ã`tenant_id`ï¼å³ä½¿å½åå ³éä¹ä¿çåæ®µï¼ã`task_id`ã`trace_id`ãåºæ¯ãä¸å¡å¯¹è±¡å¼ç¨åæéå¿«ç §ãPython ä¸å¯ä¿¡ä»»åç«¯ä¼ å ¥çæé声æï¼æ¯æ¬¡å·¥å ·è°ç¨ç± Java æå¡ç«¯æå½åç¨æ·éæ°é´æã ## 3. é¢åè½åå¾è°± ä¸è¡¨æ¯**ç®æ å·¥å ·ç®å½**ï¼ä¸æ¯å¯¹ç°ææ¥å£åå·²å¯ç¨ç声æãæ¯è¡å 交ä»åªè¯»å·¥å ·åå¼ç¨é¾æ¥ï¼åå¨ä½å¦è¡è¿è¡æ¥å£ä¸æéæ ¸å®ã | é¢å | 馿¹åªè¯»è½å | åç»å»ºè®®æå®¡æ¹å¨ä½ | | --- | --- | --- | | MDM ä¸»æ°æ® | ç©æ/SKUã计éåä½ãä»åºãæ¹æ¬¡å±æ§æ¥è¯¢ï¼ç¼ç æ¶æ§ | ä¸»æ°æ®éå¤é¡¹ä¿®è®¢å»ºè®® | | CRM éå® | 客æ·ãåæºãæ¥ä»·ãååã忬¾è®¡åãéå®ç®æ æè¦ | è·è¿å»ºè®®ãååé£é©æç¤ºãæ¥ä»·è稿 | | SRM ä¾åºå | ä¾åºåèµè´¨ãæææ ã交ä»ä¸ç»©ææ¥è¯¢ | èµè´¨å°ææéãåéä¾åºåæ¯è¾ | | ERP éè´/éå®/èµé | éè´ç³è¯·ä¸è®¢åãæ¥ç¥¨ä»æ¬¾ãéå®è®¢åãæ¶æ¬¾ç¶æ | 缺货éè´å»ºè®®ã订åå¼å¸¸è§£éã对账åé项 | | MES ç产 | MPSãå·¥åãå·¥åºä»»å¡ãæ¥å·¥ãå·¥èºè·¯çº¿ãå·¥å BOM | 缺æ/å·¥æ¶/é£é©/交ä»é¢æµæ´åï¼æç¨æ¹æ¡æ¨¡æ | | MES ä»å¨ | åºå维度ãå ç¨ãå»ç»ãæ¹æ¬¡/SNãåºå ¥åºäºå¡ | è°æ¨/补货建议ï¼è¿½æº¯é¾çæ | | MES è´¨é | IQC/IPQC/OQC/RQCãææ ã缺é·ãNCR | æ£éªå¤å®å»ºè®®ãå¼å¸¸å½å ãNCR å¤ç½®è稿 | | è´¨æ£æ¥å | 模æ¿çæ¬ãæ¥åå®ä¾ãå»ç»å¿«ç §å¼ç¨ | æ¥å缺å£è§£éä¸çæåæ£æ¥ | | 设å¤/å·¥è£ /æç/è½è | 设å¤ç¶æãç¹æ£/ç»´ä¿®ãå·¥è£ ãçç»ãè½èè®°å½ | ç»´ä¿®ä¼å 级ã设å¤é£é©ãæçå²çªå»ºè®® | | å®å | å·¥åãç»´ä¿®ãéè´§ãè´¨æ£ä¸é款åè°ç¶æ | 客è¯å½å ãéè´§è¿åº¦è§£éãå¤çè稿 | | HRM | 人åå¯ç¨æ§ãæçãèå¤ä¸äº¤æ¥ç¶æçæå°å¿ è¦æè¦ | 人å缺å£å»ºè®®ï¼èªé ¬æ°æ®é»è®¤ä¸è¿å ¥éç¨ä¼è¯ | | BPM | æµç¨å®ä¾ãå½åä»»å¡ã审æ¹è½¨è¿¹ãä¸å¡åè°ç¶æ | å¾ åè§£éãå®¡æ¹ææç¼ºå£æç¤ºï¼å®¡æ¹å³å®ä»ç±å®¡æ¹äººæ§è¡ | | BI | ææ å®ä¹ã仪表çèåç»æ | è·¨åç»è¥è§£éãå¼å¸¸é»åãææ å£å¾å¼ç¨ | | AI/ç¥è¯ | ç°ææ¨¡åä¸ç¥è¯åºãOCR/颿µè°ç¨ç»è®° | ç»ä¸æ¨¡åç½å ³ãæç¤ºè¯çæ¬ä¸è¯ä¼° | | System/Infra | ç¨æ·å¯è§èå´ãåå ¸ãéä»¶å¼ç¨ãä»»å¡/审计æ¥å¿ | 管çé 置建议ï¼é«æéå·¥å ·åç¬å®¡æ¹ | | Archive/Finance/Research/UMS/WXCP | å»ºç«æ¨¡åæ¸ åãæ ¸å®æ¯å¦æä¸å¡ API | æå®é æ¥å£ä¸è´£ä»»äººåå å ¥å·¥å ·ç®å½ | | IM/Member | ä¿çå ¼å®¹å ¥å£ï¼ä¸å¨é»è®¤ä¸å¡å©ææç´¢èå´å | ä¸å¡ç¡®è®¤å¯ç¨ååæ¥å ¥ | **è·¨åè¯ä¹å±**ç»ä¸ä½¿ç¨ `BusinessRef(module, object_type, id, code)` åä¸å¡äºä»¶å ³ç³»ï¼é¿å å¨æç¤ºè¯ä¸æ¼æ¥è¡¨åãä¼å è¿æ¥âéå®è®¢åâMPSâå·¥åâ颿/æ¥å·¥âè´¨æ£âå ¥åº/åºåºâ忬¾/å®åâççå®åæ®å¼ç¨ï¼æ²¡æç¡®å®å ³èæ¶æç¡®æ¾ç¤ºâå¾ æ ¸å®âï¼ä¸é åç§°çæµã ## 4. ä¸ä¸ªé¦è¦è·¨æ¨¡ååºæ¯ ### A. 订å交ä»é£é© è¾å ¥éå®è®¢åæååç¼å·ã读å CRM ååãERP éå®è®¢åãMPS/å·¥å/æ¥å·¥ãåºåå ç¨ãéè´å°è´§ã设å¤åæºãè´¨æ£é»æä¸åå²äº¤ä»ãç¡®å®æ§è®¡ç®ç¼ºå£åé¢è®¡å®æèå´ï¼æ¨¡å说æä¸»è¦é£é©ãè¯æ®ãä¸ä¸æ¥ä¸è´£ä»»å²ä½ãè¾åºæ¯âé£é©å¡ + è¯æ®å¼ç¨ + å¯éå¤çæ¹æ¡âï¼æç¨æéè´ä» çæè稿ã ### B. è´¨éå¼å¸¸è¿½æº¯ è¾å ¥ IQC/IPQC/OQC/RQC/NCR ææ¹æ¬¡å·ã沿ä¾åºåãæ¥æãåºåæ¹æ¬¡ãå·¥åå·¥åºã设å¤ãæ£éªææ ãéå®åºåºåå®åé¾è·¯è¿½æº¯ãè¾åºå½±åæ¹æ¬¡/è®¢åæ¸ åãæ¶é´çº¿ãå·²ç¥ä¸æªç¥ç¯èãä»»ä½åºåå»ç»ãè¿å·¥ãéè´§åæ¥åºå¨ä½è¿å ¥åæå®¡æ¹æµã ### C. ç»è¥ä¸ç°åºå¼å¸¸é®ç ç¨æ·æé®âæ¬å¨äº¤ä»ä¸ºä½ä¸éï¼âä¹ç±»é®é¢ãå è¯å«å¯è®¿é®ç BI ææ å£å¾ï¼åæ¥èåæ°æ®åç¸å ³åæ®ï¼å¼ç¨å ·ä½æ¶é´èå´ä¸æ¥æºãåºåäºå®ã计ç®ç»æä¸æ¨æµï¼æ²¡æè¶³å¤æ°æ®æ¶ç»åºç¼ºå¤±æ¸ åãè¯¥å ¥å£å¯è¦çå ¨é¨å·²æ¥å ¥æ¨¡åï¼ä½ä» è¿åç¨æ·å¯è§çæ°æ®ã ## 5. æºè½ä½å·¥ä½æºå¶ ```text æ¥æ¶ä»»å¡ â é´æ/è¯å«ä¸å¡å¯¹è±¡ â éç¨åºæ¯æ¨¡æ¿ â è§ååªè¯»å·¥å · â å¹¶è¡åè¯ â æ ¡éªæ¶é´ãåä½ãå£å¾ä¸å ³è â è§å/颿µè®¡ç® â çæå¸¦æ¥æºççæ¡/æ¹æ¡ â å¦éåå ¥åå½¢æå¾ 审æ¹å½ä»¤ â Java åé´æä¸ä¸å¡æ ¡éª â BPM/人工确认 â æ§è¡å¹¶åè¯»ç»æ ``` å·¥å ·è°ç¨ä½¿ç¨ JSON Schema/Pydantic è¾å ¥è¾åºãæ¯ä¸ªå·¥å ·ç»è®°ï¼`name`ã`domain`ã`read_or_write`ã`permission`ã`data_scope`ã`timeout`ã`schema_version`ã`idempotency_key`ãæ¥è¯¢é»è®¤å页ä¸éæ¶ï¼è·¨åä»»å¡é嶿大æ¥éª¤ãæå¤§å·¥å ·è°ç¨æ¬¡æ°åææ¬ã失败æ¶è¿åå·²æ ¸å®é¨åä¸ç¼ºå¤±è¯æ®ï¼ä¸ä¼ªé ç»è®ºã è¾åºç»ä¸ä¸º `answer`ã`facts[]`ã`inferences[]`ã`unknowns[]`ã`citations[]`ã`risk_level`ã`proposed_actions[]`ã`approval_required`ãæ¯æ¡æ¥æºå å«ä¸å¡å¯¹è±¡ãæ¥å£çæ¬ãééæ¶é´åå¯å¨åç³»ç»æå¼ç龿¥ã对äºéé¢ãåºåãåæ ¼å¤å®ãå®¡æ¹æéç硬约æï¼ä»¥ä¸å¡æå¡è¿åçè§ååç¶æä¸ºåã ## 6. Python 项ç®ç»æï¼æï¼ ```text industrial-agent/ pyproject.toml src/industrial_agent/ api/ # FastAPI è·¯ç±ï¼ä¼è¯ãä»»å¡ã审æ¹è稿ãå¥åº·æ£æ¥ core/ # ç¶ææºã计åå¨ãå·¥å ·è°åº¦ãä¸ä¸æã审计 contracts/ # Pydantic DTO ä¸çæ¬åå·¥å ·å¥çº¦ domains/ # mdm/crm/srm/erp/mes/qc/aftersales/hrm/bpm/bi ... workflows/ # 交ä»é£é©ãè´¨é追溯ãè·¨åé®ç integrations/ # Java ç½å ³ã模åãç¥è¯åºãäºä»¶æ»çº¿éé å¨ policies/ # æéèå´ãææå段ã审æ¹é¨æ§ãé¢ç® evaluation/ # åºæ¯æ ·æ¬ãå彿æ ãç»ææ æ³¨ tests/ docs/ ``` 建议éç¨ Python 3.11+ãFastAPIãPydanticãhttpxï¼ä»»å¡ç¶æä¸å®¡è®¡åå¨éç¨ä»åºç°æ MySQL/Redis ä½ç³»ï¼ä½ä½¿ç¨ç¬ç« schema/表åæå¡è´¦å·ï¼ä¸ç´æ¥ä¿®æ¹ä¸å¡è¡¨ã模åéé å±å ¼å®¹å·²æ AI 模åé ç½®ï¼å ·ä½å¤ç¨æ¹å¼è¦å¨å®æ½åæ ¸å¯¹è®¤è¯ä¸ APIãRAG å¯ä»¥å æ¶è´¹ç°æ AI ç¥è¯åºè½åï¼ä¸é¢è®¾å次é¨ç½²åéåºã ### Java â Python å¥çº¦èæ¡ - `POST /agent/tasks`ï¼å¸¦ä¸å¡å¯¹è±¡å¼ç¨ä¸ç¨æ·æå¾ï¼è¿å `task_id`ã - `GET /agent/tasks/{id}`ï¼æµå¼æè½®è¯¢è·åç¶æãè¯æ®åç»æã - `POST /agent/tasks/{id}/proposals`ï¼çæç»æåå¾ å®¡æ¹å½ä»¤ï¼ä¸ç´æ¥åä¸å¡åæ®ã - `POST /agent/tasks/{id}/approve`ï¼ç± Java ç½å ³ä¸ BPM å¤ç审æ¹ï¼ä¸æ¥å Python èªæ¥å®¡æ¹éè¿ã - é¢åå·¥å ·ç± Java ç½å ³æ´é²å é¨ APIï¼è¿åæå°å段éãæéè¿æ»¤ç»æå `source_ref`ï¼å é¨éä¿¡ä½¿ç¨æå¡è®¤è¯ï¼ç¨æ·ä¸ä¸æç±ç½å ³ç¾åå¹¶éæ¶ã ## 7. æ¹æ¡éæ© | æ¹æ¡ | å½¢æ | ä¼ç¹ | 代价/éç¨æ åµ | | --- | --- | --- | --- | | Aï¼ç»ä¸é®çå± | Python æå¡åªè°åªè¯»å·¥å ·åç¥è¯åº | æ¥å ¥å¿«ãé£é©ä½ï¼éåå åç»ä¸å ¥å£ | å¾é¾è¦ç审æ¹ä¸æ§è¡éç¯ | | **Bï¼å¹³å° + é¢åè½åå ï¼æ¨èï¼** | ç»ä¸ä»»å¡ç¼æãé¢åå·¥å ·ãè·¨å工使µãåçº§å®¡æ¹ | è½éæ¥è¦çææä¸å¡ï¼åä¿ç忍¡åè§å | éè¦å»ºè®¾ Java ç½å ³åå·¥å ·å¥çº¦ | | Cï¼å¤èªæ²»æºè½ä½ç¾¤ | æ¯ä¸ªé¢åç¬ç«è§åä¸åå | é¢åå¢éå¯ç¬ç«æ¼è¿ | åè°ã审计ãæéåç»æä¸è´æ§å¤æï¼å½åä¸å®ç´æ¥ä½ä¸ºé¦ç | æ¨è B ç第ä¸é¶æ®µåªè¯»è¿è¡ï¼ä¿çæªæ¥ä»åä¸ç¼æå¨åå±ä¸ºé¢åä¸é¿æºè½ä½çæ¥å£ãéæ©æ¹æ¡æ¶éç¹æ¯è¾ï¼æ³å è§£å³çè·¨åä»»å¡ãç°æ Java API çå¯å¤ç¨ç¨åº¦ãæ¯å¦å 许æºè½ä½æäº¤å®¡æ¹è稿ï¼ä»¥åä¸çº¿æéã ## 8. åé¶æ®µè½å°ä¸éªæ¶ 1. **ä¸å¡åæ¥å£çç¹**ï¼éæ¨¡åæ è®°âå·²éªè¯ API / éæ°å¢ API / ææ ä¸å¡å ¥å£âï¼ç»å¶å¯¹è±¡å ³ç³»ä¸æéè¾¹çãéªæ¶ï¼æ¯ä¸ªç®æ å·¥å ·é½æä¸å¡è´è´£äººãæ¥æºæ¥å£ãåæ®µãæ°æ®èå´åæµè¯æ ·ä¾ã 2. **å¹³å°éª¨æ¶**ï¼Python APIãå·¥å ·æ³¨åãä»»å¡ç¶ææºãå®¡è®¡ãæ¨¡åéé ãåªè¯» Java ç½å ³ãéªæ¶ï¼è¶æè¯·æ±è¢«æç»ï¼æ éå¯è¿½è¸ªå° `trace_id`ï¼çæ¡ææ¥æºé¾æ¥ã 3. **横åè¦ç**ï¼æ¥å ¥ä¸è¿°ææå®é ä¸å¡æ¨¡åçåªè¯»ç®å½ä¸è³å°ä¸ä¸ªå ³é®æ¥è¯¢ï¼æªå®ç°æ¨¡åæç¡®æ è®°ä¸å¯ç¨ãéªæ¶ï¼æ¨¡åè½åæ¸ åå¯èªå¨æ£æ¥ï¼ä¸å°ç©ºæ¨¡åå±ç¤ºæå·²æ¥å ¥ã 4. **æ·±åº¦åºæ¯**ï¼ä¼å 交ä»é£é©ä¸è´¨é追溯ï¼å ¶æ¬¡ç»è¥é®çãéè´ååã设å¤ç»´æ¤ãå®åéç¯ãéªæ¶ï¼ä¸äººå·¥åºåç»ææ¯å¯¹äºå®æ£ç¡®çãå ³èåç¡®çãæ¼æ¥çåååºæ¶å»¶ã 5. **åæ§æ§è¡**ï¼åªå¯¹ç»è¿ä¸å¡è¯å®¡çå½ä»¤å¼æ¾è稿/æäº¤ï¼ç» Java åé´æãå¹çæ ¡éªä¸ BPM 审æ¹åæ§è¡ãéªæ¶ï¼éå¤è¯·æ±ä¸éå¤å»ºåï¼æç»å®¡æ¹ä¸äº§çä¸å¡åå ¥ï¼å¯æåæ®åæ¾å®¡è®¡é¾ã 馿¹è¯ä¼°éåºå å«ç¼ºæãéå¤åºåå ç¨ãè´¨æ£ä¸åæ ¼ãå·²åå¨ç»´ä¿®åãè·¨é¨é¨è¶æãå·²æ¤é审æ¹ãæ°æ®è¿æãæ¥å£è¶ æ¶ãå ³èæé¾çæ¡ä¾ãä¸çº¿éç¨è§å¯æ¨¡å¼ï¼å æ¯å¯¹å»ºè®®ä¸äººå·¥å¤çï¼åæ©å¤§å¯æ§è¡èå´ã ## 9. å¾ éæ©ä¸æ¶¦è²çé®é¢ 1. é¦ä¸ªå¯æ¼ç¤ºéç¯éâ订å交ä»é£é©âãâè´¨éå¼å¸¸è¿½æº¯âè¿æ¯âè·¨åç»è¥é®çâï¼ 2. 第ä¸çæ¯å¦åªè¯»ï¼æå 许å建**å¾ å®¡æ¹è稿**ï¼ 3. ç¨æ·å ¥å£ä¼å æ¾å ¨å±å©æãä¸å¡åæ®ä¾§æ ï¼è¿æ¯ä¸¤è å¹¶è¡ï¼ 4. 模åé¨ç½²ä¼å 沿ç¨ç°æ `yudao-module-ai` é ç½®ï¼è¿æ¯ç± Python ç¬ç«ç®¡çï¼è¿éè¦æ ¸å¯¹å½å模åæå¡çå¯è°ç¨æ¥å£ä¸è¿ç»´æ¹å¼ã 以ä¸éå®åï¼åæ¶ææ¥å£æ¸ åãäº¤äºæµç¨ãæ°æ®åºè¡¨ãé¨ç½²å¾åéªæ¶æ ·ä¾ï¼å½¢æå¯å®æ½çæ¬ã docs/industrial-agent-scenario-blueprint.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,189 @@ # 工䏿ºè½ä½åºæ¯èå¾ï¼ä»è®¢åå°äº¤ä» > æ¹æ¡æ·±å稿ãåºäºç¨æ·ç»åºçåºæ¯ç¤ºæå¾ï¼é¢åæ¬ä»åºçå®é 模å忥å£éæ°å®ä¹ãå¾çä¸çæ°åã客æ·ã设å¤åæ§è¡ç¶æä» ä½äº¤äºç¤ºä¾ï¼ä¸ä»£è¡¨æ¬ç³»ç»ç宿°æ®æå·²å®ç°åè½ãæ¬æåªè®¾è®¡ï¼ä¸æ¹å¨ä¸å¡ä»£ç ã å·¥ç¨å®ç°åè§ [LangGraph å®å¶ææ¯æ¹æ¡](industrial-agent-langgraph-technical-design.md)ï¼å ¶ä¸é½å¥åé ä¸åºåå£å¾æ¯æ¬èå¾ç®åå ¬å¼ç宿½ç»åã åææ°æ®åå¤ä¸æ¥å¸¸å¢éè¡¥å½ç± [å·¥ä½æä»¶è¡¥å½æ ¸å¿è½å](industrial-agent-document-onboarding-design.md) æ¿æ ï¼æªæ ¸å®çæä»¶åéæ°æ®ä¸è½ç´æ¥ä½ä¸ºä¹åºæ¯ä¸çå½åä¸å¡äºå®ã ## ä¸ã产åç®æ ç¨æ·è¦ç䏿¯âè½åçå¶é ä¸é®é¢çè天æ¡âï¼èæ¯ä¸ä¸ªå¨ç°æ CRMãERPãSRMãMESãWMSãè´¨æ£ã设å¤ãå®åãBPM å BI ä¸å·¥ä½ç**ä¸å¡æ§è¡å©ç**ï¼æè®¡å主å¨å·¡æ£ï¼ç¨æ·æé®æ¶è½æ²¿è®¢å䏿¹æ¬¡é¾æ¾è¯æ®ï¼ç»åºå¯æ ¸ç®çç»è®ºï¼æéè¦å¤ççäºé¡¹äº¤ç»æ£ç¡®å²ä½ï¼æç»è·è¿å°ä¸å¡ç³»ç»åå宿ã ä¸ä¸ªåºæ¯å¿ é¡»åæ¶å ·å¤äºé¨åæç®äº¤ä»ï¼**è§¦åæ¡ä»¶ â ä¸å¡åè¯ â ç¡®å®æ§è®¡ç®/夿 â 坿 ¸å¯¹çç»æ â 人æºè¾¹çä¸åå**ãçé¢ä¸çâå·²æ§è¡âä» å¨ Java ä¸å¡æ¥å£è¿åçå®ä¸å¡åå·ååºç°ãâ颿µââ建议ââè稿ââ审æ¹ä¸ââå·²æ§è¡ââå·²å ³éâæ¯ä¸åç¶æï¼ä¸è½æ··ç¨ã ## äºãä¹ä¸ªåºæ¯è·¯çº¿ | ç¼å· | åºæ¯ | 触å | 主è¦ç³»ç» | 第ä¸çäº§ç© | åç»éç¯ | | --- | --- | --- | --- | --- | --- | | 01 | æ¥åè¯å®¡ä¸äº¤æçå¤ | åå/éå®è®¢åå建æäº¤æåæ´ | CRMãERPãMESãWMS | ææ©å¯æ¿è¯ºæ¥ä¸å²çªæ¸ å | è¯å®¡åãçå¤è稿ã人工åé | | 02 | å¼å·¥é½å¥ä¸ç¼ºæå¬äº¤ | 次æ¥å·¥å宿¶å·¡æ£/å·¥åä¸å | MESãWMSãERPãSRM | é½å¥çãå缺å£ãéè´å ³è | å¬äº¤å¾ åãåæ§ä¸åæ¬¡è®¡ç® | | 03 | å·¥åè¶ æå·¡æ£ | æ¯ç/æ¯æ¥å·¡æ£åæ¥å·¥åå | MESãæçãè®¾å¤ | çè¶ æå·¥åãå¡ç¹ä¸è´£ä»»ç» | ææ´¾å¾ åãè¶ æ¶å级 | | 04 | æå䏿ç¨éç® | æ¥åç³è¯·/èµæºæè®¾å¤åå | CRMãERPãMESã设å¤ãæç | ä¸¤å¥æç¨æ¹æ¡ä¸åå½±å订å | 人审åè°ç¨ç°ææç¨æå¡ | | 05 | åè´§ä¸ä»å¨æ¦æª | åè´§éç¥/åºåºåæ£æ¥ | WMSãERPãOQCãæ¹æ¬¡/SN | å¯åæ°éã黿åå ãä½ç½® | æ£è´§/å货建议ï¼åæ®ç §åå®¡æ¹ | | 06 | è´¨éå¼å¸¸ä¸å线å¤éª | IPQC è¶é/NCR/è®¾å¤æ£éªäºä»¶ | MES-QCãå·¥åãä»å¨ãè®¾å¤ | å½±åæ¹æ¬¡åå·²æµè½¬èå´ | é离建议ãå¤éªå¾ åãå线ç³è¯·å¾ ç¾ | | 07 | è®¾å¤æ¼æ£ä¸ä¿å » | ç¹æ£æ¶çª/è¿è¡æ¶é¿å°æ | 设å¤ãå·¥åãæç | æ¼æ£æ¸ ååå ³é®è®¾å¤æåº | ä¿å »/è¡¥æ£å¾ åä¸ç»´ä¿®åæ§ | | 08 | å§å¤å 工对账 | æç»æå¤ååå®ç» | MES-WMãERPãSRM | åæ¶èæä¸ä»·æ ¼å·®å¼æ¸ å | éè´æ ¸å®ãè´¢å¡å®¡æ¹åç»ç® | | 09 | å®¢è¯æ¹æ¬¡è¿½æº¯ | å®åå·¥å/å®¢æ·æ¹å·æé® | å®åãERPãWMSãMES-QC | æ£åå追溯å¾ãåå½±åå®¢æ· | åå¤è稿ãç¼ºè¯æ®ä»»å¡ | 横åè½åå æ¬**工忿¬å½é**ã**ç»è¥å¼å¸¸é®ç**ã**æ¥/卿¥çæ**ãè¿äºå¯æ¶è´¹ä¹ä¸ªåºæ¯çå¯ä¿¡ç»æï¼ä½ææ¬æ ¸ç®é¡»å 确认ææä»·ãå·¥æ¶è´¹çãå§å¤è´¹ç¨ãæé´å£å¾åè´¢å¡è´£ä»»äººï¼ä¸è½ç´æ¥ææ¥å·¥æ¶æ°ä¹ä¸ä¸ªçæµè´¹çã ## ä¸ãåºæ¯ç»å ### 01 æ¥åè¯å®¡ä¸äº¤æçå¤ - **å ¸åé®å¥**ï¼â客æ·è¦æè¿åæåå° 15 å·ï¼è½çåºåï¼â - **åè¯**ï¼CRM åå/客æ·è¦æ±ãERP éå®è®¢åè¡ãMES MPS/å·¥åä¸å·¥èºè·¯çº¿ãå·¥å BOMãWMS å¯ç¨åºååå ç¨ãå¨ééè´ä¸è®¾å¤/çæ¬¡è½åãå ¨é¨ä»¥åä¸è®¢åè¡ã产å SKUãæ°éååä½ä¸ºåºåã - **计ç®**ï¼`ææ©ç©æé½å¥æ¶é´` ä¸åå·¥åºå¯ç¨äº§è½çªå£ç»åï¼æ¨¡æææ©å®å·¥ä¸ OQC/åºåºæ¶é´ï¼æ¿è¯ºæ¥è¦å ä¸é ç½®çæ£éªä¸ç©æµæåæãç°æç产 AI 交ä»é¢æµå¯ä½åèï¼ä¸è½æ¿ä»£æç¨ä¸åºå硬约æã - **ç»æ**ï¼å¯æ¿è¯ºæ¥èå´ãç¸å¯¹å®¢æ·è¦æ±çå·®é¢ãåå½±åå·¥åãå ³é®è·¯å¾åè¯æ®æ¶é´ãè¥è®¡ç®ä¸å¯è¡ï¼ååºâå ç/è°è®¾å¤/æªåâæ¹æ¡åæ¯ä¸ªæ¹æ¡æ¤å åªäºè®¢åã - **å¨ä½è¾¹ç**ï¼çææ¥åè¯å®¡è稿å客æ·åå¤è稿ï¼éå®/计ååéæ©æ¹æ¡ï¼åååæ´åå®¢æ·æ¶æ¯å¿ é¡»ç±ææäººæäº¤ãç³»ç»è®°å½éç¨äºåªä¸ªçæ¬çæç¨æ°æ®ã - **缺å£**ï¼éè¦ç»ä¸ç订åå°å·¥åå ³èæ¥è¯¢ãåºåå¯ç¨éå£å¾ãæç¨æ¨¡æç»æççæ¬å¿«ç §ã交æåå¤å®¡æ¹ä¸åéå ¥å£ã ### 02 å¼å·¥é½å¥ä¸ç¼ºæå¬äº¤ - **å ¸åé®å¥**ï¼âæå¤©è¦å¼çå·¥åï¼åªäºæé½äºï¼â - **åè¯**ï¼å·²æ¹åå·¥å BOM çæ¬ãå·¥åéæ±éãWMS åºåçä»åº/åºä½/æ¹æ¬¡/å»ç»/å ç¨ãé¢æè®°å½ãéè´è®¢åæªå°æ°éãä¾åºå交æã - **计ç®**ï¼éç©æè®¡ç® `åå¯ç¨ = åæ ¼ç°å â å·²å ç¨ â å»ç» â ä¸å¯ç¨æ¹æ¬¡`ï¼`åç¼ºå£ = max(éæ± â å·²é¢ â åå¯ç¨, 0)`ï¼æç¸åç©æãåä½ãéè´æ¥æºå并缺å£ï¼åæ¶ä¿çå·¥ååææç»ãä¸è½æâå¨éâç´æ¥è®¡å ¥ç°åã - **ç»æ**ï¼å·¥å级é½å¥/æ¬ æåç±»ãæç©æåå¹¶çéè´å¬äº¤æ¸ åãä¾åºåæ¿è¯ºæ¥ä¸å¼å·¥æ¶é´å·®ãæ éè´åæäº¤æä¸æé¡¹ç®ã - **å¨ä½è¾¹ç**ï¼å¯èªå¨çæéè´å é¨å¾ åå¹¶æé责任人ï¼éè´æ¹äº¤æãä¸åãæ¿æãç¹é须走åä¸å¡å®¡æ¹ãæ¯æ¬¡éè´åæ§/å ¥åºåéç®å¹¶æ¾ç¤ºååã - **缺å£**ï¼ç°æåºåä¸ BOM æ¥å£éèåæä¸æ¬¡å¯å¤ç¨é½å¥å¿«ç §ï¼å¬äº¤å¾ ååä¾åºååæ§éè¦æç¡®ç³»ç»å æ¿è½½æ¹å¼ã ### 03 å·¥åè¶ æå·¡æ£ - **å ¸åé®å¥**ï¼âä»å¤©æåªäºå·¥åè·ä¸ä¸è®¡åï¼â - **åè¯**ï¼å·¥åå·¥åºè®¡åèç¹ãæ¥å·¥å®¡æ¹åçå®é 宿éã设å¤åæºãçæ¬¡æ¥åãå·¥åç¶æã责任çç»ã - **计ç®**ï¼æé¤å·²å®æ/åæ¶/æ¹æå¹¶éæ°åºçº¿çå·¥åï¼ä» å¨è®¡åèç¹å°æä¸å®é è¿åº¦ä¸è¶³æ¶å¤è¶ æãè¿ç»ä¸¤çæ æææ¥å·¥æ¯åç¬é£é©ï¼ä¸è½èªå¨çåâæ²¡å¹²æ´»âï¼è¿è¦æ ¸å¯¹æ¥å·¥å®¡æ¹ä¸ä¸ç¦»çº¿è¡¥æ¥ã - **ç»æ**ï¼è¶ ææ¸ åãé¢è®¡å»¶è¯¯éãå¡ä½çå·¥åºãè¿ç»æªè¿å±æ¶é¿ã责任ç»ã䏿¸¸äº¤ä»å½±åã - **å¨ä½è¾¹ç**ï¼çæçç»é¿å¾ åãæªæ¢æ¶é´ãæªåå¤å级è§åï¼ä»»ä½çç»ç»©æå¤æç±ä¸»ç®¡ç¡®è®¤ãç¶æç±å¾ ååæ§åæ°æ¥å·¥èªå¨æ´æ°ã - **缺å£**ï¼éè¦ç»ä¸è®¡åèç¹ä¸å®é è¿åº¦çæ¶é´å£å¾ã龿åºçº¿çæ¬ï¼ä»¥åä¸ç°æéç¥/ä»»å¡ç³»ç»ç对æ¥ã ### 04 æå䏿ç¨éç® - **å ¸åé®å¥**ï¼âæè¿ä¸ªæ¥åæè¿å»ï¼ä¼å½±åè°ï¼â - **åè¯**ï¼è®¢åä¼å 级ãå·²æ¿è¯ºäº¤æãå¨å¶å·¥åãå·¥èºè·¯çº¿ä¸è®¾å¤æçã设å¤ç»´æ¤çªå£ãçç»æçãç©æé½å¥æ åµã - **计ç®**ï¼ä½¿ç¨ç°ææç¨é¢è§è½åçæâä¿æç°ç¶âä¸âæåæ¹æ¡âä¸¤ä»½å¿«ç §ï¼é工忝è¾å¼å§/ç»ææ¶é´ã设å¤å ç¨ãæ¹æå¤©æ°åå·²æ¿è¯ºå®¢æ·ã - **ç»æ**ï¼åç订åãåæè®¢åãä¸å¯ç¨èµæºãéåæçå²ä½ãæç¨ååå¾ï¼æ æ³æ»¡è¶³çº¦ææ¶è¿ååå ï¼ä¸è¾åºâ已宿âã - **å¨ä½è¾¹ç**ï¼è®¡åå确认ãå¿ è¦æ¶éå®ç¡®è®¤å®¢æ·äº¤æåï¼Java ä¸å¡æå¡æ§è¡æ£å¼æç¨ãAgent ä¸è½èªè¡è¦çå·²æ¹åçå·¥å计åã - **ä»åºä¾æ®**ï¼`MesProTaskController` å·²æ `auto-schedule/preview` 忣弿ç¨å ¥å£ï¼è·¨è®¢å影忝è¾ä¸å®¡æ¹é¨æ§éè¡¥å ã ### 05 åè´§ä¸ä»å¨æ¦æª - **å ¸åé®å¥**ï¼âè¿åæå¤©è½ååï¼ç¼ºå¨åªä¸æ ¼ï¼â - **åè¯**ï¼éå®è®¢åãåè´§éç¥ãæååºåä½ç½®/æ¹æ¬¡/SNãåºåå»ç»ä¸å ç¨ãOQC ç»è®ºãæ£è´§/è£ ç®±ä¸åºåºç¶æã - **计ç®**ï¼æè®¢åè¡ä¸æ¹æ¬¡æ ¸ç®å¯åæ°éï¼ååºè´¨éæªæ¾è¡ãå»ç»ãå·²å ç¨ãåºä½ä¸æææ°éä¸è¶³ç黿项ãåºä½¿ç¨ä»å¨ä¸å¡æå¡ç¡®è®¤å¯ç¨éï¼ä¸å¤å»åºåäºå¡è§åã - **ç»æ**ï¼å¯å/ä¸å¯åæ°éã黿åå ãé¢è®¡è§£é¤æ¶é´ãåºä½æ¸ åãåæ¹æ¬¡å ³è订åã - **å¨ä½è¾¹ç**ï¼å¯çææ£è´§ä¸è¡¥è¯æ®å»ºè®®ï¼åºåè°æ´ãè§£å»ãæ£å¼åºåºãåè´§éç¥ä»èµ°åç³»ç»æéå审æ¹ã - **缺å£**ï¼éæ±æ» ERP éå®è®¢åä¸ WMS åºåº/åºåå ç¨/OQC çæ¥è¯¢è§å¾ã ### 06 è´¨éå¼å¸¸ä¸å线å¤éª - **å ¸åé®å¥**ï¼âè¿æ¹çç¼ºé·æ¯ä¸æ¯æç¹å¤ï¼å·²ç»æµå°åªéï¼â - **åè¯**ï¼IPQC ææ å¼ä¸æ£éªæ åçæ¬ã缺é·è®°å½ãå·¥åæ¹æ¬¡ã已产åºéãä¸éå·¥åºæµè½¬ãåºåæ¹æ¬¡ãè®¾å¤ææ£éªè®¾å¤æ¥å¿ã - **计ç®**ï¼æææ è§åå¤è¶éï¼ç»è®¡è¿ç»æ¬¡æ°ãæ ·æ¬æ°éãå½±åæ¹æ¬¡/工件ãå·²æµè½¬èå´ãåºåâè§åå¤è¶éââ建议é离ââå线已æ¹åââ宿ºå线已æ§è¡âã - **ç»æ**ï¼å¼å¸¸å/NCR è稿ãå½±å颿¸ åãå¤éªä»»å¡ãå线ç³è¯·è稿ï¼å ¨é¨éåå§æ£éªè®°å½ä¸æ åçæ¬ã - **å¨ä½è¾¹ç**ï¼è¶éå¯èªå¨åè¦ä¸çæå¤éªå¾ åï¼é离/åºåå»ç»éä»å¨æè´¨éææï¼å线åå¤çº¿åå«ç±ææéå²ä½ç¾åï¼Agent ä¸ä¸åæ§å¶æä»¤ã - **缺å£**ï¼æ¬ä»åºæ IPQCãNCR ä¸å·¥åå ³èï¼ä½å¾çä¸çæ£éªè®¾å¤æ°æ®ééãå线åç¾åæ§å¶ç³»ç»å读éè¦æ°å¢éæä¸æµç¨ã ### 07 è®¾å¤æ¼æ£ä¸ä¿å » - **å ¸åé®å¥**ï¼âæ¨å¤©çç¹æ£ææ²¡ææ²¡åçï¼åªäºä¼å½±åå ³é®å·¥åºï¼â - **åè¯**ï¼è®¾å¤å°è´¦ãç¹æ£è®¡å/è®°å½ãä¿å »è®¡å/è®°å½ãç»´ä¿®åãå·¥å设å¤åé ãçæ¬¡ä¸è®¾å¤è¿è¡æ¶é¿ï¼è¥æå¯ä¿¡ééæºï¼ã - **计ç®**ï¼æè®¾å¤éç¨è®¡åãçæ¬¡çªå£åæææäº¤è®°å½æ¾æ¼æ£ï¼æé¤åç¨ãç»´æ¤ä¸å计åæåç设å¤ãæç §æªæ¥ç产å ç¨åå·¥åºå ³é®æ§æåºã - **ç»æ**ï¼æ¼æ£è®¾å¤ãæåææç¹æ£æ¶é´ãé¢è®¡å½±åå·¥åã仿¥å°æä¿å »ãå·²åå¨ç»´ä¿®åã - **å¨ä½è¾¹ç**ï¼çæè¡¥æ£ä¸ä¿å »å¾ åï¼é¿å éå¤å»ºåï¼ç»´ä¿®äººå®æå¹¶ååè®°å½åå ³éãæ¯å¦ç»§ç»ä½¿ç¨è®¾å¤ç±è®¾å¤è´è´£äººä¾æ®ç°åºæ£æ¥å³å®ã - **缺å£**ï¼è¿è¡æ¶é¿è§¦åéå¯é IoT/设å¤ééæºï¼ä» ææå·¥å°è´¦æ¶å æè®¡åå¨æè§¦åã ### 08 å§å¤å 工对账 - **å ¸åé®å¥**ï¼âè¿ä¸ªæå§å¤ç账差å¨åªå ç¬ï¼â - **åè¯**ï¼å¤åå·¥åãå¤ååæ/å ¥åºãIQC åæ ¼éãä¾åºåãéè´æååçº¦å®æèçä¸åä»·ãæ¥ç¥¨ä¸ä»æ¬¾ç¶æã - **计ç®**ï¼éåéç©ææ¯å¯¹åæãæ¶åãæ¥åº/éæãååå 许æèï¼è®¡ç®è¶ èæ°éï¼éååçæ¬æ¯è¾ç»ç®ä»·ä¸çº¦å®ä»·ï¼ååºæ°éå·®åä»·å·®ãå使¢ç®ãç¨çãå¸ç§ãéè¡¥æè¦æç¡®å¤çã - **ç»æ**ï¼å·®å¼å°è´¦ï¼å«åå·ã便®ãæ°éãéé¢ãè´£ä»»å¾ ç¡®è®¤é¡¹ï¼ä¸è½ææªéªæ¶çæ¶è´§å½ä½åæ ¼å ¥åºã - **å¨ä½è¾¹ç**ï¼éè´æ ¸å®å¹¶è®°å½ä¾åºåçå¤ï¼è´¢å¡å¤æ ¸åæçæåºä»ææ£æ¬¾ãAgent å¯ä»¥è·è¸ªé¾ææªæ ¸å®é¡¹ï¼ä¸è½èªè¡å¤å®æèå½å±ã - **缺å£**ï¼MES å·²æå¤ååæ/å ¥åºå¯¹è±¡ï¼ååçº¦å®æèãå 工价åç»ç®å£å¾æ¯å¦å¨å½åç³»ç»å®æ´å¯æ¥éè¿ä¸æ¥çç¹ã ### 09 å®¢è¯æ¹æ¬¡è¿½æº¯ - **å ¸åé®å¥**ï¼âå®¢æ·æè¯çè¿ä¸ªæ¹å·ï¼æ¯åªæ¹æåçï¼è¿åç»äºè°ï¼â - **åè¯**ï¼å®åå·¥åãERP éå®è®¢åãWMS éå®åºåº/SN/æ¹æ¬¡ãMES å·¥åé¢æãæ¥ææ¹æ¬¡ãIQC/IPQC/OQC ä¸è´¨æ£æ¥åçæ¬ã - **计ç®**ï¼æ²¿âåºè´§æ¹æ¬¡âå·¥å产åºâé¢ææ¹æ¬¡âå°è´§/ä¾åºåâåå追溯ï¼åä»å¯çæ¥ææ¹æ¬¡æ£å寻æ¾å ¶å®å·¥åãåºåå客æ·ãæ¯æ¡è¾¹è®°å½æ¥æºåæ®ãæ°éãæ¶é´åå¯ä¿¡åº¦ã - **ç»æ**ï¼å¯å±å¼ç追溯å¾ãåå½±å客æ·/åºå/å¨å¶æ¸ åãè¯æ®æç¹ã客æ·åå¤è稿ã纸质æ¥åææªçµå彿¡£èµææç¡®å为æç¹ï¼ä¸è½ç»åºå®æ´è¿½æº¯ç»è®ºã - **å¨ä½è¾¹ç**ï¼å®¢æä¸è´¨éè´è´£äººç¡®è®¤å¤é¨åå¤ï¼æ¯å¦éç¥å ¶ä»å®¢æ·ãå¬åãå»ç»åºåçç±å¯¹åºè´è´£äººå³å®ã - **ä»åºä¾æ®**ï¼ç°ææ¹æ¬¡åå/åååå·¥åºè¿½æº¯å ¥å£å¯å¤ç¨ï¼å®åä¸åºåºçè·¨åå ³èãæ¥åé件宿´æ§è¿ééªè¯ã ## åãæ¯æä¸è¿°åºæ¯çç»ä¸è½å ### 4.1 订å䏿¹æ¬¡å ³ç³»å¾ ç»ä¸é®ä¸ºä¸å¡å¯¹è±¡å¼ç¨ `module + object_type + id + code`ï¼è¾¹æ¥èªä¸å¡å¤é®æåè°è®°å½ãä¸»çº¿ä¸ºï¼ ```mermaid flowchart LR CRM[CRM åå] --> SO[ERP éå®è®¢å] SO --> MPS[MES MPS] MPS --> WO[ç产工å] WO --> BOM[å·¥å BOM] WO --> FB[å·¥åºä»»å¡/æ¥å·¥] BOM --> ST[åºå/å ç¨/é¢ææ¹æ¬¡] FB --> QC[IPQC/OQC] FB --> FG[æåæ¹æ¬¡/SN] FG --> SHIP[åºåº/åè´§] SHIP --> AFTER[å®å/客è¯] ST --> SUP[éè´/ä¾åºå/IQC] ``` æ¯æ¡å ³èå为**ç´æ¥å¤é®ãä¸å¡åè°ãè§åæ¨å¯¼ã人工确认**åç§ãä» å两ç§å¯ä½ä¸ºâ已确认äºå®âãä¸å¡ç¼å·ç¸ä¼¼ãæ¶é´æ¥è¿ä¸è½èªå¨è®¤ä½åä¸åæ®ã ### 4.2 主å¨è¿è¡ä¸æç»è·è¿ - 宿¶ä»»å¡ï¼æ¬¡æ¥é½å¥ï¼å»ºè®®æ©çåï¼ãå·¥åè¶ æï¼æ¯çï¼ã设å¤ç¹æ£ï¼è®¡åçªå£åï¼ãå§å¤å¯¹è´¦ï¼æç»ï¼ãå ·ä½æ¶é´åä¼ä¸ç次/èåæ¥è®¾ç½®ï¼ä¸ç¡¬ç¼ç å¾çéç 07:30ã08:00ã06:30ã - äºä»¶è§¦åï¼è®¢å交æåæ´ãéè´äº¤ææ´æ°ãæ¥å·¥å®¡æ¹ãè´¨æ£è¶éãç»´ä¿®ç¶æååãåºåºå®æãå®åå·¥åå建ã - å·¡æ£ç»æè¦å»éï¼`åºæ¯ + ä¸å¡å¯¹è±¡ + åºçº¿çæ¬ + æ¶é´çªå£` å½¢æäºä»¶é®ï¼ä» å ³é®äºå®ååæ¶éæ°éç¥ãå¾ åæè´è´£äººãå°ææ¶é´ãåæ§ç¶æãå级路å¾åå ³éæ¡ä»¶ã - 工使µç¶æï¼`å¾ åè¯ â 计ç®ä¸ â å¾ äººå·¥å¤æ/å¾ å®¡æ¹ â å·²æäº¤ä¸å¡ç³»ç» â ä¸å¡å¤çä¸ â å·²éªè¯å ³é`ï¼å¦æ `è¯æ®ä¸è¶³`ã`è¿æééç®`ã`æ§è¡å¤±è´¥`ãAgent çä»»å¡å®æä¸ä»£è¡¨ä¸å¡åæ®å®æã ### 4.3 åç䏿ä½å¡ç å¯¹è¯æ¯å ¥å£ï¼å¡çæ¯å¯æä½çå·¥ä½å°ãæ¯ä¸ªç»æå¡è³å°æ¾ç¤ºï¼**ç»è®ºãç»è®¡å£å¾/æ¶é´ãå ³é®æ°åãè¯æ®åæ®ãåè¿ç䏿¥ã建议å¨ä½ãå½åç¶æã责任人ãä¸ä¸æ¬¡æ£æ¥æ¶é´**ãç¹å»æ°åå¯å±å¼æç»ï¼ç¹å»è¯æ®è·³åä¸å¡é¡µé¢ï¼â确认åé/审æ¹/æ¹æç¨âæé®åªå¨ææé䏿°æ®æªè¿ææ¶åºç°ã éç¨ä¸å½å Vue 管ç端ä¸è´çæä½åå¸å±ï¼å·¦ä¾§ä»»å¡/åºæ¯å¯¼èªï¼ä¸é´ç»è®ºä¸è¯æ®ï¼å³ä¾§å¾ åä¸å®¡æ¹ç¶æãç§»å¨ç«¯ä¼å æ¾ç¤ºç»è®ºãå¾ ååè¯æ®æè¦ï¼å¤æè¿½æº¯å¾æä¾è¡¨æ ¼æ¿ä»£ãææç¶æåæ¶ç¨æååé¢è²è¡¨è¾¾ï¼æé®ææç¡®çå è½½ãå¤±è´¥ãæ æéåæ°æ®è¿æåé¦ãå¾çéçæ ·å¼å¯ä½è§è§åèï¼çå®çé¢å¿ é¡»æ¾ç¤ºçå®åå·åæ§è¡ç»æã **åºæ¯ 02 çç颿 ·ä¾ï¼çº¯ç¤ºä¾æ°æ®ï¼**ï¼ç¨æ·é®âæå¤©è®¡åå¼å·¥ç 10 å¼ å·¥åï¼åªäºè½å¼ï¼âå¡çå çâ6 å¼ é½å¥ï¼4 å¼ ç¼ºæâï¼æ¾ç¤ºâæ£æ¥äº 10 份工å BOMãåºå/å ç¨ã7 å¼ å ³èéè´åâï¼åååºæ¯å¼ æ¬ æå·¥åçç©æãå缺å£ãéè´ååä¾åºå交æãä¸ä¸å¼ å¡å±ç¤ºâéè´å¬äº¤å¾ åè稿ï¼2 åè´è´£äººãæªæ¢ä»æ¥ 16:00âãç¨æ·ç¡®è®¤åï¼Java æå¡è¿åå¾ åç¼å·ï¼ç颿æ¹ä¸ºâ已派åâï¼éè´åæ§æåºåå ¥åºåéæ°è®¡ç®ï¼æ§ç»è®ºæ¾ç¤ºâæ°æ®å·²ååï¼è¯·æ¥çæ°çâãæ°åãå¨ä½åè¯æ®å§ç»å¯å±å¼æ ¸å¯¹ã ### 4.4 人æºè¾¹çç©éµ | çº§å« | ä¾å | é»è®¤è¡ä¸º | | --- | --- | --- | | L0 èªå¨åè¯ | æ¥å·¥åãåºåãæ¹æ¬¡ãæ£éªã审æ¹ç¶æ | ææéå³å¯è¿è¡å¹¶çç | | L1 èªå¨è®¡ç®/æé | é½å¥ãé¾æãæ¼æ£ãå·®å¼ãå 鍿é | è§åçæ¬åã坿¤åæéãå¯å¤ç® | | L2 å¾ å/è稿 | å¬äº¤å¾ åãå¤éªå¾ åãåå¤ç¨¿ãè¯å®¡ç¨¿ | æå²ä½ææï¼åæ¾è稿ä¸ä¸å¡åå· | | L3 审æ¹ååå ¥ | æç¨åæ´ãåºåé离/è§£å»ãéè´åãè´¢å¡ç»ç® | Java æ ¡éªãBPM 审æ¹ãå¹çæ§è¡ãå读éªè¯ | | L4 ç°åºå®å ¨å³å® | å线/å¤çº¿ã设å¤ç»§ç»ä½¿ç¨ãç¹é/æ¾è¡ãå¬å | å¿ é¡»ç±ææäººåå³å®ï¼Agent åªæä¾è¯æ®ä¸ç³è¯· | ### 4.5 ææ¯è½ç¹ Python ç¬ç«æå¡éç¨âåºæ¯ç¼æå¨ + é¢åå·¥å ·æ³¨å表 + ç¡®å®æ§è®¡ç®å¨ + ç¥è¯æ£ç´¢ + 模å说æå¨âãJava å¢å é¢åæºè½ä½çå é¨èå APIï¼è´è´£ç°æç¨æ·èº«ä»½ãæ°æ®èå´ãä¸å¡æ ¡éªå审æ¹ãPython ä¸ç´æ¥æä½ä¸å¡æ°æ®åºã馿¹å·¥å ·å æ¬ `get_order_context`ã`calculate_material_readiness`ã`preview_schedule`ã`inspect_workorder_progress`ã`trace_batch`ã`get_quality_context`ã`get_equipment_due`ã`reconcile_outsource`ï¼æ¯ä¸ªå·¥å ·æè¾å ¥/è¾åº schemaãæéãçæ¬åæµè¯åºåã ## äºãä¸å½åä»åºçæ¥å ¥æ ¸å¯¹ | è½å | 代ç ä¸å·²çå°çå ¥å£ | ä»éå»ºè®¾ææ ¸å® | | --- | --- | --- | | çäº§é¢æµ | `MesProAiController` åç±»é¢æµ | ä¸ç¡®å®æ§æç¨/åºåå£å¾èåãç»ææ ¡å | | ç产æç¨ | `MesProTaskController` é¢è§åæ§è¡ | 夿¹æ¡æ¯è¾ãåå½±å订åã审æ¹é¨æ§ | | ä»å¨ | ç©æåºåãå ç¨ãåºåºãæ¹æ¬¡è¿½æº¯æ§å¶å¨ | è·¨ä»/æ¹æ¬¡çåå¯ç¨èååæºæ°æ®æ¶ç¹ | | è´¨æ£ | IQC/IPQC/OQC/RQCãNCRãè´¨æ£æ¥å | æ£éªè®¾å¤ééãå线/å¤çº¿ç¾æ¹ãæ¥åéä»¶è¡¥å ¨ | | è®¾å¤ | ç¹æ£è®¡å/è®°å½ãä¿å »/ç»´ä¿®æ§å¶å¨ | è¿è¡æ¶é¿ééãå ³é®å·¥åºå½±åæåº | | å§å¤ | å¤ååæä¸å ¥åºæ§å¶å¨ | ååä»·/æèçã宿´æç»ä¸å½è´£æµç¨ | | éå®ä¸å®å | CRM ååãERP éå®è®¢åãå®åå·¥å | ç»ä¸è®¢åå°æ¹æ¬¡é¾ä¸è·¨ç³»ç»å®¢æ·å夿µç¨ | | 审æ¹/éç¥ | BPM ä¸ç³»ç»éç¥åºç¡è½å | Agent ä¸ç¨å¾ åãæéåæ§ã审计è§å¾ | è¿äºâå·²çå°çå ¥å£âåªè¯æå¯¹è±¡åé¨åæä½åå¨ï¼ä¸çº¿åä»é¡»æ£æ¥åæ°ãæéæ³¨è§£ãæ°æ®èå´ãåæ®ç¶ææºåç宿°æ®å®æ´åº¦ã ## å ã建议ç馿¹äº¤ä»ç»å æ¨è以 **01 æ¥åè¯å®¡ + 02 å¼å·¥é½å¥ + 03 è¶ æå·¡æ£** ä¸ºç¬¬ä¸æ¡çºµåé¾ï¼éå®è½åçè½å¦æ¥ï¼è®¡åç¥éè½å¦å¼å·¥ï¼è½¦é´ç¥éåªéå¡ä½ãè¿æ¡é¾è½å¤ç¨ç°æçäº§é¢æµãåºååæç¨å ¥å£ï¼å¹¶ä¸ºå ¶ä½åºæ¯æä¸è®¢åå ³ç³»å¾ã主å¨å·¡æ£ãå¾ ååæ§åè¯æ®å¡åºç¡ã ç¬¬äºæ¡é¾å **06 è´¨éå¼å¸¸ + 09 æ¹æ¬¡è¿½æº¯**ï¼éç¹éªè¯è·¨æ¹æ¬¡å ³èä¸âè¯æ®æç¹â表达ãç¬¬ä¸æ¡é¾å **07 è®¾å¤ + 08 å§å¤ + 05 åè´§**ï¼04 æç¨æ£å¼æ§è¡å¾ 审æ¹é¾å®åå弿¾ã éªæ¶ä¸ä»¥æ¼ç¤ºå¯¹è¯æµç 为åï¼è以ä¸å¡ç»æä¸ºåï¼ç»è®ºè½å¤ç®ãåå½±å忮䏿¼ä¸ä¸²ãæéä¸ç©¿éãå¾ åççå°äººã审æ¹ä¸ä¸å¡åå·è½åè¯»ãæ°æ®åååè½æ¤éè¿æç»è®ºãæ¯ä¸ªåºæ¯è³å°å夿£å¸¸ãæ°æ®ç¼ºå¤±ãè·¨æéã忮忴åå¨ä½å¤±è´¥æ ·æ¬ã **å¾ æç»éæ©**ï¼ä¹åºæ¯è·¯çº¿ä¸æ¨è交ä»é¡ºåºæ¯å¦ç¬¦åä¼ä¸ä¼å çº§ï¼æ¯å¦æâ工忿¬å½éâåâç»è¥é®çâæåä¸ºç¬¬ä¸æ¹ã确认ååå°æ¬è徿¶æä¸ºæ¥å£æ¸ åãæ°æ®å¥çº¦ã页颿µç¨å宿½ä»»å¡ã docs/mdm_item_category_unification.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,73 @@ # ç©æåç±»ç»ä¸å° mdm_item_category æ¹æ¡ ## èæ¯ åºç¡æ°æ® â ç©æç®¡çå¨ä¿åç©æå¹¶å¾éãåæ¥å° MESãæ¶æç¤ºãç©æåç±»ä¸åå¨ãã æ ¹å æ¯ç©æåç±»åå¨ä¸¤å¥è¡¨ä¸æªåæ¥ï¼ - ãåºç¡æ°æ® â ç©æåç±»ã页é¢çæ°å¢/ä¿®æ¹/å é¤èµ° MES æ¥å£ `MesMdItemTypeServiceImpl`ï¼åªå `mes_md_item_type`ï¼ - ç©æè¡¨åçåç±»ä¸æèµ° `/mes/md/item-type/simple-list`ï¼è¯»ç乿¯ `mes_md_item_type`ï¼ - ä½ MDM ç©æåæ¥å° MES æ¶ï¼`MdmItemServiceImpl#syncItemToMes`ï¼æåç±» ID æ¥ `mdm_item_category`ï¼æ¥ä¸å°å³æ `MDM_ITEM_CATEGORY_NOT_EXISTS`ã å æ¤èåç±»å¯ç¨ï¼å岿°æ®ä¸¤è¡¨é½æï¼ï¼æ°åç±»å¿ æ¥éã ## ç®æ ç©æåç±»ç»ä¸ä»¥ `mdm_item_category` 为å¯ä¸æ°æ®æºï¼ - MES åç±»æ¥å£ `/mes/md/item-type/*` ä¿çï¼å端路å¾ä¸åºå ¥åä¸åï¼ä½åºå±è¯»åå ¨é¨æ¹ä¸º `mdm_item_category`ï¼ - MDM ä¸ MES çåç±»ä¸æãç©æä¿åã忥ãå¯¼å ¥å ¨é¨åºäºåä¸å¼ è¡¨ï¼ - `mes_md_item_type` ä¸ååå ¥ï¼ä» ä½ä¸ºåå²å¤ä»½ä¿çã ## æ¹å¨èå´ ### å端 | 模å | æä»¶ | æ¹å¨ | |------|------|------| | mdm | `MdmItemCategoryApi` | å¢å create / update / delete / å ¨éå表 RPC æ¹æ³ | | mdm | `MdmItemCategoryApiImpl` | å®ç°ä¸è¿°æ¹æ³ | | mdm | `MdmItemCategorySaveReqDTO`ï¼æ°å¢ï¼ | RPC åå ¥åæ° | | mdm | `MdmItemCategoryRespDTO` | è¡¥ `remark`ã`createTime` | | mdm | `MdmItemCategoryService(Impl)` | å¢å å ¨éåè¡¨æ¹æ³ | | mes | `MesMdItemTypeServiceImpl` | å¢å æ¹æ¥ãååç±»ãå¯¼å ¥å ¨é¨æ¹ä¸ºè°ç¨ MDM åç±» API | ### å端 **æ éæ¹å¨ã** 页é¢è°ç¨ç仿¯å¯¹å¤è·¯å¾ï¼ - å类管ç页ï¼`/mes/md/item-type/list|get|create|update|delete|import` - åç±»ä¸æï¼`/mes/md/item-type/simple-list` - MDM ç©æé¡µåç±»ä¸æï¼åæ ·è°ç¨ `/mes/md/item-type/simple-list` ååºåæ®µä¿æ `id / parentId / code / name / itemOrProduct / sort / status / remark / createTime`ã ## æ°æ®è¿ç§» ä¸çº¿åæ§è¡ `docs/sql/mdm_item_category_migration.sql`ï¼æ `mes_md_item_type` å ¨éï¼å«å·²é»è¾å é¤è®°å½ï¼æ**å ID** è¿ç§»å° `mdm_item_category`ï¼ä¿è¯ï¼ - `mes_md_item.item_type_id`ã`mdm_item.category_id` çåå²å¤é®ç»§ç»ææï¼ - `item_type` ç± `item_or_product` æ¨å¯¼ï¼`PRODUCT â 2ï¼äº§åï¼`ï¼å ¶ä½ `â 1ï¼ç©æï¼`ï¼ - èæ¬å¯é夿§è¡ï¼æä¸»é® upsertï¼ã è¿ç§»åæ°åç±»ç± `mdm_item_category` èªå¢ ID çæï¼ä¸¤å¥ ID ä½ç³»èªç¶æ¶æä¸ºä¸å¥ã ## ä¸å¡è§å | åºæ¯ | è§å | |------|------| | æ°å¢åç±» | å `mdm_item_category`ï¼ç¼ç å ¨å±å¯ä¸ãåä¸ç¶çº§ä¸åç§°å¯ä¸ï¼ç± MDM æ ¡éªï¼ | | ä¿®æ¹åç±» | æå ID æ´æ° `mdm_item_category` | | å é¤åç±» | å æ ¡éª MES ç©æå¼ç¨ï¼åç± MDM æ ¡éªååç±»ä¸ MDM ç©æå¼ç¨ | | ç©æä¿å + 忥 MES | æ `categoryId` æ¥ `mdm_item_category` å codeï¼æ£å¸¸åæ¥ | | ç©æå¯¼å ¥ | æåç±»åç§°å¨ `mdm_item_category` ä¸è§£æ | | 设å¤èå¨ç©æ | `EQUIPMENT` åç±»è¿ç§»å MDM 侧坿£å¸¸æ code è§£æ | ## éªè¯ 1. æ§è¡è¿ç§» SQLï¼æ ¸å¯¹ `mes_md_item_type` ä¸ `mdm_item_category` è®°å½æ°ãID ä¸ä¸å¯¹åºã 2. ãåºç¡æ°æ® â ç©æåç±»ãæ°å¢ãæµè¯ãåç±»ï¼ç¡®è®¤ `mdm_item_category` åºç°è®°å½ã`mes_md_item_type` 䏿°å¢ã 3. ãåºç¡æ°æ® â ç©æç®¡çãç¼è¾ç©æï¼éæ©ãæµè¯ãï¼å¾éãåæ¥å° MESãä¿åï¼åºæåã 4. åç±»ä¸æãç©æå表åç±»åç§°å±ç¤ºãåç±»ç¼è¾åæ¾ï¼å«å¤æ³¨ï¼æ£å¸¸ã 5. åç±»å¯¼å ¥ãç©ææåç±»åç§°å¯¼å ¥æ£å¸¸ã docs/mes_collect_design.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,289 @@ # MES æ³¨å¡æºæ°é对æ¥éæ±ä¸è®¾è®¡ > ç¶æï¼å¾ è¯å®¡ï¼è¯å®¡éè¿åå¼å§ç¼ç ï¼ > ç¼åæ¥æï¼2026-10-20 > éç¨æ°æ®åºï¼`mom-kyzn` > æ¶å模åï¼`yudao-module-mes` ## 1. èæ¯ä¸ç®æ å®¢æ·æ³¨å¡æºéè¿å¼è®¯ééç½å ³ï¼å°è¿è¡ç¶æã卿è¿ç¨ãå·¥èºåæ°ã忰忴忥è¦ä»¥ MQTT æ¥ææ¨éå° EMQXãå½å MES 没æä»»ä½ MQTT æ¥å ¥ä»£ç ï¼éè¦å®æâ订é â è§£æ â è½åº â æ¥è¯¢/å±ç¤ºâçå ¨é¾è·¯å¯¹æ¥ï¼å¹¶æééæ°æ®ä¸ MES 设å¤å°è´¦ãç产任å¡/å·¥åå ³èèµ·æ¥ã æ¬æç®æ ï¼å·²ä¸ç¨æ·ç¡®è®¤ï¼ï¼ 1. **å ¨éæ¥å ¥**ï¼realtimeï¼å®æ¶ç¶æï¼ãspcï¼å¨æè¿ç¨ï¼ãtechï¼å·¥èºåæ°ï¼ãopLogï¼åæ°åæ´ï¼ãæ¥è¦äºç±»æ°æ®å ¨é¨è½åºã 2. **设å¤ç»å®**ï¼å¨ `mes_dv_machinery` 设å¤å°è´¦ä¸å¢å âæ°é设å¤ç¼å·âï¼`devId`ï¼å¦ `C01`ï¼ç´æ¥å¹é å°è´¦ã 3. **å·¥åèå¨**ï¼ééæ°æ®æâè®¾å¤æå±å·¥ä½ç«ä¸æ£å¨è¿è¡çç产任å¡âèªå¨å ³è `taskId / workOrderId`ï¼å ³èä¸å°æ¶ç空ã 4. **å级ä¿ç**ï¼åå§æ¥æ 7 天ã宿¶åå² 30 天ã卿/å·¥èº/åæ´/æ¥è¦é¿æä¿çã ä¸å¨æ¬æèå´ï¼å端页é¢ä»£ç ï¼æé¡¹ç®è§ååªè¾åºèè°æ¹æ¡ï¼ã设å¤ååæ§å¶ï¼ä¸è¡æä»¤ï¼ãå¤å®ä¾å ±äº«è®¢é ã ## 2. æ¥å ¥ä¿¡æ¯ | é¡¹ç® | å¼ | |------|----| | EMQX å°å | `36.213.90.123:1883`ï¼MQTTï¼ï¼`18083`ï¼Dashboard/HTTP APIï¼ | | è´¦å· | `admin / public`ï¼Dashboard ä¸ MQTT å ±ç¨ï¼ | | åè®® | MQTT 3.1.1ï¼QoS 0 | | 主é¢åç¼ | `/YLCY/IMM`ï¼å¯é ç½®ï¼ | | 设å¤ç¼å· | `C01` ~ `C08`ï¼`devId`ï¼ | | 订é éé | `{prefix}/+/+`ï¼å³ `/YLCY/IMM/+/+` | | 客æ·ç«¯ ID ç¤ºä¾ | `/YLCY/IMM/C03/id` | 主é¢çº¦å®ï¼æ¥èªééææ¡£ï¼ï¼ | æ°æ®ç±»å | ä¸»é¢ | 说æ | |----------|------|------| | realtime | `{prefix}/{devId}/realtime` | 宿¶è¿è¡ç¶æãæ¸©åº¦ãæ²¹æ¸© | | spc | `{prefix}/{devId}/spc` | æ¯ä¸ªæ³¨å¡å¨æçè¿ç¨æ°æ® | | tech | `{prefix}/{devId}/tech` | å·¥èºè®¾å®åæ°å ¨éå¿«ç § | | opLog | `{prefix}/{devId}/opLog` | åä¸ªåæ°ä¿®æ¹ååå¼ | | æ¥è¦ | ææ¡£æªç»åºä¸»é¢å | éè¿æ¥æ `topic` åæ®µæ `Data.wmId` è¯å«ï¼è®¢é éé å åº | > 说æï¼æ¥è¦ä¸»é¢åå¨ææ¡£æªå¾ä¸ç¼ºå¤±ï¼å æ¥æèªå¸¦ `topic` åæ®µä¸ `Data` ä¸ `wmId/wmMsg/wmTime` ç¹å¾å¯ä¸ï¼ä»£ç ææ¥æç¹å¾è¯å«ï¼ä¸»é¢åç¼ä» ä½ä¸ºé 置项å åºï¼ä¸é»å¡æ¥å ¥ã ## 3. æ¥æè§è ### 3.1 å ¬å ±ä¿¡å° ```json { "clientId": "/YLCY/IMM/C03/id", "devId": "C03", "topic": "realtime", "sendTime": "2026-09-24 11:37:00", "sendStamp": 1790221000000, "time": "2026-09-24 11:37:00", "timestamp": 1790221000000, "Data": { } } ``` - æ°æ®æ¶é´ä¼å å `time`ï¼`yyyy-MM-dd HH:mm:ss`ï¼ï¼ç¼ºå¤±æ¶åé `timestamp`ã - `Data` å¯è½ä¸ºå¯¹è±¡ï¼è¥ä¸ºå符串ï¼äºæ¬¡è§£æä¸ºå¯¹è±¡ã - æ°æ®ç±»åä¼å å `topic` åæ®µï¼å ¶æ¬¡æä¸»é¢åç¼ï¼æåæ `Data` ç¹å¾è¯å«ã ### 3.2 realtimeï¼å®æ¶ç¶æï¼ `Data` 示ä¾åæ®µï¼ | ç¼ç | å«ä¹ | 夿³¨ | |------|------|------| | `STS` | ç¶æ | 1 å¾ æºï¼2 ç产 | | `OPM` | è¿è¡æ¨¡å¼ | 0 æå¨ï¼1 åèªå¨ï¼2 çµç¼èªå¨ï¼3 æ¶é´èªå¨ï¼4 è°æ¨¡ä½¿ç¨ | | `OT` | 油温 | | | `T1..Tn` | åæ®µæ¸©åº¦ | æ®µæ°æå®é 为åï¼å¨æè§£æ | | `ASTS` | éå ç¶æ | åæ ·ä¿å | ### 3.3 spcï¼å¨æè¿ç¨æ°æ®ï¼ | ç¼ç | å«ä¹ | |------|------| | `CYCN` | 卿åºå·ï¼é¨åç³»åç¬ç«è®¡æ°ï¼å¢éä¸è´ï¼ | | `ECYCT` | 卿æ¶é´ | | `EISS` | å°åºèµ·ç¹ | | `EIVM` | æå¤§å°é | | `EIPM` | æå¤§å°å | | `ESIPT` | 转ä¿åæ¶é´ | | `ESIPP` | 转ä¿ååå | | `ESIPS` | 转ä¿åä½ç½® | | `EIPT` | å°åºæ¶é´ | | `EIPSE` | å°åºç»ç¹ä½ç½® | | `EPLST` | 卿æ¶é´ | | `EPLSSE` | 卿ç»ç¹ | | `EPLSPM` | æå¤§å¨æåå | | `ET1..ETn` | ç产温度ï¼åæ®µï¼ | ### 3.4 techï¼å·¥èºåæ°ï¼ æææ¡£ç¬¬ 3 èå ¨éåæ®µä¿åï¼TS/IP/IV/IS/IT/ITUSE/ISUSE/SIPT/SIPS/SIPP/PP/PV/PT/SBS/SBT/PLLT/PLV/PLP/PLBP/PLS/SBV/SBP/SBS/SBT/CT/MCV/MCP/MCS/MOV/MOP/MOS/EFDT/EFV/EFP/EFS/EBDT/EBV/EBP/EBS/CP1M~CP4M/CPI1S~CPI4S/CPI1P~CPI4P/CPI1V~CPI4V/CPI1T~CPI4T/CPO1S~CPO4S/CPO1P~CPO4P/CPO1V~CPO4V/CPO1T~CPO4T/CFP/CFV/CFS/CFT/CBP/CBV/CBS/CBT/CBDTï¼ãåæ®µæ°éå¤ä¸å¯è½æ©å±ï¼**ä¸å»ºå®½è¡¨**ï¼æ´å JSON å¿«ç §ä¿åï¼å端æ JSON 渲æã ### 3.5 opLogï¼åæ°åæ´ï¼ ```json { "devId": "5", "time": "2022-12-09 12:09:48", "Data": { "varId": "SIPS", "value": 37.5, "lastValue": 37, "modifyTime": "2022-12-09 12:09:46" } } ``` ### 3.6 æ¥è¦ ```json { "devId": "6", "Data": { "wmId": 2, "wmMsg": "å®å ¨é¨æªå ³", "wmTime": "2022-12-09 16:42:22" } } ``` - `wmId = 2`ï¼æ¥è¦äº§ç â æ°å¢ä¸æ¡âæªæ¶é¤âè®°å½ã - `wmId = 0`ï¼æ¥è¦æ¶å¤± â æè¯¥è®¾å¤ææâæªæ¶é¤âè®°å½ç½®ä¸ºâå·²æ¶é¤âï¼åå ¥ `clearTime`ã ## 4. æ°æ®æ¨¡å > æææ°è¡¨æ²¿ç¨é¡¹ç® `BaseDO` åæ®µï¼`creator/create_time/updater/update_time/deleted`ãé«é¢æ¥å¿è¡¨æä¿ççç¥ç©çæ¸ çã ### 4.1 设å¤å°è´¦æ©å± ```sql ALTER TABLE mes_dv_machinery ADD COLUMN collect_device_code VARCHAR(64) NULL COMMENT 'æ°é设å¤ç¼å·ï¼MQTT devIdï¼å¦ C01ï¼' AFTER workstation_id, ADD COLUMN collect_enabled BIT(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å¯ç¨æ°é' AFTER collect_device_code; ALTER TABLE mes_dv_machinery ADD UNIQUE INDEX uk_collect_device_code (collect_device_code); ``` - `collect_device_code` 为空表示æªç»å®æ°éã - å¯ä¸ç´¢å¼å 许å¤ä¸ª `NULL`ï¼ä¸ä¼å½±ååé设å¤ã - å ³è任塿¶ä½¿ç¨å°è´¦å·²æç `workstation_id`ã ### 4.2 æ°å»ºè¡¨ | 表å | ç¨é | ä¿ç | |------|------|------| | `mes_collect_realtime` | æ¯è®¾å¤ææ°å®æ¶ç¶æï¼UPSERTï¼ | 常驻 | | `mes_collect_realtime_history` | 宿¶ç¶æåå² | 30 天 | | `mes_collect_cycle` | 卿è¿ç¨æ°æ® | é¿æ | | `mes_collect_tech` | å·¥èºåæ°ææ°å¿«ç §ï¼UPSERTï¼ | 常驻 | | `mes_collect_operate_log` | åæ°åæ´æ¥å¿ | é¿æ | | `mes_collect_alarm` | æ¥è¦è®°å½ | é¿æ | | `mes_collect_message` | åå§æ¥æï¼æéãè¡¥æ°ä¾æ®ï¼ | 7 天 | å ³é®åæ®µï¼ - `mes_collect_realtime`ï¼`device_code`ï¼å¯ä¸ï¼ã`machinery_id`ã`task_id`ã`work_order_id`ã`sts`ã`opm`ã`asts`ã`ot`ã`temps` JSONã`data_json`ã`collect_time`ã - `mes_collect_realtime_history`ï¼å段åä¸ï¼å¯ä¸é® `(device_code, collect_time)`ï¼ç´¢å¼ `(device_code, collect_time)`ã`(work_order_id, collect_time)`ã - `mes_collect_cycle`ï¼`device_code`ã`cycle_no`ã`collect_time`ã`ecyct/eiss/eivm/eipm/esipt/esipp/esips/eipt/eipse/eplst/eplsse/eplspm`ã`et_temps` JSONã`data_json`ï¼å¯ä¸é® `(device_code, cycle_no, collect_time)`ã - `mes_collect_tech`ï¼`device_code`ï¼å¯ä¸ï¼ã`task_id`ã`work_order_id`ã`collect_time`ã`data_json`ã - `mes_collect_operate_log`ï¼`device_code`ã`var_id`ã`old_value`ã`new_value`ã`modify_time`ã`collect_time`ã`data_json`ï¼ç´¢å¼ `(device_code, modify_time)`ã - `mes_collect_alarm`ï¼`device_code`ã`wm_id`ã`wm_msg`ã`wm_time`ã`status`ï¼0 æªæ¶é¤/1 å·²æ¶é¤ï¼ã`clear_time`ã`data_json`ï¼ç´¢å¼ `(device_code, status)`ã`(wm_time)`ã - `mes_collect_message`ï¼`device_code`ã`machinery_id`ã`mqtt_topic`ã`msg_type`ã`event_time`ã`raw_payload` LONGTEXTã`process_status`ï¼0 æå/1 失败ï¼ã`error_msg`ã`receive_time`ã ### 4.3 è½åºè§å - `realtime`ï¼æ´æ° `mes_collect_realtime` å¿«ç § + å `mes_collect_realtime_history`ï¼å¯ä¸é®å»éï¼ã - `spc`ï¼å `mes_collect_cycle`ï¼å¯ä¸é®å»éï¼`INSERT IGNORE`ï¼ã - `tech`ï¼æ´å JSON UPSERT `mes_collect_tech`ï¼ä¸éå¤çæåæ´æ¥å¿ï¼åæ´ä»¥è®¾å¤ä¸æ¥ç `opLog` 为åã - `opLog`ï¼éæ¡å `mes_collect_operate_log`ã - æ¥è¦ï¼æ `wmId` è§åæ°å¢/æ¸ é¤ã - æææ¥æå å `mes_collect_message`ï¼è§£æå¤±è´¥ä¹ä¿çåæå¹¶è®°å½ `error_msg`ã - æªç»å®å°è´¦ç `devId`ï¼ç»æåæ°æ®ç §å¸¸å ¥åºï¼`machinery_id/task_id/work_order_id` 为空ï¼ï¼åå§æ¥æä¿çï¼å¹¶ä»¥éæµæ¥å¿æç¤ºè¡¥ç»å°è´¦ï¼é¿å 设å¤å·²ä¸çº¿ä½å°è´¦æªç»´æ¤æ¶ä¸¢æ°æ®ã ## 5. å·¥åèªå¨å ³è ``` devId â mes_dv_machinery.collect_device_code â machinery.workstation_id â mes_pro_taskï¼workstation_id å¹é ãdeleted=0ãstatus IN (1 ç产ä¸, 2 é¨å宿, 9 å·²åå·¥)ï¼ â å last_feedback_time / id ææ°ç䏿¡ â task_id + work_order_id ``` - ç»æç¼å 30 ç§ï¼æ `workstationId`ï¼ï¼é¿å æ¯æ¡æ¥ææ¥åºã - å ³èä¸å°æ¶ `task_id / work_order_id` 为空ï¼ä¸å½±åè½åºã - ä»»å¡åæ¢åæå¤ 30 ç§å»¶è¿çæã ## 6. å端å®ç°è®¾è®¡ ### 6.1 代ç ä½ç½® ``` yudao-module-mes/ âââ controller/admin/collect/ # æ¥è¯¢æ¥å£ + VO âââ service/collect/ # æ¥è¯¢ãè§£æãè½åºãå ³è â âââ MesCollectQueryService â âââ MesCollectDataService â âââ MesCollectMessageDispatcher â âââ MesCollectDataParser â âââ MesCollectTaskResolver â âââ MesCollectCleanupJobï¼@Scheduledï¼ âââ framework/collect/mqtt/MesCollectMqttClient # Paho è¿æ¥ã订é ãéè¿ âââ dal/dataobject/collect/ # DO âââ dal/mysql/collect/ # Mapper ``` - MQTT 客æ·ç«¯ä½¿ç¨é¡¹ç®ä¾èµç®¡çéå·²æç `org.eclipse.paho.client.mqttv3:1.2.5`ï¼å¨ `yudao-module-mes/pom.xml` å¼å ¥å³å¯ã - Paho åè°åªåè§£æå ¥éï¼è½åºæ¾å°åçº¿ç¨æçéåæ§è¡ï¼é¿å é»å¡å¿è·³ã - å¼å¯ `automaticReconnect`ï¼å®¢æ·ç«¯ ID ä½¿ç¨ `{prefix}-{hostname}-{random}`ï¼**ç产åå®ä¾é¨ç½²**ï¼å¤å®ä¾ä¼é夿¶è´¹ï¼åç»å¯æ¹å ±äº«è®¢é ï¼ã - éè¿ `yudao.mes.collect.mqtt.enabled` æ§å¶æ¯å¦è¿æ¥ï¼é»è®¤å ³éï¼æç¯å¢å¼å¯ã ### 6.2 é 置项ï¼`application-kyzn.yaml`ï¼å¹¶åæ¥ `local/test`ï¼ ```yaml yudao: mes: collect: mqtt: enabled: true url: tcp://36.213.90.123:1883 username: admin password: public client-id-prefix: mes-collect topic-prefix: /YLCY/IMM qos: 0 keep-alive: 65 connection-timeout: 10 alarm-topic-suffix: wm retention: raw-days: 7 realtime-days: 30 ``` ### 6.3 æ¸ çä»»å¡ - æ¯æ¥ 03:30 æ§è¡ã - ç©çå é¤ `mes_collect_message` ä¸ `receive_time < now - 7 天`ã`mes_collect_realtime_history` ä¸ `collect_time < now - 30 天` çæ°æ®ã - 忬¡å é¤éå¶æ¹éï¼é¿å é¿äºå¡é表ã ## 7. å端æ¥å£ ç»ä¸åç¼ `/mes/collect`ï¼å ¨é¨è¿åé¡¹ç®æ å `CommonResult`ã | æ¹æ³ | è·¯å¾ | 说æ | æé | |------|------|------|------| | GET | `/device/list` | è®¾å¤æ°éç¶æå表ï¼å°è´¦ + ææ°ç¶æ + å½åä»»å¡ï¼ | `mes:collect:query` | | GET | `/realtime/get` | æå®è®¾å¤ææ°å®æ¶ç¶æ | `mes:collect:query` | | GET | `/realtime/history-page` | 宿¶ç¶æåå²å页 | `mes:collect:query` | | GET | `/cycle/page` | 卿è¿ç¨æ°æ®å页 | `mes:collect:query` | | GET | `/cycle/get` | 卿æç» | `mes:collect:query` | | GET | `/tech/get` | æå®è®¾å¤ææ°å·¥èºåæ°å¿«ç § | `mes:collect:query` | | GET | `/operate-log/page` | åæ°åæ´å页 | `mes:collect:query` | | GET | `/alarm/page` | æ¥è¦å页 | `mes:collect:query` | | PUT | `/alarm/ack` | æå·¥ç¡®è®¤æ¥è¦ | `mes:collect-alarm:ack` | 设å¤ç»å®å¤ç¨ç°æè®¾å¤å°è´¦æ°å¢/æ´æ°æ¥å£ï¼æ°å¢å段 `collectDeviceCode`ã`collectEnabled`ï¼å°è´¦åé¡µæ¯ææ `collectDeviceCode` è¿æ»¤ã ## 8. æéä¸èå - æ°å¢æéç ï¼`mes:collect:query`ã`mes:collect-alarm:ack`ã - èåï¼è®¾å¤ç®¡çï¼5300ï¼ä¸æ°å¢âæ°éçæ§âï¼`collect/monitor`ï¼ã - 忥åå ¥ `docs/sql/config_export_all_*.sql` 䏿°æ®åºåå§åèæ¬ï¼é¿å æ°åºç¼ºèå/æéã - æâæéç 䏿¹å¯¹é½âè§åï¼èåãè§è²ææãå端注解ä¸å¤åæ¶è½å°ã ## 9. é¨ç½²ä¸éªè¯ 1. æ§è¡ `docs/sql/mes_collect_20261020.sql`ï¼æ¬å° `mom-kyzn` å æ§è¡éªè¯ï¼ç产ç±è¿ç»´æ§è¡ï¼ã 2. å¨è®¾å¤å°è´¦å¡«å `collect_device_code` å¹¶å¯ç¨æ°éã 3. å¯å¨å端ï¼ç¡®è®¤æ¥å¿åºç° MQTT è¿æ¥æåãè®¢é æåã 4. è§å¯ `mes_collect_message` æ¯å¦æåç±»åæ¥æå ¥åºã 5. æ ¡éª `mes_collect_realtime / cycle / tech / operate_log / alarm` æ°æ®ä¸ EMQX æ¥æä¸è´ã 6. 触å䏿¬¡åæ°ä¿®æ¹ä¸æ¥è¦ï¼ç¡®è®¤åæ´æ¥å¿åæ¥è¦ç¶ææµè½¬æ£ç¡®ã 7. éªè¯å·¥åå ³èï¼å·¥ä½ç«åå¨ç产ä¸ä»»å¡æ¶ï¼æ°æ°æ®ç `task_id/work_order_id` ä¸ä¸ºç©ºã ## 10. é£é©ä¸è¯´æ - **æ¥è¦ä¸»é¢å缺失**ï¼ææ¥æç¹å¾è¯å«ï¼å·²å åºï¼å¦åç»ç¡®è®¤ä¸»é¢ååªéæ¹é ç½®ã - **CYCN éç½®**ï¼å¨æåºå·å¯è½é设å¤éå¯éç½®ï¼å»éé®å å«ééæ¶é´ï¼é¿å 误åå¹¶ã - **å¤å®ä¾é¨ç½²**ï¼å½å为åå®ä¾æ¶è´¹ï¼å¤å®ä¾ä¼äº§çé夿°æ®ï¼åç»å¯åæ¢ EMQX å ±äº«è®¢é ã - **æ¶éåå·®**ï¼è®¾å¤æ¶é´ä¸æå¡å¨æ¶é´å¯è½ä¸ä¸è´ï¼äºä»¶æ¶é´ä»¥æ¥æ `time` 为åï¼å¦å `receive_time`ã - **æ°æ®é**ï¼æ 8 å°è®¾å¤ã30 ç§ä¸å¸§ä¼°ç®ï¼å®æ¶åå²çº¦ 70 ä¸è¡/æï¼å¦åç»æé«é¢çï¼éè¯ä¼°ååºææ¹æ¶åºåºã - **ä¸ä¿®æ¹å端代ç **ï¼æé¡¹ç®è§åå¦è¡è¾åºå端èè°æ¹æ¡ã docs/mes_collect_frontend_integration.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,179 @@ # æ³¨å¡æºæ°éçæ§ - å端èè°æ¹æ¡ ## æ¶åé¡µé¢ - 设å¤ç®¡ç - 设å¤å°è´¦ï¼æ°å¢æ°éåæ®µãå¯¼å ¥æ¨¡æ¿ï¼ - 设å¤ç®¡ç - æ°éçæ§ï¼æ°å¢ï¼ - 设å¤ç®¡ç - æ°éçæ§ - 设å¤è¯¦æ /åå²ï¼æ°å¢ï¼ - 设å¤ç®¡ç - æ°éæ¥è¦ï¼æ°å¢ï¼æä½ä¸ºæ°éçæ§é¡µç¾ï¼ ## ä¸å¡æµç¨ä¸æ°æ®å¸¦å ¥ 1. 设å¤å°è´¦ç»´æ¤ `collectDeviceCode`ï¼å¦ `C01`ï¼å¹¶å¯ç¨ `collectEnabled` åï¼æ°éæ¥ææè½èªå¨å ³èå°è¯¥è®¾å¤ã 2. æ°éçæ§å表以设å¤å°è´¦ä¸ºåºåå±ç¤ºï¼`collectDeviceCode` æ¯å表ä¸åæç»æ¥å£ä¹é´çå¯ä¸å ³èé®ï¼éä¸è®¾å¤åéæè¯¥å¼ä½ä¸º `deviceCode` å¸¦å ¥å®æ¶ç¶æãå·¥èºåæ°ãå¨ææ°æ®ãåæ°åæ´ãæ¥è¦æ¥è¯¢ã 3. å表ä¸ç `taskId / workOrderId` ç±å端æè®¾å¤æå¨å·¥ä½ç«èªå¨è§£æå½åè¿è¡ä»»å¡ï¼å端åªè¯»å±ç¤ºï¼ä¸éè¦ä¼ åã 4. ä»å表è¿å ¥æ¥è¦æ¶ï¼å»ºè®®é»è®¤å¸¦å ¥å½å `deviceCode` ä¸ `status=0`ï¼æªæ¶é¤ï¼ï¼ä¿è¯ç¨æ·å çå°å½å设å¤çå¾ å¤çæ¥è¦ã ## API | æ¹æ³ | è·¯å¾ | 说æ | |------|------|------| | GET | `/mes/collect/device/list` | æ°é设å¤ç¶æå表 | | GET | `/mes/collect/realtime/get` | è®¾å¤ææ°å®æ¶ç¶æ | | GET | `/mes/collect/realtime/history-page` | 宿¶ç¶æåå²å页 | | GET | `/mes/collect/cycle/page` | 卿è¿ç¨æ°æ®å页 | | GET | `/mes/collect/cycle/get` | 卿è¿ç¨æ°æ®æç» | | GET | `/mes/collect/tech/get` | è®¾å¤ææ°å·¥èºåæ°å¿«ç § | | GET | `/mes/collect/operate-log/page` | åæ°åæ´æ¥å¿å页 | | GET | `/mes/collect/alarm/page` | æ¥è¦è®°å½å页 | | PUT | `/mes/collect/alarm/ack` | 人工确认æ¶é¤æ¥è¦ | ### 设å¤å°è´¦å段æ°å¢ æ°å¢/æ´æ°ãå页æ¥è¯¢ãExcel å¯¼å ¥å¯¼åºå鿝æä»¥ä¸åæ®µï¼ | åæ®µ | ç±»å | å¿ å¡« | 说æ | |------|------|------|------| | collectDeviceCode | String | å¦ | æ°é设å¤ç¼å·ï¼MQTT devIdï¼ï¼å ¨å±å¯ä¸ï¼å¦ `C01` | | collectEnabled | Boolean | å¦ | æ¯å¦å¯ç¨æ°éï¼é»è®¤å¦ | - 设å¤å°è´¦å页æ¥è¯¢æ¯ææ `collectDeviceCode`ã`collectEnabled` è¿æ»¤ã - Excel å¯¼å ¥æ¨¡æ¿æ°å¢âæ°é设å¤ç¼å·âåï¼å䏿¬¡å¯¼å ¥å éå¤çç¼å·ä¼æ´è¡å¤±è´¥å¹¶è¿åå ·ä½è¡å·ä¸ç¼å·ã ### 设å¤ç¶æå表 `GET /mes/collect/device/list` æ 请æ±åæ°ï¼è¿åå·²é ç½® `collectDeviceCode` çå ¨é¨è®¾å¤ã ååºåæ®µï¼ | åæ®µ | ç±»å | 说æ | |------|------|------| | machineryId | Long | 设å¤å°è´¦ç¼å· | | machineryCode | String | 设å¤ç¼ç | | machineryName | String | 设å¤åç§° | | workstationId | Long | å·¥ä½ç«ç¼å· | | workstationName | String | å·¥ä½ç«åç§° | | collectDeviceCode | String | æ°é设å¤ç¼å· | | collectEnabled | Boolean | æ¯å¦å¯ç¨æ°é | | lastCollectTime | DateTime | æè¿ééæ¶é´ | | online | Boolean | æ¯å¦å¨çº¿ï¼5 åéå ææ°æ®ï¼ | | sts / stsName | Integer / String | è¿è¡ç¶æï¼1 å¾ æºã2 ç产 | | opm / opmName | Integer / String | è¿è¡æ¨¡å¼ï¼0 æå¨ã1 åèªå¨ã2 çµç¼èªå¨ã3 æ¶é´èªå¨ã4 è°æ¨¡ä½¿ç¨ | | ot | Decimal | 油温 | | temps | String | åæ®µæ¸©åº¦ JSON å符串 | | taskId / taskCode / taskName | Long / String / String | å½åçäº§ä»»å¡ | | workOrderId / workOrderCode | Long / String | å½åç产工å | | activeAlarmCount | Long | æªæ¶é¤æ¥è¦æ°é | ### 宿¶ç¶æ `GET /mes/collect/realtime/get`ï¼åæ° `deviceCode`ï¼å¿ å¡«ï¼ã ååºå段ï¼`id`ã`machineryId`ã`deviceCode`ã`taskId`ã`workOrderId`ã`collectTime`ã`sts/stsName`ã`opm/opmName`ã`asts`ã`ot`ã`temps`ã`dataJson`ãè®¾å¤ææ æ°æ®æ¶ `data` 为 `null`ã `GET /mes/collect/realtime/history-page` | åæ° | ç±»å | å¿ å¡« | 说æ | |------|------|------|------| | pageNo / pageSize | Integer | æ¯ | å页忰 | | deviceCode | String | å¦ | æ°é设å¤ç¼å· | | machineryId | Long | å¦ | 设å¤å°è´¦ç¼å· | | taskId | Long | å¦ | ç产任å¡ç¼å· | | workOrderId | Long | å¦ | ç产工åç¼å· | | collectTime | DateTime[] | å¦ | ééæ¶é´èå´ï¼ä¼ å¼å§ãç»æä¸¤ä¸ªå¼ | ååºç»æå宿¶ç¶æï¼æééæ¶é´ååºã ### 卿è¿ç¨æ°æ® `GET /mes/collect/cycle/page` | åæ° | ç±»å | å¿ å¡« | 说æ | |------|------|------|------| | pageNo / pageSize | Integer | æ¯ | å页忰 | | deviceCode | String | å¦ | æ°é设å¤ç¼å· | | machineryId | Long | å¦ | 设å¤å°è´¦ç¼å· | | taskId | Long | å¦ | ç产任å¡ç¼å· | | workOrderId | Long | å¦ | ç产工åç¼å· | | collectTime | DateTime[] | å¦ | ééæ¶é´èå´ | ååºå段ï¼`id`ã`machineryId`ã`deviceCode`ã`taskId`ã`workOrderId`ã`cycleNo`ã`collectTime`ã`ecyct`ã`eiss`ã`eivm`ã`eipm`ã`esipt`ã`esipp`ã`esips`ã`eipt`ã`eipse`ã`eplst`ã`eplsse`ã`eplspm`ã`etTemps`ï¼JSON å符串ï¼é®ä¸º ET1..ETnï¼ã`dataJson`ã `GET /mes/collect/cycle/get`ï¼åæ° `id`ï¼å¿ å¡«ï¼ï¼è¿ååæ¡æç»ï¼å段åä¸ã ### å·¥èºåæ°å¿«ç § `GET /mes/collect/tech/get`ï¼åæ° `deviceCode`ï¼å¿ å¡«ï¼ã ååºå段ï¼`id`ã`machineryId`ã`deviceCode`ã`taskId`ã`workOrderId`ã`collectTime`ã`dataJson`ã`dataJson` 为设å¤ä¸æ¥ç宿´å·¥èºåæ°é®å¼å¯¹ï¼çº¦ 150 个åéï¼æ æ°æ®æ¶ `data` 为 `null`ã ### åæ°åæ´æ¥å¿ `GET /mes/collect/operate-log/page` | åæ° | ç±»å | å¿ å¡« | 说æ | |------|------|------|------| | pageNo / pageSize | Integer | æ¯ | å页忰 | | deviceCode | String | å¦ | æ°é设å¤ç¼å· | | machineryId | Long | å¦ | 设å¤å°è´¦ç¼å· | | workOrderId | Long | å¦ | ç产工åç¼å· | | varId | String | å¦ | åéç¼ç ï¼å¦ `SIPS` | | modifyTime | DateTime[] | å¦ | åæ°ä¿®æ¹æ¶é´èå´ | ååºå段ï¼`id`ã`machineryId`ã`deviceCode`ã`taskId`ã`workOrderId`ã`varId`ã`oldValue`ã`newValue`ã`modifyTime`ã`collectTime`ã`dataJson`ã ### æ¥è¦è®°å½ `GET /mes/collect/alarm/page` | åæ° | ç±»å | å¿ å¡« | 说æ | |------|------|------|------| | pageNo / pageSize | Integer | æ¯ | å页忰 | | deviceCode | String | å¦ | æ°é设å¤ç¼å· | | machineryId | Long | å¦ | 设å¤å°è´¦ç¼å· | | workOrderId | Long | å¦ | ç产工åç¼å· | | status | Integer | å¦ | 0 æªæ¶é¤ã1 å·²æ¶é¤ | | wmTime | DateTime[] | å¦ | æ¥è¦æ¶é´èå´ | ååºå段ï¼`id`ã`machineryId`ã`deviceCode`ã`taskId`ã`workOrderId`ã`wmId`ï¼2 产çã0 æ¶å¤±ï¼ã`wmMsg`ã`wmTime`ã`status/statusName`ã`clearTime`ã`collectTime`ã`dataJson`ã `PUT /mes/collect/alarm/ack`ï¼åæ° `id`ï¼å¿ å¡«ï¼ï¼æ 请æ±ä½ï¼æåè¿å `true`ã ## åæ®µå±ç¤ºè§å | åæ®µ | å±ç¤ºä½ç½® | 说æ | |------|----------|------| | collectDeviceCode | å°è´¦å表ãå°è´¦è¯¦æ ãæ°éçæ§å表 | å°è´¦å表å¯ç´æ¥å±ç¤ºï¼ä¾¿äºç°åºæ ¸å¯¹ | | collectEnabled | å°è´¦å表ãå°è´¦è¡¨å | æªå¯ç¨ç设å¤ä»å±ç¤ºå¨çæ§å表ï¼ä¾¿äºåç°é ç½®é误 | | online | çæ§å表 | å¨çº¿ä¸ºç»¿è²æ è¯ï¼ç¦»çº¿ä¸ºç°è²ï¼ä¾æ® 5 åéééçªå£ | | sts/stsName | çæ§å表ã设å¤è¯¦æ | ç产/å¾ æºä¸¤æ | | opm/opmName | çæ§å表ã设å¤è¯¦æ | äºææä¸¾ï¼ç´æ¥å±ç¤ºä¸æåç§° | | otãtemps | çæ§å表ã设å¤è¯¦æ | `temps` 为 JSON å符串ï¼å端解æåæ T1..Tn å±ç¤º | | taskCode/taskNameãworkOrderCode | çæ§å表ã设å¤è¯¦æ | åªè¯»ï¼æ è¿è¡ä»»å¡æ¶æ¾ç¤ºä¸ºç©º | | activeAlarmCount | çæ§å表 | å¤§äº 0 æ¶é«äº®ï¼å¯ç¹å»è·³è½¬æ¥è¦é¡µç¾å¹¶å¸¦å ¥è®¾å¤ | | status/statusName | æ¥è¦å表 | æªæ¶é¤/å·²æ¶é¤ | | dataJson | åè¯¦æ æ½å± | ä½ä¸ºâåå§æ°æ®âæå å±ç¤ºï¼ä¾¿äºæé | ## ä¸å¡è§å说æ | åºæ¯ | è§å | |------|------| | è®¾å¤æªé ç½®æ°éç¼å· | ä¸åºç°å¨ `/device/list`ï¼ä½å端ä»ä¼æ¥æ¶å¹¶ä¿åå ¶æ¥æï¼è¡¥ç»å°è´¦åæ°æ°æ®èªå¨å ³è | | 设å¤ç¦»çº¿å¤å® | æè¿ééæ¶é´æ©äºå½åæ¶é´ 5 åéå³ç¦»çº¿ï¼ä¸è®¾å¤å¯åæ å ³ | | å·¥åå¸¦å ¥ | å端æè®¾å¤å·¥ä½ç«èªå¨å¹é ç产ä¸/é¨å宿/å·²å工任å¡ï¼ä»»å¡åæ¢æé¿ 30 ç§çæ | | æ¥è¦äº§ç | 设å¤ä¸æ¥ `wmId=2` æ°å¢ä¸æ¡æªæ¶é¤è®°å½ï¼å䏿¥è¦éå¤ä¸æ¥ä¸éå¤çæ | | æ¥è¦æ¶å¤± | 设å¤ä¸æ¥ `wmId=0` èªå¨æè¯¥è®¾å¤å ¨é¨æªæ¶é¤è®°å½ç½®ä¸ºå·²æ¶é¤å¹¶åæ¶é¤æ¶é´ | | 人工确认 | ä» æªæ¶é¤è®°å½å¯ç¡®è®¤ï¼å·²æ¶é¤è®°å½åæ¬¡ç¡®è®¤ä¼æç¤ºâ该æ¥è¦å·²æ¶é¤ï¼æ ééå¤ç¡®è®¤â | | å¨ææ°æ®å»é | åä¸è®¾å¤ãåä¸å¨æåºå·ãåä¸ééæ¶é´åªä¿ç䏿¡ | | æ°æ®ä¿ç | åå§æ¥æ 7 天ã宿¶åå² 30 天ï¼å¨æ/å·¥èº/åæ°åæ´/æ¥è¦é¿æä¿ç | ## 注æäºé¡¹ - æææ°éæ¥è¯¢æ¥å£éæé `mes:collect:query`ï¼äººå·¥ç¡®è®¤æ¥è¦é `mes:collect-alarm:ack`ã - `deviceCode` ç»ä¸ä½¿ç¨å°è´¦ `collectDeviceCode`ï¼ä¸è¦ä½¿ç¨è®¾å¤ç¼ç `machineryCode`ã - `collectTime`ã`modifyTime`ã`wmTime` æ¶é´èå´ä¸ºä¸¤ä¸ªå¼ï¼ç¬¬ä¸ä¸ªä¸ºå¼å§æ¶é´ï¼ç¬¬äºä¸ªä¸ºç»ææ¶é´ã - `temps`ã`etTemps`ã`dataJson` å为 JSON å符串ï¼éè¦åç«¯äºæ¬¡è§£æï¼è§£æå¤±è´¥æ¶æåææ¬å±ç¤ºï¼é¿å 页颿¥éã - 设å¤å表æ¥å£ä¸æ¬¡è¿åå ¨é¨å·²é ç½®æ°éç设å¤ï¼å½å 8 å°ï¼ï¼ä¸éè¦å页ã - å°è´¦ä¿åæ¶æ°éç¼å·éå¤ä¼è¿åâæ°é设å¤ç¼å·å·²è¢«å ¶ä»è®¾å¤å ç¨âï¼éæç¤ºç¨æ·æ´æ¢ç¼å·ã docs/mes_workbench_workstation_pending_count.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,93 @@ # ç产工ä½å° - å·¥ä½ç«å¾ 宿æ°éèè°æ¹æ¡ ## æ¶åé¡µé¢ - ç产工ä½å°ï¼`/mes/workbench`ï¼âã鿩工ä½ç«ãå¼¹çª ## éæ±è¯´æ å·¥ä½ç«å¡çéè¦å±ç¤ºè¯¥å·¥ä½ç«ç**å¾ å®ææ°é**ï¼å£å¾ä¸å·¥ä½å°å·¦ä¾§ãå·¥åå表ãï¼å¾ æ¥å·¥å°è´¦ï¼ä¸è´ï¼ - ä»»å¡ç¶æä¸ºè¿è¡ä¸ï¼è稿(0)ãç产ä¸(1)ãé¨å宿(2)ãå·²åå·¥(9) - ä¸ä»æå¾ æ¥å·¥éï¼`æäº§æ°é - å·²ç产æ°é > 0` - å¡çæ¾ç¤ºçæ¯æ»¡è¶³ä¸è¿°æ¡ä»¶ç**任塿¡æ°**ï¼ä¸æ¯æ°éæ»å ## API | æ¹æ³ | è·¯å¾ | 说æ | |------|------|------| | GET | `/mes/pro/task/pending-count-by-workstation` | æå·¥ä½ç«ç»è®¡å¾ æ¥å·¥ä»»å¡æ¡æ° | **请æ±åæ°ï¼** æ **ååºå段ï¼** | åæ®µ | ç±»å | 说æ | |------|------|------| | data | Map<Long, Long> | å·¥ä½ç«ç¼å· â å¾ æ¥å·¥ä»»å¡æ¡æ°ï¼æ å¾ åçå·¥ä½ç«ä¸è¿å | **ååºç¤ºä¾ï¼** ```json { "code": 0, "data": { "9": 1, "10": 1, "11": 1, "12": 1, "13": 1, "14": 1, "15": 1 }, "msg": "" } ``` **æéï¼** `mes:pro-task:query`ï¼ä¸å¾ æ¥å·¥å°è´¦æ¥å£ä¸è´ï¼å·¥ä½å°é¡µé¢å·²å ·å¤è¯¥æéï¼ ## æ¥å£è°ç¨æ¶åº 1. æå¼ã鿩工ä½ç«ãå¼¹çª 2. å¹¶è¡è¯·æ±ï¼ - `GET /mes/md-workstation/page?pageNo=1&pageSize=200` è·åå·¥ä½ç«å表 - `GET /mes/pro/task/pending-count-by-workstation` è·ååå·¥ä½ç«å¾ åæ° 3. å¡çæ¸²ææ¶ç¨ `å·¥ä½ç« id` æ¥è¯¢æ å°ï¼æªå½ä¸æ¾ç¤º 0 ## åæ®µå±ç¤ºè§å | åæ®µ | å±ç¤ºä½ç½® | 说æ | |------|----------|------| | å¾ å®ææ°é | å¡çåç§°å³ä¾§å¾½æ | æä»»å¡æ¶æ©è²å¾½æ "å¾ å®æ N"ï¼N=0 æ¶ç°è²å¾½æ "å¾ å®æ 0" | | å¾ å®ææ°é | å¾½æ hover æç¤º | "该工ä½ç«å¾ æ¥å·¥ä»»å¡æ°ï¼N" | ## ä¸å¡è§å说æ | åºæ¯ | è§å | |------|------| | ç»è®¡å£å¾ | ä¸ãå¾ æ¥å·¥å°è´¦ãå®å ¨ä¸è´ï¼é¿å å¡çæ°éä¸å·¦ä¾§å·¥åå表对ä¸ä¸ | | ç»è®¡æ¥å£å¤±è´¥ | éèå ¨é¨å¾½æ ï¼ä¸å½±åå·¥ä½ç«å表å è½½ä¸éæ©ï¼ç»è®¡ä¸ºè¾ å©ä¿¡æ¯ï¼ | | å·¥ä½ç«ææ å¾ å | æ¾ç¤ºç°è²"å¾ å®æ 0"ï¼ä¿æå¡çå¸å±ä¸è´ | | æ°éå«ä¹ | 任塿¡æ°ï¼åä¸å·¥ä½ç«å¤æ¡ä»»å¡æ¶ææ¡ç´¯å ï¼ä¸å并为æ°éå计 | ## 注æäºé¡¹ - ç»è®¡æ¥å£è¿åç Map key æ¯å符串形å¼çå·¥ä½ç«ç¼å·ï¼å端æ `String(å·¥ä½ç«id)` åå¼ - å¼¹çªæ¯æ¬¡æå¼é½ä¼éæ°è¯·æ±ç»è®¡ï¼æ¥å·¥åéæ°æå¼å³å¯çå°ææ°æ°é - 该æ¥å£è¿åå ¨éå·¥ä½ç«ç»è®¡ï¼æ°æ®éå¾å°ï¼æ¯å·¥ä½ç«ä¸è¡ï¼ï¼æ éæå·¥ä½ç« id è¿æ»¤ - è¥åç»éè¦"å¾ å®ææ°éæ»å"ï¼å©ä½å¯æ¥å·¥éå计ï¼ï¼å¯å¤ç¨å䏿¥è¯¢å¢å `SUM(quantity - produced_quantity)` åæ®µï¼æ 鿰墿¥å£ ## å端æ¹å¨ | æä»¶ | æ¹å¨ | |------|------| | `MesProTaskMapper` | æ°å¢ `selectPendingFeedbackCountByWorkstation()`ï¼æ `workstation_id` åç»ç»è®¡ | | `MesProTaskService` / `Impl` | æ°å¢ `getPendingFeedbackCountByWorkstation()`ï¼è¿å Map | | `MesProTaskController` | æ°å¢ `GET /pending-count-by-workstation` æ¥å£ | ## å端æ¹å¨ | æä»¶ | æ¹å¨ | |------|------| | `src/api/mes/pro/task/index.ts` | æ°å¢ `getPendingFeedbackCountByWorkstation()` | | `src/views/mes/workbench/components/WorkstationSelectDialog.vue` | å¹¶è¡å è½½ç»è®¡ï¼å¡çåç§°è¡å¢å å¾ å®æå¾½æ | docs/route_process_output_attribution.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,112 @@ # å·¥èºè·¯çº¿å·¥åºäº§åºå½å± - å端èè°æ¹æ¡ ## æ¶åé¡µé¢ - å·¥èºè·¯çº¿ - å·¥åºä¸äº§åºé¡µç¾ - å·¥åºæ°å¢/ç¼è¾å¼¹çªï¼process-form.vueï¼ - å·¥èºè·¯çº¿ - å¯ç¨åæ£æ¥ï¼route-configurator.vueï¼ - ç产工å - æ°å¢/ç¼è¾å¼¹çª - å·¥åºå表ï¼åå½å±è¿æ»¤å½±åï¼æ éæ°å¢åæ®µï¼ - çäº§ä»»å¡ - èªå¨çæä»»å¡ï¼äº§åºç©ææå½å±å¸¦å ¥ï¼ ## ä¸å¡æµç¨ä¸æ°æ®å¸¦å ¥ 1. å·¥èºè·¯çº¿å·¥åºç产åºç©ææ°å¢ãå½å±ãæ¦å¿µï¼ - å½å±ä¸ºç©º = å¤äº§åéç¨ï¼è¯¥è·¯çº¿ä¸ææäº§åé½ä¼äº§åºè¯¥ç©æï¼éååçº¿å ±ç¨çåæåï¼ï¼ - å½å±ä¸ºæä¸ªäº§å = 产åä¸å±ï¼åªæçäº§è¯¥äº§åæ¶æä¼äº§åºï¼ã 2. éæ©äº§åºç©ææ¶é»è®¤å½å±å°ç©æèªèº«ï¼å¤äº§åå ±ç¨çåæåéæå¨æ¹ä¸ºãéç¨ãã 3. ä¸åï¼æ°å»ºå·¥åï¼æ¶ï¼æå·¥å产åè¿æ»¤å·¥èºè·¯çº¿å·¥åºäº§åºï¼åªå¸¦å ¥ãéç¨ã产åºåã该产åä¸å±ã产åºã 4. èªå¨çæä»»å¡æ¶ï¼ä»»å¡äº§åºç©æåæ ·æå½å±è¿æ»¤ï¼ä¼å åè¿æ»¤åç第ä¸ä¸ªäº§åºï¼æ²¡æäº§åºæ¶åå·¥åæåã 5. æ«éå·¥åºçæå产åºå¿ é¡»å½å±å°èªèº«äº§åï¼ä¸è½ä¸ºãéç¨ãï¼ï¼å¦åå¯ç¨è·¯çº¿æ¶ä¼æ¥éã ## API | æ¹æ³ | è·¯å¾ | 说æ | |------|------|------| | POST | /mes/pro/route-process/create | æ°å¢å·¥åºï¼è¯·æ±æ°å¢ outputsï¼ | | PUT | /mes/pro/route-process/update | ä¿®æ¹å·¥åºï¼è¯·æ±æ°å¢ outputsï¼ | | GET | /mes/pro/route-process/get | å·¥åºè¯¦æ ï¼ååºæ°å¢ outputsï¼ | | GET | /mes/pro/route-process/list-by-route | æè·¯çº¿è·åå·¥åºï¼ååºæ°å¢ outputsï¼ | | GET | /mes/pro/route-process/list-by-product | æäº§åè·åå·¥åºï¼äº§åºå·²æå½å±è¿æ»¤ï¼ | **请æ±åæ°æ°å¢ï¼create / updateï¼ï¼** | åæ° | ç±»å | å¿ å¡« | 说æ | |------|------|------|------| | outputs | Array | å¦ | 产åºç©æå½å±é ç½®ï¼ä¼ å ¥åä¼å äº outputItemIds | | outputs[].itemId | Long | æ¯ | 产åºç©æç¼å·ï¼å¿ é¡»æ¯æ¬è·¯çº¿ç»å®ç产å | | outputs[].productId | Long | å¦ | å½å±äº§åç¼å·ï¼ä¸ä¼ æä¼ 空表示å¤äº§åéç¨ | | outputs[].sort | Integer | å¦ | æåºï¼ä¸ä¼ ææ°ç»é¡ºåº | | outputs[].remark | String | å¦ | 夿³¨ | > å ¼å®¹è¯´æï¼ä»å¯åªä¼ outputItemIdsï¼è页é¢/å·¥èºè®¾è®¡é¡µï¼ï¼å端ä¼èªå¨å¤å®å½å±ââäº§åºæ¯è·¯çº¿ç»å®äº§åæ¶å½å±å°èªèº«ï¼å¦åè§ä¸ºéç¨ã **ååºå段æ°å¢ï¼get / list-by-route / list-by-productï¼ï¼** | åæ®µ | ç±»å | 说æ | |------|------|------| | outputs | Array | 产åºå½å±å表 | | outputs[].id | Long | å½å±è®°å½ç¼å· | | outputs[].routeProcessId | Long | å·¥åºç¼å· | | outputs[].productId | Long | å½å±äº§åç¼å·ï¼ç©ºè¡¨ç¤ºéç¨ | | outputs[].productName | String | å½å±äº§ååç§° | | outputs[].itemId | Long | 产åºç©æç¼å· | | outputs[].itemCode | String | 产åºç©æç¼ç | | outputs[].itemName | String | 产åºç©æåç§° | | outputs[].sort | Integer | æåº | | outputs[].remark | String | 夿³¨ | **ååºç¤ºä¾ï¼** ```json { "code": 0, "data": { "id": 123, "processName": "å è£ å ¥åº", "outputs": [ { "productId": 201, "productName": "油浸å¼é çµååå¨", "itemId": 201, "itemName": "油浸å¼é çµååå¨", "sort": 1 }, { "productId": null, "productName": null, "itemId": 300, "itemName": "éç¨å è£ ç®±", "sort": 2 } ] } } ``` ## åæ®µå±ç¤ºè§å | åæ®µ | å±ç¤ºä½ç½® | 说æ | |------|----------|------| | outputs | å·¥åºæ°å¢/ç¼è¾å¼¹çªãæ¬å·¥åºäº§åºã | æ¯è¡ä¸¤ä¸ªä¸æï¼äº§åºç©æãå½å±ï¼æä¾ãæ·»å 产åºããå é¤ã | | å½å±ä¸æ | å·¥åºæ°å¢/ç¼è¾å¼¹çª | é项为ãéç¨ï¼ææäº§åï¼ã+ 路线产åå表 | | 产åºç©æä¸æ | å·¥åºæ°å¢/ç¼è¾å¼¹çª | é项éå®ä¸ºè·¯çº¿ç»å®ç产å | | outputs | å·¥åºåè¡¨ãæ¬å·¥åºäº§åºãå | å±ç¤ºä¸ºãç©æåï¼å½å±äº§ååï¼ãæãç©æåï¼éç¨ï¼ã | ## ä¸å¡è§å说æ | åºæ¯ | è§å | |------|------| | éæ©äº§åºç©æ | é»è®¤å½å±å°ç©æèªèº«ï¼å¯æå¨æ¹ä¸ºãéç¨ã | | å¤äº§åå ±ç¨åæå | å½å±éæ©ãéç¨ãï¼ææäº§åä¸åæ¶é½ä¼å¸¦å ¥è¯¥äº§åº | | 产åä¸å±äº§åº | å½å±éæ©å¯¹åºäº§åï¼åªæè¯¥äº§åçå·¥å/ä»»å¡ä¼å¸¦å ¥ | | æ«éå·¥åºæå | æ¯ä¸ªæåå¿ é¡»å½å±å°èªèº«äº§åï¼ä¸è½ä½¿ç¨ãéç¨ã | | åéæ°æ® | å output_item_id èªå¨æåï¼æ¯è·¯çº¿äº§åçå½å±å°èªèº«ï¼å¦åè§ä¸ºéç¨ | | åªä¼ outputItemIds | å端èªå¨æã路线产åâä¸å±ãå ¶å®âéç¨ãå¤å®å½å± | | 产åºèååæ®µ | output_item_id ä»ä¿çå¹¶èªå¨èåï¼ä¾ä»»å¡ãç©æéæ±çæ§é»è¾ä½¿ç¨ | ## 注æäºé¡¹ - å½å±äº§å䏿çé项就æ¯å½åå·¥èºè·¯çº¿ç»å®ç产ååè¡¨ï¼æªç»å®äº§åä¸è½ä½ä¸ºå½å±ã - 产åºç©æå¿ é¡»å±äºè·¯çº¿ç»å®äº§åï¼å¦åå¯ç¨è·¯çº¿æ¶ä¼æ¥ãäº§åºæªç»å®å°å½åå·¥èºè·¯çº¿ãã - åä¸éå·¥åºå¯ä»¥åæ¶åå¨éç¨äº§åºåå¤ä¸ªäº§åä¸å±äº§åºã - å·¥åºäº§åºå½å±ä¿ååï¼å·²å建çå·¥åå·¥åºå¿«ç §ä¸åå½±åï¼å¿«ç §å¨ä¸åæ¶æå½æ¶çå½å±è¿æ»¤ï¼ã - å·¥èºè·¯çº¿å¯ç¨æ¶ï¼æ«éå·¥åºè¥åå¨ãéç¨ãæå产åºä¼æ ¡éªå¤±è´¥ï¼éè¦å¨å·¥åºç¼è¾ä¸æ¹ä¸ºäº§åä¸å±ã docs/sale_order_production_cancel_integration.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,84 @@ # éå®è®¢åçäº§ç¶æâ已忶â - å端èè°æ¹æ¡ ## æ¶åé¡µé¢ - ERP éå®è®¢åå表页 - ERP éå®è®¢å详æ 页 ## ä¸å¡èæ¯ ç产计åï¼MPSï¼åæ¶æ¶ï¼ä¼åæ¥æ´æ°æ¥æºéå®è®¢åççäº§ç¶æãæ¤ååæ¶å订ååªä¼åå°âæªå®æâï¼æ æ³åºåâ仿ªç产âåâç产计å已忶âãç°æ°å¢çäº§ç¶æ `2-已忶`ã ç¶æåå¼ï¼ | productionStatus | å«ä¹ | è§¦åæ¶æº | |------------------|------|----------| | 0 | æªå®æ | 订åå®¡æ ¸éè¿çæç产计åï¼æåæ¶åéæ°å®¡æ ¸çæäºæ°çç产计å | | 1 | 已宿 | çäº§å®æäºä»¶ï¼ProductionFinishedEventï¼ | | 2 | 已忶 | æ¥æºç产计åè¢«åæ¶ï¼ProductionCanceledEventï¼ | ## API æ¥å£è·¯å¾ä¸åæ°æ ååï¼ä» ååºå段 `productionStatus` å¢å åå¼ `2`ã | æ¹æ³ | è·¯å¾ | 说æ | |------|------|------| | GET | /erp/sale-order/page | éå®è®¢åå页 | | GET | /erp/sale-order/get | éå®è®¢å详æ | **ååºå段ï¼** | åæ®µ | ç±»å | 说æ | |------|------|------| | productionStatus | Integer | çäº§ç¶æï¼0-æªå®æï¼1-已宿ï¼2-已忶 | | productionFinishTime | DateTime | çäº§å®ææ¶é´ï¼ä» productionStatus=1 æ¶æå¼ | **ååºç¤ºä¾ï¼** ```json { "code": 0, "data": { "id": 1310, "no": "XSDD20261026000002", "needProduction": 1, "productionStatus": 2, "productionFinishTime": null } } ``` ## åæ®µå±ç¤ºè§å | åæ®µ | å±ç¤ºä½ç½® | 说æ | |------|----------|------| | productionStatus | å表âçäº§ç¶æâå | éâæ éçäº§âæ¶æ 0/1/2 åå«å±ç¤ºæªå®æ / 已宿 / 已忶ï¼å»ºè®®â已忶â使ç¨åºå«äºâ已宿âçéç®é¢è² | | productionStatus | 详æ 页âçäº§ç¶æâ | åä¸ï¼ä» 卿ç»éè¦ç产æ¶å±ç¤º | | productionFinishTime | å表ã详æ | ä» å¨ productionStatus=1 æ¶å±ç¤ºï¼ç¶æä¸º 2 æ¶ä¸å±ç¤º | ## æ¥è¯¢çéè§å å表çéâçäº§ç¶æâ䏿鿰å¢éé¡¹ï¼ | é项 | ä¼ å | |------|------| | æ éç产 | needProduction=0ï¼æ²¿ç¨ç°æç¹æ®å¤çï¼ | | æªå®æ | productionStatus=0 | | 已宿 | productionStatus=1 | | 已忶 | productionStatus=2 | ## ä¸å¡è§å说æ | åºæ¯ | è§å | |------|------| | åæ¶ç产计å | éå®è®¢å productionStatus 置为 2ï¼productionFinishTime æ¸ ç©º | | åæ¶åéæ°å®¡æ ¸è®¢å | ç³»ç»æ£æµå°åç产计å已忶ï¼ä¼éæ°çææ°çç产计åï¼å¹¶æè®¢å productionStatus é置为 0 | | 订åå卿æçäº§è®¡åæ¶åæ¬¡å®¡æ ¸ | å¤ç¨å·²æç产计åï¼ä¸æ¹åçäº§ç¶æ | | ä¸åå¤æç» | çäº§ç¶æä¸ºè®¢å级ï¼ä»»ä¸æç»åæ¶ç产计åï¼æ´åæ¾ç¤ºâ已忶â | ## 注æäºé¡¹ - 订åç¶æ `status`ï¼æªå®¡æ ¸/å·²å®¡æ ¸/å·²ä½åºï¼ä¸åç产计ååæ¶å½±åï¼ä»ä¿æâå·²å®¡æ ¸âã - productionStatus=2 æ¶è®¢åä»å¯æ§è¡åå®¡æ ¸ãç¼è¾ï¼éæ°å®¡æ ¸åä¼èªå¨çææ°ç产计åã - åå²å·²åæ¶çç产计å对åºç订åä¸ä¼è¿½æº¯å·æ°ï¼ä»æ¾ç¤ºåç¶æï¼å¦éä¿®æ£è¯·åç¬å¤çåéæ°æ®ã - å端çé䏿æ°å¢â已忶âåï¼åå²ä¸æ¤ååæ¶ä¸ç¶æå·²è¢«ç½®ä¸º 0 ç订åä»ä¼è½å¨âæªå®æâçé项ä¸ã docs/work_order_process_warehouse_integration.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,110 @@ # ç产工åå·¥åºæ¥å·¥ä»åº - å端èè°æ¹æ¡ ## æ¶åé¡µé¢ - ç产工å - æ°å¢/ç¼è¾å¼¹çª - å·¥åºå表ï¼process-list.vueï¼ - ç产工å - å·¥åºæ°å¢/ç¼è¾å¼¹çªï¼process-form.vueï¼ - å·¥èºè·¯çº¿ - 产å页ç¾ï¼å·¥èºè·¯çº¿äº§åæ¥å·¥ä»åºé ç½®ï¼ä½ä¸ºå·¥åºé»è®¤å¼æ¥æºï¼ ## ä¸å¡æµç¨ä¸æ°æ®å¸¦å ¥ 1. å·¥èºè·¯çº¿äº§åé ç½®æ¥å·¥ä»åºï¼`mes_pro_route_product` ç `warehouseId/locationId/areaId`ï¼ï¼è¯¥é ç½®æ¯å·¥åºç**é»è®¤å¼æ¥æº**ã 2. ç产订åä¸åï¼æ°å»ºå·¥åï¼æ¶ï¼å·¥åºå表ä»å·¥èºè·¯çº¿å¸¦å ¥ï¼å·¥åºçæ¥å·¥ä»åº/åºåº/åºä½é»è®¤åå·¥èºè·¯çº¿äº§åçé ç½®ã 3. ä¸åæ¶å¯å¯¹æ¯éå·¥åºåç¬ä¿®æ¹æ¥å·¥ä»åº/åºåº/åºä½ï¼ä¿®æ¹ç»æéå·¥åå·¥åºä¸èµ·ä¿åï¼å·¥åå·¥åºä¸ºå¿«ç §ï¼ä¸ååç»å·¥èºè·¯çº¿ä¿®æ¹å½±åï¼ã 4. ç产æ¥å·¥å®¡æ¹éè¿åï¼äº§åºç©ææä»¥ä¸ä¼å 级å³å®å ¥åºä½ç½®ï¼ - â å·¥åå·¥åºä¸é ç½®çæ¥å·¥ä»åº/åºåº/åºä½ï¼ - â¡ å·¥èºè·¯çº¿äº§åä¸é ç½®çæ¥å·¥ä»åº/åºåº/åºä½ï¼ - ⢠èæçº¿è¾¹ä»ï¼å岿°æ®å åºï¼ã 5. å·¥åå·²åå¨ä½å·¥åºæªé ç½®ä»åºï¼æ¬æ¬¡æ¹é åçåå²å·¥åï¼æ¶ï¼èªå¨èµ° â¡ãâ¢ï¼æ éè¡¥æ°æ®ã ## API | æ¹æ³ | è·¯å¾ | 说æ | |------|------|------| | GET | /mes/pro/route-process/list-by-product | æäº§åè·åå·¥èºè·¯çº¿å·¥åºåè¡¨ï¼æ°å¢ï¼é»è®¤æ¥å·¥ä»åºï¼ | | GET | /mes/pro/work-order-process/list-by-product-id | æäº§åè·åå·¥åå·¥åºé¢å¡«åè¡¨ï¼æ°å¢ï¼é»è®¤æ¥å·¥ä»åºï¼ | | GET | /mes/pro/work-order-process/list-by-work-order-id | è·åå·¥åå·¥åºåè¡¨ï¼æ°å¢ï¼æ¥å·¥ä»åºååç§°ï¼ | | GET | /mes/pro/work-order-process/get | è·åå·¥åå·¥åºè¯¦æ ï¼æ°å¢ï¼æ¥å·¥ä»åºååç§°ï¼ | | POST | /mes/pro/work-order-process/batch-save | æ¹éä¿åå·¥åå·¥åºï¼è¯·æ±æ°å¢ä»åºåæ®µï¼ | | POST/PUT | /mes/pro/work-order-process/createã/update | åæ¡æ°å¢/ä¿®æ¹ï¼è¯·æ±æ°å¢ä»åºåæ®µï¼ | **请æ±åæ°ï¼batch-save / create / updateï¼ï¼** | åæ° | ç±»å | å¿ å¡« | 说æ | |------|------|------|------| | warehouseId | Long | å¦ | æ¥å·¥ä»åºç¼å·ï¼ä¸å¡«åæå·¥èºè·¯çº¿äº§åå åº | | locationId | Long | å¦ | æ¥å·¥åºåºç¼å·ï¼éä¸ warehouseId å¹é | | areaId | Long | å¦ | æ¥å·¥åºä½ç¼å·ï¼éä¸ locationId å¹é | > ä»åº/åºåº/åºä½ä¸è åæ¶å¡«åæ¶ï¼åç«¯æ ¡éªå±çº§å½å±å ³ç³»ï¼åªå¡«é¨åæ¶ï¼æ¥å·¥äº§åºæå·¥èºè·¯çº¿äº§åå åºã **ååºå段æ°å¢ï¼list-by-productãlist-by-work-order-idãget çå·¥åºæ¥è¯¢æ¥å£ï¼ï¼** | åæ®µ | ç±»å | 说æ | |------|------|------| | warehouseId | Long | æ¥å·¥ä»åºç¼å· | | warehouseName | String | æ¥å·¥ä»åºåç§° | | locationId | Long | æ¥å·¥åºåºç¼å· | | locationName | String | æ¥å·¥åºåºåç§° | | areaId | Long | æ¥å·¥åºä½ç¼å· | | areaName | String | æ¥å·¥åºä½åç§° | **ååºç¤ºä¾ï¼** ```json { "code": 0, "data": [ { "processId": 1, "processName": "çæ¥", "sort": 1, "warehouseId": 5, "warehouseName": "åæåä»", "locationId": 12, "locationName": "éç¨åºåº", "areaId": 31, "areaName": "é»è®¤åºä½" } ] } ``` ## åæ®µå±ç¤ºè§å | åæ®µ | å±ç¤ºä½ç½® | 说æ | |------|----------|------| | warehouseName | å·¥åå·¥åºåè¡¨ãæ¥å·¥ä»åºãå | æåºä½æ¶æ¼æ¥æ¾ç¤ºãä»åº/åºåº/åºä½ãï¼æªé ç½®æ¾ç¤ºã-ã | | warehouseId | å·¥åºæ°å¢/ç¼è¾å¼¹çª | 䏿åéï¼é项æ¥èªä»åºç²¾ç®å表ï¼å è®¸æ¸ ç©º | | locationId | å·¥åºæ°å¢/ç¼è¾å¼¹çª | 䏿åéï¼ä¾èµ warehouseIdï¼ä»åºåæ´æ¶æ¸ 空 | | areaId | å·¥åºæ°å¢/ç¼è¾å¼¹çª | 䏿åéï¼ä¾èµ locationIdï¼åºåºåæ´æ¶æ¸ 空 | ## 产åºç©æè¿æ»¤ åä¸å·¥èºè·¯çº¿å¯ä»¥å ³èå¤ä¸ªäº§åï¼å·¥èºè·¯çº¿äº§åï¼ãä¸å/æäº§æäº§åè·åå·¥èºè·¯çº¿å·¥åºæ¶ï¼å·¥åºç产åºç©æä¼èªå¨è¿æ»¤ï¼åªä¿çãéç¨äº§åºãåãå½å产åä¸å±äº§åºãï¼å ¶å®äº§åçä¸å±äº§åºä¸ä¼å¸¦å ¥ã 产åºå½å±å¨å·¥èºè·¯çº¿å·¥åºå¼¹çªä¸é ç½®ï¼äº§åºç©æå¯å½å±å°æä¸ªäº§åï¼ä¸å±ï¼ï¼ä¹å¯ç空表示å¤äº§åéç¨ï¼éååçº¿å ±ç¨çåæåï¼ãè¯¦è§ `docs/route_process_output_attribution.md`ã 示ä¾ï¼è·¯çº¿åæ¶å ³èãæ²¹æµ¸å¼é çµååå¨ãåãå ä¼åºå®æ¯æ¶ãï¼å è£ å ¥åºå·¥åºåå«ä¸ºä¸¤ä¸ªäº§åé ç½®ä¸å±äº§åºãä¸åãå ä¼åºå®æ¯æ¶ãæ¶ï¼è¯¥å·¥åºåªå¸¦å ¥ãå ä¼åºå®æ¯æ¶ãï¼è¥è¯¥å·¥åºè¿æä¸ä¸ªãéç¨ãåæå产åºï¼ä¹ä¼ä¸å¹¶å¸¦å ¥ã > å·¥èºè·¯çº¿é ç½®é¡µï¼æ routeId æ¥è¯¢ï¼ä¸åå½±åï¼ä»å±ç¤ºå ¨é¨å·²é ç½®ç产åºç©æåå ¶å½å±ã å·¥åå·¥åºæ°å¢/ç¼è¾å¼¹çªä¸çã产åºç©æãéæ©å¨åæ ·ææ¤è§åæ¶æï¼åéèå´ = 该产åå·¥èºè·¯çº¿ä¸å¸¦å ¥ç产åºï¼éç¨ + æ¬äº§åä¸å±ï¼+ 该工åºå·²æäº§åº + å·¥åäº§åæ¬èº«ãäº§åæªå ³èå·¥èºè·¯çº¿æ¶ä¸åéå¶ï¼ä¿æåæå¯éèå´ã ## ä¸å¡è§å说æ | åºæ¯ | è§å | |------|------| | æ°å»ºå·¥åå¸¦å ¥å·¥åº | ä»åº/åºåº/åºä½é»è®¤åå·¥èºè·¯çº¿äº§åçæ¥å·¥ä»åºé ç½®ï¼å¯éå·¥åºä¿®æ¹ | | ä¿®æ¹å·¥åºä»åº | ä¿®æ¹åéå·¥åºä¿åå°å·¥åå·¥åºå¿«ç §ï¼æ¥å·¥æå¿«ç §æ§è¡ | | å·¥èºè·¯çº¿åç»ä¿®æ¹ | ä¸å½±åå·²å建çå·¥åå·¥åºå¿«ç § | | å·¥åºæªé ç½®ä»åº | æ¥å·¥äº§åºåéå°å·¥èºè·¯çº¿äº§åé ç½®ï¼ååéèæçº¿è¾¹ä» | | ä»åºå±çº§ä¸å¹é | åç«¯æ ¡éª `warehouse â location â area` å½å±å ³ç³»ï¼ä¸å¹é æ¶æ¥é | | å岿£æ | ä»åºå®ä»èæçº¿è¾¹ä»æ£æï¼ä¸äº§åºä»åºæ å ³ | ## 注æäºé¡¹ - å·¥åºä»åºä¸çº§å段为å¯éï¼åå²å·¥åå·¥åºæ²¡æä»åºæ°æ®æ¶ï¼æ¥å·¥èªå¨åéï¼ä¸ä¼æ¥éã - åç½®ä»åºãåºåºãåºä½ä¸ææ°æ®å嫿¥èª `/mes/wm/warehouse/simple-list`ã`/mes/wm/warehouse-location/simple-list?warehouseId=`ã`/mes/wm/warehouse-area/simple-list?locationId=`ã - åªæ¸ 空ä»åºè䏿¸ 空åºåº/åºä½ä¼äº§çèæ°æ®ï¼å端å¨ä¸çº§åæ®µåæ´æ¶éçº§èæ¸ 空ä¸çº§å段ã - 产åºä»åºæ¹ä¸ºå®é ä»åºåï¼èæçº¿è¾¹ä»çåºåä¸åé产åºå¢å ï¼å岿£æä»ä»èæä»æ£åï¼ï¼å±äºé¢æè¡ä¸ºã sql/mysql/20261028_sp_generic_shift_dates.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,290 @@ -- sp_generic_shift_datesï¼ææå®æ¶é´çªå£å¹³ç§»åºå æ¥æç±»åæ®µ -- ä¿®å¤ç¹ï¼ -- 1) å¯ä¸ç´¢å¼å 嫿¥æåç表ï¼å¦ hrm_attendance_record.uk_user_dateï¼æ¹ä¸ºæ´è¡¨ç»ä¸å¹³ç§»ï¼ -- 常éåç§»ä¸ä¼ç ´åå¯ä¸é®ï¼é¿å 1062 Duplicate entry -- 2) å表æ§è¡å¤±è´¥ä¸å䏿æ´è½®ï¼éè¯¯è®°å ¥é¢è§è¡¨åç»§ç»å¤çåç»è¡¨ DROP PROCEDURE IF EXISTS `sp_generic_shift_dates`; DELIMITER $$ CREATE DEFINER = `root`@`%` PROCEDURE `sp_generic_shift_dates`( IN p_schema VARCHAR(64), IN p_start DATETIME, IN p_end DATETIME, IN p_execute BOOLEAN, IN p_exclude_regex VARCHAR(1000), IN p_include_regex VARCHAR(1000) ) BEGIN DECLARE v_done BOOL DEFAULT FALSE; DECLARE v_table VARCHAR(64); DECLARE v_pk VARCHAR(64); DECLARE v_pk_count INT; DECLARE v_cols LONGTEXT; DECLARE v_anchor VARCHAR(64); DECLARE v_sql LONGTEXT; DECLARE v_seconds BIGINT; DECLARE v_count BIGINT DEFAULT 0; DECLARE v_tables BIGINT DEFAULT 0; DECLARE v_fields INT; DECLARE v_uniq_hit INT; DECLARE v_uniq_cols VARCHAR(1000); DECLARE v_min_expr LONGTEXT; DECLARE v_max_expr LONGTEXT; DECLARE v_regex VARCHAR(1000); DECLARE v_err TEXT; DECLARE cur CURSOR FOR SELECT t.TABLE_NAME FROM information_schema.TABLES t WHERE t.TABLE_SCHEMA = p_schema AND t.TABLE_TYPE = 'BASE TABLE' AND (p_exclude_regex IS NULL OR TRIM(p_exclude_regex) = '' OR NOT REGEXP_LIKE(t.TABLE_NAME, p_exclude_regex, 'i')) ORDER BY t.TABLE_NAME; DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE; IF p_schema IS NULL OR p_schema = '' OR p_schema IN ('mysql','information_schema','performance_schema','sys') THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid or system schema'; END IF; IF p_start IS NULL OR p_end IS NULL OR p_end < p_start THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid date range'; END IF; IF NOT EXISTS (SELECT 1 FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = p_schema) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Schema not found'; END IF; -- 忏 åå¯è½å¾é¿ï¼é¿å GROUP_CONCAT 被é»è®¤ 1024 åèæªæ SET SESSION group_concat_max_len = 1048576; SET v_seconds = TIMESTAMPDIFF(SECOND, p_start, p_end); -- ç©ºä¸²ä¸æ¯ NULLï¼å¿ é¡»æ¾å¼å½ä¸åï¼MySQL 8 ç REGEXP_LIKE éå°ç©ºæ¨¡å¼ä¼æ 3685 IF p_include_regex IS NULL OR TRIM(p_include_regex) = '' THEN SET v_regex = '(^|_)(create|created|update|updated|modify|modified|order|production|produce|receipt|receive|delivery|ship|stock|inbound|outbound|start|end|finish|complete|plan|actual|inspect|check|approve|audit|pay|payment|due|expire|expiry|effective|business|biz|date|time|timestamp)(_|$)'; ELSE SET v_regex = p_include_regex; END IF; DROP TEMPORARY TABLE IF EXISTS tmp_date_shift_preview; CREATE TEMPORARY TABLE tmp_date_shift_preview ( table_name VARCHAR(64), anchor_column VARCHAR(64), shift_mode VARCHAR(16), field_count INT, affected_rows BIGINT, statement_text LONGTEXT ); OPEN cur; loop_tables: LOOP FETCH cur INTO v_table; IF v_done THEN LEAVE loop_tables; END IF; SELECT COUNT(*), MAX(k.COLUMN_NAME) INTO v_pk_count, v_pk FROM information_schema.KEY_COLUMN_USAGE k WHERE k.TABLE_SCHEMA = p_schema AND k.TABLE_NAME = v_table AND k.CONSTRAINT_NAME = 'PRIMARY'; IF v_pk_count <> 1 THEN ITERATE loop_tables; END IF; SELECT COUNT(*) INTO v_fields FROM information_schema.COLUMNS c WHERE c.TABLE_SCHEMA = p_schema AND c.TABLE_NAME = v_table AND c.DATA_TYPE IN ('date','datetime','timestamp') AND c.EXTRA NOT LIKE '%VIRTUAL GENERATED%' AND c.EXTRA NOT LIKE '%STORED GENERATED%' AND c.EXTRA NOT LIKE '%on update%' AND REGEXP_LIKE(c.COLUMN_NAME, v_regex, 'i'); IF v_fields = 0 THEN ITERATE loop_tables; END IF; SELECT c.COLUMN_NAME INTO v_anchor FROM information_schema.COLUMNS c WHERE c.TABLE_SCHEMA = p_schema AND c.TABLE_NAME = v_table AND c.DATA_TYPE IN ('date','datetime','timestamp') AND c.EXTRA NOT LIKE '%VIRTUAL GENERATED%' AND c.EXTRA NOT LIKE '%STORED GENERATED%' AND c.EXTRA NOT LIKE '%on update%' AND REGEXP_LIKE(c.COLUMN_NAME, v_regex, 'i') ORDER BY CASE WHEN c.COLUMN_NAME IN ('create_time','created_at','creation_time','created_time') THEN 0 ELSE 1 END, c.ORDINAL_POSITION LIMIT 1; -- å¾ å¹³ç§»çæ¥æå䏿¯å¦æè½å¨å¯ä¸ç´¢å¼ä¸ç SELECT COUNT(*) INTO v_uniq_hit FROM information_schema.STATISTICS s JOIN information_schema.COLUMNS c ON c.TABLE_SCHEMA = s.TABLE_SCHEMA AND c.TABLE_NAME = s.TABLE_NAME AND c.COLUMN_NAME = s.COLUMN_NAME WHERE s.TABLE_SCHEMA = p_schema AND s.TABLE_NAME = v_table AND s.NON_UNIQUE = 0 AND c.DATA_TYPE IN ('date','datetime','timestamp') AND c.EXTRA NOT LIKE '%VIRTUAL GENERATED%' AND c.EXTRA NOT LIKE '%STORED GENERATED%' AND c.EXTRA NOT LIKE '%on update%' AND REGEXP_LIKE(c.COLUMN_NAME, v_regex, 'i'); SET @tbl = CONCAT('`', REPLACE(p_schema,'`','``'), '`.`', REPLACE(v_table,'`','``'), '`'); SET @anchor = CONCAT('`', REPLACE(v_anchor,'`','``'), '`'); inner_block: BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 v_err = MESSAGE_TEXT; INSERT INTO tmp_date_shift_preview VALUES (v_table, v_anchor, 'failed', v_fields, 0, CONCAT('[error] ', v_err)); END; IF v_uniq_hit > 0 THEN -- ç»ä¸å¹³ç§»ï¼æ´è¡¨ä½¿ç¨åä¸åç§»ï¼ä¿çå¯ä¸é®ã -- åç§»éæææå¾ 平移åçæ´ä½è·¨åº¦è®¡ç®ï¼ä¿è¯æ¯ä¸åé½è½å¨ç®æ çªå£å ã -- COALESCE ä¿æ¤ï¼æ´å为 NULL æ¶ MIN/MAX è¿å NULLï¼ä¼è®© LEAST/GREATEST æ´ä½å NULL SELECT GROUP_CONCAT(CONCAT('COALESCE(MIN(`', REPLACE(c.COLUMN_NAME,'`','``'), '`), ''9999-12-31 23:59:59'')') ORDER BY c.ORDINAL_POSITION SEPARATOR ', '), GROUP_CONCAT(CONCAT('COALESCE(MAX(`', REPLACE(c.COLUMN_NAME,'`','``'), '`), ''1000-01-01 00:00:00'')') ORDER BY c.ORDINAL_POSITION SEPARATOR ', ') INTO v_min_expr, v_max_expr FROM information_schema.COLUMNS c WHERE c.TABLE_SCHEMA = p_schema AND c.TABLE_NAME = v_table AND c.DATA_TYPE IN ('date','datetime','timestamp') AND c.EXTRA NOT LIKE '%VIRTUAL GENERATED%' AND c.EXTRA NOT LIKE '%STORED GENERATED%' AND c.EXTRA NOT LIKE '%on update%' AND REGEXP_LIKE(c.COLUMN_NAME, v_regex, 'i'); SET @sql = CONCAT('SELECT LEAST(', v_min_expr, '), GREATEST(', v_max_expr, ') INTO @min_all, @max_all FROM ', @tbl); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @span_days = TIMESTAMPDIFF(DAY, DATE(@min_all), DATE(@max_all)); SET @range_days = TIMESTAMPDIFF(DAY, DATE(p_start), DATE(p_end)); IF @min_all IS NULL OR @min_all >= '9999-01-01' THEN INSERT INTO tmp_date_shift_preview VALUES (v_table, v_anchor, 'skipped', v_fields, 0, 'no non-null date value'); ELSEIF @span_days > @range_days THEN INSERT INTO tmp_date_shift_preview VALUES (v_table, v_anchor, 'skipped', v_fields, 0, CONCAT('date span ', @span_days, ' days exceeds target range ', @range_days, ' days')); ELSE -- ææ´æ¥å¹³ç§»ï¼ä¿çæ¶åç§ä¸ç¸å¯¹é¡ºåº SET @shift_delta = (TIMESTAMPDIFF(DAY, DATE(@min_all), DATE(p_start)) + FLOOR(RAND() * (@range_days - @span_days + 1))) * 86400; -- éæºå° 0 天çäºæ²¡æ¹ï¼å¼ºå¶è³å°å¹³ç§» 1 天 IF @shift_delta = 0 AND @span_days < @range_days THEN SET @shift_delta = 86400; END IF; SELECT GROUP_CONCAT( CONCAT('`', REPLACE(c.COLUMN_NAME,'`','``'), '` = DATE_ADD(`', REPLACE(c.COLUMN_NAME,'`','``'), '`, INTERVAL @shift_delta SECOND)') ORDER BY c.ORDINAL_POSITION SEPARATOR ', ') INTO v_cols FROM information_schema.COLUMNS c WHERE c.TABLE_SCHEMA = p_schema AND c.TABLE_NAME = v_table AND c.DATA_TYPE IN ('date','datetime','timestamp') AND c.EXTRA NOT LIKE '%VIRTUAL GENERATED%' AND c.EXTRA NOT LIKE '%STORED GENERATED%' AND c.EXTRA NOT LIKE '%on update%' AND REGEXP_LIKE(c.COLUMN_NAME, v_regex, 'i'); -- InnoDB éè¡æ´æ°å¯ä¸é®ä¼ç¬æ¶å²çªï¼æåç§»æ¹åå³å®æ«æé¡ºåºï¼ -- æ£åç§»å å¨è¾å¤§çå¼ï¼è´åç§»å å¨è¾å°çå¼ SELECT GROUP_CONCAT(CONCAT('`', REPLACE(d.COLUMN_NAME,'`','``'), '`') ORDER BY d.ORDINAL_POSITION SEPARATOR ', ') INTO v_uniq_cols FROM ( SELECT DISTINCT c.COLUMN_NAME, c.ORDINAL_POSITION FROM information_schema.STATISTICS s JOIN information_schema.COLUMNS c ON c.TABLE_SCHEMA = s.TABLE_SCHEMA AND c.TABLE_NAME = s.TABLE_NAME AND c.COLUMN_NAME = s.COLUMN_NAME WHERE s.TABLE_SCHEMA = p_schema AND s.TABLE_NAME = v_table AND s.NON_UNIQUE = 0 AND c.DATA_TYPE IN ('date','datetime','timestamp') AND c.EXTRA NOT LIKE '%VIRTUAL GENERATED%' AND c.EXTRA NOT LIKE '%STORED GENERATED%' AND c.EXTRA NOT LIKE '%on update%' AND REGEXP_LIKE(c.COLUMN_NAME, v_regex, 'i') ) d; SET @update_sql = CONCAT('UPDATE ', @tbl, ' SET ', v_cols, ' ORDER BY ', v_uniq_cols, ' ', IF(@shift_delta >= 0, 'DESC', 'ASC')); SET @count_sql = CONCAT('SELECT COUNT(*) INTO @affected FROM ', @tbl); PREPARE stmt FROM @count_sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; IF p_execute THEN PREPARE stmt FROM @update_sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END IF; SET v_count = v_count + @affected; INSERT INTO tmp_date_shift_preview VALUES (v_table, v_anchor, IF(p_execute, 'uniform-executed', 'uniform-preview'), v_fields, @affected, @update_sql); SET v_tables = v_tables + 1; END IF; ELSE -- éè¡éæºï¼æ¯è¡ä¸ä¸ªéæºç®æ æ¶é´ï¼ä»¥éç¹æ´ä½å¹³ç§» SELECT GROUP_CONCAT( CONCAT('`', REPLACE(c.COLUMN_NAME,'`','``'), '` = CASE WHEN `', REPLACE(c.COLUMN_NAME,'`','``'), '` IS NULL THEN NULL ELSE ', CASE WHEN c.DATA_TYPE = 'date' THEN 'DATE(' ELSE '' END, 'DATE_ADD(`', REPLACE(c.COLUMN_NAME,'`','``'), '`, INTERVAL TIMESTAMPDIFF(SECOND, `', REPLACE(v_anchor,'`','``'), '`, __new_anchor) SECOND)', CASE WHEN c.DATA_TYPE = 'date' THEN ')' ELSE '' END, ' END') ORDER BY c.ORDINAL_POSITION SEPARATOR ', ') INTO v_cols FROM information_schema.COLUMNS c WHERE c.TABLE_SCHEMA = p_schema AND c.TABLE_NAME = v_table AND c.DATA_TYPE IN ('date','datetime','timestamp') AND c.EXTRA NOT LIKE '%VIRTUAL GENERATED%' AND c.EXTRA NOT LIKE '%STORED GENERATED%' AND c.EXTRA NOT LIKE '%on update%' AND REGEXP_LIKE(c.COLUMN_NAME, v_regex, 'i'); DROP TEMPORARY TABLE IF EXISTS tmp_shift_row_dates; SET @sql = CONCAT('CREATE TEMPORARY TABLE tmp_shift_row_dates AS SELECT `', REPLACE(v_pk,'`','``'), '` AS __pk, DATE_ADD(?, INTERVAL FLOOR(RAND() * ', v_seconds + 1, ') SECOND) AS __new_anchor FROM ', @tbl, ' WHERE ', @anchor, ' IS NOT NULL'); IF p_execute THEN PREPARE stmt FROM @sql; SET @start_date = p_start; EXECUTE stmt USING @start_date; DEALLOCATE PREPARE stmt; SET @update_sql = CONCAT('UPDATE ', @tbl, ' t JOIN tmp_shift_row_dates s ON t.`', REPLACE(v_pk,'`','``'), '` = s.__pk SET ', REPLACE(v_cols, '__new_anchor', 's.__new_anchor')); SET @count_sql = 'SELECT COUNT(*) INTO @affected FROM tmp_shift_row_dates'; PREPARE stmt FROM @count_sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; PREPARE stmt FROM @update_sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET v_count = v_count + @affected; INSERT INTO tmp_date_shift_preview VALUES (v_table, v_anchor, 'random-executed', v_fields, @affected, @update_sql); DROP TEMPORARY TABLE tmp_shift_row_dates; ELSE SET @count_sql = CONCAT('SELECT COUNT(*) INTO @affected FROM ', @tbl, ' WHERE ', @anchor, ' IS NOT NULL'); PREPARE stmt FROM @count_sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; INSERT INTO tmp_date_shift_preview VALUES (v_table, v_anchor, 'random-preview', v_fields, @affected, CONCAT('Will shift ', v_fields, ' date columns per row; anchor=', v_anchor)); END IF; SET v_tables = v_tables + 1; END IF; END inner_block; END LOOP; CLOSE cur; SELECT * FROM tmp_date_shift_preview ORDER BY shift_mode, table_name; SELECT p_schema AS database_name, p_execute AS executed, v_tables AS tables_processed, v_count AS rows_targeted; END$$ DELIMITER ;