From 93327134ed36b2b514ce12af9a5f6b0e773718ad Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 09 九月 2026 17:18:05 +0800
Subject: [PATCH] docs(bi): 添加决策模块重构设计文档与BPM审批流程部署脚本
---
docs/wm_stock_taking_result_approval_integration.md | 62 +
docs/sql/equipment_receipt.sql | 43 +
docs/wm_stock_taking_plan_auto_generate_integration.md | 63 +
docs/decision_module_redesign.md | 385 +++++++++++
docs/wm_stock_trace_gap_analysis.md | 103 +++
docs/wm_frontend_upgrade_progress.md | 60 +
docs/hrm_requirements_roadmap.md | 187 +++++
docs/sql/bpm_mes_wm_approval_flows.sql | 140 ++++
docs/sql/stock_taking_result_approval.sql | 16
docs/wm_equipment_receipt_integration.md | 92 ++
docs/wm_sn_item_chain_integration.md | 84 ++
docs/decision_module_frontend.md | 163 ++++
docs/sql/sn_item_chain.sql | 46 +
docs/wm_barcode_scan_render_integration.md | 68 ++
docs/wm_batch_code_requirements.md | 152 ++++
docs/hrm_training_and_expire_remind_integration.md | 175 +++++
docs/sql/stock_taking_plan_auto_generate.sql | 35 +
docs/machinery_equipment_material_inbound.md | 83 ++
docs/sql/equipment_material_stock_link.sql | 48 +
19 files changed, 2,005 insertions(+), 0 deletions(-)
diff --git a/docs/decision_module_frontend.md b/docs/decision_module_frontend.md
new file mode 100644
index 0000000..1c83fdf
--- /dev/null
+++ b/docs/decision_module_frontend.md
@@ -0,0 +1,163 @@
+# 鍐崇瓥妯″潡閲嶆瀯 - 鍓嶇鑱旇皟鏂规
+
+> 鐗堟湰锛歷1.0 锝� 鏃ユ湡锛�2026-09-09 锝� 鍚庣妯″潡锛歽udao-module-bi锛堝喅绛栨敮鎸侊級
+> 璇︾粏璁捐瑙� [decision_module_redesign.md](./decision_module_redesign.md)
+
+## 娑夊強椤甸潰
+
+- 鍐崇瓥鎬昏澶у睆锛坄/bi/decision-overview`锛�
+- 閲囪喘閿�鍞ぇ灞忥紙`/bi/purchase-sales`锛�
+- 浠撳簱澶у睆锛坄/bi/warehouse`锛�
+- 鐢熶骇璁惧澶у睆锛坄/bi/production-equipment`锛�
+- 璐ㄩ噺澶у睆锛坄/bi/quality`锛�
+- 鑳借�楃洃鎺уぇ灞忥紙`/bi/energy`锛屾柊澧烇級
+- 钀ラ攢瀹㈡埛澶у睆锛坄/bi/sales-customer`锛屾柊澧烇級
+- 鍐崇瓥 BI 澶у睆 / 鍥捐〃閰嶇疆绠$悊椤� / 鏁版嵁婧愰厤缃鐞嗛〉锛堟棦鏈夛級
+
+## API 鍙樻洿璇存槑
+
+鏈涓烘柊澧炴帴鍙o紝涓嶆敼鍔ㄦ棦鏈夋帴鍙g鍚嶃��
+
+### 1. KPI 鍘嗗彶蹇収瓒嬪娍锛堣秼鍔跨爺鍒わ級
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| GET | `/bi/decision/kpi/trend/{kpiCode}` | 鎸囧畾 KPI 鐨勫巻鍙插揩鐓у簭鍒楋紙鎶樼嚎鍥炬暟鎹簮锛� |
+
+**璇锋眰鍙傛暟锛圦uery锛夛細**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| kpiCode | String | 鏄� | KPI 缂栫爜锛堣涓嬫柟 KPI 娓呭崟锛� |
+| beginTime | String | 鍚� | 寮�濮嬫椂闂� `yyyy-MM-dd HH:mm:ss`锛岄粯璁よ繎 30 澶� |
+| endTime | String | 鍚� | 缁撴潫鏃堕棿锛岄粯璁ゅ綋鍓� |
+| periodType | String | 鍚� | 缁熻鍛ㄦ湡 hour/day/week/month锛岄粯璁� hour |
+
+**鍝嶅簲瀛楁锛�**
+
+```json
+{
+ "code": 0,
+ "data": {
+ "kpiCode": "device_operation_rate",
+ "kpiName": "寮�鏈虹巼",
+ "category": "device_operation",
+ "unit": "%",
+ "periodType": "hour",
+ "points": [
+ {"time": "2026-09-09T02:00:00", "value": 100.0000},
+ {"time": "2026-09-09T03:00:00", "value": 100.0000}
+ ]
+ }
+}
+```
+
+> 蹇収鐢卞畾鏃朵换鍔℃瘡灏忔椂鑱氬悎鍐欏叆锛孠PI 瀹氫箟鍚庨渶绛夊緟涓嬩竴鏁寸偣鑱氬悎鍑烘暟锛涙棤蹇収鏃� `points` 涓虹┖鏁扮粍銆�
+
+### 2. KPI 鐜瘮鐮斿垽
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| GET | `/bi/decision/kpi/compare/{kpiCode}` | 褰撳墠蹇収鍊艰緝涓婁竴鍛ㄦ湡鐨勫彉鍖栫巼鍙婅繎 24 鏈熺粺璁� |
+
+**鍝嶅簲瀛楁锛�**
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| currentValue / currentTime | Decimal / String | 鏈�杩戜竴鏈熷揩鐓у�间笌鏃堕棿 |
+| previousValue / previousTime | Decimal / String | 涓婁竴鏈熷揩鐓у�� |
+| changeRate | Decimal | 鐜瘮鍙樺寲鐜囷紙%锛夛紝涓婃湡涓嶅瓨鍦ㄦ垨涓� 0 鏃朵负 null |
+| avgValue / maxValue / minValue | Decimal | 杩� 24 鏈熷潎鍊�/鏈�澶�/鏈�灏� |
+| periodCount | int | 瀹為檯蹇収鏉℃暟 |
+
+### 3. 棰勬祴鐢熸垚锛堟墿灞曟ā鍨嬪弬鏁帮級
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| POST | `/bi/decision/forecast/generate` | 鐢熸垚棰勬祴锛屾柊澧� `model` 鍙傛暟 |
+
+**鏂板 Query 鍙傛暟锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| forecastCode | String | 鏄� | 棰勬祴缂栫爜锛堟部鐢級 |
+| model | String | 鍚� | 妯″瀷锛歋MA/WMA/LR/SEASONAL/YOY锛岀己鐪� SMA |
+| window | int | 鍚� | 绉诲姩骞冲潎绐楀彛锛岄粯璁� 12 |
+| period | int | 鍚� | 瀛h妭鍛ㄦ湡锛岄粯璁� 7 |
+
+### 4. 鍩轰簬 KPI 鍘嗗彶鐢熸垚棰勬祴
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| POST | `/bi/decision/forecast/generate-from-kpi` | 鐢� KPI 蹇収鍘嗗彶鎸夋ā鍨嬫粴鍔ㄩ娴嬫湭鏉� N 鏈� |
+
+**璇锋眰鍙傛暟锛圦uery锛夛細**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| kpiCode | String | 鏄� | 鐢ㄥ摢涓� KPI 鐨勫巻鍙插揩鐓ч娴� |
+| model | String | 鍚� | SMA/WMA/LR/SEASONAL/YOY锛岀己鐪� SMA |
+| window | int | 鍚� | 榛樿 12 |
+| period | int | 鍚� | 榛樿 7 |
+| periods | int | 鍚� | 棰勬祴鏈熸暟锛岄粯璁� 30锛屼笂闄� 90 |
+| intervalMinutes | int | 鍚� | 棰勬祴鐐归棿闅斿垎閽燂紝榛樿 360 |
+
+**鍝嶅簲锛�** 鐢熸垚鐨勯娴嬭褰曟暟锛坕nt锛�
+
+**娉ㄦ剰锛�** 鍘嗗彶蹇収涓嶈冻鏃惰繑鍥� `BI_FORECAST_NO_HISTORY` 閿欒鐮侊紙code 闈� 0锛夛紝鍓嶇闇�鎻愮ず"鏆傛棤鍘嗗彶鏁版嵁锛屾棤娉曢娴�"銆�
+
+### 5. 鏃㈡湁鎺ュ彛锛堟棤鍙樻洿锛�
+
+- `POST /bi/dashboard/{dashboardCode}/data` 鈥� 澶у睆鏁版嵁锛堟部鐢ㄦ棦鏈� `bi_dashboard_frontend.md` 鑱旇皟绾﹀畾锛�
+- `GET /bi/decision/forecast/list`銆乣POST /bi/decision/forecast/history`銆乣POST /bi/decision/forecast/generate-work-order`銆乣GET /bi/decision/alert/page` 绛�
+
+## KPI 缂栫爜娓呭崟锛堝墠绔睍绀虹敤锛�
+
+| 鍩� | KPI 缂栫爜 | 鍚嶇О | 鍗曚綅 |
+|----|----------|------|------|
+| energy | energy_telemetry_devices | 閬ユ祴鍦ㄩ噰璁惧鏁� | 鍙� |
+| energy | energy_telemetry_points | 鍦ㄩ噰娴嬬偣鎬绘暟 | 涓� |
+| energy | energy_anomaly_rate | 閬ユ祴寮傚父鐜� | % |
+| energy | energy_power_load | 瀹炴椂鍔熺巼璐熻嵎 | kW |
+| energy | energy_power_consumption | 鍛ㄦ湡鐢ㄧ數閲� | kWh |
+| device_operation | device_total / device_running | 璁惧鎬绘暟 / 杩愯璁惧鏁� | 鍙� |
+| device_operation | device_operation_rate | 寮�鏈虹巼 | % |
+| device_operation | device_avg_efficiency | 骞冲潎鐢熶骇鏁堢巼 | 浠�/鏃� |
+| device_operation | device_need_repair | 寰呯淮淇伐鍗曟暟 | 鍗� |
+| production | prod_work_order_total / prod_work_order_finish | 宸ュ崟鎬绘暟 / 绱浜ч噺 | 鍗� / 浠� |
+| production | prod_plan_achieve_rate / prod_feedback_qualified | 璁″垝杈炬垚鐜� / 鎶ュ伐鍚堟牸鐜� | % |
+| production | prod_daily_output | 浠婃棩浜ч噺 | 浠� |
+| quality | quality_iqc_pass_rate / quality_ipqc_pass_rate / quality_oqc_pass_rate | 鏉ユ枡/杩囩▼/鍑鸿揣鍚堟牸鐜� | % |
+| quality | quality_ncr_count | 涓嶅悎鏍煎搧鎶ュ憡鏁� | 鍗� |
+| procurement | pur_request_amount / pur_order_amount / pur_order_pending_in | 閲囪喘鐢宠/璁㈠崟閲戦銆佸緟鍏ュ簱閲� | 鍏� / 浠� |
+| procurement | stock_amount_value / stock_low_alert | 搴撳瓨璐у�� / 浣庡簱瀛樼墿鏂欐暟 | 鍏� / 涓� |
+| procurement | cost_payment_amount | 搴斾粯娆捐繎30澶� | 鍏� |
+| sales | sale_order_amount / crm_contract_amount / crm_receivable_amount | 閿�鍞鍗�/鍚堝悓/鍥炴閲戦 | 鍏� |
+| sales | crm_customer_count / srm_avg_score | 瀹㈡埛鏁� / 渚涘簲鍟嗚瘎鍒� | 涓� / 鍒� |
+| safety | safety_andon_count / safety_andon_unhandled | 瀹夌伅鎶ヨ鏁� / 鏈缃暟 | 娆� / 涓� |
+
+## 鏂板澶у睆 code 涓庢暟鎹甫鍏ヨ鏄�
+
+| dashboardCode | 鍚嶇О | 鏁版嵁甯﹀叆 / 鍒锋柊 |
+|---------------|------|------------------|
+| decision_overview | 鍐崇瓥鎬昏 | number/gauge 鍗$墖 5 鍒嗛挓鍒锋柊锛岃秼鍔挎姌绾� 10 鍒嗛挓鍒锋柊 |
+| energy | 鑳借�楃洃鎺� | 瀹炴椂鍗$墖 5 鍒嗛挓鍒锋柊锛涙棤鍔熺巼/鐢甸噺娴嬬偣鏃�"鍔熺巼璐熻嵎"鏄剧ず 0 |
+| sales_customer | 钀ラ攢瀹㈡埛 | 鎸囨爣鍗$墖 10 鍒嗛挓鍒锋柊 |
+
+> 澶у睆缁熶竴璧� `POST /bi/dashboard/{code}/data`锛宍position` 鐢� 12 鍒楁爡鏍硷紙`{x,y,w,h}`锛夛紝鍥捐〃绫诲瀷 number/gauge/line/bar 娓叉煋绾﹀畾涓庢棦鏈� `bi_dashboard_frontend.md` 涓�鑷淬��
+
+## 涓氬姟瑙勫垯璇存槑
+
+| 鍦烘櫙 | 瑙勫垯 |
+|------|------|
+| KPI 棣栨閰嶇疆 | 蹇収浠庝笅涓�涓暣鐐瑰紑濮嬭仛鍚堬紝瓒嬪娍鎺ュ彛鏆傜┖ |
+| 涓氬姟琛ㄦ棤鏁版嵁 | KPI 杩斿洖 0 鎴栫┖锛屼笉瑙嗕负寮傚父锛涜澶�/閬ユ祴褰撳墠鍗虫湁鐪熷疄鏁版嵁 |
+| 鑳借�楁棤鍔熺巼娴嬬偣 | 鍔熺巼璐熻嵎/鐢ㄧ數閲忚繑鍥� 0锛屽睘姝e父鍗犱綅锛涜ˉ鍏呭姛鐜囩被娴嬬偣鍚庤嚜鍔ㄥ嚭鍊� |
+| 棰勬祴鏃犲巻鍙� | 杩斿洖 `BI_FORECAST_NO_HISTORY`锛屽墠绔彁绀烘棤鍘嗗彶鏁版嵁 |
+| 棰勮鍘婚噸 | 鍚屼竴 KPI 宸叉湁鏈鐞嗛璀︽椂涓嶉噸澶嶇敓鎴愶紝浜哄伐澶勭悊鍚庢仮澶� |
+
+## 娉ㄦ剰浜嬮」
+
+- 鎸囨爣鍗�/浠〃鐩橀潰鏉垮缓璁"鍒嗙被"鍋� tab 鍒嗙粍锛堣兘鑰�/璁惧/鐢熶骇/璐ㄩ噺/閲囪喘/钀ラ攢/瀹夊叏锛夛紝鍏辩敤鍚屼竴濂楀崱鐗囩粍浠躲��
+- 棰勮涓績椤甸潰锛堟棦鏈夛級宸叉敮鎸佹湭澶勭悊璁℃暟涓庣‘璁�/澶勭悊鎿嶄綔锛屽彲鐩存帴澶嶇敤鏈 KPI 浣撶郴浜у嚭鐨� `bi_alert_record`銆�
+- 鏉冮檺鐐规部鐢ㄦ棦鏈夛細`bi:decision:kpi:query/update`銆乣bi:decision:alert:query/confirm/handle`锛屾柊鎺ュ彛涓嶆柊澧炴潈闄愶紝鏃犻渶鏀硅彍鍗曘��
\ No newline at end of file
diff --git a/docs/decision_module_redesign.md b/docs/decision_module_redesign.md
new file mode 100644
index 0000000..5897241
--- /dev/null
+++ b/docs/decision_module_redesign.md
@@ -0,0 +1,385 @@
+# 鍐崇瓥妯″潡閲嶆瀯璁捐鏂规
+
+> 鐗堟湰锛歷1.0 锝� 鏃ユ湡锛�2026-09-09 锝� 妯″潡锛歽udao-module-bi 鍐崇瓥鏀寔锛坉ecision锛�
+> 瀵归綈鐩爣锛氭暟鎹湅鏉夸笌澶氱淮搴︽姤琛ㄣ�佸疄鏃� KPI 鐩戞帶涓庡紓甯搁璀︺�佸巻鍙叉暟鎹┍鍔ㄧ殑璐熻嵎棰勬祴涓庡喅绛栫爺鍒�
+
+---
+
+## 涓�銆佽儗鏅笌鐩爣
+
+鐜版湁 `yudao-module-bi` 鍐崇瓥鏀寔瀛愭ā鍧楀凡鍏峰浠g爜楠ㄦ灦锛圞PI / 棰勮 / 棰勬祴 / 鐪嬫澘鍥涗釜鍩燂級锛屼絾**閰嶇疆鏁版嵁鍏ㄩ儴涓虹┖**锛坄bi_kpi_definition`銆乣bi_dashboard`銆乣bi_chart_config`銆乣bi_alert_rule`銆乣bi_forecast_data` 鍧囦负 0 鏉★級锛屽皻鏈笌绯荤粺涓氬姟鏁版嵁鎵撻�氥��
+
+鏈閲嶆瀯鍥寸粫涓夊ぇ涓氬姟鐩爣锛�
+
+| # | 鐩爣 | 钀藉湴褰㈡�� |
+|---|------|----------|
+| 1 | 鏁村悎鐢ㄧ數钀ラ攢銆佺敓浜ц繍缁淬�佺墿璧勯噰璐�佸簱瀛樸�佽兘鑰楃瓑鏍稿績鏁版嵁 | 閰嶇疆寮忓彲瑙嗗寲鐪嬫澘锛堝ぇ灞忥級+ 澶氱淮搴︽姤琛� |
+| 2 | 瀹炴椂鐩戞帶渚涚數閲忋�佽澶囪繍琛屻�佺敓浜ф晥鐜囥�佽川閲忋�佹垚鏈�佸畨鍏ㄧ瓑鏍稿績 KPI锛屽紓甯歌嚜鍔ㄩ璀� | KPI 鎸囨爣搴� + 蹇収鑱氬悎 + 棰勮瑙勫垯涓績 |
+| 3 | 鍩轰簬鍘嗗彶鏁版嵁寮�灞曡礋鑽烽娴嬨�侀渶姹傚垎鏋愩�佽秼鍔跨爺鍒� | Java 缁熻棰勬祴寮曟搸锛屾敮鎾戠數缃戣皟搴︺�佽繍缁磋鍒掋�侀噰璐瓥鐣ャ�佸鎴风粡钀ュ喅绛� |
+
+---
+
+## 浜屻�佺幇鐘跺垎鏋愪笌鏁版嵁鎽稿簳
+
+### 2.1 鐜版湁鍐崇瓥妯″潡楠ㄦ灦锛堜唬鐮佸凡灏辩华锛�
+
+| 鍩� | 琛� | 鏈嶅姟 | 鎺у埗鍣� | 澶囨敞 |
+|----|----|------|--------|------|
+| KPI 鎸囨爣瀹氫箟 | `bi_kpi_definition` | BiKpiDefinitionService | DecisionKpiDefinitionController | SQL 閰嶇疆寮忥紝`query_sql` 瀹炴椂鎵ц |
+| KPI 鑱氬悎灞曠ず | 鈥� | BiDecisionKpiService | DecisionKpiController | overview/detail/category/refresh |
+| 棰勮瑙勫垯 | `bi_alert_rule` | BiAlertRuleService | DecisionAlertRuleController | 闃堝�� + 姣旇緝绗� + 閫氱煡鏂瑰紡 |
+| 棰勮璁板綍 | `bi_alert_record` | BiAlertRecordService | DecisionAlertController | 鍒嗛〉/鏈鐞嗘暟/纭/澶勭悊 |
+| 璐熻嵎棰勬祴 | `bi_forecast_data` | BiForecastService | DecisionForecastController | 鐜颁负 SMA 绠�鍗曠Щ鍔ㄥ钩鍧囧崰浣嶏紝鏀寔鑱斿姩鐢熸垚宸ュ崟 |
+| 浠〃鐩� | `bi_dashboard` | DashboardService | DashboardController | 鎸� `{code}/data` 杩斿洖鍥捐〃鏁版嵁 |
+| 鍥捐〃閰嶇疆 | `bi_chart_config` | BiChartConfigService | BiChartConfigController | SQL + chartType + position + chartOptions |
+| 鏁版嵁婧愰厤缃� | `bi_data_source_config` | BiDataSourceConfigService | BiDataSourceConfigController | 澶氭暟鎹簮棰勭暀 |
+
+### 2.2 棰勮瀹氭椂浠诲姟锛堝凡瀛樺湪锛�
+
+`AlertEvaluationTask` 姣� 5 鍒嗛挓锛堝彲閰� `bi.alert.evaluation.interval`锛夋壂鎻忓惎鐢ㄩ璀﹁鍒� 鈫� 鎵ц KPI SQL 鈫� 涓庨槇鍊兼瘮杈� 鈫� 鐢熸垚棰勮璁板綍锛屽苟瀵瑰悓涓� KPI 鏈鐞嗛璀﹀幓閲嶃��
+
+### 2.3 涓氬姟鏁版嵁鎽稿簳锛坢om-xgdl 搴� 2026-09-09锛�
+
+| 鏁版嵁鍩� | 琛� | 鐜扮姸 | 璇存槑 |
+|--------|----|------|------|
+| 璁惧 | `mes_dv_machinery` | 1 鍙帮紙鐢熶骇鏈猴紝status=1锛屾晥鐜�100锛� | status锛�0-鍋� / 1-杩愯 |
+| 閬ユ祴 | `mes_dv_telemetry` | 296 鏉★紙4 鍙拌澶囷級 | 宸ヨ壓鍙傛暟锛堟俯搴�/鍖濇暟绛夛級锛屽惈 `whether_anomaly` 寮傚父鏍囧織銆乣telemetry_data_time`銆乣shift_name` |
+| 鐢熶骇 | `mes_pro_work_order / task / feedback` | 0 | 宸ュ崟/浠诲姟/鎶ュ伐 |
+| 璐ㄩ噺 | `mes_qc_iqc/ipqc/oqc/ncr` | 0 | 鏉ユ枡/杩囩▼/鍑鸿揣/涓嶅悎鏍煎搧 |
+| 搴撳瓨 | `mes_wm_material_stock/transaction` | 1+1 | 搴撳瓨浣欓 + 娴佹按 |
+| 瀹夌伅 | `mes_pro_andon_record` | 0 | 鐜板満寮傚父鍛煎彨锛堝畨鍏ㄧ洃鎺у叆鍙o級 |
+| 閲囪喘 | `erp_purchase_request/order` | 0 | 閲囪喘鐢宠/璁㈠崟 |
+| 閿�鍞� | `erp_sale_order` | 0 | 閿�鍞鍗� |
+| 璐㈠姟 | `erp_finance_receipt/payment` | 0 | 鏀舵/浠樻 |
+| 瀹㈡埛 | `crm_customer/contract/receivable` | 0 | 瀹㈡埛/鍚堝悓/鍥炴 |
+
+> **缁撹**锛氬綋鍓嶅浜庡紑鍙�/璇曡繍琛屽垵鏈燂紝涓氬姟鏁版嵁鏈摵寮�銆侹PI 鎸囨爣銆侀璀﹁鍒欍�佺湅鏉垮浘琛ㄤ竴寰嬫寜**鐪熷疄琛ㄧ粨鏋� + 鐪熷疄瀛楁**閰嶇疆锛屾暟鎹Н绱悗鑷姩鍑哄�硷紱璁惧杩愯涓庨仴娴嬪紓甯告寚鏍囧綋鍓嶅嵆鏈夌湡瀹炴暟鎹敮鎾戙��
+
+### 2.4 鍏抽敭鏁版嵁缂哄彛
+
+| 缂哄彛 | 鐜扮姸 | 鏈绛栫暐 |
+|------|------|----------|
+| 鑳借��/渚涚數閲忔暟鎹� | 鏃犵嫭绔嬬敤鐢甸噺璁板綍琛紱`mes_dv_telemetry` 涓哄伐鑹哄弬鏁伴仴娴嬶紝鏃犲姛鐜�/鐢甸噺鍙傛暟 | **浠庨仴娴嬪弬鏁拌仛鍚�**锛氭寜 `param_name` 鍖归厤 鍔熺巼/鐢甸噺/鐢垫祦 绫诲弬鏁拌仛鍚堬紱鏃犲尮閰嶅弬鏁版椂 KPI 杩斿洖 0 鍗犱綅骞朵繚鐣欐帴鍙� |
+| 瀹夊叏鏁版嵁 | 鏃犱簨鏁�/闅愭偅鍙拌处锛屼粎 `mes_pro_andon_record` 瀹夌伅璁板綍 | 瀹夊叏 KPI 鍩轰簬瀹夌伅璁板綍锛堟暟閲�/鏈缃暟锛夛紝闅愭偅鍙拌处鐣欏緟鍚庣画 |
+| KPI 鍘嗗彶 | 鏃犲巻鍙插�煎瓨鍌紝鏃犳硶鍋氳秼鍔�/鍚屾瘮鐜瘮/棰勬祴 | **鏂板 `bi_kpi_value_history` 蹇収琛� + 瀹氭椂鑱氬悎浠诲姟** |
+
+---
+
+## 涓夈�佹�讳綋鏋舵瀯璁捐
+
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 绠$悊灞傦紙澶у睆/鎶ヨ〃锛� 鈹�
+鈹� bi_dashboard {code}/data 鈫� 閰嶇疆寮忓ぇ灞忥紙閲囪喘閿�鍞�/浠撳簱/鐢熶骇璁惧 鈹�
+鈹� /璐ㄩ噺/鑳借��/钀ラ攢 + 鍐崇瓥鎬昏锛� 鈹�
+鈹� 澶氱淮搴︽姤琛細鎸� 鏃堕棿 / 杞﹂棿 / 璁惧绫诲瀷 / 鐗╂枡鍒嗙被 / 瀹㈡埛 / 渚涘簲鍟� 鈹�
+鈹� 浜ゅ弶鍒嗘瀽锛堟柊澧� /bi/decision/report 姹囨�绘帴鍙o級 鈹�
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 鐩戞帶灞傦紙KPI + 棰勮锛� 鈹�
+鈹� bi_kpi_definition锛圫QL 鎸囨爣搴擄級 鈹�
+鈹� 鈹溾攢鈹� 瀹炴椂灞傦細BiDecisionKpiService 鎸夐渶瀹炴椂鎵ц SQL 鈹�
+鈹� 鈹溾攢鈹� 蹇収灞傦細锛堟柊澧烇級KpiSnapshotTask 瀹氭椂鍐欏叆 bi_kpi_value_history鈹�
+鈹� 鈹斺攢鈹� 棰勮灞傦細AlertEvaluationTask 璇勪及 bi_alert_rule 鈫� bi_alert_record鈹�
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 鍐崇瓥灞傦紙棰勬祴/鐮斿垽锛� 鈹�
+鈹� BiForecastEngine锛堢粺璁¢娴嬪紩鎿庯細SMA/WMA/绾挎�у洖褰�/鍚屾瘮鐜瘮/瀛h妭鎸囨暟锛夆攤
+鈹� 鈹溾攢鈹� 鍩轰簬 bi_kpi_value_history 鐨� KPI 瓒嬪娍棰勬祴锛堣礋鑽�/浜ч噺/閲囪喘/鍥炴锛夆攤
+鈹� 鈹斺攢鈹� 鑱斿姩锛氶娴嬬粨鏋� 鈫� 鐢熸垚鐢熶骇宸ュ崟锛堝鐢� generate-work-order锛� 鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+### 3.1 鍒嗗眰鑱岃矗
+
+| 灞� | 杈撳叆 | 澶勭悊 | 杈撳嚭 |
+|----|------|------|------|
+| 鏁版嵁鎺ュ叆 | 鍚勪笟鍔¤〃锛坢es/erp/crm/srm锛�+ 閬ユ祴 | 璺ㄦā鍧� SQL锛堝崟搴� JdbcTemplate锛� | KPI 褰撳墠鍊� |
+| 鐩戞帶 | KPI 鎸囨爣搴� | 瀹炴椂鏌ヨ + 瀹氭椂蹇収 + 闃堝�艰瘎浼� | overview / 蹇収鍘嗗彶 / 棰勮璁板綍 |
+| 鍐崇瓥 | 蹇収鍘嗗彶 | 缁熻棰勬祴寮曟搸 | 棰勬祴搴忓垪 + 缃俊鍖洪棿 + 宸ュ崟鑱斿姩 |
+| 灞曠ず | 鐪嬫澘/鍥捐〃閰嶇疆 | 閰嶇疆椹卞姩缁勮 | 澶у睆 / 鎶ヨ〃 |
+
+### 3.2 瀹炴椂鎬ц璁�
+
+| 灞傜骇 | 鏈哄埗 | 鍛ㄦ湡 |
+|------|------|------|
+| KPI 瀹炴椂鏌ヨ | 鍓嶇鎸� `refreshInterval` 璋� `overview/{kpiCode}` | 鎸夐渶 |
+| KPI 蹇収 | 鏂板 `KpiSnapshotTask` 鑱氬悎鑷� `bi_kpi_value_history` | 榛樿 1 灏忔椂锛堝彲閰� `bi.kpi.snapshot.interval`锛� |
+| 棰勮璇勪及 | 鐜版湁 `AlertEvaluationTask` | 榛樿 5 鍒嗛挓锛堝彲閰� `bi.alert.evaluation.interval`锛� |
+| 閬ユ祴寮傚父 | 鐩存帴鑱氬悎 `mes_dv_telemetry.whether_anomaly` | 闅忓揩鐓� |
+
+---
+
+## 鍥涖�並PI 鎸囨爣浣撶郴璁捐
+
+缁熶竴缂栫爜瑙勫垯锛歚{鍩熺畝绉皚_{鎸囨爣鑻辨枃}`锛屽叡 7 绫伙紙category 鎵╁睍鍘熸敞閲婃灇涓撅級銆�
+
+### 4.1 鍩熷垝鍒嗕笌鎸囨爣娓呭崟
+
+#### A. 渚涚數鐢甸噺 / 鑳借�楀煙锛坈ategory = `energy`锛�
+
+| code | 鍚嶇О | 鍗曚綅 | 鏁版嵁鏉ユ簮 SQL 閫昏緫 |
+|------|------|------|--------------------|
+| energy_telemetry_devices | 閬ユ祴鍦ㄩ噰璁惧鏁� | 鍙� | `COUNT(DISTINCT tb_device_id)` from mes_dv_telemetry锛堣繎24h锛� |
+| energy_telemetry_points | 鍦ㄩ噰娴嬬偣鎬绘暟 | 涓� | `COUNT(*)` from mes_dv_telemetry锛堣繎24h锛� |
+| energy_anomaly_rate | 閬ユ祴寮傚父鐜� | % | `SUM(whether_anomaly)/COUNT(*)` 杩�24h |
+| energy_power_load | 瀹炴椂鍔熺巼璐熻嵎 | kW | `SUM(timely_value)` where param_name like '%鍔熺巼%'锛堟棤鍙傛暟杩斿洖0鍗犱綅锛� |
+| energy_power_consumption | 鍛ㄦ湡鐢ㄧ數閲� | kWh | 鑱氬悎鐢靛害绫诲弬鏁板樊鍊硷紙棰勭暀妯″瀷锛屾湰鏈熷崰浣嶏級 |
+
+#### B. 璁惧杩愯鍩燂紙category = `device_operation`锛�
+
+| code | 鍚嶇О | 鍗曚綅 | SQL 閫昏緫 |
+|------|------|------|----------|
+| device_total | 璁惧鎬绘暟 | 鍙� | `COUNT(*)` from mes_dv_machinery |
+| device_running | 杩愯璁惧鏁� | 鍙� | `COUNT(*) where status=1` |
+| device_operation_rate | 寮�鏈虹巼 | % | 杩愯 / 鎬绘暟 |
+| device_avg_efficiency | 骞冲潎鐢熶骇鏁堢巼 | 浠�/鏃� | `AVG(production_efficiency)` |
+| device_need_repair | 寰呯淮淇伐鍗� | 涓� | `COUNT(*) where status<缁堟�乣 from mes_dv_repair |
+| device_overdue_mainten | 鍒版湡鏈繚鍏昏澶� | 鍙� | `last_mainten_time < 璁″垝鍛ㄦ湡`锛堥鐣欙紝杩斿洖0锛� |
+
+#### C. 鐢熶骇鏁堢巼鍩燂紙category = `production`锛�
+
+| code | 鍚嶇О | 鍗曚綅 | SQL 閫昏緫 |
+|------|------|------|----------|
+| prod_work_order_total | 宸ュ崟鎬绘暟 | 鍗� | `COUNT(*)` from mes_pro_work_order锛堣繎30澶╋級 |
+| prod_work_order_finish | 瀹屽伐宸ュ崟鏁� | 鍗� | `status=宸插畬宸 |
+| prod_plan_achieve_rate | 宸ュ崟璁″垝杈炬垚鐜� | % | 瀹屽伐閲忎箣鍜� / 璁″垝閲忎箣鍜� |
+| prod_feedback_qualified | 鎶ュ伐鍚堟牸鐜� | % | SUM(qualified)/SUM(feedback) from mes_pro_feedback |
+| prod_daily_output | 鏃ヤ骇閲� | 浠� | SUM(feedback_quantity) 褰撴棩 |
+| prod_task_duration | 宸ュ崟骞冲潎宸ユ湡 | 澶� | AVG(duration) from mes_pro_task |
+
+#### D. 璐ㄩ噺鍩燂紙category = `quality`锛�
+
+| code | 鍚嶇О | 鍗曚綅 | SQL 閫昏緫 |
+|------|------|------|----------|
+| quality_iqc_pass_rate | 鏉ユ枡妫�楠屽悎鏍肩巼 | % | SUM(qualified)/SUM(check) from mes_qc_iqc |
+| quality_ipqc_pass_rate | 杩囩▼妫�楠屽悎鏍肩巼 | % | from mes_qc_ipqc |
+| quality_oqc_pass_rate | 鍑鸿揣妫�楠屽悎鏍肩巼 | % | from mes_qc_oqc |
+| quality_ncr_count | 涓嶅悎鏍煎搧鎶ュ憡鏁� | 鍗� | `COUNT(*)` from mes_qc_ncr |
+
+#### E. 鐗╄祫閲囪喘 / 鎴愭湰鍩燂紙category = `procurement`锛�
+
+| code | 鍚嶇О | 鍗曚綅 | SQL 閫昏緫 |
+|------|------|------|----------|
+| pur_request_amount | 閲囪喘鐢宠閲戦锛堣繎30澶╋級 | 鍏� | `SUM(total_price)` from erp_purchase_request |
+| pur_order_amount | 閲囪喘璁㈠崟閲戦锛堣繎30澶╋級 | 鍏� | `SUM(total_price)` from erp_purchase_order |
+| pur_order_pending_in | 寰呭叆搴撻噰璐噺 | 浠� | `SUM(total_count-in_count)` from erp_purchase_order |
+| stock_amount_value | 搴撳瓨璐у�� | 鍏� | `SUM(stock.quantity*item.cost_price)` from mes_wm_material_stock join mdm_item |
+| stock_low_alert | 搴撳瓨浣庝簬瀹夊叏搴撳瓨鐗╂枡鏁� | 涓� | `quantity < item.safety_stock` |
+| cost_payment_amount | 搴斾粯娆撅紙杩�30澶╋級 | 鍏� | `SUM(payment_price)` from erp_finance_payment |
+
+#### F. 鐢ㄧ數钀ラ攢 / 瀹㈡埛缁忚惀鍩燂紙category = `sales`锛�
+
+| code | 鍚嶇О | 鍗曚綅 | SQL 閫昏緫 |
+|------|------|------|----------|
+| sale_order_amount | 閿�鍞鍗曢噾棰濓紙杩�30澶╋級 | 鍏� | `SUM(total_price)` from erp_sale_order |
+| crm_contract_amount | 鍚堝悓绛捐閲戦 | 鍏� | `SUM(total_price)` from crm_contract锛堝鏍搁�氳繃锛� |
+| crm_receivable_amount | 瀹為檯鍥炴閲戦 | 鍏� | `SUM(price)` from crm_receivable |
+| crm_customer_count | 瀹㈡埛鎬绘暟 | 涓� | `COUNT(*)` from crm_customer |
+| crm_receivable_overdue | 閫炬湡鏈洖娆鹃噾棰� | 鍏� | 浣i噾璁″垝 `receivable_plan` 瓒� return_time 鏈洖 |
+| srm_avg_score | 渚涘簲鍟嗗钩鍧囩患鍚堣瘎鍒� | 鍒� | `AVG(composite_score)` from srm_supplier_evaluation |
+
+#### G. 瀹夊叏鍩燂紙category = `safety`锛�
+
+| code | 鍚嶇О | 鍗曚綅 | SQL 閫昏緫 |
+|------|------|------|----------|
+| safety_andon_count | 瀹夌伅鎶ヨ鏁帮紙杩�30澶╋級 | 娆� | `COUNT(*)` from mes_pro_andon_record |
+| safety_andon_unhandled | 鏈缃畨鐏暟 | 涓� | `COUNT(*) where status=鏈缃甡 |
+
+### 4.2 缁村害璁捐
+
+| 缁村害 | 鏉ユ簮 | 鐢ㄩ�� |
+|------|------|------|
+| 鏃堕棿 | 鏃� / 鍛� / 鏈� / 骞� | 鍏ㄩ儴鎸囨爣瓒嬪娍 |
+| 杞﹂棿 | `mes_dv_machinery.workshop_id`銆乣mes_pro_work_order` | 璁惧/鐢熶骇 |
+| 璁惧绫诲瀷 | `mes_dv_machinery_type` | 璁惧/鑳借�� |
+| 鐗╂枡鍒嗙被 | `mdm_item` 鍒嗙被 | 閲囪喘/搴撳瓨 |
+| 瀹㈡埛 | `crm_customer` | 钀ラ攢/鍥炴 |
+| 渚涘簲鍟� | `srm_supplier` / `erp_supplier` | 閲囪喘/鎴愭湰 |
+
+---
+
+## 浜斻�並PI 鍘嗗彶蹇収涓庤仛鍚堬紙鏈鏂板锛�
+
+### 5.1 鏂板琛� `bi_kpi_value_history`
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| id | bigint | 涓婚敭 |
+| kpi_id | bigint | 鍏宠仈 bi_kpi_definition.id |
+| kpi_code | varchar(64) | KPI 缂栫爜锛堝啑浣欙級 |
+| kpi_name | varchar(128) | KPI 鍚嶇О锛堝啑浣欙級 |
+| category | varchar(32) | 鍒嗙被 |
+| kpi_value | decimal(18,4) | 蹇収鍊� |
+| snapshot_time | datetime | 蹇収鏃堕棿鐐癸紙鏁寸偣锛� |
+| period_type | varchar(16) | 缁熻鍛ㄦ湡锛歨our/day/week/month |
+| dimension_value | varchar(64) | 涓氬姟缁村害鍊硷紙棰勭暀锛岄粯璁� all锛� |
+| remark | varchar(255) | 澶囨敞 |
+| 瀹¤瀛楁 | 鈥� | creator/create_time/updater/update_time/deleted |
+
+绱㈠紩锛歚idx_kpi_time(kpi_code, snapshot_time)`锛宍idx_category_time(category, snapshot_time)`銆�
+
+### 5.2 鏂板鑱氬悎浠诲姟 `KpiSnapshotTask`
+
+- 瀹氭椂锛堥粯璁ゆ瘡灏忔椂 `0 0 * * * *`锛屽彲閰� `bi.kpi.snapshot.cron`锛夋壂鎻� `status=1` 鐨� KPI 瀹氫箟
+- 鎵ц姣忔潯 `query_sql` 鍙栧綋鍓嶅�硷紝鍐欏叆 `bi_kpi_value_history`
+- 鍚屽悕 KPI 鍚屼竴鏁寸偣鍘婚噸锛堣鐩栧紡鏇存柊鎴栬烦杩囧幓閲嶏紝鍙栨渶鏂帮級
+- 澶辫触 SQL 璁版棩蹇楅檷绾э紝涓嶄腑鏂暣浣�
+
+### 5.3 鏂板鏌ヨ鎺ュ彛锛堣秼鍔跨爺鍒わ級
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| GET | `/bi/decision/kpi/trend/{kpiCode}?beginTime=&endTime=&periodType=` | KPI 鍘嗗彶蹇収瓒嬪娍锛堜緵鎶ヨ〃/澶у睆鎶樼嚎锛� |
+| GET | `/bi/decision/kpi/compare/{kpiCode}` | 鍚屾瘮鐜瘮锛堣緝涓婃湀/鍘诲勾鍚屾湡锛夛紝鍩轰簬蹇収 |
+
+---
+
+## 鍏�侀璀﹁鍒欎綋绯�
+
+### 6.1 瑙勫垯閰嶇疆锛堟湰娆¤惤搴撶ず渚嬶級
+
+| KPI | 瑙勫垯 | 绾у埆 | 闃堝�� | 姣旇緝绗� |
+|-----|------|------|------|--------|
+| energy_anomaly_rate | 閬ユ祴寮傚父鐜囪繃楂� | 璀﹀憡 | 5 (%) | >= |
+| device_operation_rate | 寮�鏈虹巼杩囦綆 | 涓ラ噸 | 60 (%) | < |
+| device_avg_efficiency | 璁惧鏁堢巼杩囦綆 | 璀﹀憡 | 80 (浠�/鏃�) | < |
+| quality_oqc_pass_rate | 鍑鸿揣妫�楠屽悎鏍肩巼杩囦綆 | 涓ラ噸 | 95 (%) | < |
+| stock_low_alert | 搴撳瓨浣庝簬瀹夊叏搴撳瓨鐗╂枡鏁拌秴闄� | 涓ラ噸 | 10 (涓�) | > |
+| safety_andon_unhandled | 鏈缃畨鐏寔缁疮绉� | 绱ф�� | 1 (涓�) | > |
+| crm_receivable_overdue | 閫炬湡鍥炴閲戦杩囧ぇ | 涓ラ噸 | 500000 (鍏�) | > |
+
+> 闃堝�间粎涓哄垵濮嬪缓璁�硷紝涓婄嚎鍚庢寜瀹為檯姘村钩璋冩暣銆俙notificationType` 缁熶竴閰嶇疆涓� `system`锛堢珯鍐呬俊/寰呭姙闆嗘垚锛屽悗缁墿灞� message/email锛夈��
+
+### 6.2 棰勮鐢熷懡鍛ㄦ湡
+
+```
+瑙勫垯鍚敤 鈫� 瀹氭椂璇勪及锛�5min锛夆啋 鍛戒腑闃堝�� 鈫� 鐢熸垚 bi_alert_record(status=0)
+鈫� 鍓嶇"棰勮涓績"灞曠ず + 鏈鐞嗚鏁� 鈫� 纭(confirm) / 澶勭悊(handle) 鈫� 鍏抽棴
+```
+
+鍘婚噸绛栫暐锛氬悓涓� KPI 瀛樺湪鏈鐞嗛璀︽椂涓嶅啀閲嶅鐢熸垚锛堢幇鏈夐�昏緫锛夈��
+
+---
+
+## 涓冦�佽兘鑰�/渚涚數閲忚仛鍚堟柟妗堬紙浠庨仴娴嬪弬鏁拌仛鍚堬級
+
+### 7.1 澶勭悊鍘熷垯
+
+- 浠� `mes_dv_telemetry` 涓哄敮涓�瀹炴椂鑳借�楁潵婧愶紝鎸� `param_name` 鐗瑰緛鍖归厤鑳藉姏鍙傛暟锛�
+ - 鍔熺巼绫伙細`param_name LIKE '%鍔熺巼%'` 鈫� `energy_power_load`锛堝疄鏃跺姛鐜囷紝kW锛�
+ - 鐢甸噺绫伙細`param_name LIKE '%鐢甸噺%' OR '%鐢ㄧ數%' OR '%鐢靛害%'` 鈫� 鐢甸噺閲囬泦锛堥鐣欙級
+ - 鐢垫祦/鐢靛帇绫伙細`%鐢垫祦%`銆乣%鐢靛帇%` 鈫� 鐢佃兘璐ㄩ噺杈呭姪鎸囨爣
+- 褰撳墠娴嬬偣鏃犺兘鍔涘弬鏁版椂锛岀浉鍏� KPI 杩斿洖 0 / 鏃犳暟鎹崰浣嶏紝**涓嶄吉閫犳暟鎹�**锛屽緟娴嬬偣琛ュ厖鍚庤嚜鍔ㄥ嚭鍊笺��
+
+### 7.2 鑳借�楄仛鍚堟ā鍨嬶紙鏈钀藉湴锛�
+
+| 鎸囨爣 | 鑱氬悎鍙e緞 |
+|------|----------|
+| 瀹炴椂鍔熺巼璐熻嵎 | 褰撳墠鎵规 `timely_value` 姹傚拰锛屾寜璁惧 |
+| 鐝鑳借�椾及绠� | 鎸� `shift_name` 鍒嗙粍 `AVG(timely_value)` 脳 杩愯鏃堕暱锛堥鐣欙級 |
+| 鏃ョ敤鐢甸噺 | 鐢靛害绫诲弬鏁� `max_value-min_value` 璺ㄦ棩鍥炲樊锛堥鐣欐ā鍨嬶紝琛ㄧ粨鏋勫氨缁級 |
+
+---
+
+## 鍏�丣ava 缁熻棰勬祴寮曟搸璁捐
+
+### 8.1 妯″瀷搴擄紙鏈钀藉湴锛�
+
+| 妯″瀷 | 绠楁硶 | 閫傜敤鍦烘櫙 | 瀹炵幇 |
+|------|------|----------|------|
+| SMA | 绠�鍗曠Щ鍔ㄥ钩鍧囷紙绐楀彛 12锛� | 骞崇ǔ搴忓垪 | 鐜版湁閫昏緫淇濈暀 |
+| WMA | 鍔犳潈绉诲姩骞冲潎锛堣繎鏈熸潈閲嶉�掑锛� | 鏈夎交寰秼鍔� | 鏂板 |
+| LR | 涓�鍏冪嚎鎬у洖褰掞紙鏈�灏忎簩涔橈級 | 绾挎�ц秼鍔匡紙浜ч噺/閲囪喘/鍥炴锛� | 鏂板 |
+| SEASONAL | 瀛h妭鎸囨暟锛堟寜鍛ㄦ湡褰掍竴鍖栵級 | 鍛ㄦ湡鎬ц礋鑽� | 鏂板 |
+| YOY/QOQ | 鍚屾瘮/鐜瘮澶栨帹 | 钀ラ攢绫诲揩閫熼浼� | 鏂板 |
+
+### 8.2 寮曟搸缁撴瀯
+
+```
+BiForecastEngine锛堟柊澧烇紝绾� Java 宸ュ叿绫伙級
+ 鈹溾攢 sma(List<BigDecimal>, window)
+ 鈹溾攢 wma(List<BigDecimal>, window)
+ 鈹溾攢 linearRegression(List<BigDecimal>) 鈫� slope/intercept/棰勬祴涓婲鏈�
+ 鈹溾攢 seasonalIndex(List<BigDecimal>, period) 鈫� 瀛h妭鍥犲瓙 + 鍘诲鑺傞娴�
+ 鈹斺攢 forecastByModel(code, modelType, data, periods) 鈫� 缁熶竴鍑哄彛
+```
+
+### 8.3 鎺ュ彛鎵╁睍锛圔iForecastService + Controller锛�
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| GET | `/bi/decision/kpi/trend/{kpiCode}?beginTime=&endTime=&periodType=` | KPI 鍘嗗彶蹇収瓒嬪娍鍙栨暟锛堝杺缁欏紩鎿庯級 |
+| POST | `/bi/decision/forecast/generate` 鎵╁睍鍙傛暟 `model=SMA\|WMA\|LR\|SEASONAL` + `periods=` | 鎸夋ā鍨嬬敓鎴愰娴嬶紝钀� `bi_forecast_data` |
+| POST | `/bi/decision/forecast/generate-from-kpi?kpiCode=&model=&periods=` | 浠� KPI 蹇収鍘嗗彶鐢熸垚棰勬祴锛堣礋鑽�/浜ч噺/閲囪喘/鍥炴锛� |
+| POST | `/bi/decision/forecast/generate-work-order` | 棰勬祴鑱斿姩鍒涘缓鐢熶骇宸ュ崟锛堢幇鏈夛紝寤剁画锛� |
+
+棰勬祴缁撴灉瀛楁娌跨敤 `bi_forecast_data`锛歠orecast_value / lowerBound / upperBound / confidenceLevel(95%) / modelVersion锛堝 `v2.0-lr`锛夈��
+
+### 8.4 鍐崇瓥鏀拺鍦烘櫙鏄犲皠
+
+| 鍐崇瓥鍦烘櫙 | 棰勬祴瀵硅薄 | 鏁版嵁婧� | 杈撳嚭 |
+|----------|----------|--------|------|
+| 鐢电綉璋冨害/浜ц兘鎺掔▼ | 鏃ヤ骇閲忋�佸伐鍗曡礋鑽� | prod_daily_output 蹇収 | 鏈潵 7/30 澶╀骇閲忛娴� |
+| 杩愮淮璁″垝 | 璁惧鏁堢巼銆佸紓甯哥巼 | device_avg_efficiency銆乪nergy_anomaly_rate | 寮傚父瓒嬪娍棰勮 |
+| 閲囪喘绛栫暐 | 閲囪喘閲戦銆佸簱瀛樺懆杞� | pur_order_amount銆乻tock_low_alert | 涓嬫湀閲囪喘閲忛娴� |
+| 瀹㈡埛缁忚惀 | 鍥炴銆佸悎鍚� | crm_receivable_amount | 涓嬫湀鍥炴棰勬祴 |
+
+---
+
+## 涔濄�佺湅鏉夸笌澶氱淮搴︽姤琛ㄦ柟妗�
+
+### 9.1 鐪嬫澘甯冨眬锛坆i_dashboard + bi_chart_config 钀藉簱锛�
+
+| code | 鍚嶇О | 瑕嗙洊鍥捐〃锛坈hart_config锛� |
+|------|------|--------------------------|
+| decision_overview | 鍐崇瓥鎬昏澶у睆 | 鏍稿績 KPI 鍗$墖锛坣umber锛�+ 鍚勫煙瓒嬪娍鎶樼嚎 |
+| purchase_sales | 閲囪喘閿�鍞ぇ灞� | 閲囪喘閲戦瓒嬪娍/閿�鍞鍗曡秼鍔�/鏉ョエ棰�/鍥炴锛堟部鐢ㄦ棦鏈� code锛� |
+| warehouse | 浠撳簱澶у睆 | 搴撳瓨璐у��/浣庡簱瀛�/鍑哄叆搴撴祦姘�/搴撲綅鍒嗗竷 |
+| production_equipment | 鐢熶骇璁惧澶у睆 | 璁惧寮�鏈虹巼/鏁堢巼/宸ュ崟杈炬垚鐜�/浜ч噺瓒嬪娍/閬ユ祴寮傚父 |
+| quality | 璐ㄩ噺澶у睆 | 鍚勬楠屽悎鏍肩巼/NCR 鏁伴噺 |
+| energy | 鑳借�楃洃鎺уぇ灞忥紙鏂板锛� | 瀹炴椂鍔熺巼璐熻嵎/鍦ㄩ噰娴嬬偣/寮傚父鐜�/鐝鑳借�� |
+| sales_customer | 钀ラ攢瀹㈡埛澶у睆锛堟柊澧烇級 | 鍚堝悓绛惧畾/鍥炴/閫炬湡/瀹㈡埛鏁�/渚涘簲鍟嗚瘎鍒� |
+
+### 9.2 澶氱淮搴︽姤琛紙鏂板 `/bi/decision/report`锛�
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| POST | `/bi/decision/report/cross` | 浜ゅ弶琛細鏃堕棿 脳 杞﹂棿/瀹㈡埛/渚涘簲鍟�/鐗╂枡鍒嗙被 脳 鎸囨爣鍊� |
+| GET | `/bi/decision/report/topn?category=&dimension=&limit=` | TOP N 鎺掕锛堝鎴峰洖娆� TOP銆佷笉鑹� TOP銆佺己鏂� TOP锛� |
+
+鍝嶅簲缁熶竴涓� `{ columns, rows }` 缁撴瀯锛屽墠绔覆鏌撴櫘閫氳〃鏍�/閫忚鍥俱��
+
+---
+
+## 鍗併�佹暟鎹簱鍙樻洿娓呭崟
+
+| 鎿嶄綔 | 瀵硅薄 | 璇存槑 |
+|------|------|------|
+| 鏂板缓琛� | `bi_kpi_value_history` | KPI 鍘嗗彶蹇収 |
+| 鍒濆鍖栨暟鎹� | `bi_kpi_definition` | 绾� 26 鏉� KPI锛堜笂琛ㄥ叏閮� code锛� |
+| 鍒濆鍖栨暟鎹� | `bi_alert_rule` | 绾� 7 鏉¢璀﹁鍒� |
+| 鍒濆鍖栨暟鎹� | `bi_dashboard` | 7 涓湅鏉� |
+| 鍒濆鍖栨暟鎹� | `bi_chart_config` | 鍚勭湅鏉垮浘琛紙绾� 30 寮狅級 |
+| 涓嶆敼琛� | `bi_forecast_data` | 鐜版湁缁撴瀯澶熺敤锛屼粎鎵╁睍 modelVersion 浣跨敤 |
+
+> 涓氬姟琛ㄩ浂鏀瑰姩锛欿PI 浣撶郴鍙鍚勪笟鍔¤〃锛屼笉鍔犱换浣曞啑浣欏瓧娈点�傜鍚堛�婃枃浠朵笂浼犺鍒欍�嬨�奡QL 鑴氭湰瑙勮寖銆嬶紙鏃� tenant_id锛夌瓑鏃㈡湁绾︽潫銆�
+
+---
+
+## 鍗佷竴銆佸疄鏂芥楠�
+
+| 姝ラ | 鍐呭 | 浜や粯 |
+|------|------|------|
+| 1 | 鏂板 `bi_kpi_value_history` 琛� + DO + Mapper | 琛ㄧ粨鏋勩�佷唬鐮� |
+| 2 | 鏂板 `KpiSnapshotTask` 蹇収鑱氬悎浠诲姟 | 瀹氭椂浠诲姟 |
+| 3 | `BiDecisionKpiService` 澧炲姞 trend / compare 鎺ュ彛 | Controller + Service |
+| 4 | BiForecastEngine 缁熻棰勬祴寮曟搸 + BiForecastService 鎵╁睍 | 棰勬祴鑳藉姏 |
+| 5 | KPI 鎸囨爣搴� / 棰勮瑙勫垯 / 鐪嬫澘鍥捐〃 SQL 鑴氭湰钀藉簱 | 鍒濆鍖栬剼鏈� |
+| 6 | 缂栬瘧妫�鏌ワ紙mvn compile锛�+ 鏁版嵁搴撳洖璇婚獙璇� | 楠岃瘉鎶ュ憡 |
+
+## 鍗佷簩銆侀闄╀笌娉ㄦ剰浜嬮」
+
+- 涓氬姟琛ㄥ綋鍓嶄负绌猴紝KPI 鍑哄�间緷璧栨暟鎹Н绱紱鏈淇濊瘉"缁撴瀯姝g‘ + SQL 鍙墽琛�"锛屾暟鎹埌浣嶈嚜鍔ㄥ嚭鍊笺��
+- 閬ユ祴鏃犲姛鐜�/鐢甸噺鍙傛暟鏃讹紝鑳借�� KPI 杩斿洖 0 鍗犱綅锛屾祴鐐硅ˉ鍏呭悗鑷姩鐢熸晥锛�**涓嶄吉閫犳暟鎹�**銆�
+- KPI `query_sql` 涓虹鐞嗗憳鍙厤缃」锛屽睘绯荤粺杈圭晫鍐呭彲淇¢厤缃紱杩愯鏃剁粡 JdbcTemplate 鍙傛暟鍖栨墽琛岋紝鏃犳敞鍏ラ闄┿��
+- 蹇収閲忎及绠楋細26 KPI 脳 姣忓皬鏃� = 绾� 624 琛�/澶╋紝骞存暟鎹噺 ~23 涓囪锛岃妯″彲鎺с��
+- 棰勮闃堝�煎垵鍊奸渶涓婄嚎鍚庢牎鍑嗐��
\ No newline at end of file
diff --git a/docs/hrm_requirements_roadmap.md b/docs/hrm_requirements_roadmap.md
new file mode 100644
index 0000000..d82b264
--- /dev/null
+++ b/docs/hrm_requirements_roadmap.md
@@ -0,0 +1,187 @@
+# 鐢靛姏琛屼笟浜哄姏璧勬簮绯荤粺闇�姹傛⒊鐞嗕笌瀹炴柦璺嚎鍥�
+
+> 鐘舵�侊細闇�姹傛暣鐞嗙锛屼緵纭锛屽皻鏈繘鍏ョ紪鐮併��
+> 鐩爣搴擄細`mom-xgdl`锛堝悗绔� local profile 鏁版嵁婧愶級銆傚叧鑱旀枃妗o細[鍩硅+鍒版湡鎻愰啋鑱旇皟鏂规](hrm_training_and_expire_remind_integration.md)銆�
+
+---
+
+## 涓�銆侀渶姹傛�昏
+
+鐢靛姏琛屼笟浜哄姏璧勬簮绯荤粺鍏变笁娈甸渶姹傦紝瑕嗙洊銆屼汉浜嬫。妗� 鈫� 鑰冨嫟 鈫� 钖叕 鈫� 缁╂晥銆嶅叏娴佺▼锛屼互鍙婇潰鍚戠彮缁�/鍊煎畧宀椾綅鐨勬帓鐝笌宸ユ椂锛屽啀鍙犲姞鍩硅璇佷功鍚堣绠$悊銆�
+
+| 缂栧彿 | 闇�姹傚師鏂囪鐐� | 妯″潡褰掑睘 | 褰撳墠杩涘害 |
+|------|--------------|----------|----------|
+| 闇�姹傗憼 | 缁熺绠$悊鍏ㄥ憳浜轰簨妗f銆佸姵鍔ㄥ悎鍚屻�佽�冨嫟鎵撳崱銆佽柂閰牳绠椼�佺哗鏁堣�冩牳鍏ㄦ祦绋嬩笟鍔� | HRM | 寰呭疄鏂斤紙鏈枃妗f⒊鐞嗘柟妗堬級 |
+| 闇�姹傗憽 | 閽堝杩愮淮鐝粍銆佹淇彮缁勩�佸�煎畧宀椾綅瀹炵幇鏅鸿兘鎺掔彮銆佸伐鏃剁粺璁★紝宸ユ椂鏁版嵁鍚屾瀵规帴鎴愭湰鏍哥畻妯″潡 | MES 鎺掔彮/宸ユ椂 + HRM 宸ユ椂 | 寰呭疄鏂斤紙鍚笌鎴愭湰妯″潡鐨勫鎺ュ彛寰勶級 |
+| 闇�姹傗憿 | 绠$悊瀹夊叏鍩硅銆佹妧鑳藉煿璁�佺壒绉嶄綔涓氳瘉涔︺�佷粠涓氳祫璐紝鍒版湡鑷姩鎻愰啋锛屾弧瓒崇數鍔涜涓氬悎瑙勭鐞� | HRM 鍩硅 + 璇佷功/鍚堝悓鎻愰啋 | **宸插疄鏂藉畬鎴�**锛堣绗叚鑺傦級 |
+
+**宸茬‘璁ょ殑鎬讳綋鍙e緞锛堜細璇濆喅绛栵級**
+- 涓夋闇�姹傚垎闃舵鎺ㄨ繘锛屽厛缁熶竴姊崇悊銆佹寜闃舵缂栫爜锛屾渶鍚庣粺涓�鍥炲綊娴嬭瘯锛堢敤鎴峰彛寰勩�岀粺涓�鏀瑰畬鍦ㄦ祴璇曘�嶏級銆�
+- 鐩爣鏁版嵁搴撲负 `mom-xgdl`锛屾墍鏈夎彍鍗�/瀛楀吀/閰嶇疆/琛ㄥ潎鍐欏叆璇ュ簱銆�
+- 鎴愭湰鏍哥畻妯″潡**褰撳墠涓嶅瓨鍦�**锛岄渶姹傗憽鐨勫伐鏃跺鎺ラ噰鍙栥�屽厛鍥哄寲宸ユ椂姹囨�昏〃 + 瀵瑰鎻愪緵 Api銆嶏紝鎴愭湰妯″潡鍚庣画鍙﹀缓锛堟湰杞笉寤烘垚鏈〃锛夈��
+
+---
+
+## 浜屻�佺幇鐘剁洏鐐癸紙宸插叿澶囩殑鑳藉姏锛�
+
+| 涓氬姟鍩� | 宸叉湁瀹炰綋/鎺ュ彛 | 璇存槑 |
+|--------|---------------|------|
+| 浜轰簨妗f | `hrm_employee`锛堝熀鏈俊鎭�/閮ㄩ棬/宀椾綅/瀛﹀巻/鍏ヨ亴/鍛樺伐鐘舵��/鍩烘湰宸ヨ祫/钖叕缁撴瀯ID 绛夛級锛沗hrm_employee_education`銆乣_emergency_contact`銆乣_work_history` | 鏈夋柊澧�/鍒嗛〉/璇︽儏/绂昏亴浜ゆ帴鎺ュ彛锛�**鍏ヨ亴/瀹℃壒涓嶈仈鍔ㄥ洖鍐�** |
+| 鍔冲姩鍚堝悓 | `hrm_employee_contract`锛屽凡鏈夊姩鎬佸埌鏈熺姸鎬� + `REMIND_DAYS=30` + `/expiring-count` | 鏈夊埌鏈熸彁閱掕鏁帮紝鏃犵珯鍐呬俊锛堥渶姹傗憿宸茶ˉ锛� |
+| 璇峰亣/绂昏亴/璋冨姩瀹℃壒 | `hrm_leave_application`銆乣hrm_resignation_application`銆乣hrm_transfer_application` + BPM | 閫氳繃 BPM 瀹℃壒娴侊紱**瀹℃壒閫氳繃鍚庝笉鍙嶅啓鍛樺伐涓绘。** |
+| 浜ゆ帴 | `hrm_user_handover` + `HrmUserHandoverApi.expandUserIds()` | 绂昏亴鏁版嵁浜ゆ帴锛屽悇妯″潡鏌ヨ缁熶竴鎵╁睍 userId锛堣瑙佷氦鎺ヨ鍒欙級 |
+| 鑰冨嫟 | `hrm_attendance_record`(鎵撳崱/clock-in/clock-out)銆乣_rule`銆乣_holiday`銆乣_exception`銆乣_summary`(姹囨��/generate)锛沗HrmAttendanceSummaryDO` | **鍔犵彮鏃堕暱閾炬柇瑁傦細鎵撳崱/寮傚父鍧囨湭浜у嚭 overtime 瀛楁** |
+| 钖叕 | 妗f`hrm_employee_salary`銆佺ぞ淇漙hrm_employee_social_security`/`hrm_social_security_config`/`_scheme`銆佷釜绋巂hrm_tax_rate_config`銆佽鍋囩被鍨媊hrm_leave_type_config`銆佹牳绠梎hrm_salary_calculation`銆佸彂鏀綻hrm_salary_payment`(+鏄庣粏) | **鏍哥畻鍙畻鍥哄畾椤癸紱鍔犵彮鍐欐 0銆佸伐浣滄棩鍐欐 22锛涚己钖叕缁撴瀯/鍛樺伐钖叕妗f鍚庡彴 CRUD** |
+| 缁╂晥 | `hrm_performance_appraise` + `_item` + `_result`(+`_item`) | 鑰冩牳鏂规瀵硅薄瀛樺湪锛�**"鎸囧畾鐝粍"缁村害鏃犺惤鍦拌浇浣�** |
+| 鍩硅/璇佷功 | 闇�姹傗憿鏂板 `hrm_training`/`hrm_training_participant`锛沗hrm_certificate`(鍥涚被璧勮川+鍒版湡瀛楁) | 瑙佺鍏妭 |
+| 鎺掔彮(闇�姹傗憽) | MES `mes_cal_plan(_shift/_team)`銆乣mes_cal_team(_member/_shift)`銆乣mes_cal_holiday` | 鎺掔彮濂椾欢榻愬叏锛�**浣嗘湭钀藉埌"浜好楁棩"** |
+| 宸ユ椂(闇�姹傗憽) | MES `mes_pro_task`(duration 浜烘棩)銆乣MesProTaskApi.getTeamWorkHourSummary`(鎸夌彮缁勮仛鍚堬紝1 浜烘棩=8 浜烘椂) | HRM 宸插彲璺ㄦā鍧楄皟 MES 宸ユ椂锛�**鏃犳眹鎬昏〃锛屽疄鏃剁粺璁�** |
+| 鎴愭湰 | ERP 浠� `erp_finance_receipt`/`erp_finance_payment` | **鏃犳垚鏈ā鍧�** |
+
+---
+
+## 涓夈�侀渶姹傗憼銆屽叏娴佺▼涓氬姟銆嶅樊璺濆垎鏋愪笌寤鸿
+
+### 3.1 浜哄憳妗f涓庡姵鍔ㄥ悎鍚岄棴鐜�
+
+闇�姹傦細鍏ㄥ憳浜轰簨妗f + 鍔冲姩鍚堝悓鍏ㄦ祦绋嬶紙绛捐/缁/鍒版湡锛夈��
+
+**鐜扮姸缂哄彛**
+1. `hrm_employee` **缂恒�岀敤宸ユ�ц川銆嶃�屾墍灞炵彮缁勩�嶅瓧娈�**锛堣繍缁寸彮/妫�淇彮/鍊煎畧宀楃瓑缁勭粐缁村害鏃犳硶琛ㄨ揪锛夈�傜數鍔涘満鏅彮缁勬槸鏍稿績缁勭粐鍗曞厓锛岄渶姹傗憽鎺掔彮銆佺哗鏁堟寚瀹氱彮缁勯兘渚濊禆瀹冦��
+2. **瀹℃壒閫氳繃鍚庝笉鍙嶅啓涓绘。**锛氱鑱屽鎵归�氳繃 鈫� 鍛樺伐 `employeeStatus`/`leaveDate` 鏈嚜鍔ㄦ洿鏂帮紙闇�鎵嬪姩鏀癸級锛涜皟鍔ㄥ鎵归�氳繃 鈫� `deptId/postId` 鏈仈鍔ㄣ�傜洰鍓嶇鑱屼氦鎺ラ潬 `hrm_user_handover`锛屼絾鍛樺伐鐘舵�佸瓧娈典粛闈犳墜宸ャ��
+3. **鏃犮�岃浆姝c�嶄笟鍔�**锛歚hrm_employee.regularDate` 瀛楁瀛樺湪浣嗘棤瑙﹀彂鐐癸紱璇曠敤鈫掑湪鑱岀殑鐘舵�佹祦杞棤娴佺▼銆�
+4. 鍔冲姩鍚堝悓鍒版湡锛氬凡鏈夊埌鏈熻鏁� + 闇�姹傗憿绔欏唴淇℃彁閱掞紝**缁鍔ㄤ綔**鏄惁瑕佽蛋瀹℃壒銆佹柊鍚堝悓鍙峰浣曡鎺ュ緟瀹氥��
+
+**寤鸿**
+- 鍛樺伐涓绘。琛� `employmentType`(鐢ㄥ伐鎬ц川锛氭寮�/鍔冲姟/澶栧寘/瀹炰範绛夛紝瀛楀吀) 涓� `teamId`/`teamName`(鎵�灞炵彮缁�) 鈥斺�� 鐝粍寮曠敤 MES `mes_cal_team` 鎴� HRM 鐙珛鐝粍琛紝闇�涓庨渶姹傗憽缁熶竴鍙e緞銆�
+- 绂昏亴/璋冨姩瀹℃壒缁撴灉**鍥炲啓涓绘。**锛堟柊澧� BPM 瀹℃壒瀹屾垚鐩戝惉锛屾洿鏂� employeeStatus/leaveDate/deptId/postId锛夈��
+- 鏂板**杞**鍔ㄤ綔锛堝叆鑱屾弧璇曠敤鏈� 鈫� 姝e紡锛屽啓 regularDate锛屾敼鐘舵�侊級銆傛槸鍚︽帴 BPM 瀹℃壒寰呭畾銆�
+- 鍔冲姩鍚堝悓澧�/缁淇濈暀鐜板埌鏈熸彁閱掗摼璺��
+
+### 3.2 鑰冨嫟鎵撳崱
+
+闇�姹傦細鑰冨嫟鎵撳崱鍏ㄦ祦绋嬶紙瑙勫垯/鎵撳崱/姹囨�伙級锛屼负钖叕鎻愪緵鍔犵彮/缂哄嫟銆�
+
+**鐜扮姸缂哄彛**
+1. `hrm_attendance_record` 鎵撳崱(clock-in/clock-out)瀛樺湪锛屼絾**鍔犵彮鏃堕暱浠庢湭琚绠�**锛氭棤 overtime 鍐欏叆鐐广��
+2. 鏈� `_exception`(寮傚父/琛ュ崱)銆乣_rule`銆乣_holiday`銆乣_summary`(generate 姹囨��)锛屼絾姹囨�诲瓧娈典笌钖叕鏍哥畻瀛楁**鏈墦閫�**銆�
+
+**寤鸿**
+- 鎵撻��"鎵撳崱/瑙勫垯/鑺傚亣鏃� 鈫� 姣忔棩鑰冨嫟(鍚簲鍑哄嫟銆佸疄鍑哄嫟銆�**鍔犵彮鏃堕暱 overtimeHours**銆佽繜鍒版棭閫�) 鈫� 鏈堝害姹囨��"銆�
+- 鏄庣‘鍔犵彮鍙e緞锛堣秴鍑鸿鍒欏伐鏃堕儴鍒� / 娉曞畾鑺傚亣涓婄彮绛夛級锛屽姞鐝簮鏁版嵁鐢辫�冨嫟浜у嚭锛屼緵钖叕娑堣垂銆�
+
+### 3.3 钖叕鏍哥畻
+
+闇�姹傦細钖叕鏍哥畻鍏ㄦ祦绋嬨��
+
+**鐜扮姸缂哄彛锛堟牳蹇冩柇閾撅級**
+- `HrmSalaryCalculationServiceImpl` 鏍哥畻**鍙彇妗f鍥哄畾椤�**锛�
+ - `overtimePay = BigDecimal.ZERO`銆乣overtimeHours = BigDecimal.ZERO`锛�**浠庝笉璇昏�冨嫟鍔犵彮**锛夛紱
+ - `workDays = 22` **鍐欐**锛堜笉浠庤�冨嫟/鏃ュ巻寰楀嚭褰撴湀搴斿嚭鍕わ級锛�
+ - 璇峰亣鎵f鍙"宸插鎵归�氳繃鐨勮鍋囪褰�"锛坄hrm_leave_application`锛夛紝**涓嶈鑰冨嫟缂哄嫟**锛宍leaveHours` 鐩稿叧鍙e緞寰呮牳銆�
+- **缁╂晥缁撴灉鏈弬涓庢牳绠�**锛歱erformanceSalary 浠庡憳宸ユ。妗堝彇鍥哄畾鍊硷紝**涓嶈缁╂晥缁撴灉琛�**銆�
+- **鏃犺柂閰粨鏋�/鍛樺伐钖叕妗f鐨勫悗鍙� CRUD**锛歚HrmSalaryStructureDO`銆乣HrmEmployeeSalaryDO` 浠呰鏍哥畻浠g爜寮曠敤锛宍controller/admin/salary` 涓嬪彧鏈夌ぞ淇�/鏍哥畻/鍙戞斁/閰嶇疆/绋庣巼/璇峰亣绫诲瀷锛岀己 `HrmSalaryStructureController`銆乣HrmEmployeeSalaryController` 鈫� 鍓嶇鏃犳硶缁存姢"钖叕缁撴瀯=鍥哄畾+缁╂晥+琛ヨ创+鍔犵彮"涓庡憳宸ヤ釜浜鸿柂閰。妗堛��
+
+**寤鸿**
+- 鏍哥畻杈撳叆琛ラ綈涓夋潯閾捐矾锛氣憼鑰冨嫟(鍔犵彮鏃堕暱/缂哄嫟澶╂暟) 鈫� 鍔犵彮璐�/鎵f锛涒憽缁╂晥缁撴灉 鈫� 缁╂晥宸ヨ祫锛涒憿璇峰亣/缂哄嫟 鈫� 鎵f銆備笁鑰呬箻浠ュ綋浜鸿柂閰。妗堝崟浠枫��
+- 琛ュ缓钖叕缁撴瀯 + 鍛樺伐钖叕妗f鍚庡彴 CRUD + 鑿滃崟鏉冮檺銆�
+- 寤虹珛銆岃柂閰粨鏋勯」 脳 绯绘暟銆嶏紝鍔犵彮璐� = 鍔犵彮鏃堕暱 脳 鏃惰柂(鐢卞熀鏈伐璧�/搴斿嚭鍕ゆ姌绠�)锛屽厛涓庣敤鎴风‘璁よ浠峰彛寰勩��
+
+### 3.4 缁╂晥鑰冩牳
+
+闇�姹傦細缁╂晥鑰冩牳鍏ㄦ祦绋嬨��
+
+**鐜扮姸缂哄彛**
+- 鑰冩牳瀹炰綋(`appraise`/`item`/`result`)宸插叿澶囷紝浣�**"2-鎸囧畾鐝粍"鐨� scopeType 鏃犺惤鍦拌浇浣�**锛堢彮缁勭淮搴︽湭寤猴級锛屾寚瀹氫汉鐨勭粨鏋滀笌钖叕/鍩硅鑱斿姩寮便��
+- 鑰冩牳缁撴灉濡備綍杩涘叆钖叕锛堢哗鏁堝伐璧勶級閾捐矾锛堣 3.3锛夐渶鎵撻�氥��
+
+**寤鸿**
+- 缁╂晥瀵硅薄钀藉簱鍒�"鍛樺伐(鎴栫彮缁�)"锛岀彮缁勭淮搴﹀鐢ㄩ渶姹傗憼琛ョ殑鐝粍杞戒綋銆�
+- 纭缁╂晥缁撴灉 鈫� 钖叕鏍哥畻鐨勫彇鍊艰鍒欙紙缁撴灉绛夌骇/鍒嗘暟 脳 缁╂晥宸ヨ祫妗o級銆�
+
+### 3.5 闇�姹傗憼寤鸿瀹炴柦瀛愰」灏忕粨
+
+| 瀛愰」 | 娑夊強 | 璇存槑 |
+|------|------|------|
+| A. 鍛樺伐涓绘。鎵╁睍 | `hrm_employee` + 瀛楀吀 | 鍔� 鐢ㄥ伐鎬ц川 / 鎵�灞炵彮缁勶紙涓庘憽缁熶竴鍙e緞锛� |
+| B. 瀹℃壒缁撴灉鍥炲啓 + 杞 | HRM service + BPM 鐩戝惉 | 绂昏亴/璋冨姩鍙嶅啓涓绘。锛涜浆姝e姩浣� |
+| C. 鑰冨嫟鍔犵彮鎵撻�� | 鑰冨嫟鐩稿叧 service/mapper | 鍔犵彮鏃堕暱浜у嚭鍙e緞 |
+| D. 钖叕鏍哥畻鎺ヨ�冨嫟/缁╂晥 | `HrmSalaryCalculationServiceImpl` | 鍔犵彮璐广�佸簲鍑哄嫟銆佺哗鏁堝伐璧勩�佹墸娆� |
+| E. 钖叕缁撴瀯涓庢。妗� CRUD | 鏂板 2 Controller + 鑿滃崟 | 鍚庡彴鍙淮鎶よ柂閰ā鍨嬩笌涓汉妗f |
+| F. 缁╂晥鐝粍钀藉湴 + 缁撴灉鍏ヨ柂閰� | 缁╂晥瀵硅薄鎵╁睍 | 涓� A/D 鑱斿姩 |
+
+---
+
+## 鍥涖�侀渶姹傗憽銆屾帓鐝� + 宸ユ椂 + 鎴愭湰瀵规帴銆嶅樊璺濆垎鏋愪笌寤鸿
+
+闇�姹傦細瀵硅繍缁寸彮缁勩�佹淇彮缁勩�佸�煎畧宀椾綅**鏅鸿兘鎺掔彮**銆�**宸ユ椂缁熻**锛屽伐鏃舵暟鎹�**鍚屾瀵规帴鎴愭湰鏍哥畻妯″潡**銆�
+
+### 4.1 鎺掔彮
+
+**鐜扮姸缂哄彛**
+- MES `mes_cal_*` 鎺掔彮濂椾欢榻愬叏锛歚cal_plan`(鎺掔彮璁″垝) 鈫� `cal_plan_shift`(鐝)銆乣cal_plan_team`(鍙備笌鐝粍)銆乣cal_team_member`(鐝粍鎴愬憳锛宍userId`鈫旂郴缁熺敤鎴�)銆乣cal_team_shift`(鐝粍脳鐝脳鏃ユ湡)銆乣cal_holiday`(鑺傚亣鏃�)銆�
+- **鍙帹婕斿埌"鍛樺伐脳鏃�"鐨勬帓鐝紝浣嗘湭钀芥垚鏄庣粏**锛氬�煎畧宀椾綅閫愪汉閫愭棩鐨勭彮娆″畨鎺�(鐧�/澶�/浼�)娌℃湁鐗╁寲缁撴灉銆�
+- **鏃�"鏅鸿兘"鑳藉姏**锛氶渶鏄庣‘鏅鸿兘鏄寚锛坅锛夎嚜鍔ㄦ寜瑙勫垯鐢熸垚鎺掔彮琛紙鍚堣锛氳繛缁伐鏃�/浼戞伅闂撮殧/鐝鍧囪 锛夛紝杩樻槸锛坆锛変粎鍥哄寲鎺掔彮鐪嬫澘渚涙煡璇€��
+
+**寤鸿**
+- 鍦� `mes_cal_team_shift` 涔嬩笂**鍥哄寲"鍛樺伐绾ф帓鐝槑缁�"**锛坄mes_cal_schedule_detail`锛氬憳宸ッ楁棩鏈熋楃彮娆★級锛屼綔涓哄伐鏃�/鍊煎畧鍚堣鐨勫熀鍑嗐��
+- "鏅鸿兘"鎸夎鍒欏紩鎿庢渶灏忓寲瀹炵幇锛氬厛鎸夌彮缁勭彮娆℃ā鏉跨敓鎴� + 浜哄伐寰皟 + 鍚堣鏍¢獙锛屽悗缁啀璋堣嚜鍔ㄤ紭鍖栥��
+- 鍊煎畧(24h)宀椾綅鐨勬帓鐝彛寰勶紙涓夌彮鍊�/鐧藉浼戠瓑锛夐渶鐢ㄦ埛纭鐝搴撱��
+
+### 4.2 宸ユ椂缁熻涓庢垚鏈鎺�
+
+**鐜扮姸缂哄彛**
+- 鎶ュ伐宸ユ椂锛歁ES `mes_pro_task` 鏃堕暱 duration(浜烘棩锛�1=8h)锛宍MesProTaskApi.getTeamWorkHourSummary` 宸叉寜鐝粍鑱氬悎锛�**HRM 宸茶法妯″潡璋冪敤**锛堝疄鏃剁粺璁★紝鏃犳眹鎬昏〃锛夈��
+- **鏃犳垚鏈ā鍧�**锛圗RP 浠呮敹浠樻锛夈�傞渶姹傚師鏂�"瀵规帴鎴愭湰鏍哥畻"锛岃嫢鍧氭寔瀹炴椂绠楁垚鏈紝浼氱壍鍑� ERP 鎴愭湰鍩熺殑鐗╂枡/浜哄伐/鍒堕�犺垂鐢ㄤ笁瑕佺礌锛岃寖鍥磋繃澶с��
+
+**寤鸿锛堟部鐢ㄥ凡纭鍙e緞锛氬厛鍥哄寲锛屼笉寤烘垚鏈級**
+- 鏂板**鏈堝害宸ユ椂姹囨�昏〃**锛堝憳宸ッ楃彮缁劽楀伐鏃跺彛寰勶細鎺掔彮宸ユ椂/瀹為檯宸ユ椂/鍔犵彮宸ユ椂锛屾簮鑷� MES 鎺掔彮鏄庣粏 + 鎶ュ伐锛夛紝骞跺**瀵瑰鎻愪緵 `Api`** 渚涘悗缁垚鏈ā鍧楁秷璐广��
+- 浜哄伐鎴愭湰鍙e緞锛氬伐鏃� 脳 鍛樺伐鏃惰柂(钖叕妗f) 鍙綔**杞垚鏈瑙�**锛屼絾涓嶈惤 ERP 鎴愭湰鎬昏处锛堝緟鐢ㄦ埛纭鏄惁鏈疆瑕佸仛锛夈��
+
+---
+
+## 浜斻�侀渶姹傗憿锛堝凡瀹屾垚锛変氦浠樿鏄�
+
+闇�姹傗憿宸插疄鏂藉畬鎴愬苟閫氳繃缂栬瘧銆佺瀛愯惤搴� `mom-xgdl`锛�
+
+- **鍩硅绠$悊**锛歚hrm_training` + `hrm_training_participant`锛堣崏绋�/寰呭紑灞�/宸插畬鎴�/宸插彇娑堬紱缂栧彿 PX 鑷姩鐢熸垚锛涘弬璁汉鎵归噺娣诲姞/鎴愮哗/鏄惁鍚堟牸锛沗/hrm/training/*` 涓� `/hrm/training-participant/*` 鍏ㄥ鎺ュ彛锛夈��
+- **璇佷功/鍚堝悓鍒版湡鎻愰啋**锛氭瘡鏃� `infra_job`(`hrmExpiryRemindJob` 08:00) + 璇佷功/鍚堝悓鍒楄〃鎳掕Е鍙戝厹搴曪紱Redis 鏃ラ攣+60 澶╁幓閲嶏紱鎸夊憳宸� `userId` 鍙戠珯鍐呬俊锛涙彁閱掑ぉ鏁� `infra_config`(榛樿 30)鍙皟銆�
+- **鑱斿姩鍙戣瘉**锛氬煿璁畬鎴愭椂瀵� `is_pass=1` 涓旀湭鍙戣瘉鐨勫弬璁汉鐢熸垚 `hrm_certificate`锛堝畨鍏ㄢ啋绫诲瀷4銆佹妧鑳解啋绫诲瀷3锛岃瘉涔︽湁鏁堟湡=瀹屾垚鏃�+`cert_validity_months`锛夛紝鍥炲啓 `certificate_id` 闃查噸銆�
+- **璇佷功绛涢��**锛氳瘉涔﹀垎椤垫柊澧� `expiryType`(1 鍗冲皢鍒版湡/2 宸茶繃鏈�)銆�
+- 鑱旇皟鏂规鏂囨。宸插嚭锛圼hrm_training_and_expire_remind_integration.md](hrm_training_and_expire_remind_integration.md)锛夈��
+
+> 閬楃暀锛氳繍琛屾椂绔埌绔獙璇佸緟鐢ㄦ埛鐜灏辩华鍚庢墽琛岋紙褰撳墠 `mom-xgdl` 鏃犲憳宸ユ祴璇曟暟鎹級銆�
+
+---
+
+## 鍏�佹�讳綋瀹炴柦璺嚎鍥撅紙寤鸿闃舵锛�
+
+> 渚濊禆鍏崇郴锛氱彮缁勫彛寰�(闇�姹傗憼A) 鈫� 鎺掔彮鏄庣粏(闇�姹傗憽) 鍓嶇疆鎵撻�氬悗锛岀哗鏁堟寚瀹氱彮缁�/宸ユ椂姹囨�绘墠涓嶈繑宸ャ��
+
+| 闃舵 | 鍐呭 | 鍓嶇疆 | 浜у嚭 |
+|------|------|------|------|
+| **P0 宸蹭氦浠�** | 闇�姹傗憿 鍩硅 + 鍒版湡鎻愰啋 | 鏃� | 宸茶惤鍦� + 鑱旇皟鏂囨。 |
+| **P1 缁勭粐鍙e緞** | 闇�姹傗憼A 鍛樺伐涓绘。鎵╁睍(鐢ㄥ伐鎬ц川/鐝粍) + 闇�姹傗憽鐝粍鍙e緞缁熶竴 | P0 | 瀛楀吀/瀛楁/鐝粍杞戒綋 |
+| **P2 浜哄憳闂幆** | 闇�姹傗憼B 瀹℃壒鍥炲啓/杞 + 鍔冲姩鍚堝悓缁鍙e緞 | P1 | BPM 鐩戝惉 + 杞鍔ㄤ綔 |
+| **P3 鑰冨嫟鈫掕柂閰�** | 闇�姹傗憼C 鑰冨嫟鍔犵彮 + D 钖叕鏍哥畻鎺ヨ�冨嫟/缁╂晥 + E 钖叕缁撴瀯/妗f CRUD | P1 | 鑰冨嫟/钖叕閾捐矾闂幆 |
+| **P4 缁╂晥** | 闇�姹傗憼F 缁╂晥鐝粍钀藉湴 + 缁撴灉鍏ヨ柂閰� | P1/P3 | 缁╂晥鈫掕柂閰彇鍊� |
+| **P5 鎺掔彮+宸ユ椂** | 闇�姹傗憽 鍛樺伐绾ф帓鐝槑缁� + 鏈堝害宸ユ椂姹囨�昏〃 + 瀵瑰 Api | P1(鐝粍) | 鎺掔彮鐪嬫澘鍩哄噯 + 宸ユ椂 Api |
+| **P6 鎴愭湰(鍙﹁鍒�)** | ERP 鎴愭湰鍩�(浜哄伐/鐗╂枡/鍒堕��) 娑堣垂宸ユ椂 Api | P5 | 闇�姹傗憽"瀵规帴鎴愭湰"钀界偣 |
+
+> 姣忛樁娈甸伒寰湰浠撳簱瑙勫垯锛氭帴鍙e彉鏇村嚭 `docs/` 鍓嶇鑱旇皟鏂规锛汼QL 绉嶅瓙鍚彍鍗�/瀛楀吀/鏉冮檺骞惰惤 `mom-xgdl`锛涜法妯″潡鏀瑰姩鍋氱紪璇戞鏌ャ��**鎴愭湰妯″潡鏄惁鏈疆灏卞缓銆佹櫤鑳芥帓鐝埌浣曠绋嬪害锛岃涓嬭妭寰呯‘璁ゃ��**
+
+---
+
+## 涓冦�佸緟纭鐨勫紑鏀惧喅绛�
+
+1. **鐝粍杞戒綋褰掑睘**锛氬憳宸ユ墍灞炵彮缁勫紩鐢� MES `mes_cal_team`(瀛楁鍏宠仈 `teamId`)锛岃繕鏄� HRM 鐙珛鐝粍琛紵鈫� 褰卞搷 P1/P2/P5 涓夊銆�
+2. **鐢ㄥ伐鎬ц川瀛楀吀**锛氬彇鍊奸泦鍚堬紙姝e紡/鍔冲姟/澶栧寘/瀹炰範/閫�浼戣繑鑱�/鍏朵粬锛燂級銆�
+3. **杞娴佺▼**锛氳浆姝f槸鎵嬪姩鍔ㄤ綔杩樻槸璧� BPM 瀹℃壒锛堣瘯鐢ㄦ湡鍒拌嚜鍔ㄦ彁閱� + 瀹℃壒鍚庤浆姝o級锛�
+4. **钖叕鍔犵彮/鎵f璁′环鍙e緞**锛氬姞鐝垂 = 鍔犵彮鏃堕暱 脳 鏃惰柂锛熸椂钖� = 鍩烘湰宸ヨ祫 梅 褰撴湀搴斿嚭鍕ゅぉ鏁帮紵缂哄嫟鎵f鍙e緞鍚屾簮锛熺哗鏁堝伐璧� = 缁╂晥缁撴灉鍒嗘暟/绛夌骇 脳 鍥哄畾缁╂晥妗o紵
+5. **缁╂晥鑰冩牳鑼冨洿**锛氭湰杞�冩牳"鎸囧畾鐝粍"鏄惁闇�瑕佸畬鏁寸彮缁勬垚鍛橀�愪竴璇勶紝杩樻槸鑰冩牳鍒扮彮缁勫啀鍒嗘憡锛�
+6. **闇�姹傗憽"鏅鸿兘"绋嬪害**锛氳嚜鍔ㄦ帓鐝粎鍋氳鍒欐ā鏉� + 浜哄伐寰皟 + 鍚堣鏍¢獙锛岃繕鏄渶瑕佽嚜鍔ㄦ帓鐝畻娉曪紵
+7. **鎴愭湰妯″潡鑼冨洿**锛氱‘璁ゆ湰杞笉寤� ERP 鎴愭湰鍩燂紝鍙浐鍖栨湀搴﹀伐鏃舵眹鎬昏〃 + 瀵瑰 Api锛堣蒋鎴愭湰棰勮锛夛紝鎴愭湰鏍哥畻鍙﹁瑙勫垝 鈥斺�� 鏄惁璁ゅ彲锛�
+
+---
+
+*鏈枃妗d负闇�姹傛⒊鐞嗙锛屽緟涓婅堪鍐崇瓥纭鍚庢寜闃舵瀹炴柦锛涙湭缁忕‘璁や笉杩涘叆缂栫爜銆�*
diff --git a/docs/hrm_training_and_expire_remind_integration.md b/docs/hrm_training_and_expire_remind_integration.md
new file mode 100644
index 0000000..8f867bc
--- /dev/null
+++ b/docs/hrm_training_and_expire_remind_integration.md
@@ -0,0 +1,175 @@
+# HRM 鍩硅绠$悊 + 璇佷功/鍚堝悓鍒版湡鎻愰啋 - 鍓嶇鑱旇皟鏂规
+
+## 娑夊強椤甸潰
+
+| 椤甸潰 | 鍙樻洿绫诲瀷 | 璇存槑 |
+|------|----------|------|
+| 浜哄姏璧勬簮 - 璇佷功璧勮川 | 鏀归�� | 鍒楄〃绛涢�夋柊澧�"鍒版湡绫诲瀷"锛屽垪琛ㄩ〉鎵撳紑瑙﹀彂璇佷功鍒版湡鎻愰啋 |
+| 浜哄姏璧勬簮 - 鍛樺伐鍚堝悓 | 鏀归�� | 鍒楄〃椤垫墦寮�瑙﹀彂鍚堝悓鍒版湡鎻愰啋锛堟棤椤甸潰缁撴瀯鏀瑰姩锛� |
+| 浜哄姏璧勬簮 - 鍩硅绠$悊锛堟柊澧炶彍鍗曪級 | 鏂板 | 鍩硅娲诲姩 + 鍙傝浜哄憳 + 瀹屾垚鍙戣瘉 |
+| 绯荤粺娑堟伅锛堢珯鍐呬俊锛� | 灞曠ず | 鍒版湡鎻愰啋绔欏唴淇$敱鍚庣涓诲姩鍙戦�侊紝鍓嶇鏃犻渶璋冪敤鎺ュ彛 |
+
+## 鍒版湡鎻愰啋琛屼负璇存槑
+
+- 璇佷功璧勮川銆佸姵鍔ㄥ悎鍚屽埌鏈熷墠 N 澶╋紙榛樿 30锛屽彲鍦ㄣ�岀郴缁熼厤缃�嶄腑鏀� `hrm.certificate.remind-days` / `hrm.contract.remind-days`锛夛紝鍚戣鍛樺伐缁戝畾鐨勭郴缁熻处鍙峰彂閫佺珯鍐呬俊銆�
+- 瑙﹀彂鏃舵満鍙屼繚闄╋細
+ 1. 姣忔棩瀹氭椂浠诲姟锛坔andlerName=`hrmExpiryRemindJob`锛屾瘡鏃� 08:00锛屽彲鍦ㄥ畾鏃朵换鍔$鐞嗕腑璋冩暣/鍚仠锛夛紱
+ 2. 鎳掕Е鍙戯細鎵撳紑"璇佷功璧勮川"鎴�"鍛樺伐鍚堝悓"鍒楄〃鏃跺悗绔『甯﹁ˉ鎵竴娆★紙best-effort锛屽け璐ヤ笉褰卞搷鍒楄〃锛夈��
+- 鍘婚噸瑙勫垯锛氬悓涓�璇佷功/鍚堝悓鍦ㄥ埌鏈熸棩鍓嶅悗 60 澶╁唴鍙彁閱掍竴娆★紱鍚屼竴鍛樺伐绂昏亴鍚庝笉鎻愰啋锛堜粎鍚戝湪宀�/璇曠敤涓旀湁绯荤粺璐﹀彿鐨勫憳宸ュ彂閫侊級銆�
+
+绔欏唴淇℃枃妗堬紙鍙橀噺鐢卞悗绔甫鍏ワ紝鍓嶇浠呭睍绀猴級锛�
+
+| 妯℃澘 | 鍐呭绀轰緥 |
+|------|----------|
+| 璇佷功鍒版湡鎻愰啋 | {employeeName}锛屾偍鐨勮瘉涔﹁祫璐ㄣ�恵certTypeName}銆憑certName} 灏嗕簬 {expireDate} 鍒版湡锛岃鍙婃椂鍔炵悊澶嶅/鎹㈣瘉銆� |
+| 鍔冲姩鍚堝悓鍒版湡鎻愰啋 | {employeeName}锛屾偍鐨勫姵鍔ㄥ悎鍚岋紙缂栧彿锛歿contractNo}锛夊皢浜� {endDate} 鍒版湡锛岃鍙婃椂鑱旂郴浜轰簨鍔炵悊缁鎴栫鑱屾墜缁�� |
+
+## API
+
+### 涓�銆佽瘉涔﹁祫璐紙鏀归�狅級
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| GET | /hrm/certificate/page | 鍒嗛〉鏌ヨ锛屾柊澧� `expiryType` 杩囨护鍙傛暟 |
+
+**璇锋眰鍙傛暟锛堟柊澧烇級锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| expiryType | Integer | 鍚� | 1=鍗冲皢鍒版湡锛�30 澶╁唴锛夛紝2=宸茶繃鏈燂紱涓嶄紶鍒欎笉杩囨护 |
+
+### 浜屻�佸煿璁椿鍔紙鏂板锛岃彍鍗曟潈闄� hrm:training:*锛�
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| POST | /hrm/training/create | 鍒涘缓鍩硅锛堝垵濮嬬姸鎬�=鑽夌锛� |
+| PUT | /hrm/training/update | 鏇存柊鍩硅锛堜粎鑽夌/寰呭紑灞曞彲鏀癸紝缂栧彿涓嶅彲鏀癸級 |
+| DELETE | /hrm/training/delete | 鎵归噺鍒犻櫎鍩硅锛坕ds 鏁扮粍锛屽凡瀹屾垚/宸插彇娑堜笉鍙垹锛岀骇鑱斿垹鍙傝浜猴級 |
+| GET | /hrm/training/get?id= | 鍩硅璇︽儏锛堝惈鍙傝浜哄憳鍒楄〃锛� |
+| GET | /hrm/training/page | 鍩硅鍒嗛〉锛堝惈鍙傝浜烘暟銆佺姸鎬�/绫诲瀷鍚嶇О锛� |
+| POST | /hrm/training/start?id= | 寮�濮嬪煿璁紙鑽夌 鈫� 寰呭紑灞曪級 |
+| POST | /hrm/training/complete?id= | 瀹屾垚鍩硅锛堚啋 宸插畬鎴愶紝瑙﹀彂鑱斿姩鍙戣瘉锛� |
+| POST | /hrm/training/cancel?id= | 鍙栨秷鍩硅锛堣崏绋�/寰呭紑灞� 鈫� 宸插彇娑堬級 |
+
+**鍒涘缓/鏇存柊璇锋眰鍙傛暟锛圚rmTrainingSaveReqVO锛夛細**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| id | Long | 鏇存柊蹇呭~ | 鍩硅娲诲姩缂栧彿 |
+| name | String | 鏄� | 鍩硅鍚嶇О |
+| trainingType | Integer | 鏄� | 鍩硅绫诲瀷锛�1=瀹夊叏鍩硅锛�2=鎶�鑳藉煿璁紝3=绠$悊鍩硅锛�4=鍏朵粬 |
+| trainer | String | 鍚� | 璁插笀 |
+| location | String | 鍚� | 鍩硅鍦扮偣 |
+| hours | BigDecimal | 鍚� | 鍩硅瀛︽椂 |
+| startDate | LocalDate | 鍚� | 寮�濮嬫棩鏈� |
+| endDate | LocalDate | 鍚� | 缁撴潫鏃ユ湡 |
+| issueCertificate | Boolean | 鍚� | 鏄惁鑷姩鍙戣瘉锛�0=鍚︼紝1=鏄紱浠呭畨鍏�/鎶�鑳藉煿璁彲缃� 1锛� |
+| certValidityMonths | Integer | issue=1 鏃跺繀濉� | 璇佷功鏈夋晥鏈燂紙鏈堬級 |
+| remark | String | 鍚� | 澶囨敞 |
+
+**鍒嗛〉鏌ヨ鍙傛暟锛圚rmTrainingPageReqVO锛夛細**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| trainingNo | String | 鍚� | 鍩硅缂栧彿锛堢簿纭級 |
+| name | String | 鍚� | 鍩硅鍚嶇О锛堟ā绯婏級 |
+| trainingType | Integer | 鍚� | 鍩硅绫诲瀷 |
+| status | Integer | 鍚� | 鐘舵�侊細0=鑽夌锛�10=寰呭紑灞曪紝20=宸插畬鎴愶紝30=宸插彇娑� |
+
+**璇︽儏/鍒楄〃鍝嶅簲锛圚rmTrainingRespVO锛夛細**
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| id / trainingNo / name | | 涓婚敭銆佺紪鍙凤紙PX 鍓嶇紑鑷姩鐢熸垚锛屽彧璇伙級銆佸悕绉� |
+| trainingType / trainingTypeName | | 绫诲瀷 + 灞曠ず鍚嶏紙瀹夊叏鍩硅/鎶�鑳藉煿璁�/绠$悊鍩硅/鍏朵粬锛� |
+| trainer / location / hours | | 璁插笀/鍦扮偣/瀛︽椂 |
+| startDate / endDate | | 璧锋鏃ユ湡 |
+| issueCertificate / certValidityMonths | | 鏄惁鑷姩鍙戣瘉 / 璇佷功鏈夋晥鏈熸湀 |
+| status / statusName | | 鐘舵�� + 灞曠ず鍚嶏紙鑽夌/寰呭紑灞�/宸插畬鎴�/宸插彇娑堬級 |
+| participantCount | Integer | 鍙傝浜烘暟锛堝垎椤靛垪琛ㄨ繑鍥烇級 |
+| participants | Array | 鍙傝浜哄憳鍒楄〃锛堣鎯呮帴鍙h繑鍥烇紝缁撴瀯瑙佷笅锛� |
+| remark / createTime | | 澶囨敞 / 鍒涘缓鏃堕棿 |
+
+### 涓夈�佸煿璁弬璁汉鍛橈紙鏂板锛屾寕鍩硅绠$悊鏉冮檺锛�
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| POST | /hrm/training-participant/add | 鎵归噺娣诲姞鍙傝鍛樺伐锛堣嚜鍔ㄨ烦杩囧凡鍦ㄥ悕鍗曚腑鐨勫憳宸ワ級 |
+| PUT | /hrm/training-participant/update | 鏇存柊鍗曟潯鍙傝璁板綍锛堝弬鍔�/鎴愮哗/鏄惁鍚堟牸锛� |
+| DELETE | /hrm/training-participant/delete | 鎵归噺鍒犻櫎鍙傝璁板綍锛坕ds 鏁扮粍锛� |
+| GET | /hrm/training-participant/list?trainingId= | 鏌愭鍩硅鐨勫弬璁汉鍛樺垪琛紙鍚憳宸ュ伐鍙�/濮撳悕锛� |
+
+**add 璇锋眰鍙傛暟锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| trainingId | Long | 鏄� | 鍩硅娲诲姩缂栧彿 |
+| employeeIds | Array | 鏄� | 鍙傝鍛樺伐缂栧彿闆嗗悎 |
+
+**update 璇锋眰鍙傛暟锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| id | Long | 鏄� | 鍙傝璁板綍缂栧彿 |
+| attended | Boolean | 鍚� | 鏄惁瀹為檯鍙傚姞 |
+| score | BigDecimal | 鍚� | 鑰冩牳鎴愮哗 |
+| isPass | Boolean | 鍚� | 鏄惁鍚堟牸 |
+| remark | String | 鍚� | 澶囨敞 |
+
+**list 鍝嶅簲瀛楁锛圚rmTrainingParticipantRespVO锛夛細**
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| id / trainingId / employeeId | | 涓婚敭 / 鍩硅缂栧彿 / 鍛樺伐缂栧彿 |
+| employeeNo / employeeName | | 鍛樺伐宸ュ彿 / 濮撳悕锛堝悗绔寜 employeeId 鍥炲~锛� |
+| attended | Boolean | 鏄惁瀹為檯鍙傚姞 |
+| score | BigDecimal | 鑰冩牳鎴愮哗 |
+| isPass | Boolean | 鏄惁鍚堟牸 |
+| certificateId | Long | 鑱斿姩鐢熸垚鐨勮瘉涔︾紪鍙凤紙绌�=灏氭湭鍙戣瘉锛屽彧璇伙級 |
+| remark / createTime | | 澶囨敞 / 鍒涘缓鏃堕棿 |
+
+## 鍓嶇淇敼鐐癸紙椤甸潰琛屼负璇存槑锛屼笉鍚唬鐮侊級
+
+### 1. 鍩硅绠$悊鍒楄〃椤碉紙鏂板锛�
+
+- 椤堕儴绛涢�夛細鍩硅缂栧彿銆佸煿璁悕绉般�佸煿璁被鍨嬶紙涓嬫媺锛夈�佺姸鎬侊紙涓嬫媺锛夛紝璋冪敤鍩硅鍒嗛〉鎺ュ彛銆�
+- 鍒楄〃鍒楋細鍩硅缂栧彿銆佸悕绉般�佺被鍨嬨�佽甯堛�佽捣姝㈡棩鏈熴�佸弬璁汉鏁般�佺姸鎬併�佹搷浣溿��
+- 鏂板/缂栬緫寮圭獥锛氳〃鍗曞瓧娈靛悓鍒涘缓璇锋眰鍙傛暟锛�"鏄惁鑷姩鍙戣瘉"鍕鹃�変笖鍩硅绫诲瀷涓哄畨鍏�/鎶�鑳芥椂灞曠ず"璇佷功鏈夋晥鏈燂紙鏈堬級"蹇呭~杈撳叆銆�
+- 鎿嶄綔鎸夐挳锛堟寜褰撳墠鐘舵�佹樉闅愶級锛�
+ - 鑽夌锛氬紑濮嬨�佺紪杈戙�佸垹闄わ紱
+ - 寰呭紑灞曪細瀹屾垚銆佸彇娑堛�佺紪杈戙�佸垹闄わ紱
+ - 宸插畬鎴�/宸插彇娑堬細浠呮煡鐪嬶紝涓嶅厑璁哥紪杈�/鍒犻櫎/鎿嶄綔鍙備笌浜恒��
+- "鍙傝浜哄憳"寮圭獥浠庤鎯呮帴鍙h幏寰� participants锛屾寜鍩硅瀹屾垚涓庡惁鍐冲畾鏄惁鍏佽澧炲垹鏀瑰弬涓庝汉璁板綍銆�
+
+### 2. 鍙傝浜哄憳鎿嶄綔
+
+- "娣诲姞鍙傝鍛樺伐"浣跨敤鐜版湁鍛樺伐閫夋嫨鍣紝閫変腑鍚庡彇鍛樺伐 id 鍒楄〃锛岃皟鐢� add 鎺ュ彛锛涙帴鍙h繑鍥炲疄闄呮柊澧炴暟锛堝凡瀛樺湪鐨勮嚜鍔ㄨ烦杩囷級銆�
+- 鍙傝璁板綍琛屽彲褰�"鏄惁鍙傚姞 / 鑰冩牳鎴愮哗 / 鏄惁鍚堟牸"锛屾彁浜よ蛋 update锛沝elete 浼� ids銆�
+- 鍛樺伐宸ュ彿/濮撳悕鐢卞悗绔洖濉紝鍓嶇涓嶈鍦ㄦ湰鍦版嫾瑁呫��
+
+### 3. 璇佷功璧勮川鍒楄〃锛堟敼閫狅級
+
+- 鍒楄〃绛涢�夊尯鏂板"鍒版湡绫诲瀷"涓嬫媺锛堝叏閮�/鍗冲皢鍒版湡/宸茶繃鏈燂級锛屽�兼槧灏� expiryType 1/2銆�
+- 鍒楄〃鎵撳紑鍗充細瑙﹀彂鍒版湡鎻愰啋鍙戦�侊紝鏃犻渶棰濆 UI銆�
+
+## 涓氬姟瑙勫垯璇存槑
+
+| 鍦烘櫙 | 瑙勫垯 |
+|------|------|
+| 鐘舵�佹祦杞� | create鈫掕崏绋�(0)锛泂tart鈫掑緟寮�灞�(10)锛沜omplete鈫掑凡瀹屾垚(20)锛沜ancel鈫掑凡鍙栨秷(30) |
+| 瀹屾垚鍩硅 | 鐘舵�佷负鑽夌/寰呭紑灞曟墠鍙畬鎴愶紝鍚﹀垯鎶ラ敊 |
+| 鑱斿姩鍙戣瘉 | issueCertificate=1 鏃讹紝鍩硅瀹屾垚鑷姩瀵�"鍚堟牸(isPass=1)涓旀湭鍙戣瘉(certificateId 涓虹┖)"鐨勫弬璁汉鐢熸垚璇佷功 |
+| 璇佷功绫诲瀷鏄犲皠 | 瀹夊叏鍩硅(1)鈫掕瘉涔︾被鍨�4 瀹夊叏鍩硅鍚堟牸璇侊紱鎶�鑳藉煿璁�(2)鈫掕瘉涔︾被鍨�3 鎶�鑳界瓑绾ц瘉涔︼紱绠$悊/鍏朵粬涓嶆敮鎸佽嚜鍔ㄥ彂璇� |
+| 璇佷功鏈夋晥鏈� | 鍙戣瘉鏃ユ湡=瀹屾垚褰撳ぉ锛涘埌鏈熸棩鏈�=瀹屾垚褰撳ぉ + certValidityMonths 涓湀 |
+| 骞傜瓑 | 閲嶅鐐�"瀹屾垚"涓嶄細閲嶅鍙戣瘉锛堝弬璁汉鍥炲啓 certificateId 闃查噸锛� |
+| 涓嶅彲缂栬緫杈圭晫 | 宸插畬鎴�/宸插彇娑堢殑鍩硅锛氫笉鍙紪杈戙�佸垹闄わ紝涓嶅彲娣诲姞/鏇存柊/鍒犻櫎鍙傝浜� |
+| 鍙傝浜哄敮涓� | 鍚屼竴鍩硅涓嬪悓涓�鍛樺伐鍙厑璁镐竴鏉¤褰曪紝閲嶅娣诲姞鑷姩璺宠繃 |
+| 缂栧彿鐢熸垚 | trainingNo 浠� PX 寮�澶� + 鏃ユ湡 + 鑷锛岀敱鍚庣鐢熸垚锛屽墠绔彧璇诲睍绀� |
+| 鍒版湡鎻愰啋鍙戦�佸璞� | 浠呰鍛樺伐缁戝畾绯荤粺璐﹀彿涓斿湪鑱�/璇曠敤锛涚鑱屼笉鎻愰啋 |
+
+## 娉ㄦ剰浜嬮」
+
+- 鍩硅鐩稿叧 4 涓寜閽潈闄愶紙query/create/update/delete锛変笌璇佷功璧勮川涓�鑷村凡鎺堟潈缁欑鎴风鐞嗗憳绛夎鑹诧紱濡傛煇浜涜处鍙风湅涓嶅埌"鍩硅绠$悊"鑿滃崟锛岄渶鍦�"绯荤粺绠$悊鈫掕鑹茬鐞�"閲屽嬀閫夎鑿滃崟鏉冮檺銆�
+- 绔欏唴淇″湪鐧诲綍鐢ㄦ埛鐨�"绯荤粺娑堟伅"鍐呮煡鐪嬶紱鏀朵欢浜烘槸鍩硅澶栫殑鍛樺伐鏈汉锛堣瘉涔�/鍚堝悓褰掑睘鍛樺伐锛夛紝涓嶆槸 HR 鎿嶄綔浜恒��
+- `certificateId` 涓哄彧璇诲洖鏄撅紝鍓嶇涓嶅彲鎻愪氦銆�
+- 鑻ヤ慨鏀逛簡鍒版湡鎻愰啋澶╂暟閰嶇疆锛岃鍦�"绯荤粺閰嶇疆"淇濆瓨锛屼笅娆℃彁閱掓壂鎻忓嵆鎸夋柊鍊肩敓鏁堛��
diff --git a/docs/machinery_equipment_material_inbound.md b/docs/machinery_equipment_material_inbound.md
new file mode 100644
index 0000000..7c17128
--- /dev/null
+++ b/docs/machinery_equipment_material_inbound.md
@@ -0,0 +1,83 @@
+# 璁惧鍙拌处鍒涘缓鑷姩寤虹墿鏂欏苟鍏ヨ澶囦粨 - 鍓嶇鑱旇皟鏂规
+
+## 娑夊強椤甸潰
+
+- MES 璁惧绠$悊 鈫� 璁惧鍙拌处锛氭柊澧�/缂栬緫琛ㄥ崟銆佸垪琛�
+- MES 璁惧绠$悊 鈫� 璁惧鍙拌处锛欵xcel 瀵煎叆
+- MDM 涓绘暟鎹� 鈫� 鐗╂枡锛堝彲鍦ㄢ�滆澶団�濆垎绫讳笅鐪嬪埌鑷姩鐢熸垚鐨勮澶囩墿鏂欙級
+- MES 浠撳偍 鈫� 搴撳瓨鏌ヨ / 搴撳瓨娴佹按鏌ヨ锛堟煡鐪嬭澶囦粨鏁伴噺涓庢祦姘达級
+
+## 涓氬姟娴佺▼涓庢暟鎹甫鍏�
+
+1. 鏂板璁惧锛堝崟鏉�/Excel 瀵煎叆锛夆啋 鍚庣鍦ㄥ悓涓�浜嬪姟鍐呰嚜鍔ㄥ畬鎴愶細
+ - 鍒涘缓 MDM 鐗╂枡锛堢被鍨�=璁惧銆佸垎绫�=璁惧銆佸崟浣�=鍙般�佺紪鐮�=璁惧缂栫爜銆佸悕绉�=璁惧鍚嶇О銆佽鏍�=璁惧瑙勬牸鍨嬪彿锛�
+ - 鍚屾鍒涘缓 MES 鐗╂枡锛堢紪鐮�/鍚嶇О/瑙勬牸涓� MDM 瀵归綈锛屼袱濂楃墿鏂� id 鐩哥瓑锛�
+ - 钀借澶囧彴璐﹀苟鍥炲啓 `itemId`锛堣澶囪鎯�/鍒楄〃鍙煡锛�
+ - 鐢熸垚涓�鏉″簱瀛樻祦姘村苟鍏ヨ澶囦粨锛圫YS-EQUIPMENT / SYS-EQUIP-LOC-01 / SYS-EQUIP-BIN-01锛夛紝搴撳瓨鏁伴噺 +1
+2. 缂栬緫璁惧锛堝崟鏉�/Excel 鏇存柊锛夆啋 鍙敼璁惧鍙拌处锛屼笉閲嶅寤虹墿鏂欍�佷笉閲嶅鍏ュ簱锛宍itemId` 淇濇寔涓嶅彉
+3. 鍒犻櫎璁惧 鈫� 宸茬敓鎴愮墿鏂欏苟鍏ヨ澶囦粨鐨勮澶囩姝㈠垹闄わ紙闇�鍏堥�氳繃搴撳瓨璋冩暣澶勭悊搴撳瓨锛�
+
+## API
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| POST | /mes/dv-machinery/create | 鏂板璁惧锛堣嚜鍔ㄥ缓鐗╂枡骞跺叆搴擄級 |
+| PUT | /mes/dv-machinery/update | 缂栬緫璁惧锛堜笉閲嶅寤虹墿鏂�/鍏ュ簱锛� |
+| DELETE | /mes/dv-machinery/delete?id= | 鍒犻櫎璁惧锛堝凡鍏ヨ澶囦粨鍒欐嫤鎴級 |
+| POST | /mes/dv-machinery/import | Excel 瀵煎叆锛堝垱寤鸿鍚屾牱寤虹墿鏂欏苟鍏ュ簱锛� |
+| GET | /mes/dv-machinery/page | 璁惧鍒嗛〉鍒楄〃 |
+| GET | /mes/dv-machinery/get?id= | 璁惧璇︽儏 |
+
+**璇锋眰鍙傛暟锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| code | String | 鏄� | 璁惧缂栫爜锛堝皢浣滀负瀵瑰簲鐗╂枡鐨勭墿鏂欑紪鐮侊級 |
+| name | String | 鏄� | 璁惧鍚嶇О锛堝皢浣滀负瀵瑰簲鐗╂枡鐨勭墿鏂欏悕绉帮級 |
+| specification | String | 鍚� | 瑙勬牸鍨嬪彿锛堝悓姝ュ埌鐗╂枡瑙勬牸锛� |
+| machineryTypeId | Long | 鏄� | 璁惧绫诲瀷 |
+| workshopId | Long | 鏄� | 鎵�灞炶溅闂� |
+| status | Integer | 鏄� | 璁惧鐘舵�� |
+
+鏂板/瀵煎叆鏃跺墠绔�**鏃犻渶浼� `itemId`**锛堢郴缁熻嚜鍔ㄧ敓鎴愬苟鍥炲啓锛夈��
+
+**鍝嶅簲瀛楁鏂板锛坄get` / `page` / `simple-list` 杩斿洖鐨� RespVO 涓級锛�**
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| itemId | Long | 璇ヨ澶囧搴旂殑鐗╂枡缂栧彿锛�=MDM 鐗╂枡 id锛屽悓鏃剁瓑浜� MES 鐗╂枡 id锛� |
+
+**鍏充簬鍒涘缓鍝嶅簲锛�** `POST /create` 杩斿洖浣� `data` 浠嶄负 `Long`锛堟柊寤鸿澶� id锛夛紝涓嶇洿鎺ユ惡甯� `itemId`銆傚墠绔繚瀛樻垚鍔熷悗鑻ラ渶绔嬪嵆灞曠ず瀵瑰簲鐗╂枡缂栧彿锛屽彲鍐嶈皟鐢� `GET /get?id=<鏂癷d>` 鍙� `data.itemId`锛沗/page`銆乣/simple-list` 鍒楄〃琛屼篃浼氳繑鍥炶瀛楁銆�
+
+**璇︽儏鍝嶅簲绀轰緥锛�**
+
+```json
+{
+ "code": 0,
+ "data": { "id": 1024, "code": "EQ-001", "itemId": 100001 }
+}
+```
+
+## 瀛楁灞曠ず瑙勫垯
+
+| 瀛楁 | 灞曠ず浣嶇疆 | 璇存槑 |
+|------|----------|------|
+| 瀵瑰簲鐗╂枡缂栧彿(itemId) | 璁惧鍒楄〃銆佽鎯� | 鍚庣鑷姩鐢熸垚锛涘彲鐢ㄤ簬璺宠浆 MDM 鐗╂枡璇︽儏鎴栨寜鐗╂枡鏌ュ簱瀛� |
+| 璁惧浠撳簱瀛� | 搴撳瓨鏌ヨ椤碉紙浠撳簱=璁惧浠擄級 | 鏂板缓璁惧鑷姩鍏ヨ澶囦粨锛屾暟閲忎负 1 |
+
+## 涓氬姟瑙勫垯璇存槑
+
+| 鍦烘櫙 | 瑙勫垯 |
+|------|------|
+| 鏂板璁惧 | 鍚屼竴浜嬪姟锛氬缓 MDM 鐗╂枡 鈫� 鍚屾 MES 鐗╂枡 鈫� 钀藉彴璐� 鈫� 鍏ヨ澶囦粨锛�+1锛夈�備换涓�姝ュけ璐ユ暣浣撳洖婊氾紝涓嶇暀鑴忔暟鎹� |
+| 缂栬緫璁惧 | 涓嶉噸寤虹墿鏂欍�佷笉鍏ュ簱锛沗itemId` 鍙涓嶅洖浼� |
+| 鍒犻櫎璁惧 | `itemId` 闈炵┖鐨勮澶囩姝㈠垹闄わ紙闃叉搴撳瓨娴佹按澶卞幓涓氬姟涓讳綋锛夛紝闇�鍏堝仛搴撳瓨璋冩暣 |
+| Excel 瀵煎叆 | 鍒涘缓琛屼笌鍗曟潯鏂板璧板悓涓�濂椻�滃缓鐗╂枡 + 鍏ヨ澶囦粨鈥濋�昏緫锛涚紪鐮佸啿绐佽鎶ラ敊涓嶈惤搴� |
+| 缂轰富鏁版嵁 | 鑻モ�滆澶団�濆垎绫�/鈥滃彴鈥濆崟浣嶆垨璁惧浠撴湭鍒濆鍖栵紝鏂板/瀵煎叆鎶モ�滀富鏁版嵁鏈垵濮嬪寲鈥濓紝鎻愮ず鑱旂郴绠$悊鍛� |
+
+## 娉ㄦ剰浜嬮」
+
+- 璁惧缂栫爜鍗崇墿鏂欑紪鐮侊紝璇蜂繚鎸佽澶囩紪鐮佸湪鐗╂枡缁村害涔熷敮涓�锛堢郴缁熷鐗╂枡缂栫爜鍋氬敮涓�鏍¢獙锛屽啿绐佷細瀵艰嚧鏂板澶辫触锛夈��
+- 鍒楄〃/璇︽儏鎺ュ彛杩斿洖鐨� `itemId` 鍙湪鈥滃簱瀛�/娴佹按鈥濇煡璇腑浣滀负绛涢�夋潯浠舵煡鐪嬭璁惧鍦ㄨ澶囦粨鐨勫簱瀛樹笌娴佹按銆�
+- 鑻ラ渶鍦� MDM 鐗╂枡椤垫寜鍒嗙被绛涢�夋煡鐪嬭澶囩墿鏂欙紝閫変腑鈥滆澶団�濆垎绫诲嵆鍙��
+- 鏁版嵁搴撻渶鍏堟墽琛屽垵濮嬪寲鑴氭湰 `docs/sql/equipment_material_stock_link.sql`锛堟柊澧� `mes_dv_machinery.item_id`銆佲�滆澶団�濆垎绫�/绫诲瀷銆佲�滃彴鈥濆崟浣嶏級锛屽惁鍒欐柊寤鸿澶囦細鎻愮ず涓绘暟鎹湭鍒濆鍖栥��
diff --git a/docs/sql/bpm_mes_wm_approval_flows.sql b/docs/sql/bpm_mes_wm_approval_flows.sql
new file mode 100644
index 0000000..ebe236b
--- /dev/null
+++ b/docs/sql/bpm_mes_wm_approval_flows.sql
@@ -0,0 +1,140 @@
+-- =====================================================================
+-- MES 浠撳偍鍩� BPM 瀹℃壒娴佺▼鎵嬪伐閮ㄧ讲鑴氭湰
+-- 鐩爣搴擄細mom-xgdl锛坙ocal profile锛�
+--
+-- 閮ㄧ讲 6 涓笓鐢ㄦ祦绋嬶紝娴佺▼瀹氫箟 KEY_ 涓庡悇涓氬姟鐩戝惉鍣� getProcessDefinitionKey() 瀹屽叏涓�鑷达細
+-- 鍒嗙被/KEY_ 娴佺▼鍚� 鐩戝惉鍣�
+-- misc_receipt_approve 鏉傞」鍏ュ簱瀹℃壒娴佺▼ MesWmMiscReceiptStatusListener
+-- misc_issue_approve 鏉傞」鍑哄簱瀹℃壒娴佺▼ MesWmMiscIssueStatusListener
+-- return_vendor_approve 渚涘簲鍟嗛��璐у鎵规祦绋� MesWmReturnVendorStatusListener
+-- item_receipt_approve 閲囪喘鍏ュ簱瀹℃壒娴佺▼ MesWmItemReceiptStatusListener
+-- stock_taking_result_approve 鐩樼偣缁撴灉瀹℃壒娴佺▼ MesWmStockTakingTaskResultStatusListener
+-- equipment_receipt_approve 璁惧鍏ュ簱瀹℃壒娴佺▼ MesWmEquipmentReceiptStatusListener
+--
+-- BPMN 妯℃澘锛歝rm-invoice-audit锛坈andidateStrategy=36 鍙戣捣浜烘彁浜よ嚜鍔ㄩ�氳繃锛夊鍒跺苟鏇挎崲 key/鍚嶇О銆�
+-- 绾︽潫閬靛畧 bpm-manual-deployment 璁板繂锛�
+-- model_type=10锛汦NGINE_VERSION_ 鐣� NULL锛堜笉鍐欑┖涓诧級锛汳ETA_INFO_ 鍚� sort锛沝eployment=32浣嶆棤妯嚎ID銆�
+-- =====================================================================
+
+SET NAMES utf8mb4;
+
+-- 1. ACT_RE_DEPLOYMENT -------------------------------------------------
+INSERT INTO `mom-xgdl`.`ACT_RE_DEPLOYMENT` (ID_, NAME_, CATEGORY_, KEY_, TENANT_ID_, DEPLOY_TIME_, ENGINE_VERSION_)
+VALUES
+('10000000000000000000000000000001', '鏉傞」鍏ュ簱瀹℃壒娴佺▼', 'misc_receipt_approve', '', '', NOW(), NULL),
+('10000000000000000000000000000002', '鏉傞」鍑哄簱瀹℃壒娴佺▼', 'misc_issue_approve', '', '', NOW(), NULL),
+('10000000000000000000000000000003', '渚涘簲鍟嗛��璐у鎵规祦绋�', 'return_vendor_approve', '', '', NOW(), NULL),
+('10000000000000000000000000000004', '閲囪喘鍏ュ簱瀹℃壒娴佺▼', 'item_receipt_approve', '', '', NOW(), NULL),
+('10000000000000000000000000000005', '鐩樼偣缁撴灉瀹℃壒娴佺▼', 'stock_taking_result_approve', '', '', NOW(), NULL),
+('10000000000000000000000000000006', '璁惧鍏ュ簱瀹℃壒娴佺▼', 'equipment_receipt_approve', '', '', NOW(), NULL);
+
+-- 2. ACT_GE_BYTEARRAY锛圔PMN XML锛氫粠 crm-invoice-audit 妯℃澘澶嶅埗骞舵浛鎹� key/鍚嶇О锛�----
+INSERT INTO `mom-xgdl`.`ACT_GE_BYTEARRAY` (ID_, REV_, NAME_, DEPLOYMENT_ID_, BYTES_, GENERATED_)
+SELECT
+ '30000000000000000000000000000001', 1, 'misc_receipt_approve.bpmn', '10000000000000000000000000000001',
+ CAST(REPLACE(REPLACE(CONVERT(BYTES_ USING utf8mb4), 'crm-invoice-audit', 'misc_receipt_approve'), '寮�绁ㄥ鎵规祦绋�', '鏉傞」鍏ュ簱瀹℃壒娴佺▼') AS BINARY), 0
+FROM `mom-xgdl`.`ACT_GE_BYTEARRAY` WHERE ID_ = 'c101d3e1-0001-11f2-8a27-00155dad6485'
+UNION ALL
+SELECT
+ '30000000000000000000000000000002', 1, 'misc_issue_approve.bpmn', '10000000000000000000000000000002',
+ CAST(REPLACE(REPLACE(CONVERT(BYTES_ USING utf8mb4), 'crm-invoice-audit', 'misc_issue_approve'), '寮�绁ㄥ鎵规祦绋�', '鏉傞」鍑哄簱瀹℃壒娴佺▼') AS BINARY), 0
+FROM `mom-xgdl`.`ACT_GE_BYTEARRAY` WHERE ID_ = 'c101d3e1-0001-11f2-8a27-00155dad6485'
+UNION ALL
+SELECT
+ '30000000000000000000000000000003', 1, 'return_vendor_approve.bpmn', '10000000000000000000000000000003',
+ CAST(REPLACE(REPLACE(CONVERT(BYTES_ USING utf8mb4), 'crm-invoice-audit', 'return_vendor_approve'), '寮�绁ㄥ鎵规祦绋�', '渚涘簲鍟嗛��璐у鎵规祦绋�') AS BINARY), 0
+FROM `mom-xgdl`.`ACT_GE_BYTEARRAY` WHERE ID_ = 'c101d3e1-0001-11f2-8a27-00155dad6485'
+UNION ALL
+SELECT
+ '30000000000000000000000000000004', 1, 'item_receipt_approve.bpmn', '10000000000000000000000000000004',
+ CAST(REPLACE(REPLACE(CONVERT(BYTES_ USING utf8mb4), 'crm-invoice-audit', 'item_receipt_approve'), '寮�绁ㄥ鎵规祦绋�', '閲囪喘鍏ュ簱瀹℃壒娴佺▼') AS BINARY), 0
+FROM `mom-xgdl`.`ACT_GE_BYTEARRAY` WHERE ID_ = 'c101d3e1-0001-11f2-8a27-00155dad6485'
+UNION ALL
+SELECT
+ '30000000000000000000000000000005', 1, 'stock_taking_result_approve.bpmn', '10000000000000000000000000000005',
+ CAST(REPLACE(REPLACE(CONVERT(BYTES_ USING utf8mb4), 'crm-invoice-audit', 'stock_taking_result_approve'), '寮�绁ㄥ鎵规祦绋�', '鐩樼偣缁撴灉瀹℃壒娴佺▼') AS BINARY), 0
+FROM `mom-xgdl`.`ACT_GE_BYTEARRAY` WHERE ID_ = 'c101d3e1-0001-11f2-8a27-00155dad6485'
+UNION ALL
+SELECT
+ '30000000000000000000000000000006', 1, 'equipment_receipt_approve.bpmn', '10000000000000000000000000000006',
+ CAST(REPLACE(REPLACE(CONVERT(BYTES_ USING utf8mb4), 'crm-invoice-audit', 'equipment_receipt_approve'), '寮�绁ㄥ鎵规祦绋�', '璁惧鍏ュ簱瀹℃壒娴佺▼') AS BINARY), 0
+FROM `mom-xgdl`.`ACT_GE_BYTEARRAY` WHERE ID_ = 'c101d3e1-0001-11f2-8a27-00155dad6485';
+
+-- 3. ACT_RE_PROCDEF锛圗NGINE_VERSION_ 蹇呴』 NULL锛屼笉鍐欑┖涓诧級----------------
+INSERT INTO `mom-xgdl`.`ACT_RE_PROCDEF` (ID_, REV_, CATEGORY_, NAME_, KEY_, VERSION_, DEPLOYMENT_ID_, RESOURCE_NAME_, DGRM_RESOURCE_NAME_, DESCRIPTION_, HAS_START_FORM_KEY_, HAS_GRAPHICAL_NOTATION_, SUSPENSION_STATE_, TENANT_ID_, ENGINE_VERSION_, DERIVED_FROM_, DERIVED_FROM_ROOT_, DERIVED_VERSION_)
+VALUES
+('misc_receipt_approve:1:10000000000000000000000000000001', 1, 'misc_receipt_approve', '鏉傞」鍏ュ簱瀹℃壒娴佺▼', 'misc_receipt_approve', 1, '10000000000000000000000000000001', 'misc_receipt_approve.bpmn', '', '', 0, 0, 1, '', NULL, '', '', 0),
+('misc_issue_approve:1:10000000000000000000000000000002', 1, 'misc_issue_approve', '鏉傞」鍑哄簱瀹℃壒娴佺▼', 'misc_issue_approve', 1, '10000000000000000000000000000002', 'misc_issue_approve.bpmn', '', '', 0, 0, 1, '', NULL, '', '', 0),
+('return_vendor_approve:1:10000000000000000000000000000003', 1, 'return_vendor_approve', '渚涘簲鍟嗛��璐у鎵规祦绋�', 'return_vendor_approve', 1, '10000000000000000000000000000003', 'return_vendor_approve.bpmn', '', '', 0, 0, 1, '', NULL, '', '', 0),
+('item_receipt_approve:1:10000000000000000000000000000004', 1, 'item_receipt_approve', '閲囪喘鍏ュ簱瀹℃壒娴佺▼', 'item_receipt_approve', 1, '10000000000000000000000000000004', 'item_receipt_approve.bpmn', '', '', 0, 0, 1, '', NULL, '', '', 0),
+('stock_taking_result_approve:1:10000000000000000000000000000005', 1, 'stock_taking_result_approve', '鐩樼偣缁撴灉瀹℃壒娴佺▼', 'stock_taking_result_approve', 1, '10000000000000000000000000000005', 'stock_taking_result_approve.bpmn', '', '', 0, 0, 1, '', NULL, '', '', 0),
+('equipment_receipt_approve:1:10000000000000000000000000000006', 1, 'equipment_receipt_approve', '璁惧鍏ュ簱瀹℃壒娴佺▼', 'equipment_receipt_approve', 1, '10000000000000000000000000000006', 'equipment_receipt_approve.bpmn', '', '', 0, 0, 1, '', NULL, '', '', 0);
+
+-- 4. ACT_RE_MODEL锛圡ETA_INFO_ 鍚� sort锛汦DITOR_SOURCE_VALUE_ID_ 瀵归綈 BPMN bytearray锛�----
+INSERT INTO `mom-xgdl`.`ACT_RE_MODEL` (ID_, REV_, NAME_, KEY_, CATEGORY_, CREATE_TIME_, LAST_UPDATE_TIME_, VERSION_, META_INFO_, DEPLOYMENT_ID_, EDITOR_SOURCE_VALUE_ID_, EDITOR_SOURCE_EXTRA_VALUE_ID_, TENANT_ID_)
+VALUES
+('20000000000000000000000000000001', 1, '鏉傞」鍏ュ簱瀹℃壒娴佺▼', 'misc_receipt_approve', 'misc_receipt_approve', NOW(), NOW(), 1,
+ '{"allowCancelRunningProcess":true,"allowWithdrawTask":false,"autoApprovalType":0,"description":"","formCustomCreatePath":"","formCustomViewPath":"","formId":1,"formType":10,"icon":null,"managerUserIds":[1],"printTemplateSetting":{"enable":false,"template":""},"processAfterTriggerSetting":null,"processBeforeTriggerSetting":null,"processIdRule":{"enable":false,"infix":"","length":5,"postfix":"","prefix":""},"sort":1785465606001,"startDeptIds":[],"startUserIds":[],"summarySetting":{"enable":false,"summary":[]},"taskAfterTriggerSetting":null,"taskBeforeTriggerSetting":null,"titleSetting":{"enable":false,"title":""},"type":10,"visible":true}',
+ '10000000000000000000000000000001', '30000000000000000000000000000001', NULL, ''),
+('20000000000000000000000000000002', 1, '鏉傞」鍑哄簱瀹℃壒娴佺▼', 'misc_issue_approve', 'misc_issue_approve', NOW(), NOW(), 1,
+ '{"allowCancelRunningProcess":true,"allowWithdrawTask":false,"autoApprovalType":0,"description":"","formCustomCreatePath":"","formCustomViewPath":"","formId":1,"formType":10,"icon":null,"managerUserIds":[1],"printTemplateSetting":{"enable":false,"template":""},"processAfterTriggerSetting":null,"processBeforeTriggerSetting":null,"processIdRule":{"enable":false,"infix":"","length":5,"postfix":"","prefix":""},"sort":1785465606002,"startDeptIds":[],"startUserIds":[],"summarySetting":{"enable":false,"summary":[]},"taskAfterTriggerSetting":null,"taskBeforeTriggerSetting":null,"titleSetting":{"enable":false,"title":""},"type":10,"visible":true}',
+ '10000000000000000000000000000002', '30000000000000000000000000000002', NULL, ''),
+('20000000000000000000000000000003', 1, '渚涘簲鍟嗛��璐у鎵规祦绋�', 'return_vendor_approve', 'return_vendor_approve', NOW(), NOW(), 1,
+ '{"allowCancelRunningProcess":true,"allowWithdrawTask":false,"autoApprovalType":0,"description":"","formCustomCreatePath":"","formCustomViewPath":"","formId":1,"formType":10,"icon":null,"managerUserIds":[1],"printTemplateSetting":{"enable":false,"template":""},"processAfterTriggerSetting":null,"processBeforeTriggerSetting":null,"processIdRule":{"enable":false,"infix":"","length":5,"postfix":"","prefix":""},"sort":1785465606003,"startDeptIds":[],"startUserIds":[],"summarySetting":{"enable":false,"summary":[]},"taskAfterTriggerSetting":null,"taskBeforeTriggerSetting":null,"titleSetting":{"enable":false,"title":""},"type":10,"visible":true}',
+ '10000000000000000000000000000003', '30000000000000000000000000000003', NULL, ''),
+('20000000000000000000000000000004', 1, '閲囪喘鍏ュ簱瀹℃壒娴佺▼', 'item_receipt_approve', 'item_receipt_approve', NOW(), NOW(), 1,
+ '{"allowCancelRunningProcess":true,"allowWithdrawTask":false,"autoApprovalType":0,"description":"","formCustomCreatePath":"","formCustomViewPath":"","formId":1,"formType":10,"icon":null,"managerUserIds":[1],"printTemplateSetting":{"enable":false,"template":""},"processAfterTriggerSetting":null,"processBeforeTriggerSetting":null,"processIdRule":{"enable":false,"infix":"","length":5,"postfix":"","prefix":""},"sort":1785465606004,"startDeptIds":[],"startUserIds":[],"summarySetting":{"enable":false,"summary":[]},"taskAfterTriggerSetting":null,"taskBeforeTriggerSetting":null,"titleSetting":{"enable":false,"title":""},"type":10,"visible":true}',
+ '10000000000000000000000000000004', '30000000000000000000000000000004', NULL, ''),
+('20000000000000000000000000000005', 1, '鐩樼偣缁撴灉瀹℃壒娴佺▼', 'stock_taking_result_approve', 'stock_taking_result_approve', NOW(), NOW(), 1,
+ '{"allowCancelRunningProcess":true,"allowWithdrawTask":false,"autoApprovalType":0,"description":"","formCustomCreatePath":"","formCustomViewPath":"","formId":1,"formType":10,"icon":null,"managerUserIds":[1],"printTemplateSetting":{"enable":false,"template":""},"processAfterTriggerSetting":null,"processBeforeTriggerSetting":null,"processIdRule":{"enable":false,"infix":"","length":5,"postfix":"","prefix":""},"sort":1785465606005,"startDeptIds":[],"startUserIds":[],"summarySetting":{"enable":false,"summary":[]},"taskAfterTriggerSetting":null,"taskBeforeTriggerSetting":null,"titleSetting":{"enable":false,"title":""},"type":10,"visible":true}',
+ '10000000000000000000000000000005', '30000000000000000000000000000005', NULL, ''),
+('20000000000000000000000000000006', 1, '璁惧鍏ュ簱瀹℃壒娴佺▼', 'equipment_receipt_approve', 'equipment_receipt_approve', NOW(), NOW(), 1,
+ '{"allowCancelRunningProcess":true,"allowWithdrawTask":false,"autoApprovalType":0,"description":"","formCustomCreatePath":"","formCustomViewPath":"","formId":1,"formType":10,"icon":null,"managerUserIds":[1],"printTemplateSetting":{"enable":false,"template":""},"processAfterTriggerSetting":null,"processBeforeTriggerSetting":null,"processIdRule":{"enable":false,"infix":"","length":5,"postfix":"","prefix":""},"sort":1785465606006,"startDeptIds":[],"startUserIds":[],"summarySetting":{"enable":false,"summary":[]},"taskAfterTriggerSetting":null,"taskBeforeTriggerSetting":null,"titleSetting":{"enable":false,"title":""},"type":10,"visible":true}',
+ '10000000000000000000000000000006', '30000000000000000000000000000006', NULL, '');
+
+-- 5. bpm_process_definition_info锛坢odel_type=10锛宒eleted=0锛�---------------
+INSERT INTO `mom-xgdl`.`bpm_process_definition_info`
+(process_definition_id, model_id, model_type, category, icon, description, form_type, form_id, form_conf, form_fields, simple_model, visible, sort, start_user_ids, start_dept_ids, manager_user_ids, allow_cancel_running_process, allow_withdraw_task, deleted, creator, create_time, updater, update_time)
+VALUES
+('misc_receipt_approve:1:10000000000000000000000000000001', '20000000000000000000000000000001', 10, 'misc_receipt_approve', NULL, NULL, 10, 1,
+ '{"form":{"layout":"horizontal","labelAlign":"right","size":"middle","colon":false,"labelCol":{"style":{"width":"125px"}},"wrapperCol":{"span":24},"labelWidth":"100px"},"resetBtn":{"show":false,"innerText":"閲嶇疆"},"submitBtn":{"show":true,"innerText":"鎻愪氦"}}',
+ '[]', NULL, 1, 1785465606001, NULL, NULL, '1', 1, 1, 0, '1', NOW(), '1', NOW()),
+('misc_issue_approve:1:10000000000000000000000000000002', '20000000000000000000000000000002', 10, 'misc_issue_approve', NULL, NULL, 10, 1,
+ '{"form":{"layout":"horizontal","labelAlign":"right","size":"middle","colon":false,"labelCol":{"style":{"width":"125px"}},"wrapperCol":{"span":24},"labelWidth":"100px"},"resetBtn":{"show":false,"innerText":"閲嶇疆"},"submitBtn":{"show":true,"innerText":"鎻愪氦"}}',
+ '[]', NULL, 1, 1785465606002, NULL, NULL, '1', 1, 1, 0, '1', NOW(), '1', NOW()),
+('return_vendor_approve:1:10000000000000000000000000000003', '20000000000000000000000000000003', 10, 'return_vendor_approve', NULL, NULL, 10, 1,
+ '{"form":{"layout":"horizontal","labelAlign":"right","size":"middle","colon":false,"labelCol":{"style":{"width":"125px"}},"wrapperCol":{"span":24},"labelWidth":"100px"},"resetBtn":{"show":false,"innerText":"閲嶇疆"},"submitBtn":{"show":true,"innerText":"鎻愪氦"}}',
+ '[]', NULL, 1, 1785465606003, NULL, NULL, '1', 1, 1, 0, '1', NOW(), '1', NOW()),
+('item_receipt_approve:1:10000000000000000000000000000004', '20000000000000000000000000000004', 10, 'item_receipt_approve', NULL, NULL, 10, 1,
+ '{"form":{"layout":"horizontal","labelAlign":"right","size":"middle","colon":false,"labelCol":{"style":{"width":"125px"}},"wrapperCol":{"span":24},"labelWidth":"100px"},"resetBtn":{"show":false,"innerText":"閲嶇疆"},"submitBtn":{"show":true,"innerText":"鎻愪氦"}}',
+ '[]', NULL, 1, 1785465606004, NULL, NULL, '1', 1, 1, 0, '1', NOW(), '1', NOW()),
+('stock_taking_result_approve:1:10000000000000000000000000000005', '20000000000000000000000000000005', 10, 'stock_taking_result_approve', NULL, NULL, 10, 1,
+ '{"form":{"layout":"horizontal","labelAlign":"right","size":"middle","colon":false,"labelCol":{"style":{"width":"125px"}},"wrapperCol":{"span":24},"labelWidth":"100px"},"resetBtn":{"show":false,"innerText":"閲嶇疆"},"submitBtn":{"show":true,"innerText":"鎻愪氦"}}',
+ '[]', NULL, 1, 1785465606005, NULL, NULL, '1', 1, 1, 0, '1', NOW(), '1', NOW()),
+('equipment_receipt_approve:1:10000000000000000000000000000006', '20000000000000000000000000000006', 10, 'equipment_receipt_approve', NULL, NULL, 10, 1,
+ '{"form":{"layout":"horizontal","labelAlign":"right","size":"middle","colon":false,"labelCol":{"style":{"width":"125px"}},"wrapperCol":{"span":24},"labelWidth":"100px"},"resetBtn":{"show":false,"innerText":"閲嶇疆"},"submitBtn":{"show":true,"innerText":"鎻愪氦"}}',
+ '[]', NULL, 1, 1785465606006, NULL, NULL, '1', 1, 1, 0, '1', NOW(), '1', NOW());
+
+-- =====================================================================
+-- 闄勫綍锛歁6 鑿滃崟/鏉冮檺琛ュ厖锛堝凡鍦� mom-xgdl 鎵ц锛�
+-- 閲嶅鎵ц浼氫富閿啿绐侊紝娉ㄦ剰骞傜瓑銆�
+-- =====================================================================
+
+-- SN 鐮佽ˉ"鏇存柊"鎸夐挳锛堝嚭鍏ュ簱/璇︽儏鎺ュ彛渚濊禆 mes:wm-sn:update锛�
+INSERT INTO `mom-xgdl`.`system_menu`
+(id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
+VALUES
+(1065725, 'SN 鐮佹洿鏂�', 'mes:wm-sn:update', 3, 3, 5897, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0');
+
+-- 璁惧鍏ュ簱鍗曡彍鍗曪紙浠撳偍鐗╂祦 5780 涓嬶紝缁勪欢 wls/equipmentreceipt/index锛�
+INSERT INTO `mom-xgdl`.`system_menu`
+(id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
+VALUES
+(1065726, '璁惧鍏ュ簱', '', 2, 20, 5780, 'equipment-receipt', 'fa-solid:box-open', 'wls/equipmentreceipt/index', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
+(1065727, '璁惧鍏ュ簱鏌ヨ', 'mes:wm:equipment-receipt:query', 3, 1, 1065726, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
+(1065728, '璁惧鍏ュ簱鍒涘缓', 'mes:wm:equipment-receipt:create', 3, 2, 1065726, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
+(1065729, '璁惧鍏ュ簱鏇存柊', 'mes:wm:equipment-receipt:update', 3, 3, 1065726, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
+(1065730, '璁惧鍏ュ簱鍒犻櫎', 'mes:wm:equipment-receipt:delete', 3, 4, 1065726, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
+(1065731, '璁惧鍏ュ簱鎻愪氦', 'mes:wm:equipment-receipt:submit', 3, 5, 1065726, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
+(1065732, '璁惧鍏ュ簱鎵ц', 'mes:wm:equipment-receipt:finish', 3, 6, 1065726, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
+(1065733, '璁惧鍏ュ簱鍙栨秷', 'mes:wm:equipment-receipt:cancel', 3, 7, 1065726, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0');
\ No newline at end of file
diff --git a/docs/sql/equipment_material_stock_link.sql b/docs/sql/equipment_material_stock_link.sql
new file mode 100644
index 0000000..0426621
--- /dev/null
+++ b/docs/sql/equipment_material_stock_link.sql
@@ -0,0 +1,48 @@
+-- =====================================================================
+-- 璁惧鍙拌处鑱斿姩璁惧浠擄細璁惧鐗╂枡涓绘暟鎹垵濮嬪寲鑴氭湰锛圡ySQL锛�
+-- 鐩爣搴擄細mom-xgdl锛堟湰鍦� dev 搴擄級銆傚叾瀹冨簱鎵ц鍓嶈鏍稿涓婚敭 id 鏄惁鍐茬獊銆�
+--
+-- 鑳屾櫙锛�
+-- 1) MES 璁惧鍒涘缓鏃惰嚜鍔ㄧ敓鎴愬搴旂墿鏂欙紝杩涘叆璁惧浠撳簱瀛橈紝鍏宠仈閾句负锛�
+-- mes_dv_machinery.item_id -> mdm_item.id锛�= mes_md_item.id 瀵归綈锛�
+-- 2) 璁惧鐗╂枡澶嶇敤浜� MDM/MES 涓ゅ涓绘暟鎹紝鏈剼鏈ˉ榻愶細
+-- - 鍒嗙被/绫诲瀷锛氣�滆澶団�濓紙mes_md_item_type 涓� mdm_item_category 浣跨敤鍚屼竴 id 瀵归綈锛�
+-- - 璁¢噺鍗曚綅锛氣�滃彴鈥濓紙mes_md_unit_measure 涓� mdm_unit_measure锛�
+-- - 璁惧浠�/搴撳尯/搴撲綅锛歋YS-EQUIPMENT / SYS-EQUIP-LOC-01 / SYS-EQUIP-BIN-01
+-- 锛堝鐩爣搴撶己澶遍渶鍙﹁鍒濆鍖栵紱浠g爜浠呭湪缂哄け鏃剁粰鍑衡�滀富鏁版嵁鏈垵濮嬪寲鈥濇彁绀猴級
+--
+-- 绾︽潫锛氳剼鏈笉鍚� tenant_id锛汚DD COLUMN 鍓嶅仛瀛樺湪鎬ф鏌ワ紙MySQL 涓嶆敮鎸� IF NOT EXISTS锛夈��
+-- =====================================================================
+
+-- 1. mes_dv_machinery 澧炲姞 item_id锛堣澶囧搴旂墿鏂欑紪鍙凤級
+SET @col_exists = (SELECT COUNT(*) FROM information_schema.columns
+ WHERE table_schema = 'mom-xgdl' AND table_name = 'mes_dv_machinery' AND column_name = 'item_id');
+SET @ddl = IF(@col_exists = 0,
+ 'ALTER TABLE `mes_dv_machinery` ADD COLUMN `item_id` BIGINT NULL COMMENT ''瀵瑰簲鐗╂枡缂栧彿锛坢dm_item.id锛�'' AFTER `workstation_id`',
+ 'SELECT 1');
+PREPARE s FROM @ddl;
+EXECUTE s;
+DEALLOCATE PREPARE s;
+
+-- 2. MES 鐗╂枡绫诲瀷锛氣�滆澶団�濓紙code=EQUIPMENT锛屼綔涓鸿澶囩墿鏂欑殑鍒嗙被/绫诲瀷锛�
+INSERT INTO `mes_md_item_type` (`id`, `code`, `name`, `parent_id`, `item_or_product`, `sort`, `status`)
+SELECT 100, 'EQUIPMENT', '璁惧', 0, 'ITEM', 1, 0 FROM DUAL
+WHERE NOT EXISTS (SELECT 1 FROM `mes_md_item_type` WHERE `code` = 'EQUIPMENT' AND `deleted` = 0);
+
+-- 3. MDM 鐗╂枡鍒嗙被锛氣�滆澶団�濓紙id 涓� MES 绫诲瀷 id=100 瀵归綈锛屼唬鐮佹嵁姝よВ鏋� MDM categoryId锛�
+INSERT INTO `mdm_item_category` (`id`, `parent_id`, `code`, `name`, `item_type`, `item_or_product`, `sort`, `status`)
+SELECT 100, 0, 'EQUIPMENT', '璁惧', 4, 'ITEM', 1, 0 FROM DUAL
+WHERE NOT EXISTS (SELECT 1 FROM `mdm_item_category` WHERE `code` = 'EQUIPMENT' AND `deleted` = 0);
+
+-- 4. MES 璁¢噺鍗曚綅锛氣�滃彴鈥濓紙code=TAI锛�
+INSERT INTO `mes_md_unit_measure` (`id`, `code`, `name`, `primary_flag`, `primary_id`, `change_rate`, `status`)
+SELECT 100, 'TAI', '鍙�', 1, NULL, 1, 0 FROM DUAL
+WHERE NOT EXISTS (SELECT 1 FROM `mes_md_unit_measure` WHERE `code` = 'TAI' AND `deleted` = 0);
+
+-- 5. MDM 璁¢噺鍗曚綅锛氣�滃彴鈥濓紙code=TAI锛�
+INSERT INTO `mdm_unit_measure` (`id`, `code`, `name`, `primary_flag`, `primary_id`, `change_rate`, `status`)
+SELECT 100, 'TAI', '鍙�', 1, NULL, 1, 0 FROM DUAL
+WHERE NOT EXISTS (SELECT 1 FROM `mdm_unit_measure` WHERE `code` = 'TAI' AND `deleted` = 0);
+
+-- 璇存槑锛氳嫢鐩爣搴撲腑 id=100 涓庡凡鏈夎褰曞啿绐侊紝鍙皢涓婇潰 4 澶� id 璋冩暣涓哄悓涓�绌洪棽 id锛�
+-- 骞朵繚璇� mes_md_item_type 涓� mdm_item_category 鐨勨�滆澶団�濊 id 鐩哥瓑锛堜唬鐮佹嵁姝ゅ彇 MDM categoryId锛夈��
diff --git a/docs/sql/equipment_receipt.sql b/docs/sql/equipment_receipt.sql
new file mode 100644
index 0000000..154a876
--- /dev/null
+++ b/docs/sql/equipment_receipt.sql
@@ -0,0 +1,43 @@
+-- =============================================
+-- M5锛氱嫭绔嬭澶囧叆搴撳崟
+-- 1. mes_wm_equipment_receipt锛堜富琛級
+-- 2. mes_wm_equipment_receipt_line锛堣琛細浠庤澶囧彴璐﹂�夋嫨锛屽浐瀹氳澶囦粨鍏ュ簱锛�
+-- 鐩爣搴擄細mom-xgdl锛坙ocal profile锛�
+-- =============================================
+
+CREATE TABLE IF NOT EXISTS `mes_wm_equipment_receipt` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '缂栧彿',
+ `code` varchar(64) NOT NULL COMMENT '鍗曟嵁缂栫爜',
+ `name` varchar(255) DEFAULT NULL COMMENT '鍗曟嵁鍚嶇О',
+ `receipt_date` datetime DEFAULT NULL COMMENT '鍏ュ簱鏃ユ湡',
+ `source` varchar(255) DEFAULT NULL COMMENT '鍏ュ簱鏉ユ簮',
+ `status` tinyint NOT NULL DEFAULT '0' COMMENT '鐘舵��',
+ `process_instance_id` varchar(64) DEFAULT NULL COMMENT 'BPM 娴佺▼瀹炰緥缂栧彿',
+ `remark` varchar(500) DEFAULT NULL COMMENT '澶囨敞',
+ `creator` varchar(64) DEFAULT '' COMMENT '鍒涘缓鑰�',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
+ `updater` varchar(64) DEFAULT '' COMMENT '鏇存柊鑰�',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '鏄惁鍒犻櫎',
+ PRIMARY KEY (`id`),
+ KEY `idx_code` (`code`),
+ KEY `idx_status` (`status`)
+) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='璁惧鍏ュ簱鍗�';
+
+CREATE TABLE IF NOT EXISTS `mes_wm_equipment_receipt_line` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '缂栧彿',
+ `receipt_id` bigint NOT NULL COMMENT '鍏ュ簱鍗曠紪鍙�',
+ `machinery_id` bigint NOT NULL COMMENT '璁惧鍙拌处缂栧彿',
+ `item_id` bigint DEFAULT NULL COMMENT '璁惧鐗╂枡缂栧彿锛坢dm_item.id锛�',
+ `quantity` decimal(24,6) NOT NULL DEFAULT '1.000000' COMMENT '鍏ュ簱鏁伴噺',
+ `remark` varchar(500) DEFAULT NULL COMMENT '澶囨敞',
+ `creator` varchar(64) DEFAULT '' COMMENT '鍒涘缓鑰�',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
+ `updater` varchar(64) DEFAULT '' COMMENT '鏇存柊鑰�',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '鏄惁鍒犻櫎',
+ PRIMARY KEY (`id`),
+ KEY `idx_receipt_id` (`receipt_id`),
+ KEY `idx_machinery_id` (`machinery_id`),
+ KEY `idx_item_id` (`item_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='璁惧鍏ュ簱鍗曡';
diff --git a/docs/sql/sn_item_chain.sql b/docs/sql/sn_item_chain.sql
new file mode 100644
index 0000000..6568035
--- /dev/null
+++ b/docs/sql/sn_item_chain.sql
@@ -0,0 +1,46 @@
+-- =============================================
+-- M4锛歋N 鍗曞搧搴撳瓨杞婚噺闂幆
+-- 1. mes_wm_sn 澧炲姞鍦ㄥ簱搴撲綅缁村害鍒楋紙status/batch_id/remark 琛ㄤ腑宸插瓨鍦級
+-- 2. mes_wm_transaction 澧炲姞 sn_code 鍒�
+-- 鐩爣搴擄細mom-xgdl锛坙ocal profile锛�
+-- =============================================
+
+-- 1. mes_wm_sn.warehouse_id锛堝湪搴撲粨搴� ID锛�
+SET @exists = (SELECT COUNT(*) FROM information_schema.columns
+ WHERE table_schema = DATABASE() AND table_name = 'mes_wm_sn' AND column_name = 'warehouse_id');
+SET @sql = IF(@exists = 0,
+ 'ALTER TABLE mes_wm_sn ADD COLUMN warehouse_id BIGINT NULL COMMENT ''鍦ㄥ簱浠撳簱 ID'' AFTER batch_id',
+ 'SELECT 1');
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+-- 2. mes_wm_sn.location_id锛堝湪搴撳簱鍖� ID锛�
+SET @exists = (SELECT COUNT(*) FROM information_schema.columns
+ WHERE table_schema = DATABASE() AND table_name = 'mes_wm_sn' AND column_name = 'location_id');
+SET @sql = IF(@exists = 0,
+ 'ALTER TABLE mes_wm_sn ADD COLUMN location_id BIGINT NULL COMMENT ''鍦ㄥ簱搴撳尯 ID'' AFTER warehouse_id',
+ 'SELECT 1');
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+-- 3. mes_wm_sn.area_id锛堝湪搴撳簱浣� ID锛�
+SET @exists = (SELECT COUNT(*) FROM information_schema.columns
+ WHERE table_schema = DATABASE() AND table_name = 'mes_wm_sn' AND column_name = 'area_id');
+SET @sql = IF(@exists = 0,
+ 'ALTER TABLE mes_wm_sn ADD COLUMN area_id BIGINT NULL COMMENT ''鍦ㄥ簱搴撲綅 ID'' AFTER location_id',
+ 'SELECT 1');
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+-- 4. mes_wm_transaction.sn_code锛圫N 鐮侊級
+SET @exists = (SELECT COUNT(*) FROM information_schema.columns
+ WHERE table_schema = DATABASE() AND table_name = 'mes_wm_transaction' AND column_name = 'sn_code');
+SET @sql = IF(@exists = 0,
+ 'ALTER TABLE mes_wm_transaction ADD COLUMN sn_code VARCHAR(100) NULL COMMENT ''SN 鐮�'' AFTER batch_code',
+ 'SELECT 1');
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
\ No newline at end of file
diff --git a/docs/sql/stock_taking_plan_auto_generate.sql b/docs/sql/stock_taking_plan_auto_generate.sql
new file mode 100644
index 0000000..60ca187
--- /dev/null
+++ b/docs/sql/stock_taking_plan_auto_generate.sql
@@ -0,0 +1,35 @@
+-- =============================================
+-- M2锛氬畾鏈熺洏鐐硅嚜鍔ㄨ皟搴�
+-- mes_wm_stock_taking_plan 澧炲姞瀹氭湡鑷姩鐢熸垚鐩稿叧鍒�
+-- 鐩爣搴擄細mom-xgdl锛坙ocal profile锛�
+-- =============================================
+
+-- 1. mes_wm_stock_taking_plan.auto_generate锛堟槸鍚﹀畾鏈熻嚜鍔ㄧ敓鎴愮洏鐐逛换鍔★級
+SET @exists = (SELECT COUNT(*) FROM information_schema.columns
+ WHERE table_schema = DATABASE() AND table_name = 'mes_wm_stock_taking_plan' AND column_name = 'auto_generate');
+SET @sql = IF(@exists = 0,
+ 'ALTER TABLE mes_wm_stock_taking_plan ADD COLUMN auto_generate TINYINT(1) NULL DEFAULT b''0'' COMMENT ''鏄惁瀹氭湡鑷姩鐢熸垚鐩樼偣浠诲姟'' AFTER frozen',
+ 'SELECT 1');
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+-- 2. mes_wm_stock_taking_plan.generate_cron锛堣嚜鍔ㄧ敓鎴愬懆鏈� cron 琛ㄨ揪寮忥級
+SET @exists = (SELECT COUNT(*) FROM information_schema.columns
+ WHERE table_schema = DATABASE() AND table_name = 'mes_wm_stock_taking_plan' AND column_name = 'generate_cron');
+SET @sql = IF(@exists = 0,
+ 'ALTER TABLE mes_wm_stock_taking_plan ADD COLUMN generate_cron VARCHAR(64) NULL COMMENT ''鑷姩鐢熸垚鍛ㄦ湡 cron 琛ㄨ揪寮忥紙auto_generate=1 鏃跺繀濉級'' AFTER auto_generate',
+ 'SELECT 1');
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+-- 3. mes_wm_stock_taking_plan.last_generate_time锛堜笂娆¤嚜鍔ㄧ敓鎴愭椂闂达級
+SET @exists = (SELECT COUNT(*) FROM information_schema.columns
+ WHERE table_schema = DATABASE() AND table_name = 'mes_wm_stock_taking_plan' AND column_name = 'last_generate_time');
+SET @sql = IF(@exists = 0,
+ 'ALTER TABLE mes_wm_stock_taking_plan ADD COLUMN last_generate_time DATETIME NULL COMMENT ''涓婃鑷姩鐢熸垚鏃堕棿'' AFTER generate_cron',
+ 'SELECT 1');
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
\ No newline at end of file
diff --git a/docs/sql/stock_taking_result_approval.sql b/docs/sql/stock_taking_result_approval.sql
new file mode 100644
index 0000000..4ec575e
--- /dev/null
+++ b/docs/sql/stock_taking_result_approval.sql
@@ -0,0 +1,16 @@
+-- =============================================
+-- M1锛氱洏鐐圭粨鏋滃鎵� BPM
+-- mes_wm_stock_taking_task 澧炲姞 process_instance_id 鍒�
+-- 鐢ㄤ簬鍥炲啓"鐩樼偣缁撴灉宸叉彁浜� BPM 瀹℃壒"鐨勬祦绋嬪疄渚嬬紪鍙�
+-- 鐩爣搴擄細mom-xgdl锛坙ocal profile锛�
+-- =============================================
+
+-- 1. mes_wm_stock_taking_task.process_instance_id
+SET @exists = (SELECT COUNT(*) FROM information_schema.columns
+ WHERE table_schema = DATABASE() AND table_name = 'mes_wm_stock_taking_task' AND column_name = 'process_instance_id');
+SET @sql = IF(@exists = 0,
+ 'ALTER TABLE mes_wm_stock_taking_task ADD COLUMN process_instance_id VARCHAR(64) NULL COMMENT ''BPM 娴佺▼瀹炰緥缂栧彿锛堥潪绌鸿〃绀虹洏鐐圭粨鏋滃凡鎻愪氦瀹℃壒锛�'' AFTER status',
+ 'SELECT 1');
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
diff --git a/docs/wm_barcode_scan_render_integration.md b/docs/wm_barcode_scan_render_integration.md
new file mode 100644
index 0000000..b99f750
--- /dev/null
+++ b/docs/wm_barcode_scan_render_integration.md
@@ -0,0 +1,68 @@
+# 鏉$爜缁勫悎 / 鏈嶅姟绔垚鍥� / 鎵爜瑙f瀽 - 鍓嶇鑱旇皟鏂规
+
+## 娑夊強椤甸潰
+
+- 鏉$爜閰嶇疆绠$悊椤碉紙`contentFormat` 缂栬緫锛�
+- 鏍囩鎵撳嵃 / 鏉$爜灞曠ず椤碉紙鏈嶅姟绔垚鍥鹃瑙堬級
+- 鎵爜锛圥DA / 鎵嬫満鎵爜鏋級瑙﹀彂涓氬姟瑙f瀽鍏ュ彛
+
+## 涓氬姟娴佺▼涓庢暟鎹甫鍏�
+
+1. 鏉$爜閰嶇疆 -> 鍐呭鐢熸垚锛氶厤缃� `contentFormat` 鏀寔缁勫悎鍗犱綅绗� `{BUSINESSCODE}`锛堜笟鍔$紪鐮侊級銆乣{BUSINESSNAME}`锛堜笟鍔″悕绉帮級銆傚墠绔紶 `bizType`銆乣bizCode`銆乣bizName` 璋冪敓鎴愭帴鍙o紝鍚庣鎸夐厤缃ā鏉挎浛鎹㈠崰浣嶇銆佹竻绌烘湭鐭ュ崰浣嶇锛岃繑鍥炴渶缁堟潯鐮佸唴瀹广��
+2. 鏈嶅姟绔垚鍥撅細鍓嶇鎶婃潯鐮佸唴瀹� + 鏍煎紡锛�1 QRCode / 2 EAN-13 / 3 Code39 / 4 UPC-A / 榛樿 Code128锛�+ 瀹介珮浼犵粰 `POST /render`锛屽悗绔敤 zxing 鐢熸垚鍥剧墖锛岃繑鍥� Base64 data-URL 渚� `<img>` 鐩存帴棰勮锛堜笉鎸佷箙鍖栬惤搴擄級銆�
+3. 鎵爜瑙f瀽锛氬墠绔妸鎵埌鐨勫唴瀹逛紶缁� `POST /parse`锛屽悗绔厛绮剧‘鍖归厤鏉$爜琛紝鍐嶆寜鍚敤閰嶇疆鐨� `contentFormat` 鍙嶅悜姝e垯鍖归厤锛岃繑鍥炲懡涓殑 `bizType` / `bizCode` / `bizName`锛屽墠绔嵁姝よ烦杞搴斾笟鍔″崟鎹��
+
+## API
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| GET | /mes/wm/barcode/generate-content?bizType=&bizCode=&bizName= | 鎸夐厤缃敓鎴愭潯鐮佸唴瀹� |
+| POST | /mes/wm/barcode/render | 鏈嶅姟绔垚鍥撅紙杩斿洖 Base64 鍥剧墖锛� |
+| POST | /mes/wm/barcode/parse | 鎵爜瑙f瀽锛堣繑鍥炰笟鍔″瓧娈碉級 |
+
+**璇锋眰鍙傛暟锛坮ender锛夛細**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| content | String | 鏄� | 鏉$爜鍐呭锛堝彲鐢� generate-content 杩斿洖锛� |
+| format | Integer | 鍚� | 鏉$爜鏍煎紡锛�1 QRCode / 2 EAN-13 / 3 Code39 / 4 UPC-A / 榛樿 Code128 |
+| width | Integer | 鍚� | 鍥剧墖瀹藉害锛堥粯璁� 200锛� |
+| height | Integer | 鍚� | 鍥剧墖楂樺害锛堥粯璁� 200锛� |
+
+**鍝嶅簲锛坮ender锛夛細** `{ "code": 200, "data": "data:image/png;base64,..." }`
+
+**璇锋眰鍙傛暟锛坧arse锛夛細**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| content | String | 鏄� | 鎵弿寰楀埌鐨勬潯鐮佸唴瀹� |
+
+**鍝嶅簲瀛楁锛坧arse锛夛細**
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| bizType | Integer | 鍛戒腑鐨勪笟鍔$被鍨� |
+| bizCode | String | 鍛戒腑鐨勪笟鍔$紪鐮� |
+| bizName | String | 鍛戒腑鐨勪笟鍔″悕绉� |
+
+## 瀛楁灞曠ず瑙勫垯
+
+| 瀛楁 | 灞曠ず浣嶇疆 | 璇存槑 |
+|------|----------|------|
+| contentFormat | 鏉$爜閰嶇疆缂栬緫椤� | 鏀寔 `{BUSINESSCODE}`銆乣{BUSINESSNAME}` 缁勫悎 |
+| 鏉$爜鍥剧墖 | 鏍囩 / 鍒楄〃 | `render` 杩斿洖 Base64 鐩存帴 `<img src>` |
+| 瑙f瀽缁撴灉 | 鎵爜缁撴灉椤� | 鍛戒腑鍚庡睍绀轰笟鍔$紪鐮佸苟璺宠浆 |
+
+## 涓氬姟瑙勫垯璇存槑
+
+| 鍦烘櫙 | 瑙勫垯 |
+|------|------|
+| 鐢熸垚鍐呭 | 浠呮浛鎹㈤厤缃腑瀛樺湪鐨勫崰浣嶇锛涙湭閰嶇疆鐨勬湭鐭ュ崰浣嶇浼氳娓呯┖ |
+| 鏈嶅姟绔垚鍥� | 鍙仛鍗虫椂棰勮锛屼笉钀藉簱锛涙寮忛檮浠朵粛璧� system 瀛樺偍闄勪欢鏈哄埗 |
+| 瑙f瀽 | 浼樺厛绮剧‘鍖归厤鏉$爜琛紱鏈懡涓啀鎸夊惎鐢ㄩ厤缃� `contentFormat` 鍙嶅悜鍖归厤锛涘潎鏈懡涓繑鍥炵┖ |
+| 鏍煎紡鏀寔 | 浜岀淮鐮佷笌涓�缁寸爜锛圗AN-13 / Code39 / UPC-A / Code128锛� |
+
+## 娉ㄦ剰浜嬮」
+
+- 鏉$爜鍥剧墖涓� Base64 data-URL锛岄�傚悎鍗虫椂棰勮锛涘闇�鎸佷箙瀛樺偍鎸夈�屾枃浠朵笂浼犺鍒欍�嶈蛋 `/system/storage-*`銆�
+- `generate-content` 闇�瑕佸瓨鍦ㄥ搴旂殑鍚敤鏉$爜閰嶇疆锛屽惁鍒欒繑鍥炲師鏍锋垨绌恒��
\ No newline at end of file
diff --git a/docs/wm_batch_code_requirements.md b/docs/wm_batch_code_requirements.md
new file mode 100644
index 0000000..9727b37
--- /dev/null
+++ b/docs/wm_batch_code_requirements.md
@@ -0,0 +1,152 @@
+# 浠撳偍锛圵M锛夋壒閲忚ˉ鐮侀渶姹傝鏄�
+
+> 鏈枃妗f暣鐞嗙殑鏄� **2026-09-08 纭鐨勬湰杞壒閲忚ˉ鐮侀渶姹傚寘**锛圡1~M5锛夛紝鐢ㄤ簬鍚庣画寮�鍙戝熀绾裤��
+> 鍓嶇疆鑳藉姏锛堜笉鍦ㄦ湰鏂囪寖鍥达紝宸插畬鎴愶級锛氭潅椤瑰叆搴�/鍑哄簱/渚涘簲鍟嗛��璐т笁鍗曟嵁 BPM 瀹℃壒闂幆銆佽澶囧彴璐﹁仈鍔ㄨ澶囦粨鑷姩鍏ュ簱銆佺洏鐐瑰樊寮傝嚜鍔ㄦ牳閿�鎺ョ嚎銆丮DM 鐗╂枡涓绘暟鎹紙鍚�滆澶団�濈墿鏂欑被鍨�/鍒嗙被/鍗曚綅锛夈��
+
+## 1. 鑳屾櫙涓庣洰鏍�
+
+褰撳墠 WM 浠撳偍宸插叿澶囧崟鎹�佸簱瀛樻祦姘淬�佺洏鐐广�佽澶囦粨鑷姩鍏ュ簱绛夎兘鍔涳紝浣嗗瓨鍦ㄤ互涓嬬己鍙o紝鏈疆涓�骞惰ˉ榻愶細
+
+| 缂哄彛 | 鐜扮姸 | 鐩爣 |
+|------|------|------|
+| 鐩樼偣鏃犲鏍稿叧鍙� | 褰曞叆/瀵煎叆瀹炵洏鍚庣敱鈥滃畬鎴愮洏鐐光�濈洿鎺ユ牳閿�鍙拌处 | 鐩樼偣缁撴灉鍏堣蛋 BPM 瀹℃壒锛岄�氳繃鎵嶈В鍐诲苟鏍搁攢 |
+| 鐩樼偣闈犱汉宸ラ�愭湡寤轰换鍔� | 姣忔闇�鎵嬪伐鍒涘缓浠诲姟 | 鏂规閰嶇疆鍛ㄦ湡锛屽悗鍙板畾鏃惰嚜鍔ㄧ敓鎴愪换鍔� |
+| 鏉$爜鑳藉姏寮� | 浠呮敮鎸佸崟涓�涓氬姟缂栫爜鍗犱綅绗︺�佹棤鎴愬浘/鎵爜 | 缁勫悎瀛楁銆佹湇鍔$鎴愬浘銆佹壂鐮佽В鏋� |
+| SN 鏃犻棴鐜� | 浠呮湁 SN 涓绘。锛屾棤鍦ㄥ簱/鍘诲悜 | 鐧昏/鏍搁攢 SN銆佸崟浠跺湪搴�/鍘诲悜鏌ヨ锛堣交閲忛棴鐜級 |
+| 璁惧鍏ュ簱鏃犲崟鎹� | 浠呪�滃彴璐﹀垱寤哄嵆鑷姩鍏ヨ澶囦粨鈥� | 鐙珛璁惧鍏ュ簱鍗曪紝璧板垱寤恒�佸鎵广�佸畬鎴愬叆搴撱�佹煡璇� |
+
+**鍏ㄥ眬绾︽潫**锛氫粎鍚庣锛涗笉淇敼鍓嶇椤圭洰锛涙帴鍙e彉鏇村彧鍑鸿仈璋冩枃妗o紱搴撳瓨鍒涘缓/鏁伴噺鏇存柊/娴佹按涓�寰嬬粡搴撳瓨浜嬪姟鏈嶅姟锛屼笉鐩村啓搴撳瓨琛紱BPM 鍒嗙被涓庢祦绋嬪畾涔夋墜宸ラ儴缃诧紱鏂板琛ㄤ笉钀� tenant_id锛沗ADD COLUMN` 鎸夊瓨鍦ㄦ�ф鏌ユ墽琛屻��
+
+## 2. 鑼冨洿鐣屽畾
+
+- **鍋�**锛歁1 鐩樼偣缁撴灉瀹℃壒 BPM锛汳2 瀹氭湡鐩樼偣鑷姩璋冨害锛汳3 鏉$爜缁勫悎/鎴愬浘/鎵爜锛汳4 SN 杞婚噺闂幆锛汳5 鐙珛璁惧鍏ュ簱鍗曘��
+- **涓嶅仛**锛氱洏鐐光�滃啿閿�/鍙嶆牳閿�鈥濓紱鍘嗗彶宸插畬鎴愪换鍔¤ˉ鏍搁攢锛涘簱瀛樺崟鎹閲嶆瀯涓� SN 鏄庣粏锛涘墠绔唬鐮併��
+
+## 3. M1 鐩樼偣缁撴灉瀹℃壒 BPM
+
+### 3.1 涓氬姟鍦烘櫙
+鐩樼偣涓綍鍏�/瀵煎叆瀹炵洏鍚庯紝鐢辫礋璐d汉灏嗙洏鐐圭粨鏋滄彁浜� BPM 瀹℃壒锛涘鎵归�氳繃鍚庣郴缁熻В鍐诲簱瀛樺苟鑷姩鏍搁攢鐩樼泩/鐩樹簭宸紓鏇存柊鍙拌处锛涘鎵逛笉閫氳繃鍒欏厑璁镐慨鏀瑰疄鐩樺悗閲嶆柊鎻愪氦銆�
+
+### 3.2 鐘舵�佹満锛堝鐢ㄧ幇鏋氫妇锛屼笉鏂板鈥滃凡瀹℃壒鈥濇�侊級
+```
+鑽夌 PREPARE 鈹�鈹�寮�濮嬬洏鐐光攢鈹�鈻� 鐩樼偣涓� APPROVING 鈹�鈹�鎻愪氦缁撴灉瀹℃壒(寤築PM)鈹�鈹�鈻� 鐩樼偣涓� APPROVING
+ 鈹傦紙processInstanceId 闈炵┖=瀹℃壒涓級
+鐩樼偣涓� 鈹�鈹�瀹℃壒閫氳繃鈹�鈹�鈻� 宸插畬鎴� FINISHED锛堣В鍐� + 鑷姩鏍搁攢宸紓锛屽悓浜嬪姟锛�
+鐩樼偣涓� 鈹�鈹�瀹℃壒椹冲洖鈹�鈹�鈻� 鐩樼偣涓� APPROVING锛堟竻 processInstanceId锛屽彲鏀瑰疄鐩樺悗閲嶆彁锛�
+鐩樼偣涓� 鈹�鈹�瀹℃壒鍙栨秷鈹�鈹�鈻� 宸插彇娑� CANCELED锛堣В鍐伙級
+鑽夌/鐩樼偣涓� 鈹�鈹�鍙栨秷鈹�鈹�鈻� 宸插彇娑� CANCELED锛堣В鍐伙級
+```
+
+### 3.3 涓氬姟瑙勫垯
+- **寮�濮嬬洏鐐�**锛堣崏绋库啋鐩樼偣涓級锛氫粎鑽夌锛涚洏鐐硅闈炵┖锛涘紑鍚喕缁撳垯鍐荤粨鐩樼偣琛屽簱瀛樸��
+- **褰曞叆/瀵煎叆瀹炵洏**锛氫粎鐩樼偣涓厑璁革紙浜哄伐褰曞叆銆丒xcel 瀵煎叆缁熶竴鍙e緞锛夈��
+- **鎻愪氦缁撴灉瀹℃壒** 鍓嶇疆鏍¢獙锛氱姸鎬�=鐩樼偣涓紱宸叉湁 鈮�1 鏉$洏鐐圭粨鏋滐紱鏈彁浜よ繃锛坄processInstanceId` 涓虹┖锛岄槻閲嶅鎻愪氦锛夈��
+- **瀹℃壒閫氳繃**锛堝悓涓�浜嬪姟銆佸け璐ユ暣浣撳洖婊氬洖鐩樼偣涓級锛氱疆宸插畬鎴� 鈫� 鑻ュ喕缁撳垯鍏堣В鍐� 鈫� 閫愭潯鐩樼偣缁撴灉鏍搁攢锛氬樊寮� = 瀹炵洏 鈭� 璐﹂潰锛�>0 鐩樼泩浣滃叆搴撱��<0 鐩樹簭浣滃嚭搴擄紙鏁伴噺涓鸿礋锛夈��=0 璺宠繃锛涗互鐩樼偣缁撴灉鍥炲~鐨勫簱瀛樺畾浣嶇簿纭牳閿�锛涚敓鎴愬簱瀛樻祦姘� `bizType`=鐩樼偣銆�
+- 鍘熲�滃畬鎴愮洏鐐光�濆叕寮�鍔ㄤ綔绉婚櫎锛屾牳閿�鏀圭敱瀹℃壒閫氳繃浜嬩欢椹卞姩銆�
+- 椹冲洖涓嶆敼浠诲姟鐘舵�侊紙淇濇寔鐩樼偣涓級锛屼粎娓呮祦绋嬪疄渚嬫爣璁帮紝鍏佽淇敼瀹炵洏鍚庨噸鎻愩��
+
+### 3.4 鏁版嵁涓庢帴鍙�
+- `mes_wm_stock_taking_task` 澧炲姞 `process_instance_id`锛涗换鍔℃煡璇�/璇︽儏鍝嶅簲杩斿洖璇ュ瓧娈碉紙鍓嶇鎹鍖哄垎鈥滃鎵逛腑鈥濅笌鈥滃彲鎻愪氦瀹℃壒鈥濓級銆�
+- 鎺ュ彛锛歚鎻愪氦鐩樼偣缁撴灉瀹℃壒`锛堝崟鎹� id + 娴佺▼瀹氫箟 key锛夈�乣鍙鎵规祦绋嬪畾涔夊垪琛╜锛堝垎绫荤紪鐮� `stock_taking_result_approve`锛夈��
+- BPM 鐩戝惉锛氳В鏋愪笟鍔′富閿�=浠诲姟 id锛屾牎楠屼换鍔″瓨鍦ㄤ笖鐩樼偣涓紝鎸夊鎵圭粨鏋滄洿鏂帮紙閫氳繃/椹冲洖/鍙栨秷锛夈��
+
+## 4. M2 瀹氭湡鐩樼偣鑷姩璋冨害
+
+### 4.1 涓氬姟鍦烘櫙
+鐩樼偣鏂规鍙紑鍚�滃畾鏈熻嚜鍔ㄧ敓鎴愨�濓細绯荤粺鎸夋柟妗堥厤缃殑鍛ㄦ湡锛坈ron锛夎嚜鍔ㄥ垱寤虹洏鐐逛换鍔★紝鍒扮偣鍗崇敤锛屾棤闇�浜哄伐閫愭湡寤哄崟銆�
+
+### 4.2 涓氬姟瑙勫垯
+- 鏂规瀛楁锛氭槸鍚﹁嚜鍔ㄧ敓鎴愶紙`auto_generate`锛夈�佺敓鎴愬懆鏈� cron锛坄generate_cron`锛孮uartz 6 娈碉級銆佷笂娆$敓鎴愭椂闂达紙`last_generate_time`锛夈��
+- 寮�鍚嚜鍔ㄧ敓鎴愭椂蹇呴』閰嶇疆鍚堟硶 cron锛涙湭寮�鍚垯蹇界暐 cron銆�
+- 浠� **鍚敤鐘舵�� + 寮�鍚嚜鍔ㄧ敓鎴� + 宸查厤缃� cron** 鐨勬柟妗堝弬涓庢壂鎻忋��
+- 鍚庡彴瀹氭椂浠诲姟鍛ㄦ湡瑙﹀彂锛坕nfra 鍚庡彴閰嶇疆 cron锛宧andler=鏂规鐢熸垚 Job 鐨� Bean 鍚嶏紝寤鸿姣忓垎閽熶竴娆★級锛氭寜鍚勬柟妗堚�滀笂娆$敓鎴愭椂闂� + cron鈥濆垽鏂槸鍚﹀埌鏈燂紝鍒版湡鎵嶇敓鎴愩��
+- **闃查噸澶�**锛氱敓鎴愪换鍔℃垚鍔熷悗鍚屼簨鍔″洖鍐欎笂娆$敓鎴愭椂闂达紱棣栨鎵弿浠呰褰曞熀绾挎椂闂淬�佷笉绔嬪嵆鐢熸垚锛堜粠涓嬩竴鍛ㄦ湡寮�濮嬶級銆�
+- 鑷姩鐢熸垚鐨勪换鍔★細娌跨敤鏂规鐨勭被鍨�/鐩茬洏/鍐荤粨/鍔ㄦ�佺洏鐐规椂闂存锛涘悕绉板彇鏂规鍚嶏紱鐩樼偣浜哄彇绯荤粺榛樿鐢ㄦ埛锛涗换鍔$紪鐮佽蛋鈥滅洏鐐逛换鍔$紪鐮佲�濊嚜鍔ㄨ鍒欙紱鍒涘缓鍚庡嵆鎸夋柟妗堢敓鎴愮洏鐐规槑缁嗚锛堣崏绋挎�侊級銆�
+- 鍗曚釜鏂规鐢熸垚澶辫触涓嶅奖鍝嶅叾瀹冩柟妗堛��
+
+### 4.3 鏁版嵁涓庢帴鍙�
+- `mes_wm_stock_taking_plan` 澧炲姞 `auto_generate` / `generate_cron` / `last_generate_time`锛涙柟妗堟柊澧�/淇敼涓庢煡璇㈠搷搴旀惡甯︺��
+- 鎻愪緵鈥滅敱鏂规鎸夊懆鏈熺敓鎴愪换鍔♀�濈殑鏈嶅姟鏂规硶锛屼緵 Job 璋冪敤锛汮ob 鏈韩涓嶅仛搴撳瓨/鍗曟嵁涓氬姟銆�
+
+## 5. M3 鏉$爜 / 鏍囩 / 鎵爜澧炲己
+
+### 5.1 涓氬姟鍦烘櫙
+鎶婁粨鍌ㄦ潯鐮佷粠鈥滃崟涓�涓氬姟缂栫爜鈥濆崌绾т负鍙粍鍚堛�佸彲鎴愬浘銆佸彲鎵爜鍙嶆煡锛屾敮鎾戞爣绛炬墦鍗颁笌 PDA 鎵爜銆�
+
+### 5.2 闇�姹傜偣
+1. **鏉$爜鍐呭缁勫悎瀛楁**锛氭潯鐮佸唴瀹规ā鏉挎敮鎸佸涓崰浣嶇鑷敱缁勫悎锛堝涓氬姟缂栫爜 + 鐗╂枡缂栫爜 + 鎵规 + 搴撲綅 + SN 绛夛級锛岄厤缃埌鏉$爜閰嶇疆椤癸紝鐢熸垚鏃舵寜妯℃澘娓叉煋鐪熷疄鍐呭銆�
+2. **鏈嶅姟绔垚鍥� / 鎵撳嵃**锛歁ES 妯″潡寮曞叆浜岀淮鐮�/鏉$爜鐢熸垚搴擄紙zxing锛夊湪鏈嶅姟绔垚鍥撅紱鎻愪緵鎵撳嵃/棰勮鑳藉姏銆傚浘鐗囪嫢闇�鐣欏瓨涓�寰嬭蛋闄勪欢涓棿琛紱浠呭嵆鏃堕瑙堝彲鐢� Base64锛屼笉钀戒笟鍔¤〃鍥剧墖鍒椼��
+3. **鎵爜瑙f瀽**锛氭柊澧炴湇鍔$鎺ュ彛锛屽鎵爜鍐呭鍋氱粨鏋勫寲瑙f瀽锛氳瘑鍒笟鍔$紪鐮佷笌鍏跺畠閿�硷紝鍙嶆煡骞惰繑鍥炲搴斾笟鍔″璞★紙鍗曟嵁 / 鐗╂枡 / 鎵规 / SN / 搴撲綅绛夛級锛屼緵鎵爜鏋笌绉诲姩绔烦杞�佹牳楠屻��
+
+### 5.3 楠屾敹瑕佺偣
+- 缁勫悎妯℃澘娓叉煋鍐呭姝g‘锛堝惈涓枃/澶у皬鍐欙級銆�
+- 鐢熸垚鍥惧儚鍙鎵爜杩樺師锛屼笖杩樺師缁撴灉涓庢覆鏌撳唴瀹逛竴鑷淬��
+- 瑙f瀽鎺ュ彛瀵规湭璇嗗埆鍐呭缁欏嚭鏄庣‘閿欒鑰岄潪闈欓粯銆�
+
+## 6. M4 SN 鍗曞搧搴撳瓨杞婚噺闂幆
+
+### 6.1 涓氬姟鍦烘櫙
+瀵瑰紑鍚簭鍒楀彿绠$悊鐨勭墿鏂欙紝瑕佹眰鑳界櫥璁版瘡浠� SN 鐨勫嚭鍏ャ�佹煡鐪嬪崟浠跺綋鍓嶅湪搴撲笌鍘诲悜锛屽苟鏀寔鐩樼偣鎸� SN 鏍稿銆�**鍗曟嵁琛屼笉閲嶆瀯涓� SN 鏄庣粏**锛堜繚鎸佽绾ф暟閲忕鐞嗭紝SN 浣滀负鐧昏/鏍搁攢璁板綍闂幆锛夈��
+
+### 6.2 闇�姹傜偣
+1. **SN 鍦ㄥ簱鐘舵�佷笌浣嶇疆**锛歚mes_wm_sn` 琛ラ綈鍦ㄥ簱鐘舵�併�佹墍鍦ㄥ簱浣嶇瓑瀛楁锛圖O 涓庤〃瀛楁瀵归綈锛夈��
+2. **娴佹按甯� SN**锛氬簱瀛樹簨鍔�/娴佹按琛ㄥ鍔� `snCode` 鍒楋紝璁板綍璇ョ瑪鍑哄叆瀵瑰簲鐨勫簭鍒楀彿銆�
+3. **鍏ュ簱鐧昏 SN**锛氭寜 SN 绠$悊鐗╂枡鐨勫叆搴撲簨鍔$櫥璁� SN锛堢疆涓哄湪搴撱�佽褰曞簱浣嶏級銆�
+4. **鍑哄簱鏍搁攢 SN**锛氬嚭搴撴椂鏍搁攢鎸囧畾鍦ㄥ簱 SN锛堢疆涓哄嚭搴�/闈炲湪搴擄級锛屼笌搴撳瓨浜嬪姟鍚岃褰曘��
+5. **鍗曚欢鍦ㄥ簱/鍘诲悜鏌ヨ**锛氭寜 SN 鏌ュ綋鍓嶅湪搴撲綅缃�佹渶杩戝幓鍚戞祦姘淬��
+6. **鐩樼偣鎸� SN 鏍稿**锛氭寜 SN 绠$悊鐗╂枡鐨勭洏鐐规敮鎸� SN 绮掑害鏍稿锛堝湪鐩樼偣缁村害鍐呮牎楠屽疄鐗� SN 涓庡湪搴� SN锛夈��
+7. **搴忓垪鍙风鐞嗘爣璁拌疮閫�**锛氱墿鏂欌�滄槸鍚﹀簭鍒楀彿绠$悊锛坕sSerialManaged锛夆�濋渶鍦� MDM API锛堢墿鏂欏搷搴�/鍒涘缓 DTO锛変腑璐�氾紝渚� MES 鍚勬ā鍧楀垽鏂��
+
+### 6.3 涓氬姟瑙勫垯
+- 浠呪�滄寜 SN 绠$悊鈥濈殑鐗╂枡鐧昏/鏍搁攢 SN銆�
+- 鍚屼竴 SN 鍦ㄥ簱鍞竴锛涘嚭搴撴牳閿�鐨� SN 蹇呴』澶勪簬鍦ㄥ簱鐘舵�併��
+
+## 7. M5 鐙珛璁惧鍏ュ簱鍗�
+
+### 7.1 涓氬姟鍦烘櫙
+鈥滆澶囧彴璐﹀垱寤哄嵆鑷姩鍏ヨ澶囦粨鈥濊В鍐宠澶囧缓妗h仈鍔紱鈥滆澶囧叆搴撳崟鈥濆垯浣滀负鍙拷婧�佸彲瀹℃壒鐨勫叆搴撳嚟璇侊紝鐢ㄤ簬璁惧鐢卞閮ㄨ繘鍏�/姝e紡鍏ヤ粨鐨勪笟鍔★紝鎸夊崟鐣欑棔銆�
+
+### 7.2 鍗曟嵁缁撴瀯
+- **涓昏〃**锛氬崟鎹紪鐮侊紙鑷姩鐢熸垚锛屾柊澧炩�滆澶囧叆搴撳崟缂栫爜鈥濊鍒欙級銆佸悕绉般�佸叆搴撴棩鏈熴�佹潵婧�/澶囨敞銆佺姸鎬併�丅PM 娴佺▼瀹炰緥缂栧彿绛夈��
+- **鏄庣粏琛�**锛氳澶囷紙鍙拌处锛夆啋 鑷姩甯﹀叆璁惧鐗╂枡(itemId)锛涗粨搴�/搴撳尯/搴撲綅鍥哄畾璁惧浠撲笁鍏冪粍锛涙暟閲忛粯璁� 1锛涘悓鍗曞彲澶氬彴锛涘娉ㄣ��
+
+### 7.3 娴佺▼涓庣姸鎬侊紙娌跨敤鏉傞」鍏ュ簱妯℃澘锛�
+```
+鑽夌 PREPARE 鈹�鈹�鎻愪氦瀹℃壒(寤築PM,鍥炲啓娴佺▼缂栧彿)鈹�鈹�鈻� 瀹℃壒涓� APPROVING
+瀹℃壒閫氳繃 鈫� 宸插鎵� APPROVED 鈹�鈹�瀹屾垚鍏ュ簱鈹�鈹�鈻� 宸插畬鎴� FINISHED
+椹冲洖 鈫� 鑽夌 PREPARE锛堝彲鏀归噸鎻愶級
+瀹℃壒/鑽夌鍙栨秷 鈫� 宸插彇娑� CANCELED
+```
+- 瀹℃壒閫氳繃杩涘叆鈥滃彲鎵ц鍏ュ簱鈥濓紝搴撳瓨鍔ㄤ綔浠呭湪鈥滃畬鎴愬叆搴撯�濇墽琛岋紙閫愭槑缁嗚璁惧浠� IN +1锛屾洿鏂板彴璐︿笌娴佹按锛屼笟鍔$被鍨嬬嫭绔嬶級銆�
+
+### 7.4 涓氬姟瑙勫垯
+- 鏄庣粏浠呭彲閫夊凡鍏宠仈鐗╂枡锛堟湁 `itemId`锛夌殑璁惧鍙拌处銆�
+- 搴撲綅蹇呴』灞炰簬璁惧浠撲綋绯汇��
+- 璁惧缂栫爜/鐗╂枡宸叉湁鍒欎笉鍏佽閲嶅寤烘。锛堟部鐢ㄥ彴璐︾害鏉燂級銆�
+- 鈥滃畬鎴愬叆搴撯�濅粎宸插鎵圭姸鎬佸彲鎵ц锛屼笖浠呮墽琛屼竴娆★紱搴撳瓨涓庢祦姘寸粺涓�璧板簱瀛樹簨鍔℃湇鍔★紝涓嶇洿鍐欏簱瀛樿〃銆�
+- 鐙珛 BPM 娴佺▼鍒嗙被涓庣嫭绔嬪簱瀛樻祦姘翠笟鍔$被鍨嬶紙鐢ㄤ簬璁惧鍏ュ簱鍗曟嵁涓庤澶囧彴璐﹁嚜鍔ㄥ叆搴撳尯鍒嗭級銆�
+
+## 8. 璺ㄥ崟鍏冧緷璧栦笌瀹炴柦椤哄簭
+
+```
+M1 鐩樼偣缁撴灉瀹℃壒 BPM锛堟敼鏃㈡湁鐩樼偣浠诲姟锛屽惈 DB 鍒�/閿欒鐮�/鐩戝惉鍣�/绔偣鏇挎崲锛�
+ 鈹斺攢鈻� M2 瀹氭湡鐩樼偣璋冨害锛圡1 浠诲姟鍒涘缓/鐘舵�佹満鏄叾涓嬫父浜х墿锛�
+M3 鏉$爜鎴愬浘/鎵爜/缁勫悎瀛楁锛圡ES 渚濊禆寮曞叆 zxing锛�
+M4 SN 杞婚噺闂幆锛堝惈 MDM-API 瀛楁璐�氾級
+M5 璁惧鍏ュ簱鍗曪紙鍙鐢ㄦ潅椤瑰叆搴撳崟鎹鏋讹級
+M6 鏀跺熬锛氬叏閲忕紪璇戙�乨ocs 鑱旇皟鏂囨。銆佺粺涓�绔埌绔啋鐑燂紙鍚� DB 鑴氭湰鎵ц銆丅PM 鍒嗙被涓庢祦绋嬪畾涔夋墜宸ラ儴缃诧級
+```
+
+## 9. 寰呮緞娓�/鍐崇瓥椤癸紙瀹炵幇鍓嶉渶纭锛�
+- M5 鐙珛璁惧鍏ュ簱鍗曟槸鍚﹂渶瑕佷笌璁惧鍙拌处鐨勨�滆嚜鍔ㄥ叆搴撯�濆彔鍔狅紙鍗宠澶囨棦闅忓彴璐﹁嚜鍔ㄥ叆搴擄紝鍙堝彲鍗曠嫭璧板叆搴撳崟锛夛紝鎴栬嚜鍔ㄥ叆搴撴敹鏁涗负浠呴殢鍏ュ簱鍗曟墽琛屻��
+
+## 闄勶細瀹炴柦鐘舵�佽拷韪紙渚涚画浣滃熀绾匡級
+
+| 鍗曞厓 | 鐘舵�� | 澶囨敞 |
+|------|------|------|
+| M1 鐩樼偣缁撴灉瀹℃壒 BPM | 浠g爜瀹屾垚锛岀紪璇戦�氳繃 | 閿欒鐮�/DO/RespVO/Mapper/鎺ュ彛涓庡疄鐜�/鐩戝惉鍣�/绔偣鏇挎崲宸茶惤鍦帮紱DB 鑴氭湰宸插啓寰呮墽琛� |
+| M2 瀹氭湡鐩樼偣璋冨害 | 閮ㄥ垎瀹屾垚锛屾湭缂栬瘧 | 鏂规瀛楁/鏍¢獙/鏌ヨ涓� Service 宸叉敼锛涗换鍔′晶鈥滄寜鏂规鐢熸垚浠诲姟鈥濄�丣ob銆丏B 鑴氭湰鏈仛 |
+| M3 鏉$爜缁勫悎/鎴愬浘/鎵爜 | 鏈紑濮� | 寰� zxing 寮曞叆銆佹ā鏉挎覆鏌撱�佽В鏋愭帴鍙� |
+| M4 SN 杞婚噺闂幆 | 鏈紑濮� | 寰呰〃瀛楁/鐧昏鏍搁攢/鏌ヨ/API 璐�� |
+| M5 璁惧鍏ュ簱鍗� | 鏈紑濮� | 寰呮柊鍗曟嵁鍏ㄦ爤涓� BPM |
+| M6 鏀跺熬 | 鏈紑濮� | 鍏ㄩ噺缂栬瘧 + docs + 鍐掔儫 + DB/娴佺▼閮ㄧ讲 |
diff --git a/docs/wm_equipment_receipt_integration.md b/docs/wm_equipment_receipt_integration.md
new file mode 100644
index 0000000..c6c6532
--- /dev/null
+++ b/docs/wm_equipment_receipt_integration.md
@@ -0,0 +1,92 @@
+# 璁惧鍏ュ簱鍗� - 鍓嶇鑱旇皟鏂规
+
+## 娑夊強椤甸潰
+
+- 璁惧鍏ュ簱鍗曞垪琛紙椤甸潰璺緞涓庤矾鐢卞緟鍓嶇琛ュ厖锛�
+- 璁惧鍏ュ簱鍗曡鎯� / 缂栬緫锛堜富鍗曚俊鎭� + 鏄庣粏琛岋級
+
+## 涓氬姟娴佺▼涓庢暟鎹甫鍏�
+
+1. 璁惧鍙拌处 -> 璁惧鍏ュ簱鍗曟槑缁嗚锛氫粠銆岃澶囧彴璐︺�嶉〉閫夋嫨璁惧鍚庯紝`machineryId`銆乣itemId`锛堣澶囩墿鏂欑紪鍙凤級鑷姩甯﹀叆骞朵紶鍏� `POST /mes/wm/equipment-receipt-line/create`锛涚墿鏂欑紪鐮�/鍚嶇О/瑙勬牸/鍗曚綅鐢卞悗绔寜 `itemId` 瀹炴椂鎷兼帴杩斿洖銆�
+2. 璁惧鍏ュ簱鍗曞垱寤� -> 缂栧彿锛歚code` 鍦ㄥ墠绔紪杈戦〉鍙皟鐢ㄨ嚜鍔ㄧ紪鐮佽鍒欙紙`WM_EQUIP_RECEIPT_CODE`锛夌敓鎴愶紝浼犵粰 `POST /mes/wm/equipment-receipt/create`銆�
+3. 瀹℃壒娴佺▼锛氫富绠″崟鎻愪氦瀹℃壒鍚庯紝璧� BPM锛屽鎵归�氳繃鍚庣敱銆屾墽琛屽叆搴撱�嶆妸鏄庣粏琛屾寜鍥哄畾銆岃澶囦粨涓夊厓缁勩�嶏紙`SYS-EQUIPMENT` / `SYS-EQUIP-LOC-01` / `SYS-EQUIP-BIN-01`锛夊叆璁惧浠撱�佹暟閲忛粯璁� 1銆�
+
+## API
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| POST | /mes/wm/equipment-receipt/create | 鍒涘缓璁惧鍏ュ簱鍗曪紙鑽夌锛� |
+| PUT | /mes/wm/equipment-receipt/update | 淇敼璁惧鍏ュ簱鍗曪紙浠呰崏绋匡級 |
+| DELETE | /mes/wm/equipment-receipt/delete | 鍒犻櫎璁惧鍏ュ簱鍗曪紙浠呰崏绋匡紝绾ц仈鍒犺锛� |
+| GET | /mes/wm/equipment-receipt/get?id= | 鑾峰緱璁惧鍏ュ簱鍗曡鎯� |
+| GET | /mes/wm/equipment-receipt/page | 璁惧鍏ュ簱鍗曞垎椤� |
+| PUT | /mes/wm/equipment-receipt/submit-approval?id=&processDefinitionKey= | 鎻愪氦 BPM 瀹℃壒锛堣崏绋库啋瀹℃壒涓級 |
+| GET | /mes/wm/equipment-receipt/approval-process-list | 鑾峰緱璁惧鍏ュ簱鍙�夋祦绋嬪畾涔夊垪琛� |
+| PUT | /mes/wm/equipment-receipt/finish?id= | 鎵ц鍏ュ簱锛堝凡瀹℃壒鈫掑凡瀹屾垚锛岄�愯鍏ヨ澶囦粨锛� |
+| PUT | /mes/wm/equipment-receipt/cancel?id= | 鍙栨秷璁惧鍏ュ簱鍗� |
+| POST | /mes/wm/equipment-receipt-line/create | 鏂板鏄庣粏琛� |
+| PUT | /mes/wm/equipment-receipt-line/update | 淇敼鏄庣粏琛� |
+| DELETE | /mes/wm/equipment-receipt-line/delete?id= | 鍒犻櫎鏄庣粏琛� |
+| GET | /mes/wm/equipment-receipt-line/get?id= | 鑾峰緱鏄庣粏琛� |
+| GET | /mes/wm/equipment-receipt-line/list-by-receipt-id?receiptId= | 鎸変富鍗曡幏寰楁槑缁嗚鍒楄〃 |
+| GET | /mes/wm/equipment-receipt-line/page | 鏄庣粏琛屽垎椤� |
+
+**璇锋眰鍙傛暟锛坈reate/update锛夛細**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| code | String | 鏄� | 鍗曟嵁缂栫爜锛堝彲鑷姩缂栫爜鐢熸垚锛� |
+| name | String | 鍚� | 鍗曟嵁鍚嶇О |
+| receiptDate | datetime | 鏄� | 鍏ュ簱鏃ユ湡 |
+| source | String | 鍚� | 鍏ュ簱鏉ユ簮 |
+| remark | String | 鍚� | 澶囨敞 |
+
+**璇锋眰鍙傛暟锛堟槑缁嗚 create/update锛夛細**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| receiptId | Long | 鏄� | 鍏ュ簱鍗曠紪鍙� |
+| machineryId | Long | 鏄� | 璁惧鍙拌处缂栧彿 |
+| itemId | Long | 鏄� | 璁惧鐗╂枡缂栧彿锛堜粠璁惧鍙拌处甯﹀叆锛� |
+| quantity | decimal | 鏄� | 鍏ュ簱鏁伴噺锛堥粯璁� 1锛屽彲鍚屽崟澶氬彴锛� |
+| remark | String | 鍚� | 澶囨敞 |
+
+**鍝嶅簲瀛楁鏂板锛堜富鍗曪級锛�**
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| processInstanceId | String | BPM 娴佺▼瀹炰緥缂栧彿锛岄潪绌鸿〃绀哄凡鎻愪氦瀹℃壒 |
+
+**鍝嶅簲瀛楁锛堟槑缁嗚锛夛細**
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| machineryId / machineryCode / machineryName | Long/String | 璁惧鍙拌处淇℃伅 |
+| itemId / itemCode / itemName / specification / unitMeasureName | Long/String | 鐗╂枡鍙婂崟浣嶄俊鎭� |
+
+## 瀛楁灞曠ず瑙勫垯
+
+| 瀛楁 | 灞曠ず浣嶇疆 | 璇存槑 |
+|------|----------|------|
+| 鍗曟嵁缂栫爜/鍚嶇О/鍏ュ簱鏃ユ湡/鏉ユ簮 | 鍒楄〃銆佽鎯� | 涓诲崟鍩虹淇℃伅 |
+| 鐘舵�� | 鍒楄〃銆佽鎯� | 0 鑽夌 / 2 瀹℃壒涓� / 3 宸插鎵� / 4 宸插畬鎴� / 5 宸插彇娑� |
+| processInstanceId | 璇︽儏 | 鏈夊�兼椂鍓嶇灞曠ず銆屾煡鐪嬪鎵规祦绋嬪疄渚嬨�嶅叆鍙� |
+| 鏄庣粏琛岃〃鏍� | 璇︽儏銆佺紪杈� | 灞曠ず璁惧銆佺墿鏂欍�佹暟閲忋�佸崟浣� |
+
+## 涓氬姟瑙勫垯璇存槑
+
+| 鍦烘櫙 | 瑙勫垯 |
+|------|------|
+| 鏄庣粏琛屾柊澧� | 蹇呴』閫夋嫨宸插叧鑱旂墿鏂欙紙itemId 闈炵┖锛夌殑璁惧锛屽惁鍒欐姤銆屾墍閫夎澶囨湭鍏宠仈鐗╂枡銆� |
+| 鏁伴噺 | 蹇呴』 > 0锛岄粯璁� 1 |
+| 缂栬緫 | 浠呰崏绋跨姸鎬佷笅鍙鍒犳敼涓诲崟涓庢槑缁嗚 |
+| 鎻愪氦瀹℃壒 | 鑷冲皯鏈変竴鏉℃槑缁嗚锛涙彁浜ゅ悗杩涘叆瀹℃壒涓紝涓嶅彲鍐嶇紪杈� |
+| 瀹℃壒缁撴灉 | 閫氳繃鈫掑凡瀹℃壒锛涢┏鍥炩啋鍥炶崏绋垮彲鏀归噸鎻愶紱鍙栨秷鈫掑凡鍙栨秷 |
+| 鎵ц鍏ュ簱 | 浠呭凡瀹℃壒鍙墽琛岋紱閫愯涓烘瘡鍙拌澶囧湪璁惧浠� +1 搴撳瓨骞跺啓搴撳瓨娴佹按锛涘畬鎴愬悗涓嶅彲閲嶅鎵ц |
+| 搴撳瓨鐢熸晥 | 瀹℃壒閫氳繃涓嶇珛鍗虫墸搴撳瓨锛屼粎銆屾墽琛屽叆搴撱�嶆墠鍏ヨ澶囦粨 |
+
+## 娉ㄦ剰浜嬮」
+
+- 鏄庣粏琛屾湯绔浐瀹氬叆銆岃澶囦粨涓夊厓缁勩�嶏紝鍓嶇鏃犻渶鎻愪氦浠撳簱/搴撳尯/搴撲綅瀛楁銆�
+- 搴撳瓨鏁伴噺鍙樺寲閫氳繃鏃㈡湁搴撳瓨/搴撳瓨娴佹按鏌ヨ鎺ュ彛鏌ョ湅锛屾湰鍗曟嵁涓嶅鍒跺簱瀛樻暟鎹��
+- BPM 娴佺▼瀹氫箟闇�鍦ㄥ悗鍙颁互鍒嗙被 `equipment_receipt_approve` 鎵嬪伐閮ㄧ讲鍚庯紝`approval-process-list` 鎵嶄細杩斿洖鍙敤娴佺▼銆�
\ No newline at end of file
diff --git a/docs/wm_frontend_upgrade_progress.md b/docs/wm_frontend_upgrade_progress.md
new file mode 100644
index 0000000..9a71a39
--- /dev/null
+++ b/docs/wm_frontend_upgrade_progress.md
@@ -0,0 +1,60 @@
+# MES 浠撳偍鍔熻兘 - 鍓嶇鏀归�犺繘搴﹁褰�
+
+> 鏈枃璁板綍"缁х画淇敼鍓嶅悗绔�"鎵归噺琛ョ爜鐨勫墠绔疄鏂借繘搴︼紙2026-09-08锛夛紝浣滀负璺ㄥぉ浜ゆ帴渚濇嵁銆�
+> 鍚庣 M1~M5 浠g爜宸插叏閮ㄥ畬鎴愬苟缂栬瘧閫氳繃锛汢PM 娴佺▼涓庤彍鍗曟潈闄愬凡 DB 閮ㄧ讲銆�
+> 鏈枃浠朵粎璁板綍**鍓嶇锛坢om-pro2-before锛�**鏀瑰姩涓庡緟鍔炪��
+
+## 宸插畬鎴愶紙2026-09-08锛�
+
+### 1. 閫氱敤 BPM 娴佺▼閫夋嫨寮圭獥缁勪欢锛堟柊寤猴級
+
+- `mom-pro2-before/src/views/wls/components/process-select-modal.vue`
+- 鐢� mes/pd/project 鐨� process-select-modal 娉涘寲鑰屾潵锛涙彁浜ゅ嚱鏁伴�氳繃 `modalApi.getData({ id, processList, submitFn })` 浼犲叆锛屼笁鍗曟嵁涓庡悗缁� M1/M5 鍧囧彲澶嶇敤銆�
+
+### 2. 闃舵1 涓夊崟鎹� BPM 鎻愪氦鍗囩骇锛堟潅椤瑰叆搴�/鏉傞」鍑哄簱/渚涘簲鍟嗛��璐э級
+
+**API 灞傦紙鍧囨柊澧� processInstanceId 瀛楁锛夛細**
+
+| 鏂囦欢 | 鏀瑰姩 |
+|------|------|
+| `src/api/mes/wm/miscreceipt/index.ts` | `getMiscReceiptApproveProcessList()`銆乣submitMiscReceiptApproval(id, key)`銆佹帴鍙e姞 `processInstanceId` |
+| `src/api/mes/wm/miscissue/index.ts` | `getMiscIssueApproveProcessList()`銆乣submitMiscIssueApproval(id, key)`銆佹帴鍙e姞 `processInstanceId` |
+| `src/api/mes/wm/returnvendor/index.ts` | `getReturnVendorApproveProcessList()`銆乣submitReturnVendorApproval(id, key)`銆佹帴鍙e姞 `processInstanceId` |
+
+> 鏃х殑鏃犲弬 `submitMiscReceipt(id)` 绛夊凡鍒犻櫎锛堝悗绔� submit 鎺ュ彛鐜板湪瑕佹眰 `processDefinitionKey` 鍙傛暟锛夈��
+
+**椤甸潰灞傦紙涓変釜鍗曟嵁妯″紡涓�鑷达級锛�**
+
+- `index.vue`锛氭柊澧� `useRouter` + ProcessSelectModal 鎸傝浇锛涜鎿嶄綔澧炲姞
+ - 鈥滄彁浜ゅ鎵光�濓紙PREPARE 鐘舵�侊紝鍏堟煡娴佺▼鍒楄〃鍐嶅脊绐楅�夋嫨锛�
+ - 鈥滄煡鐪嬪鎵光�濓紙APPROVING 鐘舵�侊紝`router.push` 鍒� `BpmProcessInstanceDetail`锛�
+- `modules/form.vue`锛氱Щ闄よ〃鍗曞唴鈥滄彁浜も�濇寜閽強 `handleSubmit`锛堟彁浜ゆ敼鐢卞垪琛ㄨ鎿嶄綔瑙﹀彂锛岃閬夸簩娆$偣鎻愪氦鐨勬棫閫昏緫锛�
+- 鏉冮檺瀛楃涓叉寜 DB 鑿滃崟锛�
+ - 鏉傞」鍏ュ簱鐢ㄥ啋鍙锋潈闄� `mes:wm:misc-receipt:submit` / `:query`
+ - 鏉傞」鍑哄簱銆佷緵搴斿晢閫�璐х敤鐭í绾挎潈闄愶紝澶嶇敤 `mes:wm-misc-issue:update` / `mes:wm-return-vendor:update`锛堟棤鐙珛 submit 鎸夐挳鑿滃崟锛�
+
+**鏋氫妇琛ラ綈锛�**
+
+- `src/packages/constants/src/biz-mes-enum.ts`锛歚MesWmMiscReceiptStatusEnum`銆乣MesWmMiscIssueStatusEnum` 澧炲姞 `APPROVING`锛�=2锛夈��
+
+**鏁版嵁搴撳瓧鍏革紙宸叉墽琛屽埌 mom-xgdl锛夛細**
+
+- `mes_wm_misc_receipt_status`銆乣mes_wm_misc_issue_status` 琛� value=2 鈥滃鎵逛腑鈥濓紙`system_dict_data` id 1065512 / 1065513锛夛紝鍘熷�间负 3/4/5 鐨勬帓搴忚嚜鍔ㄩ『寤躲��
+
+## 鏄庢棩寰呭姙锛堟湭寮�濮嬶級
+
+| # | 浠诲姟 | 涓昏鍐呭 |
+|---|------|----------|
+| M1 | 鐩樼偣浠诲姟椤� BPM 鍗囩骇锛堢粨鏋滃鎵癸級 | 绉婚櫎鈥滄墽琛岀洏鐐�(finish)鈥濇寜閽笌 execute 琛ㄥ崟绫诲瀷锛沗鎻愪氦`鎸夐挳鏂囨鏀光�滃紑濮嬬洏鐐光�濓紱鏂板鈥滄彁浜ょ粨鏋滃鎵光��(submit-approval) + 鈥滄煡鐪嬪鎵光�濓紱API 鍔� `submitStockTakingApproval`/`getStockTakingApproveProcessList`/`processInstanceId` |
+| M2 | 鐩樼偣鏂规璋冨害瀛楁 | 琛ㄥ崟鍔� `autoGenerate` Switch + `generateCron` Input锛堜緷璧� autoGenerate锛宧elpMessage 鎻愮ず璧� infra 瀹氭椂浠诲姟锛夛紱API 鍔犱笁涓瓧娈� |
+| M3 | 鏉$爜鎵爜瑙f瀽 + 鎴愬浘棰勮 | barcode 椤靛伐鍏锋爮鍔犫�滄壂鐮佽В鏋愨�濓紱API 鍔� `renderBarcodeImage`(POST) / `parseBarcodeContent`(POST)锛涙柊寤� scan-modal |
+| M4 | SN 鍦ㄥ簱鍗曚欢/鍑哄叆搴�/璇︽儏 | index.vue 鍔� Tabs锛堝垎缁�/鍦ㄥ簱鍗曚欢锛夛紱鏂板 in-stock / out-stock / sn-detail 寮圭獥锛汚PI 鍔� `registerSnInStock`/`outboundSn`/`getSnDetail`/`getSnInStockPage`锛涘姞 `MesWmSnStatusEnum` |
+| M5 | 璁惧鍏ュ簱鍗曢〉闈紙鏂伴〉闈級 | 鏂板缓 `wls/equipmentreceipt/index.vue` + data.ts + modules/{form,line-list,line-form}.vue锛汚PI 灞傛柊寤� equipmentreceipt/index.ts + line.ts锛涘姞 `MesWmEquipmentReceiptStatusEnum` + `MesAutoCodeRuleCode.WM_EQUIPMENT_RECEIPT_CODE`锛涜鐢� DvMachinerySelect锛宖inish 鍥哄畾璁惧浠撲笁鍏冪粍 |
+| 鏀跺熬 | typecheck / build | `pnpm typecheck` 淇绫诲瀷閿欒锛涘繀瑕佹椂 `pnpm build` |
+
+## 鏄庢棩寮�濮嬪墠闇�鐭�
+
+1. **M5 鍓嶇疆缂哄彛**锛歚src/api/mes/dv/machinery/index.ts` 鐨� `Machinery` 绫诲瀷娌℃湁 `itemId` 瀛楁锛堝悗绔� RespVO 宸叉湁锛夛紝M5 琛岃〃鍗曚緷璧� DvMachinerySelect 鐨� change 浜嬩欢鎼哄甫 itemId 鑷姩甯﹀叆鈥斺�旈渶鍏堢粰鍓嶇绫诲瀷琛� `itemId?: number`銆�
+2. **鏉冮檺鏍煎紡**锛歟quipment-receipt 鑿滃崟鐢ㄥ啋鍙锋潈闄� `mes:wm:equipment-receipt:query/create/update/delete/submit/finish/cancel`锛汳1 stock-taking-task 鐨� submit-approval/cancel 澶嶇敤 `mes:wm-stock-taking-task:update`锛汳3 barcode 澶嶇敤 `mes:wm-barcode:query`銆�
+3. **宸查儴缃� BPM 娴佺▼ key**锛歚misc_receipt_approve` / `misc_issue_approve` / `return_vendor_approve` / `item_receipt_approve` / `stock_taking_result_approve` / `equipment_receipt_approve`銆�
+4. **鍚庣閲嶅惎**锛�48080 闇�閲嶅惎鍔犺浇鏂颁唬鐮佸悗鎵嶅彲绔埌绔啋鐑燂紙鐢ㄦ埛 dev 杩涚▼锛岄噸鍚椂鏈虹敱鐢ㄦ埛鍐冲畾锛夈��
\ No newline at end of file
diff --git a/docs/wm_sn_item_chain_integration.md b/docs/wm_sn_item_chain_integration.md
new file mode 100644
index 0000000..ed7ef81
--- /dev/null
+++ b/docs/wm_sn_item_chain_integration.md
@@ -0,0 +1,84 @@
+# SN 鍗曞搧搴撳瓨閾撅紙杞婚噺闂幆锛�- 鍓嶇鑱旇皟鏂规
+
+## 娑夊強椤甸潰
+
+- SN 鐮佸垪琛� / 鍗曚欢鍦ㄥ簱鏌ヨ椤�
+- SN 鍗曚欢璇︽儏椤碉紙鍦ㄥ簱 / 鍘诲悜锛�
+- 浠撳簱鍏ュ簱銆佸嚭搴擄紙鐧昏 SN锛夋搷浣滈〉
+- 鐗╂枡涓绘暟鎹紙SN 寮�鍏抽厤缃級
+
+## 涓氬姟娴佺▼涓庢暟鎹甫鍏�
+
+1. 鐗╂枡涓绘暟鎹� -> SN 寮�鍏筹細鐗╂枡鑻ュ惎鐢ㄣ�屽簭鍒楀彿绠$悊銆嶏紙`isSerialManaged`锛夛紝鎵嶅厑璁歌鐗╂枡鐧昏 SN 鍏ュ簱/鍑哄簱銆�
+2. 鍏ュ簱鐧昏 SN锛氱敤鎴锋壂鐮�/鎵嬪伐褰曞叆 `code`锛岄�夋嫨鐗╂枡銆佷粨搴�/搴撳尯/搴撲綅锛岃皟鐢� `POST /mes/wm/sn/in-stock`锛涘悗绔厛寤� IN 搴撳瓨浜嬪姟鍐嶆洿鏂� SN 涓恒�屽湪搴撱�嶅苟钀藉簱浣嶃�俙snCode` 鍐欏叆搴撳瓨娴佹按锛坄mes_wm_transaction.sn_code`锛夈��
+3. 鍑哄簱鏍搁攢 SN锛氬綍鍏� SN 鐮佷笌鐗╂枡锛岃皟鐢� `POST /mes/wm/sn/out-stock`锛涘悗绔互 SN 璁板綍鐨勫簱瀛樹綅缃缓 OUT 浜嬪姟锛屽苟鎶� SN 缃�屽凡鍑哄簱銆嶃�佹竻绌哄簱浣嶃��
+4. 鍗曚欢鏌ヨ锛氭寜 `code` 璋� `GET /mes/wm/sn/detail`锛岃繑鍥� SN 鍦ㄥ簱鐘舵�併�佸綋鍓嶄綅缃紝浠ュ強鏈�杩戜竴绗斿簱瀛樻祦姘寸殑绫诲瀷/鏁伴噺/涓氬姟鍗曟嵁/鏃堕棿锛岀敤浜庢牳瀵瑰幓鍚戙��
+
+## API
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| POST | /mes/wm/sn/in-stock | SN 鐧昏鍏ュ簱 |
+| POST | /mes/wm/sn/out-stock | SN 鍑哄簱鏍搁攢 |
+| GET | /mes/wm/sn/detail?code= | SN 鍗曚欢璇︽儏锛堝湪搴撶姸鎬� + 鏈�杩戞祦姘村幓鍚戯級 |
+| GET | /mes/wm/sn/in-stock-page | 鍗曚欢鍦ㄥ簱鍒嗛〉鏌ヨ锛堟寜鐘舵��/搴撲綅/鐗╂枡/鎵规杩囨护锛� |
+
+**璇锋眰鍙傛暟锛坕n-stock锛夛細**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| code | String | 鏄� | SN 鐮� |
+| itemId | Long | 鏄� | 鐗╂枡缂栧彿锛堥』鍚敤搴忓垪鍙风鐞嗭級 |
+| warehouseId | Long | 鏄� | 浠撳簱 |
+| locationId | Long | 鏄� | 搴撳尯 |
+| areaId | Long | 鏄� | 搴撲綅 |
+| batchCode | String | 鍚� | 鎵规鍙� |
+| remark | String | 鍚� | 澶囨敞 |
+
+**璇锋眰鍙傛暟锛坥ut-stock锛夛細**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| code | String | 鏄� | SN 鐮� |
+| itemId | Long | 鏄� | 鐗╂枡缂栧彿 |
+| remark | String | 鍚� | 澶囨敞 |
+
+**鍝嶅簲瀛楁锛坉etail锛夛細**
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| code / status | String/Integer | SN 鐮併�佺姸鎬侊紙1 鍦ㄥ簱 / 2 宸插嚭搴擄級 |
+| warehouseId/locationId/areaId | Long | 鍦ㄥ簱浣嶇疆锛堝凡鍑哄簱涓虹┖锛� |
+| lastTransactionType / TypeName | Integer/String | 鏈�杩戜竴绗旀祦姘存柟鍚戯紙1 鍏ュ簱 / 2 鍑哄簱锛� |
+| lastQuantity / lastBizType / lastBizCode / lastTime | decimal/Integer/String/datetime | 鏈�杩戞祦姘存暟閲忋�佷笟鍔$被鍨嬨�佷笟鍔″崟鎹紪鐮併�佹椂闂� |
+
+**鍝嶅簲瀛楁鏂板锛堢墿鏂欑浉鍏� VO锛歁dmItemRespDTO / MdmItemSaveReqVO 绛夛級锛�**
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| isSerialManaged | Boolean | 鏄惁搴忓垪鍙风鐞嗗紑鍏筹紙create/read/update 鍧囨敮鎸侊級 |
+
+## 瀛楁灞曠ず瑙勫垯
+
+| 瀛楁 | 灞曠ず浣嶇疆 | 璇存槑 |
+|------|----------|------|
+| SN 鐮� / 鐗╂枡 / 鎵规 | 鍒楄〃銆佽鎯� | 鍗曚欢鏍囪瘑 |
+| 鍦ㄥ簱鐘舵�� | 鍒楄〃銆佽鎯� | 鍦ㄥ簱 / 宸插嚭搴� |
+| 鍦ㄥ簱搴撲綅 | 鍒楄〃銆佽鎯� | 浠撳簱/搴撳尯/搴撲綅 |
+| 鏈�杩戝幓鍚� | 璇︽儏 | 鏈�杩戞祦姘村搴旂殑涓氬姟鍗曟嵁鐮� + 鏃堕棿 |
+
+## 涓氬姟瑙勫垯璇存槑
+
+| 鍦烘櫙 | 瑙勫垯 |
+|------|------|
+| 鏈惎鐢ㄥ簭鍒楀彿 | 鐗╂枡鏈紑 `isSerialManaged` 鏃剁櫥璁� SN 鎶ラ敊 |
+| 閲嶅鍏ュ簱 | 宸层�屽湪搴撱�嶇殑 SN 鍐嶆鍏ュ簱鎶ラ敊锛岄』鍏堝嚭搴� |
+| 鍑哄簱鍓嶆彁 | 浠呫�屽湪搴撱�嶄笖浣嶇疆闈炵┖鍙嚭搴擄紱SN 涓庣墿鏂欎笉鍖归厤 / 浣嶇疆涓嶇浼氭姤閿� |
+| 鍑哄叆搴撴祦杞� | in-stock 寤� IN 浜嬪姟銆乷ut-stock 寤� OUT 浜嬪姟锛屽潎璧板簱瀛樻祦姘村苟鏇存柊搴撳瓨鍙拌处 |
+| 鍟嗗搧 SN 婧簮 | 閫氳繃 `mes_wm_transaction.sn_code` 鍏宠仈娴佹按锛屽彲鎸� SN 杩芥函鍘嗗彶杩涘嚭 |
+
+## 娉ㄦ剰浜嬮」
+
+- SN 鐧昏/鏍搁攢鏄�岃交閲忋�嶈兘鍔涳細鍗曟嵁琛屼笉鎷嗘垚 SN 鏄庣粏锛孲N 鐙珛绠$悊鍦� `mes_wm_sn`銆�
+- 鍑哄簱浣嶇疆鍙栬嚜 SN 璁板綍鐨勫簱瀛樹綅缃紝鍓嶇鏃犻渶閲嶅鎻愪氦搴撲綅銆�
+- 鐗╂枡 `isSerialManaged` 寮�鍏冲湪 MDM 鐗╂枡涓绘暟鎹淮鎶わ紝MES 璇诲彇鍚屼竴 `mdm_item` 鏁版嵁銆�
\ No newline at end of file
diff --git a/docs/wm_stock_taking_plan_auto_generate_integration.md b/docs/wm_stock_taking_plan_auto_generate_integration.md
new file mode 100644
index 0000000..3be5032
--- /dev/null
+++ b/docs/wm_stock_taking_plan_auto_generate_integration.md
@@ -0,0 +1,63 @@
+# 瀹氭湡鐩樼偣鑷姩璋冨害 - 鍓嶇鑱旇皟鏂规
+
+## 娑夊強椤甸潰
+
+- 鐩樼偣鏂规鍒楄〃椤碉紙`wls/stocktaking/plan`锛�
+- 鐩樼偣鏂规缂栬緫琛ㄥ崟锛坄wls/stocktaking/plan` 鏂板缓/缂栬緫寮圭獥锛�
+
+## 涓氬姟娴佺▼涓庢暟鎹甫鍏�
+
+1. 鐩樼偣鏂规寮�鍚�屽畾鏈熻嚜鍔ㄧ敓鎴愩�嶅苟閰嶇疆鐢熸垚鍛ㄦ湡 cron 鍚庯紝鍚庡彴瀹氭椂浠诲姟锛堟瘡鍛ㄦ湡鎵弿銆侀粯璁ゆ瘡鍒嗛挓涓�娆★級鎸夊悇鏂规銆屼笂娆$敓鎴愭椂闂� + cron銆嶅垽鏂槸鍚﹀埌鏈熴��
+2. 鍒版湡鍒欑郴缁熻嚜鍔ㄦ寜鏂规鍒涘缓鐩樼偣浠诲姟锛堣崏绋挎�侊紝鍚嶇О鍙栨柟妗堝悕锛屾部鏂规鐨勭被鍨�/鐩茬洏/鍐荤粨/鍔ㄦ�佺洏鐐规椂闂存锛夛紝骞剁珛鍗虫寜鏂规鐢熸垚鐩樼偣鏄庣粏琛屻��
+3. 鏂规棣栨寮�鍚悗绯荤粺浼氳褰曞熀绾挎椂闂达紝浠庝笅涓�涓懆鏈熻捣寮�濮嬬敓鎴愶紝涓嶄細寮�鍚綋澶╃珛鍗崇敓鎴愩��
+
+## API
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| POST | /mes/wm/stocktaking-plan/create | 鍒涘缓鐩樼偣鏂规 |
+| PUT | /mes/wm/stocktaking-plan/update | 淇敼鐩樼偣鏂规 |
+| GET | /mes/wm/stocktaking-plan/get | 鑾峰緱鐩樼偣鏂规璇︽儏 |
+| GET | /mes/wm/stocktaking-plan/page | 鑾峰緱鐩樼偣鏂规鍒嗛〉 |
+
+**璇锋眰鍙傛暟鏂板锛堝垱寤�/淇敼 ReqVO锛夛細**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| autoGenerate | Boolean | 鍚� | 鏄惁瀹氭湡鑷姩鐢熸垚鐩樼偣浠诲姟锛堥粯璁� false锛� |
+| generateCron | String | autoGenerate=true 鏃跺繀濉� | 鑷姩鐢熸垚鍛ㄦ湡 cron 琛ㄨ揪寮忥紙Quartz 6 娈碉級锛屽 `0 0 8 * * ?` 琛ㄧず姣忓ぉ 8 鐐� |
+
+**鍝嶅簲瀛楁鏂板锛堣鎯�/鍒嗛〉 RespVO锛夛細**
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| autoGenerate | Boolean | 鏄惁瀹氭湡鑷姩鐢熸垚鐩樼偣浠诲姟 |
+| generateCron | String | 鑷姩鐢熸垚鍛ㄦ湡 cron 琛ㄨ揪寮� |
+| lastGenerateTime | LocalDateTime | 涓婃鑷姩鐢熸垚鏃堕棿锛堝悗绔洖鍐欙紝浠呭睍绀猴級 |
+
+## 瀛楁灞曠ず瑙勫垯
+
+| 瀛楁 | 灞曠ず浣嶇疆 | 璇存槑 |
+|------|----------|------|
+| autoGenerate | 鍒楄〃銆佽〃鍗� | 寮�鍏�/澶嶉�夋 |
+| generateCron | 琛ㄥ崟 | autoGenerate 寮�鍚椂蹇呭~骞舵樉绀猴紱涓嶅悎娉曟椂鍚庣鎶ラ敊銆岀敓鎴愬懆鏈� cron 琛ㄨ揪寮忎笉鍚堟硶銆� |
+| lastGenerateTime | 鍒楄〃銆佽鎯� | 鍙灞曠ず锛屽墠绔笉鍙紪杈� |
+
+## 涓氬姟瑙勫垯璇存槑
+
+| 鍦烘櫙 | 瑙勫垯 |
+|------|------|
+| 寮�鍚嚜鍔ㄧ敓鎴� | autoGenerate=true 鏃� generateCron 蹇呭~锛堝惁鍒欐姤閿欍�屽紑鍚畾鏈熻嚜鍔ㄧ敓鎴愭椂蹇呴』閰嶇疆鐢熸垚鍛ㄦ湡 cron銆嶏級 |
+| 鏈紑鍚� | autoGenerate=false 鏃跺拷鐣� generateCron |
+| cron 鏍¢獙 | 浣跨敤 Quartz 6 娈� cron锛屼笉鍚堟硶缁欍�岀敓鎴愬懆鏈� cron 琛ㄨ揪寮忎笉鍚堟硶銆嶉敊璇� |
+| 鐢熸垚鑼冨洿 | 浠呫�屽惎鐢ㄧ姸鎬� + 寮�鍚嚜鍔ㄧ敓鎴� + 宸查厤缃� cron銆嶇殑鏂规鍙備笌鎵弿 |
+| 闃查噸澶� | 鐢熸垚浠诲姟鎴愬姛鍚庡悓浜嬪姟鍥炲啓涓婃鐢熸垚鏃堕棿锛岄伩鍏嶅悓鍛ㄦ湡閲嶅鐢熸垚 |
+| 棣栨鍚敤 | 棣栨鎵弿浠呰褰曞熀绾挎椂闂翠笉鐢熸垚锛屼粠涓嬩竴鍛ㄦ湡寮�濮� |
+| 閮ㄥ垎澶辫触 | 鍗曚釜鏂规鐢熸垚澶辫触涓嶅奖鍝嶅叾瀹冩柟妗� |
+| 浠诲姟鏌ョ湅 | 鑷姩鐢熸垚鐨勪换鍔″彲鍦ㄧ洏鐐逛换鍔″垪琛ㄦ煡鐪嬶紝鏉ユ簮鏂规缂栫爜/鍚嶇О鑷姩甯﹀叆 |
+
+## 娉ㄦ剰浜嬮」
+
+- 鑷姩鐢熸垚鏄悗鍙板畾鏃朵换鍔¤涓猴紝鍓嶇鏃犻渶瑙﹀彂锛涜仈璋冩椂楠岃瘉鏂规瀛楁淇濆瓨/鍥炴樉姝g‘鍗冲彲銆�
+- 鑻ラ渶楠岃瘉鐢熸垚鏁堟灉锛屽彲灏� cron 閰嶇疆涓虹煭鍛ㄦ湡锛堝姣忓垎閽� `0 */1 * * * ?`锛夛紝淇濆瓨鍚敤鍚庡湪鐩樼偣浠诲姟鍒楄〃瑙傚療鑷姩鍑虹幇鑽夌浠诲姟銆�
+- 鍚庣画鑻ュ湪 WMS锛坢om-pro2-before锛夌洏鐐规柟妗堣〃鍗曚腑澧炲姞浠ヤ笂涓や釜瀛楁锛屼粎闇�闅忔柟妗堜繚瀛樹笌鍥炴樉锛涙棤鏂板椤甸潰銆�
\ No newline at end of file
diff --git a/docs/wm_stock_taking_result_approval_integration.md b/docs/wm_stock_taking_result_approval_integration.md
new file mode 100644
index 0000000..eb97d79
--- /dev/null
+++ b/docs/wm_stock_taking_result_approval_integration.md
@@ -0,0 +1,62 @@
+# 鐩樼偣缁撴灉瀹℃壒 BPM - 鍓嶇鑱旇皟鏂规
+
+## 娑夊強椤甸潰
+
+- 鐩樼偣浠诲姟鍒楄〃椤碉紙`wls/stocktaking/task`锛�
+- 鐩樼偣浠诲姟璇︽儏/瀹炵洏褰曞叆椤碉紙`wls/stocktaking/task` 璇︽儏銆乣result-form` 褰曞叆瀹炵洏锛�
+
+## 涓氬姟娴佺▼涓庢暟鎹甫鍏�
+
+1. 鍒涘缓鐩樼偣浠诲姟锛堣崏绋匡級鈫掋�屽紑濮嬬洏鐐广�嶏細浠诲姟杩涘叆鐩樼偣涓紝鍙綍鍏�/瀵煎叆瀹炵洏銆�
+2. 褰曞畬瀹炵洏 鈫掋�屾彁浜ょ粨鏋滃鎵广�嶏細璋冪敤鎻愪氦瀹℃壒鎺ュ彛锛堥渶閫夋祦绋嬪畾涔夛級锛屼换鍔¤繘鍏ュ鎵逛腑锛堝甫娴佺▼瀹炰緥缂栧彿锛夈��
+3. 瀹℃壒閫氳繃 鈫� 绯荤粺鑷姩瑙e喕骞舵牳閿�鐩樼泩/鐩樹簭宸紓锛屼换鍔″彉涓哄凡瀹屾垚銆�
+4. 瀹℃壒椹冲洖 鈫� 浠诲姟浠嶄负鐩樼偣涓紙娓呴櫎娴佺▼瀹炰緥缂栧彿锛夛紝鍙慨鏀瑰疄鐩樺悗閲嶆柊鎻愪氦銆�
+5. 瀹℃壒鍙栨秷 / 鍙栨秷浠诲姟 鈫� 浠诲姟鍙樹负宸插彇娑堬紝鍐荤粨搴撳瓨瑙e喕銆�
+
+## API
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| GET | /mes/wm/stocktaking-task/approval-process-list | 鑾峰緱鐩樼偣缁撴灉鍙敤鐨勫鎵规祦绋嬪畾涔夊垪琛� |
+| PUT | /mes/wm/stocktaking-task/submit-approval | 鎻愪氦鐩樼偣缁撴灉瀹℃壒 |
+| PUT | /mes/wm/stocktaking-task/cancel | 鍙栨秷鐩樼偣浠诲姟 |
+
+> 娉ㄦ剰锛氬師銆屽畬鎴愮洏鐐广�嶆帴鍙� `/mes/wm/stocktaking-task/finish` 宸茬Щ闄わ紝鏍搁攢鏀圭敱瀹℃壒閫氳繃浜嬩欢椹卞姩锛屼笉鍐嶆彁渚涘畬鎴愮洏鐐规寜閽��
+
+**鎻愪氦瀹℃壒璇锋眰鍙傛暟锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| id | Long | 鏄� | 鐩樼偣浠诲姟缂栧彿 |
+| processDefinitionKey | String | 鏄� | 娴佺▼瀹氫箟 Key锛堜粠瀹℃壒娴佺▼瀹氫箟鍒楄〃閫夋嫨锛� |
+
+**瀹℃壒娴佺▼瀹氫箟鍒楄〃鍝嶅簲锛�** `{ "code": 0, "data": [{ "key": "stock_taking_result_approve", "name": "xxx", ... }] }`锛屽彇鍏朵腑鐨� `key` 浣滀负鎻愪氦瀹℃壒鍙傛暟銆�
+
+**鍝嶅簲瀛楁鏂板锛堜换鍔″垪琛�/璇︽儏 RespVO锛夛細**
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| processInstanceId | String | BPM 娴佺▼瀹炰緥缂栧彿锛涢潪绌鸿〃绀哄凡鎻愪氦瀹℃壒锛屽彲鐐瑰嚮鏌ョ湅瀹℃壒杩涘害 |
+
+## 瀛楁灞曠ず瑙勫垯
+
+| 瀛楁 | 灞曠ず浣嶇疆 | 璇存槑 |
+|------|----------|------|
+| processInstanceId | 鍒楄〃銆佽鎯� | 闈炵┖鏃舵樉绀恒�屽鎵逛腑/鏌ョ湅瀹℃壒銆嶅叆鍙o紝涓虹┖鏃舵樉绀恒�屽彲鎻愪氦瀹℃壒銆� |
+
+## 涓氬姟瑙勫垯璇存槑
+
+| 鍦烘櫙 | 瑙勫垯 |
+|------|------|
+| 鎻愪氦鍓嶇疆鏍¢獙 | 浠呯洏鐐逛腑浠诲姟鍙彁浜わ紱闇�宸叉湁 >=1 鏉$洏鐐圭粨鏋滐紱鏈彁浜よ繃锛坧rocessInstanceId 涓虹┖锛夐槻閲嶅鎻愪氦 |
+| 瀹℃壒閫氳繃 | 缃凡瀹屾垚 + 瑙e喕 + 鑷姩鏍搁攢宸紓锛堝悓涓�浜嬪姟锛屽け璐ユ暣浣撳洖婊氫粛涓虹洏鐐逛腑锛� |
+| 瀹℃壒椹冲洖 | 浠诲姟淇濇寔鐩樼偣涓紝娓� processInstanceId锛屽厑璁镐慨鏀瑰疄鐩樺悗閲嶆彁 |
+| 瀹℃壒鍙栨秷 | 浠诲姟鍙樺凡鍙栨秷锛岃В鍐� |
+| 寮�濮嬬洏鐐瑰墠缃� | 浠呰崏绋垮彲寮�濮嬶紱鐩樼偣琛岄潪绌猴紱寮�鍚喕缁撳垯鍐荤粨瀵瑰簲搴撳瓨 |
+| 瀹屾垚璺嚎 | 瀹屾垚鍚庢棤銆屽畬鎴愮洏鐐广�嶆搷浣滐紝鏍搁攢鑷姩鎵ц锛屾棤闇�鍓嶇骞查 |
+
+## 娉ㄦ剰浜嬮」
+
+- 浠诲姟鍒楄〃鎸夐挳鎬佸缓璁寜 `status` + `processInstanceId` 缁勫悎鍒ゆ柇锛氱洏鐐逛腑涓� processInstanceId 涓虹┖鎵嶆樉绀恒�屾彁浜ょ粨鏋滃鎵广�嶃��
+- 鎻愪氦鍚庤鎯�/鍒楄〃鍝嶅簲涓� processInstanceId 宸叉湁鍊硷紝鍙嵁姝ゅ姞杞藉鎵硅繘搴﹁鎯呫��
+- 鎸夐挳鏉冮檺澶嶇敤锛氭彁浜ゅ鎵逛娇鐢� `mes:wm-stock-taking-task:update`锛屽鎵规祦绋嬪垪琛ㄤ娇鐢� `mes:wm-stock-taking-task:query`銆�
\ No newline at end of file
diff --git a/docs/wm_stock_trace_gap_analysis.md b/docs/wm_stock_trace_gap_analysis.md
new file mode 100644
index 0000000..af8deda
--- /dev/null
+++ b/docs/wm_stock_trace_gap_analysis.md
@@ -0,0 +1,103 @@
+# MES 浠撳偍鐗╄祫銆屾潯鐮�/浜岀淮鐮� 路 鏍囩鎵撳嵃 路 鐩樼偣 路 鎵规涓庡崟鍝佽拷婧�嶅樊璺濆垎鏋愪笌瀹炴柦寤鸿
+
+> 渚濇嵁锛歚yudao-module-mes` 鐜版湁浠g爜鐩樼偣锛�2026-09-08锛夛紝瀵圭収涓夐」闇�姹傞�愭潯鏍稿"宸叉湁/缂哄け"銆傜粨璁哄潎鍙函婧愬埌瀵瑰簲 Controller / Service / DO / 琛ㄣ��
+
+## 1. 鎬讳綋缁撹
+
+`mes_wm_*` 涓�鏁村鍦板熀宸茬粡閾哄緱寰堝锛�**搴撳瓨鍙拌处+娴佹按銆佹壒娆°�佹潯鐮併�丼N銆佺洏鐐� plan/task/line/result銆佹壒娆¤拷婧�**閮藉缓濂戒簡銆傜湡姝g殑宸窛澶у鏄�"**鏈�鍚庝竴鍏噷娌℃帴绾�**"锛屽叾娆℃墠鏄�"闇�鏂板妯″瀷"銆傜己琛�/閲嶉�犵殑鍦烘櫙寰堝皯锛屽鏁版槸"閫昏緫宸插啓浣嗘棤璋冪敤鐐广�佸瓧娈靛凡鐣欎絾鏃犱汉缁存姢銆佹ā鍨嬪凡寤轰絾鏈繘搴撳瓨閾�"銆�
+
+涓夐渶姹傚懡涓渶閲嶈鐨勪笁澶勶細
+
+1. **鐩樼偣鐩樼泩鐩樹簭鑷姩鏍搁攢"鏈帴绾�"**锛坄processStockTakingDifference` 鏃犱换浣曡皟鐢ㄦ柟锛宖inish 鍙疆鐘舵�侊級鈥斺�旀渶纭畾銆佷唬浠锋渶灏忕殑缂哄彛銆�
+2. **鏍囩鎵撳嵃 / 鎵爜 / 鏉$爜缁勫悎瀛楁**鏁翠綋缂哄け锛堝彧鏈夋潯鐮佸瓧绗︿覆涓� config 閲岀殑妯℃澘鍚嶅瓧娈碉級銆�
+3. **SN 鍙仛"鍙锋睜"锛屾湭杩涘簱瀛�/鍗曟嵁閾�**锛宍isSerialManaged` 绌鸿浆 鈫� "鎸夊崟浠� SN 绮惧噯杩芥函"鐩墠鏄柇鐨勩��
+
+---
+
+## 2. 鐜扮姸鑳藉姏閫熸煡
+
+| 鑳藉姏 | 涓昏〃 | 鍏抽敭鎺ュ彛锛圕ontroller 璺緞锛� | 鐘舵�� |
+|------|------|------------------------------|------|
+| 搴撳瓨鍙拌处/澶氭潯浠舵煡璇�/鍐荤粨 | `mes_wm_material_stock` | `/mes/wm/material-stock/page/get/update-frozen` | 鉁� 鍦ㄧ敤锛屾敮鎸佺墿鏂�/鎵规/浠撳簱/搴撳尯搴撲綅/渚涘簲鍟嗙瓫閫� |
+| 搴撳瓨璋冩暣锛堣嚜瀹氫箟鍏�/鍑猴級 | 鍚屼笂 + 娴佹按 | `/mes/wm/material-stock/adjust-in/adjust-out` | 鉁� 璧� transaction锛岃嚜鍔ㄦ洿鏂板彴璐� |
+| 绉诲簱/璋冩嫧 | 鍚屼笂 + `mes_wm_transfer(_line/_detail)` | `/mes/wm/material-stock/move`銆乣/mes/wm/transfer/*` | 鉁� |
+| 搴撳瓨娴佹按 | `mes_wm_transaction` | `/mes/wm/transaction/page`锛堝彲鎸� bizType/bizCode/item/batch 绛涳級 | 鉁� 鍚� bizId/bizCode/bizLineId/relatedTransactionId锛屽叿澶囧弽鍚戜覆鑱斿熀纭� |
+| 鍙敤閲� available | 鍐呭瓨璁$畻瀛楁 | 椤甸潰鐜扮畻 `qty - frozen - reserved` | 鈿狅笍 灞曠ず灞傜幇绠楋紱reserved 浠呯敓浜ч鏂�/閿�鍞嚭搴撲袱鍗曞崰搴擄紙`MesWmStockReserveService`锛� |
+| 鍦ㄩ�� inTransit | `mes_wm_material_stock.in_transit_quantity` | 鏃� | 鉂� 鏃犱换浣曞啓鍏�/鍐查攢鏂癸紝绌鸿浆瀛楁 |
+| 鐩樼偣璁″垝/浠诲姟/琛�/缁撴灉 | `mes_wm_stock_taking_plan(_param)/task(_line/_result)` | `/mes/wm/stock-taking-plan/*`銆乣/mes/wm/stock-taking-task/*` | 鉁� 涓绘祦绋嬪湪鐢紱琛屾敮鎸� Excel 瀵煎叆鑷姩鍒ょ泩浜忥紙`importStockTakingQuantity`锛� |
+| 鐩樼偣鐩樼泩/鐩樹簭鏍搁攢 | 缁� transaction 鏇存柊鍙拌处 | `processStockTakingDifference`锛圫ervice锛� | 鈿狅笍 **鍗婃垚鍝�**锛氶�昏緫瀛樺湪锛坄WM_STOCK_TAKING`=107 鐢熸垚 IN/OUT 娴佹按锛夛紝浣嗘棤璋冪敤鐐� |
+| 鐩樼偣瀹℃壒 | 鈥� | task 鍙湁 submit/finish/cancel | 鈿狅笍 鎵嬪伐涓ゆ寮忥紙PREPARE鈫扐PPROVING鈫扚INISHED锛夛紝**鏈帴 BPM** |
+| 鎵规 | `mes_wm_batch`锛堝師鏂�+鎴愬搧缁熶竴锛� | `/mes/wm/batch/get/page` | 鉁� 鍞竴缂栫爜/鑷姩缂栫爜/鎵规鏉$爜锛涘簱瀛樻寜 batch 缁村害锛屽叆搴撳己鏍¢獙 batch |
+| 鎵规杩芥函 | 鎵规脳娴佹按脳鎶ュ伐 | `/mes/wm/batch/forward-list` `/backward-list` `/purchase-sources` `/sales-targets` `/process-trace` `/get-by-sn` | 鉁� 宸查棴鐜紝鍚戝墠/鍚戝悗/鏉ユ簮/鍘诲悜/宸ュ簭/SN 鍙嶆煡 |
+| SN 鍙锋睜 | `mes_wm_sn` | `/mes/wm/sn/*`锛坄generateSnCodes`锛� | 鈿狅笍 鍙敓鎴�"鍙风爜姹�"锛屽崟鎹�/搴撳瓨/娴佹按**鍧囨棤 SN 缁村害** |
+| 鏉$爜鐢熸垚 | `mes_wm_barcode(_config)` | 鍚勪笟鍔″璞″垱寤烘椂 `autoGenerateBarcode` | 鉁� 18 绫� biztype锛屽彈 config.autoGenerateFlag 鎺у埗 |
+| 鏉$爜鍐呭 | config.contentFormat | `{BUSINESSCODE}` 鍗曞崰浣� | 鈿狅笍 鏃�"鐗╂枡+鎵规+缂栧彿+搴撲綅"缁勫悎瀛楁 |
+| 鏍囩鎵撳嵃/鎴愬浘 | config.defaultTemplate(浠呭瓧绗︿覆) | 鏃� | 鉂� 鏃犳墦鍗�/娓叉煋/鎴愬浘鎺ュ彛 |
+| 鎵爜鏈嶅姟绔� | 鈥� | 鏃� | 鉂� 鏀跺彂璐�/棰嗘枡/鐩樼偣鍧囨棤 scan 鏍¢獙 |
+| 璁惧鈫掔墿鏂欌啋搴撳瓨 | `mes_dv_machinery.item_id` | 鍒涘缓璁惧鑷姩寤烘枡骞跺叆璁惧浠� | 鉁咃紙闃舵2锛宍docs/machinery_equipment_material_inbound.md`锛� |
+
+---
+
+## 3. 閫愭潯闇�姹傚樊璺濅笌寤鸿钀界偣
+
+### 3.1 闇�姹�3锛氱墿璧勪簩缁寸爜/鏍囩鎵撳嵃锛岀粦瀹氭壒娆°�佺紪鍙枫�佸簱浣嶏紝閰嶅悎璧勪骇涓庣墿璧勮拷婧�
+
+| 瀛愰渶姹� | 鐜扮姸 | 宸窛 | 寤鸿鍚庣钀界偣 |
+|--------|------|------|--------------|
+| 浜岀淮鐮�/鏍囩鎵撳嵃 | 鍙瓨鏉$爜瀛楃涓诧紝config 鏈� `defaultTemplate` 瀛楁 | **鏃犳垚鍥俱�佹棤妯℃澘娓叉煋銆佹棤鎵撳嵃鎺ュ彛** | 鏂板"鏍囩鎵撳嵃"鑳藉姏锛氣憼 鏉$爜/浜岀淮鐮佸浘鐗囩敓鎴愶紙BarcodeFormatEnum 宸叉湁 QR/CODE39/EAN13/UPC-A 鏋氫妇锛夛紱鈶� 鎵撳嵃妯℃澘锛堟寜 bizType 鍙栧瓧娈电粍鍚� 鈫� 娓叉煋鏂囨湰/鍥剧墖锛夛紱鈶� 鎵撳嵃鎺ュ彛锛堝崟鏉�/鎵归噺锛屽彲鍏ユ墦鍗伴槦鍒楋級銆傚弬鑰冩枃浠讹細`MesWmBarcodeServiceImpl`銆乣MesWmBarcodeConfigDO.contentFormat` |
+| 缁戝畾"鎵规+缂栧彿+搴撲綅" | content 浠� `{BUSINESSCODE}` | 鏉$爜涓嶅唴宓岀粍鍚堝瓧娈碉紝鏃犳硶涓�鐮佹惡甯︿笟鍔$粨鏋� | 鎵╁睍缂栫爜瑙勫垯锛歝onfig 鏀寔澶氬崰浣嶇缁勫悎锛堝 `{CODE}+{BATCH}+{LOCATION}+{SN}`锛夛紱鎴栦繚鐣�"鐮佲啋(bizType,bizId)鈫掑璞�"鍙嶆煡锛岄厤鍚堟墦鍗版ā鏉垮瓧娈靛睍绀哄疄鐜�"鏍囩甯﹀叏淇℃伅" |
+| 璧勪骇涓庣墿璧勮拷婧� | 璁惧鈫掔墿鏂欌啋璁惧浠撳凡鍋氾紙闃舵2锛夛紱鎵规杩芥函瀵瑰師鏂�/鎴愬搧宸查棴鐜� | 杩芥函鍒版壒娆$矑搴︼紱**鍗曞搧 SN 杩芥函鏂�**锛涘簱瀛樿皟鏁�/鐩樼偣鏍搁攢/绉诲簱鏄惁绾冲叆鎵规閾鹃渶鏍稿 | 鑻ラ渶"璧勪骇/鐗╄祫缁熶竴杩芥函瑙嗗浘"锛氫互 `mes_wm_transaction` 涓轰富閾捐ˉ缁熶竴杩芥函鏌ヨ锛堝叆搴撯啋搴撳瓨鈫掑嚭搴�/棰嗙敤锛夛紝瑕嗙洊鐩樼偣鏍搁攢(107)銆佺Щ搴撶瓑 bizType锛涘崟鍝佺骇瑙� 3.3 SN |
+
+### 3.2 闇�姹�4锛氬疄鏃跺簱瀛樻煡璇€�佸畾鏈熺洏鐐广�佺洏鐐规暟鎹鍏ャ�佽嚜鍔ㄦ牳绠楃洏鐩堢洏浜忋�佹洿鏂板簱瀛樺彴璐�
+
+| 瀛愰渶姹� | 鐜扮姸 | 宸窛 | 寤鸿鍚庣钀界偣 |
+|--------|------|------|--------------|
+| 瀹炴椂搴撳瓨鏌ヨ | 鍙拌处鍒嗛〉 + available 鐜扮畻 | available 涓洪〉闈㈣绠楋紱reserved 浠呰鐩栭鏂�/閿�鍞嚭搴擄紱**鍦ㄩ�斿瓧娈电┖杞�** | 鑻ラ渶"鍙敤閲忕粺涓�鍙e緞/鍦ㄩ��"锛岃ˉ锛歚inTransitQuantity` 鐨勫啓鍏ヤ笌鍐查攢锛堣皟鎷ㄥ湪閫旓級銆乺eserved 瑕嗙洊闈㈠喅绛� |
+| 瀹氭湡鐩樼偣 | plan 鍙�"鍦堝畾涓�娆¤寖鍥�"锛堟寜浠撳簱/搴撳尯/搴撲綅/鐗╂枡/鎵规鍙傛暟锛� | 鏈彂鐜�**鎸夊懆鏈熻嚜鍔ㄧ敓鎴愪换鍔�/鎻愰啋**鐨勮皟搴� | 鐩樼偣鏂规鍔犲懆鏈�(姣忔棩/姣忓懆/鏈� + 涓嬫鐩樼偣鏃�)锛岀敱瀹氭椂浠诲姟鍒版湡鐢熸垚 task 骞堕�氱煡锛堝彲鏀� `MesWmStockTakingPlanService`锛� |
+| 鐩樼偣鏁版嵁瀵煎叆 | 琛� Excel 瀵煎叆锛堢墿鏂欑紪鐮�+鎵规+瀹炵洏鏁帮級鑷姩鍒ょ泩浜� | 鉁� 宸插叿澶� | 鍙�夛細琛ユ壂鐮佸綍鍏ワ紙瑙� 3.3锛� |
+| **鑷姩鏍哥畻鐩樼泩鐩樹簭銆佹洿鏂板簱瀛樺彴璐�** | `processStockTakingDifference` 宸插疄鐜帮細鎸夌粨鏋滃樊棰濈敓鎴� `MesBizTypeConstants.WM_STOCK_TAKING`(107) 鐨� IN/OUT 娴佹按骞剁粡 `createTransaction` 鏇存柊搴撳瓨 | **鏂规硶鏃犱换浣曡皟鐢ㄦ柟**锛沗finishStockTakingTask`(ServiceImpl:146) 鍙疆 FINISHED+瑙e喕 | **棣栭�夋帴绾挎柟妗�**锛氬畬鎴愮洏鐐规椂鑷姩鏍搁攢锛坒inish 鍐呰皟鐢級鎴栨柊澧�"鏍搁攢"绔偣锛涜ˉ骞傜瓑锛堜粎鍏佽鏍搁攢涓�娆★級銆佸彲鏌ヨ鏍搁攢娴佹按銆佸苟鍙戦槻鎶ゃ�傛秹鍙婃枃浠讹細`MesWmStockTakingTaskServiceImpl`(:234 鏂规硶浣�/鎺ュ彛)锛孋ontroller 琛ュ叆鍙�+鏉冮檺 |
+| 鐩樼偣瀹℃壒 | task锛歴ubmit 缃� APPROVING+鍙�夊喕缁擄紝finish 瑕佹眰 APPROVING | 鎵嬪伐涓ゆ寮忥紝鏃� BPM | 鑻ヨ涓庡叾浣欎粨鍌ㄥ崟鎹竴鑷磋蛋鐪熷疄 BPM锛氬弬鐓� `MesWmItemReceiptStatusListener`/闃舵1 涓夊崟鎹ā寮忔帴鍏ワ紱鍚﹀垯淇濇寔鐜扮姸鍗冲彲锛屾枃妗f敞鏄庡彛寰� |
+
+### 3.3 闇�姹�5锛氬叏鍝佺被鏉$爜/浜岀淮鐮佺鐞嗭紝涓茶仈鍑哄叆搴�/棰嗙敤/鐩樼偣锛屾壒娆′笌鍗曞搧绮惧噯杩芥函
+
+| 瀛愰渶姹� | 鐜扮姸 | 宸窛 | 寤鸿鍚庣钀界偣 |
+|--------|------|------|--------------|
+| 鍏ㄥ搧绫诲惎鐢ㄦ潯鐮� | 鎸� bizType 鐨� config.autoGenerateFlag 鑷姩鐢熸垚锛涚墿鏂�/鎵规/SN/搴撲綅绛夊凡瑕嗙洊 | STOCK/渚涘簲鍟�/瀹㈡埛绫绘棤鐢熸垚鍏ュ彛锛�**闈炲己鍒�**锛屾湭鐢熸垚鍒欐棤鐮佸彲鎵� | 鏄庣‘"鍚敤鑼冨洿"锛屽闇�鍏ㄥ搧绫诲己鍒剁殑涓绘暟鎹紙鐗╂枡/鎵规/搴撲綅/SN锛夊仛鍚姩鏍¢獙涓庤ˉ鐮� |
+| 涓茶仈鍑哄叆搴�/棰嗙敤/鐩樼偣 | 鍚勫崟鎹凡寤猴紙鏀舵枡/鏉傞」/棰嗘枡 productissue/閫�鏂� returnissue/鐩樼偣锛� | **鏈嶅姟绔棤鎵爜鍏ュ彛**锛氭敹璐�/鍙戞枡/棰嗘枡/鐩樼偣鐐硅涓嶈兘"鎵潯鐮�/SN/鎵规瀹氫綅骞舵牎楠�" | 鎻愪緵缁熶竴"鎵爜瑙f瀽"鎺ュ彛锛氭寜 content 鎴� (bizType,bizId) 鎴� SN/鎵规鍙疯В鏋愬嚭鐗╂枡/鎵规/搴撲綅锛屼緵鍚勫崟鎹蹇�熷甫鍏ュ苟鏍¢獙锛堜笌鐗╂枡銆佹壒娆″惎鐢ㄣ�佸簱浣嶅尮閰嶏級锛涚洏鐐硅褰曞叆澶嶇敤 |
+| 鎵规涓庡崟鍝佺簿鍑嗚拷婧� | 鎵规杩芥函宸查棴鐜� | **鍗曞搧锛圫N锛夋湭杩涘簱瀛橀摼**锛歚mes_wm_sn` 浠呭彿姹狅紝`mes_wm_material_stock`/`mes_wm_transaction` 鍧囨棤 sn 缁村害锛宍isSerialManaged` 鏃犳秷璐规柟 | SN 鍗曞搧閾捐矾锛堟敼鍔ㄨ緝澶э級锛氬簱瀛�/娴佹按/鍗曟嵁琛屾敮鎸� SN锛涘惎鐢� `isSerialManaged` 鐗╂枡鐨勫叆搴撶敓鎴�/缁戝畾 SN銆佸嚭搴撴牳閿� SN锛涙彁渚�"SN 鍦ㄥ簱浣嶇疆/鍘嗗彶鍘诲悜"鏌ヨ锛涚洏鐐规敮鎸佹寜 SN 鍗曚欢鏍稿 |
+
+---
+
+## 4. 鎸�"灏辩华搴�"褰掔被缂哄彛锛堝缓璁疄鏂芥椂鎸夋鍒囬噷绋嬬锛�
+
+### 4.1 鍗婃垚鍝侊細閫昏緫宸叉湁锛屽彧宸帴绾匡紙鏀瑰姩灏忋�侀闄╀綆锛�
+- **鐩樼偣宸紓鑷姩鏍搁攢**锛歚MesWmStockTakingTaskServiceImpl#processStockTakingDifference` 宸茶兘鐢熸垚鐩樼泩/鐩樹簭娴佹按骞舵洿鏂板彴璐︼紝鎺ヤ笂瀹屾垚鐩樼偣鍗宠Е鍙�/鐙珛绔偣 + 骞傜瓑鍗冲彲闂幆闇�姹�4"鑷姩鏍哥畻鐩樼泩鐩樹簭銆佹洿鏂板簱瀛樺彴璐�"銆�
+
+### 4.2 妯″瀷宸叉湁锛岄渶琛ヨ兘鍔涳紙涓敼锛�
+- **鏍囩鎵撳嵃涓庢垚鍥�**锛氬埄鐢ㄥ凡鏈� BarcodeFormatEnum/鏉$爜琛紝琛ュ浘鐗囩敓鎴愩�佹ā鏉挎覆鏌撱�佹墦鍗版帴鍙c��
+- **鏉$爜鍐呭缁勫悎瀛楁 / 涓�鐮佸淇℃伅**锛氭墿灞� contentFormat 澶氬崰浣嶇锛堢墿鏂�/鎵规/搴撲綅/缂栧彿/SN锛夈��
+- **鏈嶅姟绔壂鐮�**锛氱粺涓�"瑙f瀽鏉$爜/SN/鎵规"鎺ュ彛锛屼緵鏀跺彂璐с�侀鏂欍�佺洏鐐硅澶嶇敤銆�
+- **鐩樼偣 BPM锛堝彲閫夛級** 涓� **瀹氭湡鐩樼偣璋冨害锛堝彲閫夛級**銆�
+- **鍦ㄩ��/鍙敤閲忓彛寰�**锛堣嫢涓氬姟瑕佹眰鍦ㄩ�旓級銆�
+- **杩芥函閾捐ˉ榻�**锛氭妸鐩樼偣鏍搁攢(107)銆佺Щ搴撶瓑 bizType 绾冲叆鎵规/娴佹按杩芥函锛堟牳瀵圭幇 forward/backward 鏄惁宸插惈锛夈��
+
+### 4.3 闇�鏂板妯″瀷 / 杈冮噸鏋勶紙澶ф敼锛屾寜闇�绔嬮」锛�
+- **SN 鍗曞搧搴撳瓨閾�**锛氬簱瀛樸�佹祦姘淬�佸崟鎹澧炲姞 SN 缁村害 + 鍑哄叆搴撴牳閿� + 鍗曚欢杩芥函鏌ヨ + 鐩樼偣鍗曚欢鏍稿銆�
+- **璧勪骇灞炴��**锛氳嫢"璧勪骇"涓嶆璁惧鍙拌处锛岄渶鍦ㄧ墿鏂欎晶琛ヨ祫浜х紪鍙�/褰掑睘/鍚敤鏃ユ湡/鎶ュ簾绛夊睘鎬э紝涓庤澶囧彴璐﹀悎骞惰鍥俱��
+- **閿�鍞彂杩愮骇杩芥函**锛堝瑕佹眰鎸夊嚭搴撳崟 SN/鎵规杩芥函鍘诲悜鏄庣粏锛夈��
+
+---
+
+## 5. 寤鸿瀹炴柦椤哄簭
+
+| 浼樺厛绾� | 浜嬮」 | 鐞嗙敱/渚濇嵁 | 涓昏娑夊強 |
+|--------|------|-----------|----------|
+| P0 | 鐩樼偣瀹屾垚鑷姩鏍搁攢鐩樼泩鐩樹簭 | 閫昏緫鐜版垚锛堝樊寮傛牳閿�宸茬紪鐮侊級锛屾敹鐩婄洿鎺ワ紝浠d环鏈�灏忥紱鐩存帴鍛戒腑闇�姹�4鏍稿績 | `MesWmStockTakingTaskServiceImpl`(+Controller/骞傜瓑/娴佹按鏌ヨ) |
+| P0 | 鏍囩鎵撳嵃锛堟垚鍥�+妯℃澘+鎵撳嵃锛� | 闇�姹�3纭�ч」锛涘綋鍓嶅畬鍏ㄧ己澶� | 鏉$爜鏈嶅姟+config+鎵撳嵃鎺ュ彛锛汢arcodeFormatEnum 澶嶇敤 |
+| P1 | 鏈嶅姟绔壂鐮� + 鐩樼偣鎵爜褰曞叆 | 闇�姹�5"涓茶仈鍑哄叆搴�/棰嗙敤/鐩樼偣"鍏抽敭 | 缁熶竴鎵爜瑙f瀽鎺ュ彛锛屽崟鎹鎺ュ叆 |
+| P1 | 鏉$爜鍐呭缁勫悎瀛楁 / 涓�鐮佹惡甯︽壒娆÷峰簱浣嵚风紪鍙仿稴N | 閰嶅悎鎵撳嵃涓庤拷婧� | contentFormat 澶氬崰浣嶇 |
+| P1 | SN 鍗曞搧搴撳瓨閾� | 闇�姹�3/5"鍗曞搧绮惧噯杩芥函" | 搴撳瓨/娴佹按/鍗曟嵁 SN 缁村害 + 鏍搁攢 + 鍗曚欢杩芥函 |
+| P2 | 鐩樼偣鎺� BPM銆佸畾鏈熺洏鐐硅皟搴� | 涓庨樁娈�1鍙e緞涓�鑷村寲銆侀渶姹�4"瀹氭湡" | 鍙傜収闃舵1涓夊崟鎹ā寮忥紱璋冨害 job |
+| P2 | 鍦ㄩ��/鍙敤閲忓彛寰勩�佽祫浜у睘鎬с�侀攢鍞彂杩愯拷婧� | 渚濅笟鍔¢渶瑕佸啀瀹� | 鈥� |
+
+> 寤鸿鍏堝仛 P0 涓ら」褰㈡垚"闂幆鏍锋澘"锛屽啀鎸� 4.2/4.3 鎺ㄨ繘锛涙瘡椤规寜璺ㄦā鍧�/搴撹〃鍙樻洿鍦ㄥ畬鎴愬悗鎵ц `mvn compile -pl yudao-module-mes -am -q`锛屾秹鍙� MDM/BPM 鍐嶅叏閲忕紪璇戙�傛暟鎹簱鑴氭湰閬靛惊 sql-syntax/sql-script 瑙勮寖锛堟棤 tenant_id銆丄DD COLUMN 鍏堟煡瀛樺湪锛夈��
--
Gitblit v1.9.3