倧åå¶é äžäŒäžç»äžäžå¡éæå¹³å°å»ºè®Ÿæ¹æ¡
äžãæ¹æ¡å®äœäžæ žå¿ç念
1.1 æ¬èŽšå®äœ
æ¬æ¹æ¡èçŠITå±äžå¡ç³»ç»ä¹éŽçæ ååéæ,æ žå¿è§£å³ ERPãMESãWMSãPLMãQMSãSRMãCRM çå€è¯èšæ ç³»ç»ççå±åŒå»ºè®Ÿãéå€åŒåãæ åºå¯¹æ¥é®é¢ã
æ žå¿ç®æ äžæ¯"æ°æ®æ¬è¿",èæ¯"äžå¡æµçšèޝé"ââä¿éè·šç³»ç»äžå¡æäœçäºå¡äžèŽæ§äžå¯é æ§,å®ç°äžå¡ç¶æçè·šç³»ç»ååäžæ¿è¯ºã
æç¡®èŸ¹ç:
- åšèåŽå :ææITäžå¡ç³»ç»ä¹éŽçäº€äºæ åãæ¥å£è§èãæå¡è°çšãæ°æ®æµèœ¬ãéæç®¡æ§
- äžåšèåŽå :OTå±è®Ÿå€æ°æ®ééãå·¥äžå议解æã宿¶æ§å¶æä»€äžå(ç±äžéšOT/å·¥äžäºèçœæ¹æ¡æ¿æ¥)
- äžOTå¯äžäº€é:å®ä¹OTæ°æ®å¹³å°åITç³»ç»äº€ä»æ°æ®çæ¥å£æ å
1.2 æ žå¿è®Ÿè®¡åå
| åå | 诎æ |
|---|---|
| äžå¡é©±åš | 以äžå¡æµçšèޝéäžºæ žå¿,äŒå ä¿éè·šç³»ç»äžå¡æäœçäºå¡äžèŽæ§ |
| äžå¡è¯ä¹å | APIäœç°äžå¡åšäœ(confirm-order),æ¶æ¯è¡šèŸŸäžå¡äºä»¶(OrderConfirmed),èéæ°æ®åºCRUD |
| æŸèŠå | ææäº€äºç»äžéè¿éæå¹³å°äžèœ¬,æç»ç¹å¯¹ç¹çŽè¿ |
| æ åå è¡ | æ°å»ºç³»ç»åŒºå¶éµåŸªç»äžæ å,åéç³»ç»éè¿éé åšæžè¿æ¹é |
| èœåå€çš | éŽæãæ¥å¿ã蜬æ¢ãäºå¡ç®¡æ§æ²æ·äžºå ¬å ±ç»ä»¶ |
| ç¶æèªæ²» | åç³»ç»ç»Žæ€èªèº«ç¶ææº,éè¿äžå¡äºä»¶åå忥,çŠæ¢çŽæ¥ä¿®æ¹å¯¹æ¹ç¶æ |
| æ°æ®äž»æ | æ¯äžªäžå¡æ°æ®æäžåªæäžäžªæåšæºç³»ç» |
äºãæ»äœæ¶æ
2.1 äžå¡é¢ååå(DDD)
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â å¶é äžäžå¡é¢ååå â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â â
â âââââââââââââââ âââââââââââââââ âââââââââââââââ â
â â éå®é¢å â â ç产é¢å â â ä»åšé¢å â â
â â (CRM) âââââºâ (MES) âââââºâ (WMS) â â
â â ⢠客æ·ç®¡ç â â ⢠工å管ç â â ⢠åºå管ç â â
â â ⢠ååçŸè®¢ â â ⢠工èºè·¯çº¿ â â ⢠å
¥åºäœäž â â
â â â¢ éæ±é¢æµ â â ⢠æ¥å·¥åéŠ â â ⢠åºåºåè¿ â â
â ââââââââ¬âââââââ ââââââââ¬âââââââ ââââââââ¬âââââââ â
â â â â â
â ââââââââââââââââââââŒâââââââââââââââââââ â
â â â
â ââââââââââŽâââââââââ â
â â éæå¹³å° â â
â â (äžå¡çŒæäžåè°) â â
â âââââââââââââââââââ â
â â
â âââââââââââââââ âââââââââââââââ âââââââââââââââ â
â â 莢å¡é¢å â â 莚éé¢å â â äŸåºé¢å â â
â â (ERP) âââââºâ (QMS) âââââºâ (SRM) â â
â â â¢ åºæ¶åºä» â â â¢ æ¥ææ£éª â â ⢠äŸåºååå â
â â â¢ ææ¬æ žç® â â ⢠è¿çšæ£éª â â ⢠éèŽæ§è¡ â
â â ⢠åç¥šæ ¡éª â â ⢠äžåæ Œå€çœ® â â â¢ äº€ææ¿è¯º â
â âââââââââââââââ âââââââââââââââ âââââââââââââââ â
â â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
2.2 äºå±ææ¯æ¶æ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â L5 ç»äžæ²»çå± â
â äžå¡éæéšæ· | æµçšçæ§å€§ç | äºå¡è¿œèžª | 审计äžå¿ | APIèµäº§ç®åœ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â L4 ç»äžæ¥å
¥å±(APIçœå
³) â
â 讀è¯éŽæ | éæµçæ | è·¯ç±èœ¬å | åè®®èœ¬æ¢ | äžå¡å¥çºŠæ ¡éª | å¹çæŠæª â
â Apache APISIX / äžå¡çœå
³ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
ââââââââââââââââââââââââââââŒâââââââââââââââââââââââââââ
â â â
⌠⌠âŒ
âââââââââââââââââââ âââââââââââââââââââ âââââââââââââââââââ
â 忥äžå¡è°çš â â åŒæ¥äžå¡äºä»¶ â â é¿æµçšçŒæ â
â REST/gRPC â â RocketMQ â â Apache Camel â
â (<500ms) â â (äºå¡æ¶æ¯) â â + iPaaSäœä»£ç â
ââââââââââ¬âââââââââ ââââââââââ¬âââââââââ ââââââââââ¬âââââââââ
â â â
ââââââââââââââââââââââââââŒâââââââââââââââââââââââââ
âŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â L3 éææå¡å±(äžå¡çŒææ žå¿) â
â âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ â
â â æ¶æ¯è·¯ç±èœ¬æ¢ â â SagaçŒæåŒæ â â è¡¥å¿äºå¡ç®¡ç â â ç¶ææºåŒæ â â
â â(Apache Camel)â â(Camel/Temporal)â â(Camel) â â(Camel) â â
â âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â L2 æ¶æ¯äžéŽä»¶å± â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â Apache RocketMQ(äžå¡äºå¡æ¶æ¯ / 订å / åºå / å·¥å / 莢å¡) â â
â â Apache Kafka(æ°æ®æµ / 讟å€é¥æµ / æ¥å¿ / CDC / åæç±») â â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â L1 ç»äžè¿æ¥å± â
â ââââââââ ââââââââ ââââââââ ââââââââ ââââââââ ââââââââ ââââââââ â
â â ERP â â MES â â PLM â â SCM â â CRM â â QMS â â WMS â â
â âAdapterâ âAdapterâ âAdapterâ âAdapterâ âAdapterâ âAdapterâ âAdapterâ â
â ââââââââ ââââââââ ââââââââ ââââââââ ââââââââ ââââââââ ââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
äžãç»äžææ¯æ åäœç³»
3.1 API 讟计è§è(äžå¡è¯ä¹å)
URL 讟计:äžå¡åšäœå¯Œå
https://{gateway}/api/{version}/{domain}/{capability}/{action}
ç»æ:
- {domain}: äžå¡é¢å(sales / production / warehousing / quality / procurement / finance / mdm)
- {capability}: äžå¡èœå(order-management / work-order-management / inventory-management)
- {action}: äžå¡åšäœ(åšè¯),äœç°äžå¡æåŸ
| åæš¡åŒ(æ°æ®å¯Œå) | æ£æš¡åŒ(äžå¡å¯Œå) |
|---|---|
POST /orders | POST /api/v1/sales/order-management/place-order |
PUT /orders/{id}/status | POST /api/v1/sales/order-management/confirm-order |
PUT /work-orders/{id} | POST /api/v1/production/work-order-management/schedule |
PUT /inventory/{id}/quantity | POST /api/v1/warehousing/inventory-management/reserve |
请æ±äœ:äžå¡åœä»€æš¡åŒ
{
"commandType": "CONFIRM_SALES_ORDER",
"commandId": "cmd-uuid-v4",
"orderId": "SO001",
"confirmation": {
"confirmedBy": "U1001",
"confirmedAt": "2026-08-09T15:35:00+08:00",
"deliveryDate": "2026-08-20",
"paymentTerms": "NET_30"
},
"reason": "客æ·å·²åçŸå忣æ¬"
}
ååºäœ:äžå¡ç»æå¯Œå
{
"code": "SUCCESS",
"message": "éå®è®¢å确讀æå",
"requestId": "req-uuid-v4",
"timestamp": "2026-08-09T15:35:00+08:00",
"businessResult": {
"orderId": "SO001",
"newStatus": "CONFIRMED",
"affectedSystems": [
{
"system": "MES",
"action": "WORK_ORDER_SCHEDULED",
"resultId": "WO2026001"
}
],
"nextExpectedEvents": [
{
"eventType": "WorkOrderReleased",
"expectedBy": "2026-08-11T18:00:00+08:00"
}
]
}
}
HTTP æ¹æ³äžå¹çæ§
| æ¹æ³ | çšé | å¹çæ§ |
|---|---|---|
| GET | æ¥è¯¢ | æ¯ |
| POST | å建/æ§è¡äžå¡åšäœ | åŠ(éäžå¡å¹çé®) |
| PUT | å šéæŽæ° | æ¯ |
| PATCH | éšåæŽæ° | åŠ |
| DELETE | å é€ | æ¯ |
请æ±å€Žè§è
| Header | æ¯åŠå¿ é¡» | 诎æ |
|---|---|---|
Authorization | æ¯ | Bearer {access_token} |
Content-Type | æ¯ | application/json |
X-Request-Id | æ¯ | UUID,å šéŸè·¯è¿œèžª |
X-Idempotent-Key | æ¯(åæäœ) | å¹çé® |
X-Tenant-Id | æ¯ | ç§æ·æ è¯ |
X-Data-Scope | æ¯ | æ°æ®æéèåŽ |
é误ç äœç³»
| åºéŽ | é¢å |
|---|---|
| 0 | æå |
| 10000-19999 | éçš(åæ°ã讀è¯ãæéãéæµ) |
| 20000-29999 | ERPé¢å |
| 30000-39999 | MESé¢å |
| 40000-49999 | PLMé¢å |
| 50000-59999 | SCM/SRMé¢å |
| 60000-69999 | 莚é/QMSé¢å |
| 70000-79999 | ä»åš/WMSé¢å |
| 80000-89999 | éå®/CRMé¢å |
| 90000-99999 | éæå¹³å°å éšé误 |
3.2 éä¿¡åè®®éå
| åºæ¯ | æšèåè®® | 诎æ |
|---|---|---|
| è·šç³»ç»åæ¥è°çš(æ¥è¯¢/æä»€) | RESTful HTTP/JSON | å šè¯èšéçš,å Œå®¹æ§åŒº |
| å éšåŸ®æå¡é«æ§èœéä¿¡ | gRPC + Protobuf | äºè¿å¶åºåå,æ§èœæ¯JSONé«60% |
| äŒ ç»ç³»ç»å¯¹æ¥(èæ§ERP) | SOAP/XML | ç±éæå¹³å°éé åšèœ¬æ¢äžºRESTæ åæ¥å£ |
3.3 å€è¯èšåŒåéé è§è
| è¯èšæ | æšèæ¡æ¶ | 区å¶èŠæ± |
|---|---|---|
| Java | Spring Cloud Alibaba | æ¥å ¥ç»äžAPIçœå ³ãéŽæSDKãéŸè·¯è¿œèžªæ¢é |
| Python | FastAPI | èªåšçæOpenAPIææ¡£,æ¥å ¥ç»äžçæ§æ¢é |
| C# | ASP.NET Core | éµåŸªç»äžååºæ ŒåŒ,æ¥å ¥ç»äžæ¥å¿ééç»ä»¶ |
ææè¯èšæ å ¬å ±èŠæ±:
- ç»äžOAuth2.0éŽæ
- ç»äžæ¥å¿æ ŒåŒ(å«traceIdéäŒ )
- ç»äžæŽé²
/healthå¥åº·æ£æ¥ç«¯ç¹
åãäžå¡äº€äºäžäžèŽæ§ä¿é
4.1 åç§äžå¡äº€äºæš¡åŒ
| æš¡åŒ | äžå¡å«ä¹ | ææ¯å®ç° | äžèŽæ§ | å³çåå |
|---|---|---|---|---|
| äžå¡æ¥è¯¢ | æ¥è¯¢åŠäžç³»ç»çäžå¡ç¶æ | 忥 HTTP/gRPC | æ ç¶æ | åªè¯»æäœ |
| äžå¡æä»€ | èŠæ±åŠäžç³»ç»æ§è¡äžå¡åšäœ | 忥 HTTP/gRPC + äžå¡æ ¡éª | 区äžèŽ(åç¹) | éèŠå³æ¶ç¡®è®€åäžå¡ç»æ |
| äžå¡äºä»¶ | éç¥äžå¡ç¶æå·²åæŽ | åŒæ¥æ¶æ¯(RocketMQ) | æç»äžèŽ | åªééç¥"å·²åçæäžå¡äºå®" |
| äžå¡çŒæ | è·šç³»ç»é¿æµçšåè° | Saga çŒæ + äºå¡æ¶æ¯ | æç»äžèŽ + è¡¥å¿ | è·š3+ç³»ç»çé¿æµçš |
å³çåå:
- åŠæäžæžžéèŠç¥éäžæžžæ¯åŠæ¥å以åäžå¡ç»æ â äžå¡æä»€(忥)
- åŠæäžæžžåªéèŠéç¥**âæå·²åçæäžå¡äºå®â** â äžå¡äºä»¶(åŒæ¥)
4.2 äžå¡ç¶ææºåæ¥(æ žå¿éŸç¹)
é®é¢: åäžäžå¡å¯¹è±¡åšäžåç³»ç»çç¶ææºäžåæ¥
- ERP"å·²äžèŸŸ" â MES"å·²æäº§",ååšæ¶éŽå·®åäžå¡è¯ä¹å·®
è§£å³è§å:
- åç³»ç»ç»Žæ€èªèº«ç¶ææº,äžçŽæ¥æ å°å ¶ä»ç³»ç»ç¶æ
- ç¶æåæŽä»¥äžå¡äºä»¶åœ¢åŒå¹¿æ,è®¢é æ¹èªäž»å³çæ¯åŠè·è¿
- çŠæ¢çŽæ¥ä¿®æ¹å¯¹æ¹ç³»ç»çç¶æåæ®µ(åŠERPçŽæ¥è°çšUPDATE MESå·¥åç¶æ)
4.3 äžèŽæ§å级çç¥
| çº§å« | åç§° | å®ä¹ | å®ç°æ¹åŒ | å¶é äžæ¡äŸ |
|---|---|---|---|---|
| L0 | 区äžèŽ | 宿¶åŒºäžèŽ | 2PC/TCC(æå°äœ¿çš) | èŽ¢å¡æç»é莊 |
| L1 | äžå¡äžèŽ | äžå¡æµçšå®æŽæ§ | Saga + äºå¡æ¶æ¯ | 订åâå·¥åâåºå |
| L2 | æç»äžèŽ | æç»ç¶æäžèŽ,å è®žå»¶è¿ | æ®éæ¶æ¯ + 对莊 | åºåææ¬æŽæ° |
| L3 | æå€§åªå | å°œééç¥,倱莥å¯äººå·¥å€ç | æ®éæ¶æ¯ + åèŠ | é®ä»¶éç¥ |
4.4 RocketMQ äºå¡æ¶æ¯ââçæµçšäžèŽæ§
æºå¶: äºé¶æ®µæäº€ + äºå¡ç¶æåæ¥,ç¡®ä¿"æ¬å°äºå¡æäº€"äž"æ¶æ¯åé"çååæ§
å žååºæ¯:ERPç产订åäžå
ERPç³»ç» RocketMQ
âââââââââââââââ åéåæ¶æ¯ âââââââââââââââ
â 1.åŒå§æ¬å° â ââââââââââââââ> â æ¶æ¯ç¶æ: â
â äºå¡ â â "åŸ
确讀" â
ââââââââ¬âââââââ âââââââââââââââ
â
âŒ
âââââââââââââââ âââââââââââââââ
â 2.æ§è¡æ¬å° â â æ¶æ¯ç¶æ: â
â äºå¡ â â "åŸ
确讀" â
â (å建订å) â âââââââââââââââ
ââââââââ¬âââââââ âââââââââââââââ
â ç¡®è®€æ¶æ¯(COMMIT) â æ¶æ¯ç¶æ: â
⌠ââââââââââââââââââââ> â "已确讀" â
âââââââââââââââ ââââââââ¬âââââââ
â 3.æäº€æ¬å° â â
â äºå¡ â âŒ
âââââââââââââââ âââââââââââââââ
â MESæ¶èŽ¹æ¶æ¯ â
â å建工å â
âââââââââââââââ
â ïž åŒåžž:æ¬å°äºå¡å€±èŽ¥ â äžå确讀 â RocketMQ忥 â 䞢åŒåæ¶æ¯
代ç 瀺äŸ:
@Transactional
public void createProductionOrder(Order order) {
// 1. åéåæ¶æ¯
TransactionSendResult result = rocketMQTemplate.sendMessageInTransaction(
"order-topic",
MessageBuilder.withPayload(order).build(),
order
);
// 2. æ§è¡æ¬å°äºå¡(å建订å)
orderRepository.save(order);
// 3. è¿åäºå¡ç¶æ
return LocalTransactionState.COMMIT_MESSAGE;
}
// äºå¡ç¶æåæ¥
@Override
public LocalTransactionState checkLocalTransaction(MessageExt msg) {
String orderId = msg.getKeys();
return orderRepository.existsById(orderId)
? LocalTransactionState.COMMIT_MESSAGE
: LocalTransactionState.ROLLBACK_MESSAGE;
}
4.5 Camel Saga æš¡åŒââé¿æµçšäžèŽæ§
éçš: è·š3䞪以äžç³»ç»çé¿æµçš(åŠ"订åâæçšâç产â莚æ£âå ¥åºâåŒç¥š")
æºå¶: å°å šå±äºå¡æå䞺å€äžªæ¬å°äºå¡,æ¯äžªæ¬å°äºå¡å¯¹åºäžäžªè¡¥å¿æäœ,å€±èŽ¥æ¶æéåé¡ºåºæ§è¡è¡¥å¿
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â ç产订å宿޿µçš(SagaçŒæ) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â â
â æ¥éª€1: ERPå建订å ââæåâââ¶ æ¥éª€2: MESå建工å â
â â â â
â ⌠⌠â
â è¡¥å¿: åæ¶è®¢å è¡¥å¿: åæ¶å·¥å â
â â
â æ¥éª€3: 产线ç产 ââæåâââ¶ æ¥éª€4: 莚æ£å®æ â
â â â â
â ⌠⌠â
â è¡¥å¿: æ¥åº/è¿å·¥ è¡¥å¿: æ è®°äžåæ Œ â
â â
â æ¥éª€5: æåå
¥åº ââæåâââ¶ æ¥éª€6: ERP莢å¡ç»ç® â
â â â â
â ⌠⌠â
â è¡¥å¿: é莧åºåº è¡¥å¿: å²é莢å¡åè¯ â
â â
â â ïž ä»»äžæ¥éª€å€±èŽ¥ â éåæ§è¡è¡¥å¿ â äžå¡åæ»å°åå§ç¶æ â
â â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
Camel Saga è·¯ç±ç€ºäŸ:
from("direct:startProductionFlow")
.saga()
.option("orderId", header("orderId"))
.to("saga:erp:createOrder")
.onFailure("saga:erp:cancelOrder")
.to("saga:mes:createWorkOrder")
.onFailure("saga:mes:cancelWorkOrder")
.to("saga:mes:startProduction")
.onFailure("saga:mes:reverseProduction")
.to("saga:wms:receiveFinishedGoods")
.onFailure("saga:wms:returnGoods")
.to("saga:erp:settleFinance")
.onFailure("saga:erp:reverseSettlement")
.end();
4.6 è¡¥å¿è®Ÿè®¡åå
è¡¥å¿äžæ¯ææ¯åæ»,æ¯äžå¡åæ»:
| æ£åæäœ | è¡¥å¿æäœ | äžå¡å«ä¹ |
|---|---|---|
| MES å建工å | MES åæ¶å·¥å | å·¥åäœåº,éæŸäº§èœ |
| WMS é¢çåºå | WMS éæŸé¢ç | åºåå¯çšéæ¢å€ |
| ERP æ£åä¿¡çš | ERP æ¢å€ä¿¡çš | 客æ·ä¿¡çšé¢åºŠæ¢å€ |
| QMS åèµ·äžåæ Œ | QMS æ€éäžåæ Œå | 莚éè®°åœäœåº |
è¡¥å¿è§å:
- è¡¥å¿å¿ é¡»æ¯äžå¡äžå¯çè§£çéåæäœ,èéæ°æ®åº DELETE
- è¡¥å¿å¯èœéšåæå(éè®°åœè¡¥å¿ç¶æ,人工ä»å ¥)
- è¡¥å¿æäœæ¬èº«å¿ é¡»å¹ç(å¯èœéå€è§Šå)
- è¡¥å¿äžèœæ ééåœ(æå€è¡¥å¿å°æµçšèµ·ç¹)
4.7 å¹çæ§è®Ÿè®¡
ææè·šç³»ç»åæäœå¿ é¡»æ¯æå¹ç,è¿æ¯ç¡®ä¿éè¯å®å šçåºçº¿ã
å¹çé®è§è: {äžå¡ç±»å}_{äžå¡ID}_{æäœç±»å}
- 瀺äŸ:
order_create_ORD-2026-0809-001
å®ç°æš¡åŒ:
public class IdempotentHandler {
public void handleOrder(OrderRequest request) {
String idempotentKey = request.getIdempotentKey();
// 1. æ£æ¥å¹çè®°åœ(Redis/DB)
if (idempotentRepository.exists(idempotentKey)) {
return; // å·²å€ç,çŽæ¥è¿å
}
// 2. æ§è¡äžå¡é»èŸ(æ¬å°äºå¡)
try {
businessLogic.execute(request);
// 3. è®°åœå¹ç(äžäžå¡åšåäžäºå¡äž)
idempotentRepository.save(idempotentKey, "SUCCESS");
} catch (Exception e) {
idempotentRepository.save(idempotentKey, "FAILED", e.getMessage());
throw e;
}
}
}
äºãæ¶æ¯éåäžäºä»¶æ å
5.1 äžå¡äºä»¶ vs æ°æ®åæŽäºä»¶
| ç±»å | ç€ºäŸ | æ¬æ¹æ¡ç«åº |
|---|---|---|
| æ°æ®åæŽäºä»¶ | orders衚 UPDATE status='CONFIRMED' | â äžæšè(æŽé²å éšå®ç°,è¯ä¹æš¡ç³) |
| äžå¡äºä»¶ | SalesOrderConfirmed | â æ å(衚蟟äžå¡äºå®,è¯ä¹æž æ°) |
5.2 Topic åœåè§è
åœåæ ŒåŒ:{domain}.{capability}.{event-name}
é¢ååçŒ:
sales. éå®é¢å
production. ç产é¢å
warehousing. ä»åšé¢å
quality. 莚éé¢å
procurement. éèŽé¢å
finance. 莢å¡é¢å
mdm. äž»æ°æ®
瀺äŸ:
sales.order-management.order-confirmed
sales.order-management.order-cancelled
production.work-order-management.work-order-scheduled
production.work-order-management.work-order-completed
warehousing.inventory-management.material-reserved
quality.incoming-inspection.material-accepted
äºå¡æ¶æ¯æ è®°:åçŒå .tx
äŸ:sales.order-management.order-confirmed.tx
5.3 äžå¡äºä»¶ Payload æ å(CloudEvents)
{
"specversion": "1.0",
"type": "sales.order-management.order-confirmed",
"source": "erp-order-service",
"id": "evt-uuid-v4",
"time": "2026-08-09T15:35:00+08:00",
"datacontenttype": "application/json",
"data": {
"eventId": "evt-uuid-v4",
"eventType": "ORDER_CONFIRMED",
"occurredAt": "2026-08-09T15:35:00+08:00",
"businessEntity": {
"entityType": "SALES_ORDER",
"entityId": "SO2026001",
"version": 2
},
"actor": {
"type": "USER",
"id": "U1001",
"name": "åŒ äž"
},
"payload": {
"before": { "status": "DRAFT" },
"after": {
"status": "CONFIRMED",
"confirmedAt": "2026-08-09T15:35:00+08:00",
"confirmedBy": "U1001",
"deliveryDate": "2026-08-20"
},
"changedAttributes": ["status", "confirmedAt", "confirmedBy", "deliveryDate"]
},
"correlation": {
"traceId": "trace-uuid",
"sagaTxId": "tx-uuid-v4",
"causationId": "cmd-uuid-v4"
}
}
}
5.4 æ¶æ¯äžéŽä»¶éåå³ç
| åºæ¯ | æšèåŒæ | çç± |
|---|---|---|
| ERPâMESå·¥å忥ãéèŽå ¥åºã莚éèåš | RocketMQ | äºå¡æ¶æ¯ä¿è¯è·šç³»ç»äžå¡äžèŽæ§ |
| å»¶è¿ä»»å¡(è¶ æ¶å®¡æ¹ã绎ä¿é¢èŠ) | RocketMQ | åçå»¶è¿æ¶æ¯æ¯æ |
| ITç³»ç»æ°æ®åºCDC忥尿°æ®äžå° | Kafka / RocketMQ | æCDCå·¥å ·éŸéå |
| ITç³»ç»åºçšæ¥å¿æ±è | Kafka / RocketMQ | ææ¥å¿ééå·¥å ·éŸéå |
| é«ååæ°æ®æµ(讟å€é¥æµãåæ) | Kafka | é«ååã倿¶è޹è |
æšè: 以 RocketMQ äœäžºäžå¡äºå¡æ¶æ¯äž»åŒæ,Kafka äœäžºæ°æ®æµåæ¥å¿èŸ å©åŒæã
å ãéæå¹³å°æ žå¿èœå
6.1 ç»äžAPIçœå ³(äžå¡å¥çºŠå®æ€è )
å屿¶æ:
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â 蟹çŒçœå
³ (Edge Gateway) â
â ⢠SSL ç»æ¢ / DDoS 鲿€ / WAF â
â ⢠å
šå±èŽèœœåè¡¡ / å°çäœçœ®è·¯ç± â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â äžå¡çœå
³ (Business Gateway) â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â äžå¡å¥çºŠå± â â
â â ⢠OpenAPI æ ¡éª(请æ±äœå¿
须笊åäžå¡å¥çºŠ) â â
â â ⢠äžå¡è¯ä¹æ ¡éª(åŠ:åæ¶è®¢åå¿
é¡»æäŸåæ¶åå ) â â
â â ⢠äžå¡è§å颿£(åŠ:订åå·²å莧äžå
è®žåæ¶) â â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â å®å
šäžæ²»çå± â â
â â ⢠OAuth2 / JWT è®€è¯ â â
â â â¢ æ°æ®æéèåŽæ ¡éª(X-Data-Scope) â â
â â â¢ éæµçæ(æäžå¡éèŠæ§å级) â â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â å议蜬æ¢å± â â
â â ⢠SOAP â REST / gRPC â HTTP â â
â â â¢ åæ®µæ å° / çŒç èœ¬æ¢ / è±æå å¯ â â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â æµé管çå± â â
â â ⢠ç°åºŠååž(æå®¢æ·/å·¥å/çŸåæ¯) â â
â â ⢠A/B æµè¯ / éäžéååž â â
â â â¢ çæ¬è·¯ç±(v1 / v2 å
±å) â â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
æ žå¿åèœ:
- ç»äžéŽæ:OAuth2.0 Tokenæ ¡éª,æ¯æå®¢æ·ç«¯åè¯åçšæ·Tokenäž€ç§æš¡åŒ
- æµé管æ§:ææ¥å£/è°çšæ¹ç»ŽåºŠéæµ,鲿¢åäžç³»ç»æå®äžæžž
- çæé级:äžæžžç³»ç»åŒåžžæ¶èªåšçæ,è¿åé级ååº,é¿å éªåŽ©
- å议蜬æ¢:SOAP/XMLçäŒ ç»åè®®èªåšèœ¬æ¢äžºREST/JSONæ 忥å£
- äžå¡å¥çºŠæ ¡éª:çœå ³åŒºå¶æ§è¡äžå¡è§å颿£
- å šéæ¥å¿:è®°åœææè¯·æ±/ååºæ¥å¿,å å«traceId
6.2 æå¡çŒæåŒæ(iPaaS + Camel)
æ··åæš¡åŒ:
- 䞻干æµçšçšçŒæ(Orchestration):ç¡®ä¿äžå¡å®æŽæ§,äœ¿çš Camel Saga / Temporal
- 忝ååºçšçŒè(Choreography):ä¿æç³»ç»èªæ²»æ§,䜿çšäºä»¶è®¢é
æ žå¿èœå:
- äœä»£ç å¯è§åé 眮跚系ç»è°çšéŸè·¯
- ææœåŒå段æ å°,èªåšå€çæ°æ®æ ŒåŒå·®åŒ
- å 眮䞻æµå¶é äžç³»ç»éé åš(SAP RFC/IDocãçšåU8+ãéè¶EASç)
- å 眮éè¯ãè¡¥å¿ãåèŠçç¥
- å°è·šç³»ç»å¯¹æ¥åšæä»1-2åšçŒ©çè³1-3倩
6.3 äž»æ°æ®ç®¡çäžå¿
æ°æ®äž»æåå: æ¯äžªäžå¡æ°æ®æäžåªæäžäžª"æåšæºç³»ç»"
| æ°æ®ç±»å | æåšæºç³»ç» | å ¶ä»ç³»ç»æé |
|---|---|---|
| ç©æäž»æ°æ® | MDM/PLM | åªè¯»åŒçš,çŠæ¢ä¿®æ¹ |
| 客æ·ä¿¡æ¯ | CRM | åªè¯»åŒçš |
| éå®è®¢å | ERP | MES/WMS åªè¯»å ³è |
| ç产工å | MES | ERP/WMS åªè¯»å ³è |
| åºåæ°é | WMS | ERP 读åçšäºèŽ¢å¡,çŠæ¢çŽæ¥æ¹ |
| 莚éå€å®ç»æ | QMS | MES/WMS æ ¹æ®ç»ææ§è¡åšäœ |
| äŸåºåä¿¡æ¯ | SRM/MDM | å šç³»ç»åªè¯»åŒçš |
äž»æ°æ®ååæµçš:
MDM/PLM åæŽç©æäž»æ°æ®
âââ ååžäžå¡äºä»¶:mdm.master-data.material-changed
âââ 订é
æ¹(ERP/MES/WMS/SRM)åèªæŽæ°æ¬å°å¯æ¬
äžãæ°æ®æµèœ¬è§è
7.1 åäžæ°æ®æºäžæåšç³»ç»
| æ°æ®ç±»å | æåšç³»ç» | æµèœ¬æ¹å |
|---|---|---|
| ç©æäž»æ°æ® | MDM/PLM | MDM â åæ¶èŽ¹ç³»ç» |
| BOM/å·¥èºè·¯çº¿ | PLM | PLM â ERP/MES |
| ç产订å | ERP | ERP â MES |
| 工忧è¡ç¶æ | MES | MES â ERP |
| å®å·¥/èŽšéæ°æ® | MES/QMS | MES â ERP/PLM |
| åºåååš | WMS | WMS â ERP/MES |
| 客æ·äž»æ°æ® | CRM | CRM â ERP/SCM |
| äŸåºåäž»æ°æ® | SRM | SRM â ERP |
7.2 æ žå¿äžå¡æ°æ®æµ
æ°æ®æµäž:ERP â MES(ç产订åäžå)ââäºå¡æ¶æ¯
| 屿§ | å 容 |
|---|---|
| è§Šå | ERPç产订åå建/åæŽ |
| æ°æ® | 订åå·ã产åçŒç ãæ°éãè®¡åæ¥æãBOMçæ¬ |
| æ¹åŒ | RocketMQäºå¡æ¶æ¯ |
| äžèŽæ§ | æç»äžèŽæ§(äºå¡æ¶æ¯ä¿è¯) |
| åŒåžž | MESæ§è¡å€±èŽ¥âè¡¥å¿/åæ» |
æ°æ®æµäº:MES â ERP(ç产å®å·¥åéŠ)ââäºå¡æ¶æ¯
| 屿§ | å 容 |
|---|---|
| è§Šå | å·¥åå®å·¥/éšåå®å·¥ |
| æ°æ® | å®å·¥æ°éãå·¥æ¶ãç©ææ¶èãèŽšéæ°æ® |
| æ¹åŒ | RocketMQäºå¡æ¶æ¯ |
| äžèŽæ§ | æç»äžèŽæ§ |
| åŒåžž | ERPæŽæ°å€±èŽ¥âéè¯âæ»ä¿¡â人工 |
æ°æ®æµäž:PLM â ERP/MES(BOMåæŽ)ââSagaçŒæ
| 屿§ | å 容 |
|---|---|
| è§Šå | PLM BOMååž/åæŽ |
| æ°æ® | ç©ææž åãçšéãæ¿ä»£æãçææ¥æ |
| æ¹åŒ | Camel SagaçŒæ(å ERPåMES) |
| äžèŽæ§ | Sagaæç»äžèŽæ§ |
| åŒåžž | ä»»äžç¯è倱莥âéåè¡¥å¿ |
å «ãæ²»çäžè¿ç»Žäœç³»
8.1 APIå šçåœåšæç®¡ç
- 建ç«å šäŒäžç»äžAPIèµäº§ç®åœ,æææ¥å£å¿ 须泚å
- å 嫿¥å£è¯ŽæãèŽèŽ£äººãè°çšå ³ç³»ãçæ¬ä¿¡æ¯
- æ°ç³»ç»æ¥å ¥åå¯å æ¥è¯¢æ¯åŠååšå¯å€çšæ¥å£
- æ¥å£åæŽéèµ°å®¡æ¹æµçš,èªåšéç¥ææäžæžžæ¶è޹æ¹
8.2 å šéŸè·¯çæ§
- éè¿ç»äžtraceIdäž²èè·šç³»ç»è°çšéŸè·¯
- æ žå¿æ¥å£è®Ÿçœ®SLAåèŠ(ååºæ¶éŽ>500msãé误ç>0.1%èªåšåèŠ)
- ææ¯æ :SkyWalking + ELK + Prometheus
8.3 对莊äžè¡¥å¿æºå¶
æ¥ç»å¯¹èŽŠæµçš:
- æååœæ¥äžå¡äºä»¶,äžåç³»ç»æ¬å°äžå¡è®°åœæ¯å¯¹
- åç°å·®åŒ:æŒåäºä»¶è¡¥åãé倿¶è޹å¹çå»éãç¶æäžäžèŽè§Šåè¡¥å¿
- çæå¯¹èŽŠæ¥å,æšéè¿ç»Žäººå
对莊绎床:
- 订å绎床:ERP订å vs MESå·¥å vs WMSåºå ¥åº
- åºå绎床:WMSå®ç©åºå vs ERP莢å¡åºå
- 莚é绎床:QMSæ£éªæ¹æ¬¡ vs MESçäº§æ¹æ¬¡
8.4 å®å šç®¡æ§
- æææ¥å£è°çšå¿ é¡»æºåžŠç»äžçŸåçToken
- æææ°æ®äŒ èŸå šçšå å¯
- ææå段(身仜è¯å·ãææºå·ãé¶è¡å¡å·)åšæ¥å¿äžèªåšè±æ
- æ žå¿æ¥å£è®¿é®æ¥å¿ä¿ç180倩满足çä¿å®¡è®¡
- å ³é®åæäœæ¥å£æ¯æè¯·æ±çŸå+æ¶éŽæ³æ ¡éª,é²éæŸæ»å»
8.5 åŒåžžå€çè§è
| åŒåžžç±»å | å€ççç¥ | çšæ·æç¥ |
|---|---|---|
| åæ°æ ¡éªå€±èŽ¥ | è¿å400,诎æå ·äœéè¯¯åæ®µ | æç€ºä¿®æ£ |
| äžå¡è§åå²çª | è¿å422,诎æå²çªåå | æç€ºäžå¡åŒåžž |
| äžæžžè¶ æ¶ | éè¯(ææ°éé¿,æå€3次) | æç€º"å€çäž,请çšåæ¥è¯¢" |
| äžæžžäžå¯çš | çæâæ»ä¿¡éåâåèŠ | æç€º"æå¡ç¹å¿,已记åœ,å°èªåšéè¯" |
| Sagaæ¥éª€å€±èŽ¥ | è§Šåéåè¡¥å¿ | æç€º"æµçšåŒåžž,已忻" |
| æªç¥åŒåžž | 宿޿¥å¿+åèŠ | æç€º"ç³»ç»åŒåžž,å·²éç¥ç®¡çå" |
ä¹ã宿œè·¯çº¿åŸ
9.1 åé¶æ®µè®¡å
| é¶æ®µ | åšæ | æ žå¿ä»»å¡ | 亀ä»ç© | éªæ¶æ å |
|---|---|---|---|---|
| äžãæ åå¶å® | 第1-2æ | æ¢³çæ žå¿äžå¡æµçš,ååé¢å蟹ç,å®ä¹ç¶ææº,å¶å®APIè§èãäºä»¶ç®åœ | ãäžå¡éæè§èV1.0ããäžå¡äºä»¶ç®åœV1.0ã | éè¿æ¶æè¯å®¡ |
| äºãå¹³å°å»ºè®Ÿ | 第2-3æ | éšçœ²APISIXãRocketMQãCamelãçæ§äœç³»,宿APIèµäº§çç¹ | å¯è¿è¡å¹³å° | å¹³å°å¯çšæ§â¥99.5% |
| äžãçæµçšè¯ç¹ | 第3-4æ | ERPâMES订åäžå(äºå¡æ¶æ¯)ãç产å®å·¥åéŠ | 2æ¡äºå¡æ¶æ¯æµ | äžèŽæ§èŸŸæãå»¶è¿<3s |
| åãé¿æµçšè¯ç¹ | 第4-6æ | 宿Žç产æµçšSagaçŒæ(订åâæçšâç产âå ¥åºâåŒç¥š)ãBOMåæŽèåš | 2æ¡Sagaæµçš | è¡¥å¿æºå¶éªè¯éè¿ |
| äºãäž»æ°æ®æ²»ç | 第6-8æ | èœå°äž»æ°æ®ç»äžç®¡æ§,å®ææ žå¿äž»æ°æ®æž æŽ | äž»æ°æ®äžå¿äžçº¿ | æ°æ®äžèŽæ§èŸŸ99% |
| å ãå šé¢æšå¹¿ | 第8-12æ | åç³»ç»å šéæ¥å ¥ãæµçšäžçº¿ãäœä»£ç çŒææšå¹¿ | å šç³»ç»èŠç | äžå¡å¯çšæ§â¥99.9% |
9.2 éæäŒå 级(以äžå¡ä»·åŒäžºå¯Œå)
| äŒå 级 | äžå¡åºæ¯ | æ¶åç³»ç» | ææ¯æš¡åŒ | äžå¡ä»·åŒ |
|---|---|---|---|---|
| P0 | ç产订åäžåäžæ§è¡ | ERPâMES | äºå¡æ¶æ¯ | æ¶é€è®¢åç¶æäžäžèŽ |
| P0 | ç产å®å·¥äžèŽ¢å¡ç»ç® | MESâERP | äºå¡æ¶æ¯ | 莊å®åæ¥,æ¶ç莢å¡å€±ç |
| P0 | BOMåæŽäžç©æéèŽ | PLMâERPâSCM | Saga | è®Ÿè®¡åæŽéç¯æçæé«40% |
| P1 | 订åå šæµçš | CRMâERPâMESâWMS | Saga | 订åå°äº€ä»å šéŸè·¯èޝé |
| P1 | 莚é远溯 | QMSâMESâPLM | äºå¡æ¶æ¯ | 莚éé®é¢éç¯è¿œæº¯ |
| P2 | äŸåºéŸåå | SCMâERPâWMS | Saga | äŸåºéŸååºæé |
9.3 ç»ç»ä¿é
- æç«è·šéšéšçæ°æ®æ²»çå§åäŒ,ç»äžåè°æ åèœå°
- æç¡®åç³»ç»äžå¡èŽèŽ£äººåææ¯èŽèŽ£äºº
- 建ç«éæéæ±è¯å®¡æºå¶,æ°å¯¹æ¥éæ±å¿ é¡»ç»è¿éæå¹³å°å¢éè¯å®¡
åãé¿åæå
| å | æ£ç¡®åæ³ |
|---|---|
| åŒºå¶æ¿æ¢åéç³»ç» | äŒå éè¿éæå¹³å°ååè®®éé ,é¿å å€§è§æš¡æ¹é 垊æ¥çäžå¡äžæ |
| äžååèŠæ±æææ¥å£å®æ¶åæ¥ | æäžå¡åºæ¯å¹é 忥æ¹åŒ,äœé¢æ°æ®çšæ¹é忥éäœç³»ç»èŽèœœ |
| è·³è¿èµäº§çç¹çŽæ¥å»ºè®Ÿ | å æžæž ç°ææ¥å£ãæ°æ®æµåãçç¹åºæ¯,æèœç²Ÿåå¹é éææ¹æ¡ |
| åªå ³æ³šææ¯å®ç° | äŒå 梳çè·šç³»ç»äžå¡æµçš,æç¡®äžå¡äºå¡äžèŽæ§èŠæ±,åå¶å®ææ¯æ å |
| æŽé²æ°æ®åºCRUDæ¥å£ | APIåœåäœç°äžå¡åšäœ,æ¶æ¯è¡šèŸŸäžå¡äºä»¶,éèå éšå®ç° |
| çŽæ¥ä¿®æ¹å¯¹æ¹ç³»ç»ç¶æ | åç³»ç»ç¶æèªæ²»,éè¿äžå¡äºä»¶åå忥 |
| è¡¥å¿çšæ°æ®åºDELETE | è¡¥å¿æ¯äžå¡åæ»(åŠ"åæ¶å·¥å"),äžæ¯ææ¯å é€ |
éåœ:æ žå¿åå鿥
| åå | 诎æ |
|---|---|
| API æ¯äžå¡åšäœ,éæ°æ®æäœ | çš confirm-order èé PUT /orders/{id}/status |
| æ¶æ¯æ¯äžå¡äºä»¶,éæ°æ®åæŽ | çš OrderConfirmed èé orders衚UPDATE |
| ç¶ææºåç³»ç»èªæ²» | ERPç"å·²äžèŸŸ" â MESç"å·²æäº§",éè¿äºä»¶åå |
| æ°æ®æäž»æ,åŒçšäžä¿®æ¹ | 客æ·ä¿¡æ¯æåšæºæ¯CRM,å ¶ä»ç³»ç»åªè¯»åŒçš |
| 倱莥å¯è¡¥å¿,äžå¯é圢 | äžå¡å€±èŽ¥å¿ é¡»èµ°è¡¥å¿æµçš,çŠæ¢éé»å¿œç¥ |
| çŒæäž»å¹²,çŒè忝 | æ žå¿æµçšçšSagaçŒæ,蟹çŒååºçšäºä»¶çŒè |
æ¬æ¹æ¡çæ žå¿ææ³: å¶é äžç³»ç»éæçæ¬èŽšæ¯äžå¡æµçšçè·šç³»ç»çŒæäžäžå¡ç¶æçè·šç³»ç»ååãææ¯(APIçœå ³ãæ¶æ¯éåãSagaçŒæ)æ¯ææ®µ,äžå¡(æµçšãè§åãç¶ææº)ææ¯ç®çãéè¿å¹³å°åæ ååäžå¡éæ,仿 ¹æ¬äžè§£å³ç³»ç»çå±ãéå€å»ºè®Ÿåå¯¹æ¥æ··ä¹±é®é¢,å®ç°è·šç³»ç»çäžå¡æµçšæ çŒååã
åŠææšæåšçäŒäžæ£é¢äžŽç±»äŒŒçç³»ç»éæå°å¢,ææç³»ç»éæãç»äžèº«ä»œè®€è¯çžå ³éæ±,欢è¿çèšæç§ä¿¡äº€æµã

477

被æå ç æ¡è¯è®º
䞺ä»ä¹è¢«æå ?



