From 8655501ffb8dbdaf2508e575933063e6731be714 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 28 八月 2026 17:14:40 +0800
Subject: [PATCH] refactor(mes): 重构MES生产批次和袋码管理功能

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletPageReqVO.java         |    3 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletPreGenerateRespVO.java |   16 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/pallet/MesProPalletService.java                       |   28 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchPreGenerateReqVO.java    |   20 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/MesProBagCodeController.java         |    9 
 .playwright-mcp/page-2026-08-28T09-04-52-568Z.yml                                                                            |  337 ++++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchTraceRespVO.java         |    8 
 .playwright-mcp/page-2026-08-28T07-48-51-155Z.yml                                                                            |  239 +++
 .playwright-mcp/page-2026-08-28T09-04-30-577Z.yml                                                                            |  354 ++++
 sql/mysql/mes_pro_batch_bag_code_init.sql                                                                                    |   25 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletExportQrReqVO.java     |   17 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchPreGenerateRespVO.java   |   16 
 .playwright-mcp/page-2026-08-28T08-59-32-379Z.yml                                                                            |    1 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletRespVO.java            |    4 
 .playwright-mcp/page-2026-08-28T09-03-14-535Z.yml                                                                            |  351 ++++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletBindBatchReqVO.java    |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchServiceImpl.java                     |   95 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/MesProPalletController.java           |   43 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeServiceImpl.java                 |   54 
 .playwright-mcp/page-2026-08-28T07-42-08-037Z.yml                                                                            |  285 +++
 docs/mes_bag_code_integration.md                                                                                             |  124 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/pallet/MesProPalletServiceImpl.java                   |  141 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/batch/MesProBatchMapper.java                        |    9 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java                                     |    7 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeGenerateRespVO.java  |    6 
 .playwright-mcp/page-2026-08-28T09-02-56-093Z.yml                                                                            |    1 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/pallet/MesProPalletMapper.java                      |    9 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java                                      |    1 
 .playwright-mcp/page-2026-08-28T07-48-24-872Z.yml                                                                            |  236 +++
 .playwright-mcp/page-2026-08-28T07-48-07-459Z.yml                                                                            |    1 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/pallet/MesProPalletDO.java                     |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java         |    4 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/batch/MesProBatchDO.java                       |   10 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletPreGenerateReqVO.java  |   24 
 .playwright-mcp/page-2026-08-28T07-33-08-854Z.yml                                                                            |    1 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/MesProQrLabelBuilder.java                        |   31 
 .playwright-mcp/page-2026-08-28T07-33-35-681Z.yml                                                                            |  212 ++
 .playwright-mcp/page-2026-08-28T07-30-23-438Z.yml                                                                            |  214 ++
 .playwright-mcp/page-2026-08-28T07-29-42-173Z.yml                                                                            |  104 +
 .playwright-mcp/page-2026-08-28T08-59-49-723Z.yml                                                                            |    1 
 .playwright-mcp/page-2026-08-28T09-03-07-573Z.yml                                                                            |  336 ++++
 .playwright-mcp/page-2026-08-28T07-29-23-803Z.yml                                                                            |    1 
 .playwright-mcp/page-2026-08-28T07-41-44-827Z.yml                                                                            |  212 ++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchSaveReqVO.java           |    4 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeGenerateReqVO.java   |    4 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeService.java                     |    3 
 .playwright-mcp/page-2026-08-28T09-00-15-736Z.yml                                                                            |  110 +
 .playwright-mcp/page-2026-08-28T09-04-44-764Z.yml                                                                            |  353 ++++
 .playwright-mcp/page-2026-08-28T07-49-26-431Z.yml                                                                            |  236 +++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/MesProBatchController.java             |   25 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchRespVO.java              |    9 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchService.java                         |   16 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeBindBatchReqVO.java  |   21 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/bagcode/MesProBagCodeMapper.java                    |   20 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletTraceRespVO.java       |    5 
 /dev/null                                                                                                                    |   30 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchPageReqVO.java           |    3 
 .playwright-mcp/page-2026-08-28T07-41-21-761Z.yml                                                                            |    1 
 .playwright-mcp/page-2026-08-28T07-30-00-661Z.yml                                                                            |  110 +
 .playwright-mcp/page-2026-08-28T09-00-00-757Z.yml                                                                            |  104 +
 60 files changed, 4,447 insertions(+), 225 deletions(-)

diff --git a/.playwright-mcp/page-2026-08-28T07-29-23-803Z.yml b/.playwright-mcp/page-2026-08-28T07-29-23-803Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T07-29-23-803Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T07-29-42-173Z.yml b/.playwright-mcp/page-2026-08-28T07-29-42-173Z.yml
new file mode 100644
index 0000000..954edb3
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T07-29-42-173Z.yml
@@ -0,0 +1,104 @@
+- generic [ref=e7]:
+  - complementary [ref=e9]:
+    - generic [ref=e10]:
+      - generic [ref=e11] [cursor=pointer]
+      - link "娴嬭瘯鍏徃鍝堝搱 娴嬭瘯鍏徃鍝堝搱" [ref=e16] [cursor=pointer]:
+        - /url: javascript:void 0
+        - img "娴嬭瘯鍏徃鍝堝搱" [ref=e19]
+        - generic [ref=e20]: 娴嬭瘯鍏徃鍝堝搱
+      - menu [ref=e23]:
+        - menuitem "棣栭〉" [ref=e24] [cursor=pointer]
+        - listitem [ref=e28]:
+          - generic [ref=e29] [cursor=pointer]: 鍩虹鏁版嵁
+        - listitem [ref=e37]:
+          - generic [ref=e38] [cursor=pointer]: 浠撳偍鐗╂祦
+        - listitem [ref=e46]:
+          - generic [ref=e47] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+          - list [ref=e341]:
+            - menuitem "鎵规鐢熶骇绠$悊" [ref=e342] [cursor=pointer]
+            - menuitem "璧嬬爜绠$悊" [ref=e347] [cursor=pointer]
+            - menuitem "鎵樼洏鐮佺鐞�" [ref=e353] [cursor=pointer]
+            - menuitem "浜х嚎缁存姢" [ref=e360] [cursor=pointer]
+            - menuitem "鐢熶骇绾挎壂鐮佸叆搴�" [ref=e367] [cursor=pointer]
+        - listitem [ref=e53]:
+          - generic [ref=e54] [cursor=pointer]: 璐ㄩ噺绠$悊
+        - listitem [ref=e60]:
+          - generic [ref=e61] [cursor=pointer]: 绯荤粺绠$悊
+      - generic [ref=e68] [cursor=pointer]
+  - generic [ref=e73]:
+    - generic [ref=e74]:
+      - banner [ref=e75]:
+        - button [ref=e76] [cursor=pointer]
+        - button [ref=e79] [cursor=pointer]
+        - navigation "breadcrumb" [ref=e84]:
+          - list [ref=e85]:
+            - listitem [ref=e86]:
+              - link "棣栭〉" [disabled] [ref=e87]
+        - generic [ref=e91]:
+          - generic [ref=e93] [cursor=pointer]:
+            - generic [ref=e97]: 鎼滅储
+            - generic [ref=e98]: Ctrl K
+          - button [ref=e100] [cursor=pointer]
+          - button "dark" [ref=e105] [cursor=pointer]
+          - button [ref=e114] [cursor=pointer]
+          - button [ref=e120] [cursor=pointer]
+          - button [ref=e122] [cursor=pointer]
+          - button [ref=e128] [cursor=pointer]:
+            - button [ref=e130]
+          - button "宸ヤ綔鍙�" [ref=e134] [cursor=pointer]
+          - button "鐞嗗憳" [ref=e137] [cursor=pointer]
+      - generic [ref=e144]:
+        - generic [ref=e145]: 棣栭〉
+        - generic [ref=e163]:
+          - button [ref=e164] [cursor=pointer]
+          - generic [ref=e171] [cursor=pointer]
+          - generic [ref=e175] [cursor=pointer]
+    - main [ref=e182]:
+      - generic [ref=e185]:
+        - generic [ref=e186]:
+          - generic [ref=e193] [cursor=pointer]:
+            - generic [ref=e194]: 鍝佺鎬绘暟
+            - generic [ref=e195]: "1"
+          - generic [ref=e203] [cursor=pointer]:
+            - generic [ref=e204]: MES 鍝佺
+            - generic [ref=e205]: "0"
+          - generic [ref=e213] [cursor=pointer]:
+            - generic [ref=e214]: 鍝佺鍒嗙被
+            - generic [ref=e215]: "1"
+          - generic [ref=e223] [cursor=pointer]:
+            - generic [ref=e224]: 璁¢噺鍗曚綅
+            - generic [ref=e225]: "1"
+        - generic [ref=e227]:
+          - generic [ref=e234] [cursor=pointer]:
+            - generic [ref=e235]: 浜х嚎
+            - generic [ref=e236]: "1"
+          - generic [ref=e244] [cursor=pointer]:
+            - generic [ref=e245]: 鐢熶骇鎵规
+            - generic [ref=e246]: "2"
+          - generic [ref=e254] [cursor=pointer]:
+            - generic [ref=e255]: 琚嬬爜
+            - generic [ref=e256]: 1,101
+          - generic [ref=e264] [cursor=pointer]:
+            - generic [ref=e265]: 鎵樼洏鐮�
+            - generic [ref=e266]: "10"
+        - generic [ref=e268]:
+          - generic [ref=e272]:
+            - generic [ref=e273]: 琚嬬爜鐢熸垚瓒嬪娍
+            - generic [ref=e275]:
+              - generic [ref=e276] [cursor=pointer]:
+                - generic [ref=e277]:
+                  - radio "杩� 7 澶�" [checked]
+                - generic [ref=e278]: 杩� 7 澶�
+              - generic [ref=e279] [cursor=pointer]:
+                - generic [ref=e280]:
+                  - radio "杩� 30 澶�"
+                - generic [ref=e281]: 杩� 30 澶�
+          - generic [ref=e284]: 鎵规鐘舵�佸垎甯�
+          - generic [ref=e291]: 琚嬬爜鐘舵�佸垎甯�
+        - generic [ref=e298]:
+          - generic [ref=e299]: 蹇嵎鍏ュ彛
+          - generic [ref=e303]:
+            - generic [ref=e304]: 鍝佺绠$悊
+            - generic [ref=e309]: 鍝佺鍒嗙被
+            - generic [ref=e314]: 鎵规鐢熶骇
+            - generic [ref=e319]: 璧嬬爜绠$悊
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T07-30-00-661Z.yml b/.playwright-mcp/page-2026-08-28T07-30-00-661Z.yml
new file mode 100644
index 0000000..7e5d7f0
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T07-30-00-661Z.yml
@@ -0,0 +1,110 @@
+- generic [ref=e7]:
+  - complementary [ref=e9]:
+    - generic [ref=e10]:
+      - generic [ref=e11] [cursor=pointer]
+      - link "娴嬭瘯鍏徃鍝堝搱 娴嬭瘯鍏徃鍝堝搱" [ref=e16] [cursor=pointer]:
+        - /url: javascript:void 0
+        - img "娴嬭瘯鍏徃鍝堝搱" [ref=e19]
+        - generic [ref=e20]: 娴嬭瘯鍏徃鍝堝搱
+      - menu [ref=e23]:
+        - menuitem "棣栭〉" [ref=e24] [cursor=pointer]
+        - listitem [ref=e28]:
+          - generic [ref=e29] [cursor=pointer]: 鍩虹鏁版嵁
+        - listitem [ref=e37]:
+          - generic [ref=e38] [cursor=pointer]: 浠撳偍鐗╂祦
+        - listitem [ref=e46]:
+          - generic [ref=e47] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+          - list [ref=e341]:
+            - menuitem "鎵规鐢熶骇绠$悊" [active] [ref=e342] [cursor=pointer]
+            - menuitem "璧嬬爜绠$悊" [ref=e347] [cursor=pointer]
+            - menuitem "鎵樼洏鐮佺鐞�" [ref=e353] [cursor=pointer]
+            - menuitem "浜х嚎缁存姢" [ref=e360] [cursor=pointer]
+            - menuitem "鐢熶骇绾挎壂鐮佸叆搴�" [ref=e367] [cursor=pointer]
+        - listitem [ref=e53]:
+          - generic [ref=e54] [cursor=pointer]: 璐ㄩ噺绠$悊
+        - listitem [ref=e60]:
+          - generic [ref=e61] [cursor=pointer]: 绯荤粺绠$悊
+      - generic [ref=e68] [cursor=pointer]
+  - generic [ref=e73]:
+    - generic [ref=e74]:
+      - banner [ref=e75]:
+        - button [ref=e76] [cursor=pointer]
+        - button [ref=e79] [cursor=pointer]
+        - navigation "breadcrumb" [ref=e84]:
+          - list [ref=e85]:
+            - listitem [ref=e412]:
+              - link "涓�琚嬩竴鐮佺鐞�" [ref=e413] [cursor=pointer]:
+                - /url: javascript:void 0
+              - listitem [ref=e417]
+            - listitem [ref=e420]:
+              - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e421]
+        - generic [ref=e91]:
+          - generic [ref=e93] [cursor=pointer]:
+            - generic [ref=e97]: 鎼滅储
+            - generic [ref=e98]: Ctrl K
+          - button [ref=e100] [cursor=pointer]
+          - button "dark" [ref=e105] [cursor=pointer]
+          - button [ref=e114] [cursor=pointer]
+          - button [ref=e120] [cursor=pointer]
+          - button [ref=e122] [cursor=pointer]
+          - button [ref=e128] [cursor=pointer]:
+            - button [ref=e130]
+          - button "宸ヤ綔鍙�" [ref=e134] [cursor=pointer]
+          - button "鐞嗗憳" [ref=e137] [cursor=pointer]
+      - generic [ref=e144]:
+        - generic [ref=e149]:
+          - generic [ref=e150] [cursor=pointer]: 棣栭〉
+          - generic [ref=e428] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+        - generic [ref=e163]:
+          - button [ref=e164] [cursor=pointer]
+          - generic [ref=e171] [cursor=pointer]
+          - generic [ref=e175] [cursor=pointer]
+    - main [ref=e182]:
+      - generic [ref=e185]:
+        - generic [ref=e186]:
+          - generic [ref=e193] [cursor=pointer]:
+            - generic [ref=e194]: 鍝佺鎬绘暟
+            - generic [ref=e195]: "1"
+          - generic [ref=e203] [cursor=pointer]:
+            - generic [ref=e204]: MES 鍝佺
+            - generic [ref=e205]: "0"
+          - generic [ref=e213] [cursor=pointer]:
+            - generic [ref=e214]: 鍝佺鍒嗙被
+            - generic [ref=e215]: "1"
+          - generic [ref=e223] [cursor=pointer]:
+            - generic [ref=e224]: 璁¢噺鍗曚綅
+            - generic [ref=e225]: "1"
+        - generic [ref=e227]:
+          - generic [ref=e234] [cursor=pointer]:
+            - generic [ref=e235]: 浜х嚎
+            - generic [ref=e236]: "1"
+          - generic [ref=e244] [cursor=pointer]:
+            - generic [ref=e245]: 鐢熶骇鎵规
+            - generic [ref=e246]: "2"
+          - generic [ref=e254] [cursor=pointer]:
+            - generic [ref=e255]: 琚嬬爜
+            - generic [ref=e256]: 1,101
+          - generic [ref=e264] [cursor=pointer]:
+            - generic [ref=e265]: 鎵樼洏鐮�
+            - generic [ref=e266]: "10"
+        - generic [ref=e268]:
+          - generic [ref=e272]:
+            - generic [ref=e273]: 琚嬬爜鐢熸垚瓒嬪娍
+            - generic [ref=e275]:
+              - generic [ref=e276] [cursor=pointer]:
+                - generic [ref=e277]:
+                  - radio "杩� 7 澶�" [checked]
+                - generic [ref=e278]: 杩� 7 澶�
+              - generic [ref=e279] [cursor=pointer]:
+                - generic [ref=e280]:
+                  - radio "杩� 30 澶�"
+                - generic [ref=e281]: 杩� 30 澶�
+          - generic [ref=e284]: 鎵规鐘舵�佸垎甯�
+          - generic [ref=e291]: 琚嬬爜鐘舵�佸垎甯�
+        - generic [ref=e298]:
+          - generic [ref=e299]: 蹇嵎鍏ュ彛
+          - generic [ref=e303]:
+            - generic [ref=e304]: 鍝佺绠$悊
+            - generic [ref=e309]: 鍝佺鍒嗙被
+            - generic [ref=e314]: 鎵规鐢熶骇
+            - generic [ref=e319]: 璧嬬爜绠$悊
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T07-30-23-438Z.yml b/.playwright-mcp/page-2026-08-28T07-30-23-438Z.yml
new file mode 100644
index 0000000..70132ed
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T07-30-23-438Z.yml
@@ -0,0 +1,214 @@
+- generic [ref=e7]:
+  - complementary [ref=e9]:
+    - generic [ref=e10]:
+      - generic [ref=e11] [cursor=pointer]
+      - link "娴嬭瘯鍏徃鍝堝搱 娴嬭瘯鍏徃鍝堝搱" [ref=e16] [cursor=pointer]:
+        - /url: javascript:void 0
+        - img "娴嬭瘯鍏徃鍝堝搱" [ref=e19]
+        - generic [ref=e20]: 娴嬭瘯鍏徃鍝堝搱
+      - menu [ref=e23]:
+        - menuitem "棣栭〉" [ref=e24] [cursor=pointer]
+        - listitem [ref=e28]:
+          - generic [ref=e29] [cursor=pointer]: 鍩虹鏁版嵁
+        - listitem [ref=e37]:
+          - generic [ref=e38] [cursor=pointer]: 浠撳偍鐗╂祦
+        - listitem [ref=e46]:
+          - generic [ref=e47] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+          - list [ref=e341]:
+            - menuitem "鎵规鐢熶骇绠$悊" [ref=e342] [cursor=pointer]
+            - menuitem "璧嬬爜绠$悊" [ref=e347] [cursor=pointer]
+            - menuitem "鎵樼洏鐮佺鐞�" [ref=e353] [cursor=pointer]
+            - menuitem "浜х嚎缁存姢" [ref=e360] [cursor=pointer]
+            - menuitem "鐢熶骇绾挎壂鐮佸叆搴�" [ref=e367] [cursor=pointer]
+        - listitem [ref=e53]:
+          - generic [ref=e54] [cursor=pointer]: 璐ㄩ噺绠$悊
+        - listitem [ref=e60]:
+          - generic [ref=e61] [cursor=pointer]: 绯荤粺绠$悊
+      - generic [ref=e68] [cursor=pointer]
+  - generic [ref=e73]:
+    - generic [ref=e74]:
+      - banner [ref=e75]:
+        - button [ref=e76] [cursor=pointer]
+        - button [ref=e79] [cursor=pointer]
+        - navigation "breadcrumb" [ref=e84]:
+          - list [ref=e85]:
+            - listitem [ref=e412]:
+              - link "涓�琚嬩竴鐮佺鐞�" [ref=e413] [cursor=pointer]:
+                - /url: javascript:void 0
+              - listitem [ref=e417]
+            - listitem [ref=e420]:
+              - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e421]
+        - generic [ref=e91]:
+          - generic [ref=e93] [cursor=pointer]:
+            - generic [ref=e97]: 鎼滅储
+            - generic [ref=e98]: Ctrl K
+          - button [ref=e100] [cursor=pointer]
+          - button "dark" [ref=e105] [cursor=pointer]
+          - button [ref=e114] [cursor=pointer]
+          - button [ref=e120] [cursor=pointer]
+          - button [ref=e122] [cursor=pointer]
+          - button [ref=e128] [cursor=pointer]:
+            - button [ref=e130]
+          - button "宸ヤ綔鍙�" [ref=e134] [cursor=pointer]
+          - button "鐞嗗憳" [ref=e137] [cursor=pointer]
+      - generic [ref=e144]:
+        - generic [ref=e149]:
+          - generic [ref=e150] [cursor=pointer]: 棣栭〉
+          - generic [ref=e428] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+        - generic [ref=e163]:
+          - button [ref=e164] [cursor=pointer]
+          - generic [ref=e171] [cursor=pointer]
+          - generic [ref=e175] [cursor=pointer]
+    - main [ref=e182]:
+      - generic [ref=e448]:
+        - generic [ref=e453]:
+          - generic [ref=e454]:
+            - generic [ref=e455]: 鎵规鍙�
+            - textbox "鎵规鍙�" [ref=e461]:
+              - /placeholder: 璇疯緭鍏ユ壒娆″彿
+          - generic [ref=e463]:
+            - generic [ref=e464]: 鍝佺
+            - textbox "璇烽�夋嫨鍝佺" [ref=e471]
+          - generic [ref=e477]:
+            - generic [ref=e478]: 浜х嚎缂栫爜
+            - textbox "浜х嚎缂栫爜" [ref=e484]:
+              - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+          - generic [ref=e486]:
+            - generic [ref=e487]: 浜х嚎鍚嶇О
+            - textbox "浜х嚎鍚嶇О" [ref=e493]:
+              - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+          - generic [ref=e495]:
+            - generic [ref=e496]: 璐d换浜�
+            - textbox "璇烽�夋嫨璐d换浜�" [ref=e503]
+          - generic [ref=e509]:
+            - generic [ref=e510]: 鎵规鐘舵��
+            - generic [ref=e516] [cursor=pointer]:
+              - combobox "鎵规鐘舵��" [ref=e518]
+              - generic: 璇烽�夋嫨鎵规鐘舵��
+          - generic [ref=e519]:
+            - generic [ref=e520]: 鐢熶骇鏃ユ湡
+            - generic [ref=e525]:
+              - textbox "鐢熶骇鏃ユ湡" [ref=e527]:
+                - /placeholder: 寮�濮嬫椂闂�
+              - generic "to" [ref=e529]:
+                - img "swap-right" [ref=e530]
+              - textbox "缁撴潫鏃堕棿" [ref=e534]
+              - generic:
+                - img "calendar"
+          - generic [ref=e535]:
+            - generic [ref=e536]: 鍒涘缓鏃堕棿
+            - generic [ref=e541]:
+              - textbox "鍒涘缓鏃堕棿" [ref=e543]:
+                - /placeholder: 寮�濮嬫椂闂�
+              - generic "to" [ref=e545]:
+                - img "swap-right" [ref=e546]
+              - textbox "缁撴潫鏃堕棿" [ref=e550]
+              - generic:
+                - img "calendar"
+          - generic [ref=e551]:
+            - button "閲� 缃�" [ref=e552] [cursor=pointer]
+            - button "鎼� 绱�" [ref=e554] [cursor=pointer]
+            - generic [ref=e556] [cursor=pointer]: 鏀惰捣
+        - generic [ref=e563]:
+          - generic [ref=e565]:
+            - generic [ref=e566]: 鐢熶骇鎵规鍒楄〃
+            - generic [ref=e570]:
+              - generic [ref=e572]:
+                - button "棰勭敓鎴愪簩缁寸爜" [active] [ref=e574] [cursor=pointer]
+                - button "鏂板鎵规" [ref=e579] [cursor=pointer]
+                - button "鎵爜杩芥函" [ref=e584] [cursor=pointer]
+                - button "瀵煎嚭" [ref=e591] [cursor=pointer]
+              - button "顫�" [ref=e597] [cursor=pointer]
+            - generic [ref=e599]:
+              - button "瞟�" [ref=e600] [cursor=pointer]
+              - button "顪�" [ref=e602] [cursor=pointer]
+              - button "顦�" [ref=e604] [cursor=pointer]
+          - generic [ref=e611]:
+            - generic [ref=e612]:
+              - table [ref=e616]:
+                - rowgroup [ref=e631]:
+                  - row [ref=e632]:
+                    - columnheader "鍝佺缂栫爜" [ref=e633]
+                    - columnheader "鍝佺鍚嶇О" [ref=e638]
+                    - columnheader "浜х嚎缂栫爜" [ref=e643]
+                    - columnheader "浜х嚎鍚嶇О" [ref=e648]
+                    - columnheader "鐢熶骇鏃ユ湡" [ref=e653]
+                    - columnheader "璁″垝鏁伴噺" [ref=e658]
+                    - columnheader "璐d换浜�" [ref=e663]
+                    - columnheader "琚嬬爜鏁伴噺" [ref=e668]
+                    - columnheader "鎵樼洏鐮佹暟閲�" [ref=e673]
+                    - columnheader "鎵规鐘舵��" [ref=e678]
+                    - columnheader "鍒涘缓鏃堕棿" [ref=e683]
+              - table [ref=e691]:
+                - rowgroup [ref=e706]:
+                  - row [ref=e707]:
+                    - cell "ITEM_20260819003" [ref=e708]
+                    - cell "娴嬭瘯" [ref=e712]
+                    - cell "two" [ref=e716]
+                    - cell "浜х嚎浜�" [ref=e720]
+                    - cell "2026-08-21 13:39:56" [ref=e724]
+                    - cell "100" [ref=e728]
+                    - cell "鐙楄泲" [ref=e732]
+                    - cell "0" [ref=e736]
+                    - cell "0" [ref=e740]
+                    - cell "鑽夌" [ref=e744]
+                    - cell "2026-08-21 13:40:10" [ref=e748]
+                  - row [ref=e752]:
+                    - cell "ITEM_20260819003" [ref=e753]
+                    - cell "娴嬭瘯" [ref=e757]
+                    - cell "two" [ref=e761]
+                    - cell "浜х嚎浜�" [ref=e765]
+                    - cell "2026-08-19 10:48:02" [ref=e769]
+                    - cell "10000" [ref=e773]
+                    - cell "瓒呯骇绠$悊鍛�" [ref=e777]
+                    - cell "100" [ref=e781]
+                    - cell "10" [ref=e785]
+                    - cell "宸插畬鎴�" [ref=e789]
+                    - cell "2026-08-19 10:48:22" [ref=e793]
+            - generic:
+              - generic [ref=e797]:
+                - table [ref=e800]:
+                  - rowgroup [ref=e815]:
+                    - row [ref=e816]:
+                      - columnheader "鎵规鍙�" [ref=e817]
+                - table [ref=e824]:
+                  - rowgroup [ref=e827]:
+                    - row [ref=e828]:
+                      - cell [ref=e829]:
+                        - button "PC20260821twoITEM_001" [ref=e832] [cursor=pointer]
+                    - row [ref=e834]:
+                      - cell [ref=e835]:
+                        - button "PC20260819twoITEM_001" [ref=e838] [cursor=pointer]
+              - generic [ref=e840]:
+                - table [ref=e843]:
+                  - rowgroup [ref=e858]:
+                    - row [ref=e859]:
+                      - columnheader "鎿嶄綔" [ref=e860]
+                - table [ref=e867]:
+                  - rowgroup [ref=e870]:
+                    - row [ref=e871]:
+                      - cell [ref=e872]:
+                        - generic [ref=e875]:
+                          - generic [ref=e876]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=e878] [cursor=pointer]
+                            - button "淇敼" [ref=e881] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=e888] [cursor=pointer]
+                          - button "鏇村" [ref=e892] [cursor=pointer]
+                    - row [ref=e898]:
+                      - cell [ref=e899]:
+                        - generic [ref=e902]:
+                          - button "鏌ョ湅浜岀淮鐮�" [ref=e905] [cursor=pointer]
+                          - button "鏇村" [ref=e907] [cursor=pointer]
+          - generic [ref=e919]:
+            - generic [ref=e920]: 鍏� 2 鏉¤褰�
+            - generic [ref=e922] [cursor=pointer]:
+              - generic "20鏉�/椤�" [ref=e923]:
+                - textbox "璇烽�夋嫨" [ref=e924]: 20鏉�/椤�
+              - generic [ref=e925]: 睿�
+            - button "飱�" [ref=e928]
+            - button "顧�" [ref=e930]
+            - button "顫�" [ref=e932]
+            - button "1" [ref=e935] [cursor=pointer]
+            - button "顫�" [ref=e936]
+            - button "顧�" [ref=e938]
+            - button "顦�" [ref=e940]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T07-33-08-854Z.yml b/.playwright-mcp/page-2026-08-28T07-33-08-854Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T07-33-08-854Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T07-33-35-681Z.yml b/.playwright-mcp/page-2026-08-28T07-33-35-681Z.yml
new file mode 100644
index 0000000..9c8c758
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T07-33-35-681Z.yml
@@ -0,0 +1,212 @@
+- generic [ref=f1e7]:
+  - complementary [ref=f1e9]:
+    - generic [ref=f1e10]:
+      - generic [ref=f1e11] [cursor=pointer]
+      - link "娴嬭瘯鍏徃鍝堝搱 娴嬭瘯鍏徃鍝堝搱" [ref=f1e16] [cursor=pointer]:
+        - /url: javascript:void 0
+        - img "娴嬭瘯鍏徃鍝堝搱" [ref=f1e19]
+        - generic [ref=f1e20]: 娴嬭瘯鍏徃鍝堝搱
+      - menu [ref=f1e23]:
+        - menuitem "棣栭〉" [ref=f1e24] [cursor=pointer]
+        - listitem [ref=f1e29]:
+          - generic [ref=f1e30] [cursor=pointer]: 鍩虹鏁版嵁
+        - listitem [ref=f1e38]:
+          - generic [ref=f1e39] [cursor=pointer]: 浠撳偍鐗╂祦
+        - listitem [ref=f1e47]:
+          - generic [ref=f1e48] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+          - list [ref=f1e54]:
+            - menuitem "鎵规鐢熶骇绠$悊" [ref=f1e55] [cursor=pointer]
+            - menuitem "璧嬬爜绠$悊" [ref=f1e60] [cursor=pointer]
+            - menuitem "鎵樼洏鐮佺鐞�" [ref=f1e66] [cursor=pointer]
+            - menuitem "浜х嚎缁存姢" [ref=f1e73] [cursor=pointer]
+            - menuitem "鐢熶骇绾挎壂鐮佸叆搴�" [ref=f1e80] [cursor=pointer]
+        - listitem [ref=f1e85]:
+          - generic [ref=f1e86] [cursor=pointer]: 璐ㄩ噺绠$悊
+        - listitem [ref=f1e92]:
+          - generic [ref=f1e93] [cursor=pointer]: 绯荤粺绠$悊
+      - generic [ref=f1e100] [cursor=pointer]
+  - generic [ref=f1e105]:
+    - generic [ref=f1e106]:
+      - banner [ref=f1e107]:
+        - button [ref=f1e108] [cursor=pointer]
+        - button [ref=f1e111] [cursor=pointer]
+        - navigation "breadcrumb" [ref=f1e116]:
+          - list [ref=f1e117]:
+            - listitem [ref=f1e118]:
+              - link "涓�琚嬩竴鐮佺鐞�" [ref=f1e119] [cursor=pointer]:
+                - /url: javascript:void 0
+              - listitem [ref=f1e123]
+            - listitem [ref=f1e126]:
+              - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f1e127]
+        - generic [ref=f1e132]:
+          - generic [ref=f1e134] [cursor=pointer]:
+            - generic [ref=f1e138]: 鎼滅储
+            - generic [ref=f1e139]: Ctrl K
+          - button [ref=f1e141] [cursor=pointer]
+          - button "dark" [ref=f1e146] [cursor=pointer]
+          - button [ref=f1e155] [cursor=pointer]
+          - button [ref=f1e161] [cursor=pointer]
+          - button [ref=f1e164] [cursor=pointer]
+          - button [ref=f1e170] [cursor=pointer]:
+            - button [ref=f1e172]
+          - button "宸ヤ綔鍙�" [ref=f1e176] [cursor=pointer]
+          - button "鐞嗗憳" [ref=f1e180] [cursor=pointer]
+      - generic [ref=f1e187]:
+        - generic [ref=f1e188]: 鎵规鐢熶骇绠$悊
+        - generic [ref=f1e207]:
+          - button [ref=f1e208] [cursor=pointer]
+          - generic [ref=f1e215] [cursor=pointer]
+          - generic [ref=f1e219] [cursor=pointer]
+    - main [ref=f1e226]:
+      - generic [ref=f1e231]:
+        - generic [ref=f1e236]:
+          - generic [ref=f1e237]:
+            - generic [ref=f1e238]: 鎵规鍙�
+            - textbox "鎵规鍙�" [ref=f1e244]:
+              - /placeholder: 璇疯緭鍏ユ壒娆″彿
+          - generic [ref=f1e246]:
+            - generic [ref=f1e247]: 鍝佺
+            - textbox "璇烽�夋嫨鍝佺" [ref=f1e254]
+          - generic [ref=f1e260]:
+            - generic [ref=f1e261]: 浜х嚎缂栫爜
+            - textbox "浜х嚎缂栫爜" [ref=f1e267]:
+              - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+          - generic [ref=f1e269]:
+            - generic [ref=f1e270]: 浜х嚎鍚嶇О
+            - textbox "浜х嚎鍚嶇О" [ref=f1e276]:
+              - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+          - generic [ref=f1e278]:
+            - generic [ref=f1e279]: 璐d换浜�
+            - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e286]
+          - generic [ref=f1e292]:
+            - generic [ref=f1e293]: 鎵规鐘舵��
+            - generic [ref=f1e299] [cursor=pointer]:
+              - combobox "鎵规鐘舵��" [ref=f1e301]
+              - generic: 璇烽�夋嫨鎵规鐘舵��
+          - generic [ref=f1e302]:
+            - generic [ref=f1e303]: 鐢熶骇鏃ユ湡
+            - generic [ref=f1e308]:
+              - textbox "鐢熶骇鏃ユ湡" [ref=f1e310]:
+                - /placeholder: 寮�濮嬫椂闂�
+              - generic "to" [ref=f1e312]:
+                - img "swap-right" [ref=f1e313]
+              - textbox "缁撴潫鏃堕棿" [ref=f1e317]
+              - generic:
+                - img "calendar"
+          - generic [ref=f1e318]:
+            - generic [ref=f1e319]: 鍒涘缓鏃堕棿
+            - generic [ref=f1e324]:
+              - textbox "鍒涘缓鏃堕棿" [ref=f1e326]:
+                - /placeholder: 寮�濮嬫椂闂�
+              - generic "to" [ref=f1e328]:
+                - img "swap-right" [ref=f1e329]
+              - textbox "缁撴潫鏃堕棿" [ref=f1e333]
+              - generic:
+                - img "calendar"
+          - generic [ref=f1e334]:
+            - button "閲� 缃�" [ref=f1e335] [cursor=pointer]
+            - button "鎼� 绱�" [ref=f1e337] [cursor=pointer]
+            - generic [ref=f1e339] [cursor=pointer]: 鏀惰捣
+        - generic [ref=f1e346]:
+          - generic [ref=f1e348]:
+            - generic [ref=f1e349]: 鐢熶骇鎵规鍒楄〃
+            - generic [ref=f1e353]:
+              - generic [ref=f1e355]:
+                - button "棰勭敓鎴愪簩缁寸爜" [active] [ref=f1e357] [cursor=pointer]
+                - button "鏂板鎵规" [ref=f1e362] [cursor=pointer]
+                - button "鎵爜杩芥函" [ref=f1e367] [cursor=pointer]
+                - button "瀵煎嚭" [ref=f1e374] [cursor=pointer]
+              - button "顫�" [ref=f1e380] [cursor=pointer]
+            - generic [ref=f1e382]:
+              - button "瞟�" [ref=f1e383] [cursor=pointer]
+              - button "顪�" [ref=f1e385] [cursor=pointer]
+              - button "顦�" [ref=f1e387] [cursor=pointer]
+          - generic [ref=f1e394]:
+            - generic [ref=f1e395]:
+              - table [ref=f1e399]:
+                - rowgroup [ref=f1e414]:
+                  - row [ref=f1e415]:
+                    - columnheader "鍝佺缂栫爜" [ref=f1e416]
+                    - columnheader "鍝佺鍚嶇О" [ref=f1e421]
+                    - columnheader "浜х嚎缂栫爜" [ref=f1e426]
+                    - columnheader "浜х嚎鍚嶇О" [ref=f1e431]
+                    - columnheader "鐢熶骇鏃ユ湡" [ref=f1e436]
+                    - columnheader "璁″垝鏁伴噺" [ref=f1e441]
+                    - columnheader "璐d换浜�" [ref=f1e446]
+                    - columnheader "琚嬬爜鏁伴噺" [ref=f1e451]
+                    - columnheader "鎵樼洏鐮佹暟閲�" [ref=f1e456]
+                    - columnheader "鎵规鐘舵��" [ref=f1e461]
+                    - columnheader "鍒涘缓鏃堕棿" [ref=f1e466]
+              - table [ref=f1e474]:
+                - rowgroup [ref=f1e489]:
+                  - row [ref=f1e490]:
+                    - cell "ITEM_20260819003" [ref=f1e491]
+                    - cell "娴嬭瘯" [ref=f1e495]
+                    - cell "two" [ref=f1e499]
+                    - cell "浜х嚎浜�" [ref=f1e503]
+                    - cell "2026-08-21 13:39:56" [ref=f1e507]
+                    - cell "100" [ref=f1e511]
+                    - cell "鐙楄泲" [ref=f1e515]
+                    - cell "0" [ref=f1e519]
+                    - cell "0" [ref=f1e523]
+                    - cell "鑽夌" [ref=f1e527]
+                    - cell "2026-08-21 13:40:10" [ref=f1e531]
+                  - row [ref=f1e535]:
+                    - cell "ITEM_20260819003" [ref=f1e536]
+                    - cell "娴嬭瘯" [ref=f1e540]
+                    - cell "two" [ref=f1e544]
+                    - cell "浜х嚎浜�" [ref=f1e548]
+                    - cell "2026-08-19 10:48:02" [ref=f1e552]
+                    - cell "10000" [ref=f1e556]
+                    - cell "瓒呯骇绠$悊鍛�" [ref=f1e560]
+                    - cell "100" [ref=f1e564]
+                    - cell "10" [ref=f1e568]
+                    - cell "宸插畬鎴�" [ref=f1e572]
+                    - cell "2026-08-19 10:48:22" [ref=f1e576]
+            - generic:
+              - generic [ref=f1e580]:
+                - table [ref=f1e583]:
+                  - rowgroup [ref=f1e598]:
+                    - row [ref=f1e599]:
+                      - columnheader "鎵规鍙�" [ref=f1e600]
+                - table [ref=f1e607]:
+                  - rowgroup [ref=f1e610]:
+                    - row [ref=f1e611]:
+                      - cell [ref=f1e612]:
+                        - button "PC20260821twoITEM_001" [ref=f1e615] [cursor=pointer]
+                    - row [ref=f1e617]:
+                      - cell [ref=f1e618]:
+                        - button "PC20260819twoITEM_001" [ref=f1e621] [cursor=pointer]
+              - generic [ref=f1e623]:
+                - table [ref=f1e626]:
+                  - rowgroup [ref=f1e641]:
+                    - row [ref=f1e642]:
+                      - columnheader "鎿嶄綔" [ref=f1e643]
+                - table [ref=f1e650]:
+                  - rowgroup [ref=f1e653]:
+                    - row [ref=f1e654]:
+                      - cell [ref=f1e655]:
+                        - generic [ref=f1e658]:
+                          - generic [ref=f1e659]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f1e661] [cursor=pointer]
+                            - button "淇敼" [ref=f1e664] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f1e671] [cursor=pointer]
+                          - button "鏇村" [ref=f1e675] [cursor=pointer]
+                    - row [ref=f1e681]:
+                      - cell [ref=f1e682]:
+                        - generic [ref=f1e685]:
+                          - button "鏌ョ湅浜岀淮鐮�" [ref=f1e688] [cursor=pointer]
+                          - button "鏇村" [ref=f1e690] [cursor=pointer]
+          - generic [ref=f1e702]:
+            - generic [ref=f1e703]: 鍏� 2 鏉¤褰�
+            - generic [ref=f1e705] [cursor=pointer]:
+              - generic "20鏉�/椤�" [ref=f1e706]:
+                - textbox "璇烽�夋嫨" [ref=f1e707]: 20鏉�/椤�
+              - generic [ref=f1e708]: 睿�
+            - button "飱�" [ref=f1e711]
+            - button "顧�" [ref=f1e713]
+            - button "顫�" [ref=f1e715]
+            - button "1" [ref=f1e718] [cursor=pointer]
+            - button "顫�" [ref=f1e719]
+            - button "顧�" [ref=f1e721]
+            - button "顦�" [ref=f1e723]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T07-41-21-761Z.yml b/.playwright-mcp/page-2026-08-28T07-41-21-761Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T07-41-21-761Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T07-41-44-827Z.yml b/.playwright-mcp/page-2026-08-28T07-41-44-827Z.yml
new file mode 100644
index 0000000..454dbeb
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T07-41-44-827Z.yml
@@ -0,0 +1,212 @@
+- generic [ref=f3e4]:
+  - complementary [ref=f3e6]:
+    - generic [ref=f3e7]:
+      - generic [ref=f3e8] [cursor=pointer]
+      - link "娴嬭瘯鍏徃鍝堝搱 娴嬭瘯鍏徃鍝堝搱" [ref=f3e13] [cursor=pointer]:
+        - /url: javascript:void 0
+        - img "娴嬭瘯鍏徃鍝堝搱" [ref=f3e16]
+        - generic [ref=f3e17]: 娴嬭瘯鍏徃鍝堝搱
+      - menu [ref=f3e20]:
+        - menuitem "棣栭〉" [ref=f3e21] [cursor=pointer]
+        - listitem [ref=f3e26]:
+          - generic [ref=f3e27] [cursor=pointer]: 鍩虹鏁版嵁
+        - listitem [ref=f3e35]:
+          - generic [ref=f3e36] [cursor=pointer]: 浠撳偍鐗╂祦
+        - listitem [ref=f3e44]:
+          - generic [ref=f3e45] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+          - list [ref=f3e51]:
+            - menuitem "鎵规鐢熶骇绠$悊" [ref=f3e52] [cursor=pointer]
+            - menuitem "璧嬬爜绠$悊" [ref=f3e57] [cursor=pointer]
+            - menuitem "鎵樼洏鐮佺鐞�" [ref=f3e63] [cursor=pointer]
+            - menuitem "浜х嚎缁存姢" [ref=f3e70] [cursor=pointer]
+            - menuitem "鐢熶骇绾挎壂鐮佸叆搴�" [ref=f3e77] [cursor=pointer]
+        - listitem [ref=f3e82]:
+          - generic [ref=f3e83] [cursor=pointer]: 璐ㄩ噺绠$悊
+        - listitem [ref=f3e89]:
+          - generic [ref=f3e90] [cursor=pointer]: 绯荤粺绠$悊
+      - generic [ref=f3e97] [cursor=pointer]
+  - generic [ref=f3e102]:
+    - generic [ref=f3e103]:
+      - banner [ref=f3e104]:
+        - button [ref=f3e105] [cursor=pointer]
+        - button [ref=f3e108] [cursor=pointer]
+        - navigation "breadcrumb" [ref=f3e113]:
+          - list [ref=f3e114]:
+            - listitem [ref=f3e115]:
+              - link "涓�琚嬩竴鐮佺鐞�" [ref=f3e116] [cursor=pointer]:
+                - /url: javascript:void 0
+              - listitem [ref=f3e120]
+            - listitem [ref=f3e123]:
+              - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f3e124]
+        - generic [ref=f3e129]:
+          - generic [ref=f3e131] [cursor=pointer]:
+            - generic [ref=f3e135]: 鎼滅储
+            - generic [ref=f3e136]: Ctrl K
+          - button [ref=f3e138] [cursor=pointer]
+          - button "dark" [ref=f3e143] [cursor=pointer]
+          - button [ref=f3e152] [cursor=pointer]
+          - button [ref=f3e158] [cursor=pointer]
+          - button [ref=f3e161] [cursor=pointer]
+          - button [ref=f3e167] [cursor=pointer]:
+            - button [ref=f3e169]
+          - button "宸ヤ綔鍙�" [ref=f3e173] [cursor=pointer]
+          - button "鐞嗗憳" [ref=f3e177] [cursor=pointer]
+      - generic [ref=f3e184]:
+        - generic [ref=f3e185]: 鎵规鐢熶骇绠$悊
+        - generic [ref=f3e204]:
+          - button [ref=f3e205] [cursor=pointer]
+          - generic [ref=f3e212] [cursor=pointer]
+          - generic [ref=f3e216] [cursor=pointer]
+    - main [ref=f3e223]:
+      - generic [ref=f3e228]:
+        - generic [ref=f3e233]:
+          - generic [ref=f3e234]:
+            - generic [ref=f3e235]: 鎵规鍙�
+            - textbox "鎵规鍙�" [ref=f3e241]:
+              - /placeholder: 璇疯緭鍏ユ壒娆″彿
+          - generic [ref=f3e243]:
+            - generic [ref=f3e244]: 鍝佺
+            - textbox "璇烽�夋嫨鍝佺" [ref=f3e251]
+          - generic [ref=f3e257]:
+            - generic [ref=f3e258]: 浜х嚎缂栫爜
+            - textbox "浜х嚎缂栫爜" [ref=f3e264]:
+              - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+          - generic [ref=f3e266]:
+            - generic [ref=f3e267]: 浜х嚎鍚嶇О
+            - textbox "浜х嚎鍚嶇О" [ref=f3e273]:
+              - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+          - generic [ref=f3e275]:
+            - generic [ref=f3e276]: 璐d换浜�
+            - textbox "璇烽�夋嫨璐d换浜�" [ref=f3e283]
+          - generic [ref=f3e289]:
+            - generic [ref=f3e290]: 鎵规鐘舵��
+            - generic [ref=f3e296] [cursor=pointer]:
+              - combobox "鎵规鐘舵��" [ref=f3e298]
+              - generic: 璇烽�夋嫨鎵规鐘舵��
+          - generic [ref=f3e299]:
+            - generic [ref=f3e300]: 鐢熶骇鏃ユ湡
+            - generic [ref=f3e305]:
+              - textbox "鐢熶骇鏃ユ湡" [ref=f3e307]:
+                - /placeholder: 寮�濮嬫椂闂�
+              - generic "to" [ref=f3e309]:
+                - img "swap-right" [ref=f3e310]
+              - textbox "缁撴潫鏃堕棿" [ref=f3e314]
+              - generic:
+                - img "calendar"
+          - generic [ref=f3e315]:
+            - generic [ref=f3e316]: 鍒涘缓鏃堕棿
+            - generic [ref=f3e321]:
+              - textbox "鍒涘缓鏃堕棿" [ref=f3e323]:
+                - /placeholder: 寮�濮嬫椂闂�
+              - generic "to" [ref=f3e325]:
+                - img "swap-right" [ref=f3e326]
+              - textbox "缁撴潫鏃堕棿" [ref=f3e330]
+              - generic:
+                - img "calendar"
+          - generic [ref=f3e331]:
+            - button "閲� 缃�" [ref=f3e332] [cursor=pointer]
+            - button "鎼� 绱�" [ref=f3e334] [cursor=pointer]
+            - generic [ref=f3e336] [cursor=pointer]: 鏀惰捣
+        - generic [ref=f3e343]:
+          - generic [ref=f3e345]:
+            - generic [ref=f3e346]: 鐢熶骇鎵规鍒楄〃
+            - generic [ref=f3e350]:
+              - generic [ref=f3e352]:
+                - button "棰勭敓鎴愪簩缁寸爜" [active] [ref=f3e354] [cursor=pointer]
+                - button "鏂板鎵规" [ref=f3e359] [cursor=pointer]
+                - button "鎵爜杩芥函" [ref=f3e364] [cursor=pointer]
+                - button "瀵煎嚭" [ref=f3e371] [cursor=pointer]
+              - button "顫�" [ref=f3e377] [cursor=pointer]
+            - generic [ref=f3e379]:
+              - button "瞟�" [ref=f3e380] [cursor=pointer]
+              - button "顪�" [ref=f3e382] [cursor=pointer]
+              - button "顦�" [ref=f3e384] [cursor=pointer]
+          - generic [ref=f3e391]:
+            - generic [ref=f3e392]:
+              - table [ref=f3e396]:
+                - rowgroup [ref=f3e411]:
+                  - row [ref=f3e412]:
+                    - columnheader "鍝佺缂栫爜" [ref=f3e413]
+                    - columnheader "鍝佺鍚嶇О" [ref=f3e418]
+                    - columnheader "浜х嚎缂栫爜" [ref=f3e423]
+                    - columnheader "浜х嚎鍚嶇О" [ref=f3e428]
+                    - columnheader "鐢熶骇鏃ユ湡" [ref=f3e433]
+                    - columnheader "璁″垝鏁伴噺" [ref=f3e438]
+                    - columnheader "璐d换浜�" [ref=f3e443]
+                    - columnheader "琚嬬爜鏁伴噺" [ref=f3e448]
+                    - columnheader "鎵樼洏鐮佹暟閲�" [ref=f3e453]
+                    - columnheader "鎵规鐘舵��" [ref=f3e458]
+                    - columnheader "鍒涘缓鏃堕棿" [ref=f3e463]
+              - table [ref=f3e471]:
+                - rowgroup [ref=f3e486]:
+                  - row [ref=f3e487]:
+                    - cell "ITEM_20260819003" [ref=f3e488]
+                    - cell "娴嬭瘯" [ref=f3e492]
+                    - cell "two" [ref=f3e496]
+                    - cell "浜х嚎浜�" [ref=f3e500]
+                    - cell "2026-08-21 13:39:56" [ref=f3e504]
+                    - cell "100" [ref=f3e508]
+                    - cell "鐙楄泲" [ref=f3e512]
+                    - cell "0" [ref=f3e516]
+                    - cell "0" [ref=f3e520]
+                    - cell "鑽夌" [ref=f3e524]
+                    - cell "2026-08-21 13:40:10" [ref=f3e528]
+                  - row [ref=f3e532]:
+                    - cell "ITEM_20260819003" [ref=f3e533]
+                    - cell "娴嬭瘯" [ref=f3e537]
+                    - cell "two" [ref=f3e541]
+                    - cell "浜х嚎浜�" [ref=f3e545]
+                    - cell "2026-08-19 10:48:02" [ref=f3e549]
+                    - cell "10000" [ref=f3e553]
+                    - cell "瓒呯骇绠$悊鍛�" [ref=f3e557]
+                    - cell "100" [ref=f3e561]
+                    - cell "10" [ref=f3e565]
+                    - cell "宸插畬鎴�" [ref=f3e569]
+                    - cell "2026-08-19 10:48:22" [ref=f3e573]
+            - generic:
+              - generic [ref=f3e577]:
+                - table [ref=f3e580]:
+                  - rowgroup [ref=f3e595]:
+                    - row [ref=f3e596]:
+                      - columnheader "鎵规鍙�" [ref=f3e597]
+                - table [ref=f3e604]:
+                  - rowgroup [ref=f3e607]:
+                    - row [ref=f3e608]:
+                      - cell [ref=f3e609]:
+                        - button "PC20260821twoITEM_001" [ref=f3e612] [cursor=pointer]
+                    - row [ref=f3e614]:
+                      - cell [ref=f3e615]:
+                        - button "PC20260819twoITEM_001" [ref=f3e618] [cursor=pointer]
+              - generic [ref=f3e620]:
+                - table [ref=f3e623]:
+                  - rowgroup [ref=f3e638]:
+                    - row [ref=f3e639]:
+                      - columnheader "鎿嶄綔" [ref=f3e640]
+                - table [ref=f3e647]:
+                  - rowgroup [ref=f3e650]:
+                    - row [ref=f3e651]:
+                      - cell [ref=f3e652]:
+                        - generic [ref=f3e655]:
+                          - generic [ref=f3e656]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f3e658] [cursor=pointer]
+                            - button "淇敼" [ref=f3e661] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f3e668] [cursor=pointer]
+                          - button "鏇村" [ref=f3e672] [cursor=pointer]
+                    - row [ref=f3e678]:
+                      - cell [ref=f3e679]:
+                        - generic [ref=f3e682]:
+                          - button "鏌ョ湅浜岀淮鐮�" [ref=f3e685] [cursor=pointer]
+                          - button "鏇村" [ref=f3e687] [cursor=pointer]
+          - generic [ref=f3e699]:
+            - generic [ref=f3e700]: 鍏� 2 鏉¤褰�
+            - generic [ref=f3e702] [cursor=pointer]:
+              - generic "20鏉�/椤�" [ref=f3e703]:
+                - textbox "璇烽�夋嫨" [ref=f3e704]: 20鏉�/椤�
+              - generic [ref=f3e705]: 睿�
+            - button "飱�" [ref=f3e708]
+            - button "顧�" [ref=f3e710]
+            - button "顫�" [ref=f3e712]
+            - button "1" [ref=f3e715] [cursor=pointer]
+            - button "顫�" [ref=f3e716]
+            - button "顧�" [ref=f3e718]
+            - button "顦�" [ref=f3e720]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T07-42-08-037Z.yml b/.playwright-mcp/page-2026-08-28T07-42-08-037Z.yml
new file mode 100644
index 0000000..bcb0d80
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T07-42-08-037Z.yml
@@ -0,0 +1,285 @@
+- generic [ref=f3e1]:
+  - generic [ref=f3e4]:
+    - complementary [ref=f3e6]:
+      - generic [ref=f3e7]:
+        - generic [ref=f3e8] [cursor=pointer]
+        - link "娴嬭瘯鍏徃鍝堝搱 娴嬭瘯鍏徃鍝堝搱" [ref=f3e13] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "娴嬭瘯鍏徃鍝堝搱" [ref=f3e16]
+          - generic [ref=f3e17]: 娴嬭瘯鍏徃鍝堝搱
+        - menu [ref=f3e20]:
+          - menuitem "棣栭〉" [ref=f3e21] [cursor=pointer]
+          - listitem [ref=f3e26]:
+            - generic [ref=f3e27] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f3e35]:
+            - generic [ref=f3e36] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f3e44]:
+            - generic [ref=f3e45] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f3e51]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f3e52] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f3e57] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f3e63] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f3e70] [cursor=pointer]
+              - menuitem "鐢熶骇绾挎壂鐮佸叆搴�" [ref=f3e77] [cursor=pointer]
+          - listitem [ref=f3e82]:
+            - generic [ref=f3e83] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f3e89]:
+            - generic [ref=f3e90] [cursor=pointer]: 绯荤粺绠$悊
+        - generic [ref=f3e97] [cursor=pointer]
+    - generic [ref=f3e102]:
+      - generic [ref=f3e103]:
+        - banner [ref=f3e104]:
+          - button [ref=f3e105] [cursor=pointer]
+          - button [ref=f3e108] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f3e113]:
+            - list [ref=f3e114]:
+              - listitem [ref=f3e115]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f3e116] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f3e120]
+              - listitem [ref=f3e123]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f3e124]
+          - generic [ref=f3e129]:
+            - generic [ref=f3e131] [cursor=pointer]:
+              - generic [ref=f3e135]: 鎼滅储
+              - generic [ref=f3e136]: Ctrl K
+            - button [ref=f3e138] [cursor=pointer]
+            - button "dark" [ref=f3e143] [cursor=pointer]
+            - button [ref=f3e152] [cursor=pointer]
+            - button [ref=f3e158] [cursor=pointer]
+            - button [ref=f3e161] [cursor=pointer]
+            - button [ref=f3e167] [cursor=pointer]:
+              - button [ref=f3e169]
+            - button "宸ヤ綔鍙�" [ref=f3e173] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f3e177] [cursor=pointer]
+        - generic [ref=f3e184]:
+          - generic [ref=f3e185]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f3e204]:
+            - button [ref=f3e205] [cursor=pointer]
+            - generic [ref=f3e212] [cursor=pointer]
+            - generic [ref=f3e216] [cursor=pointer]
+      - main [ref=f3e223]:
+        - generic [ref=f3e228]:
+          - generic [ref=f3e233]:
+            - generic [ref=f3e234]:
+              - generic [ref=f3e235]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f3e241]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f3e243]:
+              - generic [ref=f3e244]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f3e251]
+            - generic [ref=f3e257]:
+              - generic [ref=f3e258]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f3e264]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f3e266]:
+              - generic [ref=f3e267]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f3e273]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f3e275]:
+              - generic [ref=f3e276]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f3e283]
+            - generic [ref=f3e289]:
+              - generic [ref=f3e290]: 鎵规鐘舵��
+              - generic [ref=f3e296] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f3e298]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f3e299]:
+              - generic [ref=f3e300]: 鐢熶骇鏃ユ湡
+              - generic [ref=f3e305]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f3e307]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f3e309]:
+                  - img "swap-right" [ref=f3e310]
+                - textbox "缁撴潫鏃堕棿" [ref=f3e314]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f3e315]:
+              - generic [ref=f3e316]: 鍒涘缓鏃堕棿
+              - generic [ref=f3e321]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f3e323]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f3e325]:
+                  - img "swap-right" [ref=f3e326]
+                - textbox "缁撴潫鏃堕棿" [ref=f3e330]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f3e331]:
+              - button "閲� 缃�" [ref=f3e332] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f3e334] [cursor=pointer]
+              - generic [ref=f3e336] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f3e343]:
+            - generic [ref=f3e345]:
+              - generic [ref=f3e346]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f3e350]:
+                - generic [ref=f3e352]:
+                  - button "棰勭敓鎴愪簩缁寸爜" [ref=f3e354] [cursor=pointer]
+                  - button "鏂板鎵规" [active] [ref=f3e359] [cursor=pointer]
+                  - button "鎵爜杩芥函" [ref=f3e364] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f3e371] [cursor=pointer]
+                - button "顫�" [ref=f3e377] [cursor=pointer]
+              - generic [ref=f3e379]:
+                - button "瞟�" [ref=f3e380] [cursor=pointer]
+                - button "顪�" [ref=f3e382] [cursor=pointer]
+                - button "顦�" [ref=f3e384] [cursor=pointer]
+            - generic [ref=f3e391]:
+              - generic [ref=f3e392]:
+                - table [ref=f3e396]:
+                  - rowgroup [ref=f3e411]:
+                    - row [ref=f3e412]:
+                      - columnheader "鍝佺缂栫爜" [ref=f3e413]
+                      - columnheader "鍝佺鍚嶇О" [ref=f3e418]
+                      - columnheader "浜х嚎缂栫爜" [ref=f3e423]
+                      - columnheader "浜х嚎鍚嶇О" [ref=f3e428]
+                      - columnheader "鐢熶骇鏃ユ湡" [ref=f3e433]
+                      - columnheader "璁″垝鏁伴噺" [ref=f3e438]
+                      - columnheader "璐d换浜�" [ref=f3e443]
+                      - columnheader "琚嬬爜鏁伴噺" [ref=f3e448]
+                      - columnheader "鎵樼洏鐮佹暟閲�" [ref=f3e453]
+                      - columnheader "鎵规鐘舵��" [ref=f3e458]
+                      - columnheader "鍒涘缓鏃堕棿" [ref=f3e463]
+                - table [ref=f3e471]:
+                  - rowgroup [ref=f3e486]:
+                    - row [ref=f3e487]:
+                      - cell "ITEM_20260819003" [ref=f3e488]
+                      - cell "娴嬭瘯" [ref=f3e492]
+                      - cell "two" [ref=f3e496]
+                      - cell "浜х嚎浜�" [ref=f3e500]
+                      - cell "2026-08-21 13:39:56" [ref=f3e504]
+                      - cell "100" [ref=f3e508]
+                      - cell "鐙楄泲" [ref=f3e512]
+                      - cell "0" [ref=f3e516]
+                      - cell "0" [ref=f3e520]
+                      - cell "鑽夌" [ref=f3e524]
+                      - cell "2026-08-21 13:40:10" [ref=f3e528]
+                    - row [ref=f3e532]:
+                      - cell "ITEM_20260819003" [ref=f3e533]
+                      - cell "娴嬭瘯" [ref=f3e537]
+                      - cell "two" [ref=f3e541]
+                      - cell "浜х嚎浜�" [ref=f3e545]
+                      - cell "2026-08-19 10:48:02" [ref=f3e549]
+                      - cell "10000" [ref=f3e553]
+                      - cell "瓒呯骇绠$悊鍛�" [ref=f3e557]
+                      - cell "100" [ref=f3e561]
+                      - cell "10" [ref=f3e565]
+                      - cell "宸插畬鎴�" [ref=f3e569]
+                      - cell "2026-08-19 10:48:22" [ref=f3e573]
+              - generic:
+                - generic [ref=f3e577]:
+                  - table [ref=f3e580]:
+                    - rowgroup [ref=f3e595]:
+                      - row [ref=f3e596]:
+                        - columnheader "鎵规鍙�" [ref=f3e597]
+                  - table [ref=f3e604]:
+                    - rowgroup [ref=f3e607]:
+                      - row [ref=f3e608]:
+                        - cell [ref=f3e609]:
+                          - button "PC20260821twoITEM_001" [ref=f3e612] [cursor=pointer]
+                      - row [ref=f3e614]:
+                        - cell [ref=f3e615]:
+                          - button "PC20260819twoITEM_001" [ref=f3e618] [cursor=pointer]
+                - generic [ref=f3e620]:
+                  - table [ref=f3e623]:
+                    - rowgroup [ref=f3e638]:
+                      - row [ref=f3e639]:
+                        - columnheader "鎿嶄綔" [ref=f3e640]
+                  - table [ref=f3e647]:
+                    - rowgroup [ref=f3e650]:
+                      - row [ref=f3e651]:
+                        - cell [ref=f3e652]:
+                          - generic [ref=f3e655]:
+                            - generic [ref=f3e656]:
+                              - button "鏌ョ湅浜岀淮鐮�" [ref=f3e658] [cursor=pointer]
+                              - button "淇敼" [ref=f3e661] [cursor=pointer]
+                              - button "鍒犻櫎" [ref=f3e668] [cursor=pointer]
+                            - button "鏇村" [ref=f3e672] [cursor=pointer]
+                      - row [ref=f3e678]:
+                        - cell [ref=f3e679]:
+                          - generic [ref=f3e682]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f3e685] [cursor=pointer]
+                            - button "鏇村" [ref=f3e687] [cursor=pointer]
+            - generic [ref=f3e699]:
+              - generic [ref=f3e700]: 鍏� 2 鏉¤褰�
+              - generic [ref=f3e702] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f3e703]:
+                  - textbox "璇烽�夋嫨" [ref=f3e704]: 20鏉�/椤�
+                - generic [ref=f3e705]: 睿�
+              - button "飱�" [ref=f3e708]
+              - button "顧�" [ref=f3e710]
+              - button "顫�" [ref=f3e712]
+              - button "1" [ref=f3e715] [cursor=pointer]
+              - button "顫�" [ref=f3e716]
+              - button "顧�" [ref=f3e718]
+              - button "顦�" [ref=f3e720]
+  - dialog [ref=f3e723]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=f3e725]
+    - generic [ref=f3e727]:
+      - generic [ref=f3e729]:
+        - generic [ref=f3e730]:
+          - generic [ref=f3e731]:
+            - generic [ref=f3e732]: "*"
+            - text: 鍖呰琚嬪瀷
+          - generic [ref=f3e738] [cursor=pointer]:
+            - combobox "* 鍖呰琚嬪瀷" [ref=f3e740]
+            - generic: 璇烽�夋嫨鍖呰琚嬪瀷
+        - generic [ref=f3e741]:
+          - generic [ref=f3e742]:
+            - generic [ref=f3e743]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佸搧绉嶏級" [ref=f3e750]
+        - generic [ref=f3e756]:
+          - generic [ref=f3e757]:
+            - generic [ref=f3e758]: "*"
+            - text: 浜х嚎
+          - generic [ref=f3e764]:
+            - combobox "* 浜х嚎" [ref=f3e766]
+            - generic: 璇烽�夋嫨浜х嚎
+        - generic [ref=f3e767]:
+          - generic [ref=f3e768]:
+            - generic [ref=f3e769]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=f3e775]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=f3e776]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=f3e777]:
+          - generic [ref=f3e778]: 璁″垝鏁伴噺
+          - generic [ref=f3e783]:
+            - generic [ref=f3e784]:
+              - button "Increase Value" [ref=f3e785] [cursor=pointer]:
+                - img "up" [ref=f3e786]
+              - button "Decrease Value" [ref=f3e789] [cursor=pointer]:
+                - img "down" [ref=f3e790]
+            - spinbutton "璁″垝鏁伴噺" [ref=f3e794]
+        - generic [ref=f3e795]:
+          - generic [ref=f3e796]:
+            - generic [ref=f3e797]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=f3e804]
+        - generic [ref=f3e810]:
+          - generic [ref=f3e811]: 澶囨敞
+          - textbox "澶囨敞" [ref=f3e816]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=f3e817]:
+        - generic [ref=f3e818]:
+          - generic [ref=f3e819]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=f3e820] [cursor=pointer]
+        - generic [ref=f3e828]:
+          - generic [ref=f3e832]:
+            - table [ref=f3e836]:
+              - rowgroup [ref=f3e842]:
+                - row [ref=f3e843]:
+                  - columnheader "鐢熶骇浜哄憳" [ref=f3e844]
+                  - columnheader "宀椾綅绫诲瀷" [ref=f3e849]
+                  - columnheader "澶囨敞" [ref=f3e854]
+                  - columnheader "鎿嶄綔" [ref=f3e859]
+            - generic [ref=f3e865]:
+              - table:
+                - rowgroup
+          - generic: 鏆傛棤鏁版嵁
+    - button [ref=f3e875] [cursor=pointer]
+    - generic [ref=f3e885]:
+      - button "纭� 璁�" [ref=f3e886] [cursor=pointer]
+      - button "鍙� 娑�" [ref=f3e889] [cursor=pointer]
+    - button [ref=f3e891] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T07-48-07-459Z.yml b/.playwright-mcp/page-2026-08-28T07-48-07-459Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T07-48-07-459Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T07-48-24-872Z.yml b/.playwright-mcp/page-2026-08-28T07-48-24-872Z.yml
new file mode 100644
index 0000000..53574c0
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T07-48-24-872Z.yml
@@ -0,0 +1,236 @@
+- generic [ref=f4e4]:
+  - generic [ref=f4e7]:
+    - complementary [ref=f4e9]:
+      - generic [ref=f4e10]:
+        - generic [ref=f4e11] [cursor=pointer]
+        - link "娴嬭瘯鍏徃鍝堝搱 娴嬭瘯鍏徃鍝堝搱" [ref=f4e16] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "娴嬭瘯鍏徃鍝堝搱" [ref=f4e19]
+          - generic [ref=f4e20]: 娴嬭瘯鍏徃鍝堝搱
+        - menu [ref=f4e23]:
+          - menuitem "棣栭〉" [ref=f4e24] [cursor=pointer]
+          - listitem [ref=f4e29]:
+            - generic [ref=f4e30] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f4e38]:
+            - generic [ref=f4e39] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f4e47]:
+            - generic [ref=f4e48] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f4e54]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f4e55] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f4e60] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f4e66] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f4e73] [cursor=pointer]
+              - menuitem "鐢熶骇绾挎壂鐮佸叆搴�" [ref=f4e80] [cursor=pointer]
+          - listitem [ref=f4e85]:
+            - generic [ref=f4e86] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f4e92]:
+            - generic [ref=f4e93] [cursor=pointer]: 绯荤粺绠$悊
+        - generic [ref=f4e100] [cursor=pointer]
+    - generic [ref=f4e105]:
+      - generic [ref=f4e106]:
+        - banner [ref=f4e107]:
+          - button [ref=f4e108] [cursor=pointer]
+          - button [ref=f4e111] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f4e116]:
+            - list [ref=f4e117]:
+              - listitem [ref=f4e118]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f4e119] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f4e123]
+              - listitem [ref=f4e126]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f4e127]
+          - generic [ref=f4e132]:
+            - generic [ref=f4e134] [cursor=pointer]:
+              - generic [ref=f4e138]: 鎼滅储
+              - generic [ref=f4e139]: Ctrl K
+            - button [ref=f4e141] [cursor=pointer]
+            - button "dark" [ref=f4e146] [cursor=pointer]
+            - button [ref=f4e155] [cursor=pointer]
+            - button [ref=f4e161] [cursor=pointer]
+            - button [ref=f4e164] [cursor=pointer]
+            - button [ref=f4e170] [cursor=pointer]:
+              - button [ref=f4e172]
+            - button "宸ヤ綔鍙�" [ref=f4e176] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f4e180] [cursor=pointer]
+        - generic [ref=f4e187]:
+          - generic [ref=f4e188]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f4e207]:
+            - button [ref=f4e208] [cursor=pointer]
+            - generic [ref=f4e215] [cursor=pointer]
+            - generic [ref=f4e219] [cursor=pointer]
+      - main [ref=f4e226]:
+        - generic [ref=f4e231]:
+          - generic [ref=f4e236]:
+            - generic [ref=f4e237]:
+              - generic [ref=f4e238]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f4e244]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f4e246]:
+              - generic [ref=f4e247]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f4e254]
+            - generic [ref=f4e260]:
+              - generic [ref=f4e261]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f4e267]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f4e269]:
+              - generic [ref=f4e270]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f4e276]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f4e278]:
+              - generic [ref=f4e279]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f4e286]
+            - generic [ref=f4e292]:
+              - generic [ref=f4e293]: 鎵规鐘舵��
+              - generic [ref=f4e299] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f4e301]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f4e302]:
+              - generic [ref=f4e303]: 鐢熶骇鏃ユ湡
+              - generic [ref=f4e308]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f4e310]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f4e312]:
+                  - img "swap-right" [ref=f4e313]
+                - textbox "缁撴潫鏃堕棿" [ref=f4e317]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f4e318]:
+              - generic [ref=f4e319]: 鍒涘缓鏃堕棿
+              - generic [ref=f4e324]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f4e326]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f4e328]:
+                  - img "swap-right" [ref=f4e329]
+                - textbox "缁撴潫鏃堕棿" [ref=f4e333]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f4e334]:
+              - button "閲� 缃�" [ref=f4e335] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f4e337] [cursor=pointer]
+              - generic [ref=f4e339] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f4e346]:
+            - generic [ref=f4e348]:
+              - generic [ref=f4e349]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f4e353]:
+                - generic [ref=f4e355]:
+                  - button "棰勭敓鎴愪簩缁寸爜" [active] [ref=f4e357] [cursor=pointer]
+                  - button "鏂板鎵规" [ref=f4e362] [cursor=pointer]
+                  - button "鎵爜杩芥函" [ref=f4e367] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f4e374] [cursor=pointer]
+                - button "顫�" [ref=f4e380] [cursor=pointer]
+              - generic [ref=f4e382]:
+                - button "瞟�" [ref=f4e383] [cursor=pointer]
+                - button "顪�" [ref=f4e385] [cursor=pointer]
+                - button "顦�" [ref=f4e387] [cursor=pointer]
+            - generic [ref=f4e394]:
+              - generic [ref=f4e395]:
+                - table [ref=f4e399]:
+                  - rowgroup [ref=f4e414]:
+                    - row [ref=f4e415]:
+                      - columnheader "鍝佺缂栫爜" [ref=f4e416]
+                      - columnheader "鍝佺鍚嶇О" [ref=f4e421]
+                      - columnheader "浜х嚎缂栫爜" [ref=f4e426]
+                      - columnheader "浜х嚎鍚嶇О" [ref=f4e431]
+                      - columnheader "鐢熶骇鏃ユ湡" [ref=f4e436]
+                      - columnheader "璁″垝鏁伴噺" [ref=f4e441]
+                      - columnheader "璐d换浜�" [ref=f4e446]
+                      - columnheader "琚嬬爜鏁伴噺" [ref=f4e451]
+                      - columnheader "鎵樼洏鐮佹暟閲�" [ref=f4e456]
+                      - columnheader "鎵规鐘舵��" [ref=f4e461]
+                      - columnheader "鍒涘缓鏃堕棿" [ref=f4e466]
+                - table [ref=f4e474]:
+                  - rowgroup [ref=f4e489]:
+                    - row [ref=f4e490]:
+                      - cell "ITEM_20260819003" [ref=f4e491]
+                      - cell "娴嬭瘯" [ref=f4e495]
+                      - cell "two" [ref=f4e499]
+                      - cell "浜х嚎浜�" [ref=f4e503]
+                      - cell "2026-08-21 13:39:56" [ref=f4e507]
+                      - cell "100" [ref=f4e511]
+                      - cell "鐙楄泲" [ref=f4e515]
+                      - cell "0" [ref=f4e519]
+                      - cell "0" [ref=f4e523]
+                      - cell "鑽夌" [ref=f4e527]
+                      - cell "2026-08-21 13:40:10" [ref=f4e531]
+                    - row [ref=f4e535]:
+                      - cell "ITEM_20260819003" [ref=f4e536]
+                      - cell "娴嬭瘯" [ref=f4e540]
+                      - cell "two" [ref=f4e544]
+                      - cell "浜х嚎浜�" [ref=f4e548]
+                      - cell "2026-08-19 10:48:02" [ref=f4e552]
+                      - cell "10000" [ref=f4e556]
+                      - cell "瓒呯骇绠$悊鍛�" [ref=f4e560]
+                      - cell "100" [ref=f4e564]
+                      - cell "10" [ref=f4e568]
+                      - cell "宸插畬鎴�" [ref=f4e572]
+                      - cell "2026-08-19 10:48:22" [ref=f4e576]
+              - generic:
+                - generic [ref=f4e580]:
+                  - table [ref=f4e583]:
+                    - rowgroup [ref=f4e598]:
+                      - row [ref=f4e599]:
+                        - columnheader "鎵规鍙�" [ref=f4e600]
+                  - table [ref=f4e607]:
+                    - rowgroup [ref=f4e610]:
+                      - row [ref=f4e611]:
+                        - cell [ref=f4e612]:
+                          - button "PC20260821twoITEM_001" [ref=f4e615] [cursor=pointer]
+                      - row [ref=f4e617]:
+                        - cell [ref=f4e618]:
+                          - button "PC20260819twoITEM_001" [ref=f4e621] [cursor=pointer]
+                - generic [ref=f4e623]:
+                  - table [ref=f4e626]:
+                    - rowgroup [ref=f4e641]:
+                      - row [ref=f4e642]:
+                        - columnheader "鎿嶄綔" [ref=f4e643]
+                  - table [ref=f4e650]:
+                    - rowgroup [ref=f4e653]:
+                      - row [ref=f4e654]:
+                        - cell [ref=f4e655]:
+                          - generic [ref=f4e658]:
+                            - generic [ref=f4e659]:
+                              - button "鏌ョ湅浜岀淮鐮�" [ref=f4e661] [cursor=pointer]
+                              - button "淇敼" [ref=f4e664] [cursor=pointer]
+                              - button "鍒犻櫎" [ref=f4e671] [cursor=pointer]
+                            - button "鏇村" [ref=f4e675] [cursor=pointer]
+                      - row [ref=f4e681]:
+                        - cell [ref=f4e682]:
+                          - generic [ref=f4e685]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f4e688] [cursor=pointer]
+                            - button "鏇村" [ref=f4e690] [cursor=pointer]
+            - generic [ref=f4e702]:
+              - generic [ref=f4e703]: 鍏� 2 鏉¤褰�
+              - generic [ref=f4e705] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f4e706]:
+                  - textbox "璇烽�夋嫨" [ref=f4e707]: 20鏉�/椤�
+                - generic [ref=f4e708]: 睿�
+              - button "飱�" [ref=f4e711]
+              - button "顧�" [ref=f4e713]
+              - button "顫�" [ref=f4e715]
+              - button "1" [ref=f4e718] [cursor=pointer]
+              - button "顫�" [ref=f4e719]
+              - button "顧�" [ref=f4e721]
+              - button "顦�" [ref=f4e723]
+  - dialog [ref=f4e726]:
+    - heading "棰勭敓鎴愭壒娆′簩缁寸爜" [level=2] [ref=f4e728]
+    - generic [ref=f4e732]:
+      - generic [ref=f4e733]:
+        - generic [ref=f4e734]:
+          - generic [ref=f4e735]: "*"
+          - text: 鐢熸垚涓暟
+        - generic [ref=f4e740]:
+          - generic [ref=f4e741]:
+            - button "Increase Value" [ref=f4e742] [cursor=pointer]:
+              - img "up" [ref=f4e743]
+            - button "Decrease Value" [ref=f4e746] [cursor=pointer]:
+              - img "down" [ref=f4e747]
+          - spinbutton "* 鐢熸垚涓暟" [ref=f4e751]
+      - generic [ref=f4e752]:
+        - generic [ref=f4e753]: 澶囨敞
+        - textbox "澶囨敞" [ref=f4e758]:
+          - /placeholder: 璇疯緭鍏ュ娉�
+    - button [ref=f4e759] [cursor=pointer]
+    - generic [ref=f4e769]:
+      - button "鍙� 娑�" [ref=f4e770] [cursor=pointer]
+      - button "纭� 璁�" [ref=f4e772] [cursor=pointer]
+    - button [ref=f4e774] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T07-48-51-155Z.yml b/.playwright-mcp/page-2026-08-28T07-48-51-155Z.yml
new file mode 100644
index 0000000..d803fea
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T07-48-51-155Z.yml
@@ -0,0 +1,239 @@
+- generic [ref=f4e4]:
+  - generic [ref=f4e7]:
+    - complementary [ref=f4e9]:
+      - generic [ref=f4e10]:
+        - generic [ref=f4e11] [cursor=pointer]
+        - link "娴嬭瘯鍏徃鍝堝搱 娴嬭瘯鍏徃鍝堝搱" [ref=f4e16] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "娴嬭瘯鍏徃鍝堝搱" [ref=f4e19]
+          - generic [ref=f4e20]: 娴嬭瘯鍏徃鍝堝搱
+        - menu [ref=f4e23]:
+          - menuitem "棣栭〉" [ref=f4e24] [cursor=pointer]
+          - listitem [ref=f4e29]:
+            - generic [ref=f4e30] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f4e38]:
+            - generic [ref=f4e39] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f4e47]:
+            - generic [ref=f4e48] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f4e54]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f4e55] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f4e60] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f4e66] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f4e73] [cursor=pointer]
+              - menuitem "鐢熶骇绾挎壂鐮佸叆搴�" [ref=f4e80] [cursor=pointer]
+          - listitem [ref=f4e85]:
+            - generic [ref=f4e86] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f4e92]:
+            - generic [ref=f4e93] [cursor=pointer]: 绯荤粺绠$悊
+        - generic [ref=f4e100] [cursor=pointer]
+    - generic [ref=f4e105]:
+      - generic [ref=f4e106]:
+        - banner [ref=f4e107]:
+          - button [ref=f4e108] [cursor=pointer]
+          - button [ref=f4e111] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f4e116]:
+            - list [ref=f4e117]:
+              - listitem [ref=f4e118]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f4e119] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f4e123]
+              - listitem [ref=f4e126]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f4e127]
+          - generic [ref=f4e132]:
+            - generic [ref=f4e134] [cursor=pointer]:
+              - generic [ref=f4e138]: 鎼滅储
+              - generic [ref=f4e139]: Ctrl K
+            - button [ref=f4e141] [cursor=pointer]
+            - button "dark" [ref=f4e146] [cursor=pointer]
+            - button [ref=f4e155] [cursor=pointer]
+            - button [ref=f4e161] [cursor=pointer]
+            - button [ref=f4e164] [cursor=pointer]
+            - button [ref=f4e170] [cursor=pointer]:
+              - button [ref=f4e172]
+            - button "宸ヤ綔鍙�" [ref=f4e176] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f4e180] [cursor=pointer]
+        - generic [ref=f4e187]:
+          - generic [ref=f4e188]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f4e207]:
+            - button [ref=f4e208] [cursor=pointer]
+            - generic [ref=f4e215] [cursor=pointer]
+            - generic [ref=f4e219] [cursor=pointer]
+      - main [ref=f4e226]:
+        - generic [ref=f4e231]:
+          - generic [ref=f4e236]:
+            - generic [ref=f4e237]:
+              - generic [ref=f4e238]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f4e244]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f4e246]:
+              - generic [ref=f4e247]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f4e254]
+            - generic [ref=f4e260]:
+              - generic [ref=f4e261]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f4e267]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f4e269]:
+              - generic [ref=f4e270]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f4e276]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f4e278]:
+              - generic [ref=f4e279]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f4e286]
+            - generic [ref=f4e292]:
+              - generic [ref=f4e293]: 鎵规鐘舵��
+              - generic [ref=f4e299] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f4e301]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f4e302]:
+              - generic [ref=f4e303]: 鐢熶骇鏃ユ湡
+              - generic [ref=f4e308]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f4e310]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f4e312]:
+                  - img "swap-right" [ref=f4e313]
+                - textbox "缁撴潫鏃堕棿" [ref=f4e317]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f4e318]:
+              - generic [ref=f4e319]: 鍒涘缓鏃堕棿
+              - generic [ref=f4e324]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f4e326]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f4e328]:
+                  - img "swap-right" [ref=f4e329]
+                - textbox "缁撴潫鏃堕棿" [ref=f4e333]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f4e334]:
+              - button "閲� 缃�" [ref=f4e335] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f4e337] [cursor=pointer]
+              - generic [ref=f4e339] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f4e346]:
+            - generic [ref=f4e348]:
+              - generic [ref=f4e349]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f4e353]:
+                - generic [ref=f4e355]:
+                  - button "棰勭敓鎴愪簩缁寸爜" [ref=f4e357] [cursor=pointer]
+                  - button "鏂板鎵规" [ref=f4e362] [cursor=pointer]
+                  - button "鎵爜杩芥函" [ref=f4e367] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f4e374] [cursor=pointer]
+                - button "顫�" [ref=f4e380] [cursor=pointer]
+              - generic [ref=f4e382]:
+                - button "瞟�" [ref=f4e383] [cursor=pointer]
+                - button "顪�" [ref=f4e385] [cursor=pointer]
+                - button "顦�" [ref=f4e387] [cursor=pointer]
+            - generic [ref=f4e394]:
+              - generic [ref=f4e395]:
+                - table [ref=f4e399]:
+                  - rowgroup [ref=f4e414]:
+                    - row [ref=f4e415]:
+                      - columnheader "鍝佺缂栫爜" [ref=f4e416]
+                      - columnheader "鍝佺鍚嶇О" [ref=f4e421]
+                      - columnheader "浜х嚎缂栫爜" [ref=f4e426]
+                      - columnheader "浜х嚎鍚嶇О" [ref=f4e431]
+                      - columnheader "鐢熶骇鏃ユ湡" [ref=f4e436]
+                      - columnheader "璁″垝鏁伴噺" [ref=f4e441]
+                      - columnheader "璐d换浜�" [ref=f4e446]
+                      - columnheader "琚嬬爜鏁伴噺" [ref=f4e451]
+                      - columnheader "鎵樼洏鐮佹暟閲�" [ref=f4e456]
+                      - columnheader "鎵规鐘舵��" [ref=f4e461]
+                      - columnheader "鍒涘缓鏃堕棿" [ref=f4e466]
+                - table [ref=f4e474]:
+                  - rowgroup [ref=f4e489]:
+                    - row [ref=f4e490]:
+                      - cell "ITEM_20260819003" [ref=f4e491]
+                      - cell "娴嬭瘯" [ref=f4e495]
+                      - cell "two" [ref=f4e499]
+                      - cell "浜х嚎浜�" [ref=f4e503]
+                      - cell "2026-08-21 13:39:56" [ref=f4e507]
+                      - cell "100" [ref=f4e511]
+                      - cell "鐙楄泲" [ref=f4e515]
+                      - cell "0" [ref=f4e519]
+                      - cell "0" [ref=f4e523]
+                      - cell "鑽夌" [ref=f4e527]
+                      - cell "2026-08-21 13:40:10" [ref=f4e531]
+                    - row [ref=f4e535]:
+                      - cell "ITEM_20260819003" [ref=f4e536]
+                      - cell "娴嬭瘯" [ref=f4e540]
+                      - cell "two" [ref=f4e544]
+                      - cell "浜х嚎浜�" [ref=f4e548]
+                      - cell "2026-08-19 10:48:02" [ref=f4e552]
+                      - cell "10000" [ref=f4e556]
+                      - cell "瓒呯骇绠$悊鍛�" [ref=f4e560]
+                      - cell "100" [ref=f4e564]
+                      - cell "10" [ref=f4e568]
+                      - cell "宸插畬鎴�" [ref=f4e572]
+                      - cell "2026-08-19 10:48:22" [ref=f4e576]
+              - generic:
+                - generic [ref=f4e580]:
+                  - table [ref=f4e583]:
+                    - rowgroup [ref=f4e598]:
+                      - row [ref=f4e599]:
+                        - columnheader "鎵规鍙�" [ref=f4e600]
+                  - table [ref=f4e607]:
+                    - rowgroup [ref=f4e610]:
+                      - row [ref=f4e611]:
+                        - cell [ref=f4e612]:
+                          - button "PC20260821twoITEM_001" [ref=f4e615] [cursor=pointer]
+                      - row [ref=f4e617]:
+                        - cell [ref=f4e618]:
+                          - button "PC20260819twoITEM_001" [ref=f4e621] [cursor=pointer]
+                - generic [ref=f4e623]:
+                  - table [ref=f4e626]:
+                    - rowgroup [ref=f4e641]:
+                      - row [ref=f4e642]:
+                        - columnheader "鎿嶄綔" [ref=f4e643]
+                  - table [ref=f4e650]:
+                    - rowgroup [ref=f4e653]:
+                      - row [ref=f4e654]:
+                        - cell [ref=f4e655]:
+                          - generic [ref=f4e658]:
+                            - generic [ref=f4e659]:
+                              - button "鏌ョ湅浜岀淮鐮�" [ref=f4e661] [cursor=pointer]
+                              - button "淇敼" [ref=f4e664] [cursor=pointer]
+                              - button "鍒犻櫎" [ref=f4e671] [cursor=pointer]
+                            - button "鏇村" [ref=f4e675] [cursor=pointer]
+                      - row [ref=f4e681]:
+                        - cell [ref=f4e682]:
+                          - generic [ref=f4e685]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f4e688] [cursor=pointer]
+                            - button "鏇村" [ref=f4e690] [cursor=pointer]
+            - generic [ref=f4e702]:
+              - generic [ref=f4e703]: 鍏� 2 鏉¤褰�
+              - generic [ref=f4e705] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f4e706]:
+                  - textbox "璇烽�夋嫨" [ref=f4e707]: 20鏉�/椤�
+                - generic [ref=f4e708]: 睿�
+              - button "飱�" [ref=f4e711]
+              - button "顧�" [ref=f4e713]
+              - button "顫�" [ref=f4e715]
+              - button "1" [ref=f4e718] [cursor=pointer]
+              - button "顫�" [ref=f4e719]
+              - button "顧�" [ref=f4e721]
+              - button "顦�" [ref=f4e723]
+  - generic [ref=f4e779]:
+    - img "close-circle" [ref=f4e780]
+    - text: 璇锋眰鍦板潃涓嶅瓨鍦�:admin-api/mes/pro/batch/pre-generate
+  - dialog [ref=f4e726]:
+    - heading "棰勭敓鎴愭壒娆′簩缁寸爜" [level=2] [ref=f4e728]
+    - generic [ref=f4e732]:
+      - generic [ref=f4e733]:
+        - generic [ref=f4e734]:
+          - generic [ref=f4e735]: "*"
+          - text: 鐢熸垚涓暟
+        - generic [ref=f4e740]:
+          - generic [ref=f4e741]:
+            - button "Increase Value" [ref=f4e742] [cursor=pointer]:
+              - img "up" [ref=f4e743]
+            - button "Decrease Value" [ref=f4e746] [cursor=pointer]:
+              - img "down" [ref=f4e747]
+          - spinbutton "* 鐢熸垚涓暟" [ref=f4e751]: "3"
+      - generic [ref=f4e752]:
+        - generic [ref=f4e753]: 澶囨敞
+        - textbox "澶囨敞" [ref=f4e758]:
+          - /placeholder: 璇疯緭鍏ュ娉�
+    - button [ref=f4e759] [cursor=pointer]
+    - generic [ref=f4e769]:
+      - button "鍙� 娑�" [ref=f4e770] [cursor=pointer]
+      - button "纭� 璁�" [active] [ref=f4e772] [cursor=pointer]
+    - button [ref=f4e774] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T07-49-26-431Z.yml b/.playwright-mcp/page-2026-08-28T07-49-26-431Z.yml
new file mode 100644
index 0000000..364d985
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T07-49-26-431Z.yml
@@ -0,0 +1,236 @@
+- generic [ref=f4e4]:
+  - generic [ref=f4e7]:
+    - complementary [ref=f4e9]:
+      - generic [ref=f4e10]:
+        - generic [ref=f4e11] [cursor=pointer]
+        - link "娴嬭瘯鍏徃鍝堝搱 娴嬭瘯鍏徃鍝堝搱" [ref=f4e16] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "娴嬭瘯鍏徃鍝堝搱" [ref=f4e19]
+          - generic [ref=f4e20]: 娴嬭瘯鍏徃鍝堝搱
+        - menu [ref=f4e23]:
+          - menuitem "棣栭〉" [ref=f4e24] [cursor=pointer]
+          - listitem [ref=f4e29]:
+            - generic [ref=f4e30] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f4e38]:
+            - generic [ref=f4e39] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f4e47]:
+            - generic [ref=f4e48] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f4e54]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f4e55] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f4e60] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f4e66] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f4e73] [cursor=pointer]
+              - menuitem "鐢熶骇绾挎壂鐮佸叆搴�" [ref=f4e80] [cursor=pointer]
+          - listitem [ref=f4e85]:
+            - generic [ref=f4e86] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f4e92]:
+            - generic [ref=f4e93] [cursor=pointer]: 绯荤粺绠$悊
+        - generic [ref=f4e100] [cursor=pointer]
+    - generic [ref=f4e105]:
+      - generic [ref=f4e106]:
+        - banner [ref=f4e107]:
+          - button [ref=f4e108] [cursor=pointer]
+          - button [ref=f4e111] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f4e116]:
+            - list [ref=f4e117]:
+              - listitem [ref=f4e118]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f4e119] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f4e123]
+              - listitem [ref=f4e126]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f4e127]
+          - generic [ref=f4e132]:
+            - generic [ref=f4e134] [cursor=pointer]:
+              - generic [ref=f4e138]: 鎼滅储
+              - generic [ref=f4e139]: Ctrl K
+            - button [ref=f4e141] [cursor=pointer]
+            - button "dark" [ref=f4e146] [cursor=pointer]
+            - button [ref=f4e155] [cursor=pointer]
+            - button [ref=f4e161] [cursor=pointer]
+            - button [ref=f4e164] [cursor=pointer]
+            - button [ref=f4e170] [cursor=pointer]:
+              - button [ref=f4e172]
+            - button "宸ヤ綔鍙�" [ref=f4e176] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f4e180] [cursor=pointer]
+        - generic [ref=f4e187]:
+          - generic [ref=f4e188]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f4e207]:
+            - button [ref=f4e208] [cursor=pointer]
+            - generic [ref=f4e215] [cursor=pointer]
+            - generic [ref=f4e219] [cursor=pointer]
+      - main [ref=f4e226]:
+        - generic [ref=f4e231]:
+          - generic [ref=f4e236]:
+            - generic [ref=f4e237]:
+              - generic [ref=f4e238]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f4e244]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f4e246]:
+              - generic [ref=f4e247]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f4e254]
+            - generic [ref=f4e260]:
+              - generic [ref=f4e261]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f4e267]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f4e269]:
+              - generic [ref=f4e270]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f4e276]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f4e278]:
+              - generic [ref=f4e279]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f4e286]
+            - generic [ref=f4e292]:
+              - generic [ref=f4e293]: 鎵规鐘舵��
+              - generic [ref=f4e299] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f4e301]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f4e302]:
+              - generic [ref=f4e303]: 鐢熶骇鏃ユ湡
+              - generic [ref=f4e308]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f4e310]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f4e312]:
+                  - img "swap-right" [ref=f4e313]
+                - textbox "缁撴潫鏃堕棿" [ref=f4e317]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f4e318]:
+              - generic [ref=f4e319]: 鍒涘缓鏃堕棿
+              - generic [ref=f4e324]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f4e326]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f4e328]:
+                  - img "swap-right" [ref=f4e329]
+                - textbox "缁撴潫鏃堕棿" [ref=f4e333]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f4e334]:
+              - button "閲� 缃�" [ref=f4e335] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f4e337] [cursor=pointer]
+              - generic [ref=f4e339] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f4e346]:
+            - generic [ref=f4e348]:
+              - generic [ref=f4e349]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f4e353]:
+                - generic [ref=f4e355]:
+                  - button "棰勭敓鎴愪簩缁寸爜" [ref=f4e357] [cursor=pointer]
+                  - button "鏂板鎵规" [ref=f4e362] [cursor=pointer]
+                  - button "鎵爜杩芥函" [ref=f4e367] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f4e374] [cursor=pointer]
+                - button "顫�" [ref=f4e380] [cursor=pointer]
+              - generic [ref=f4e382]:
+                - button "瞟�" [ref=f4e383] [cursor=pointer]
+                - button "顪�" [ref=f4e385] [cursor=pointer]
+                - button "顦�" [ref=f4e387] [cursor=pointer]
+            - generic [ref=f4e394]:
+              - generic [ref=f4e395]:
+                - table [ref=f4e399]:
+                  - rowgroup [ref=f4e414]:
+                    - row [ref=f4e415]:
+                      - columnheader "鍝佺缂栫爜" [ref=f4e416]
+                      - columnheader "鍝佺鍚嶇О" [ref=f4e421]
+                      - columnheader "浜х嚎缂栫爜" [ref=f4e426]
+                      - columnheader "浜х嚎鍚嶇О" [ref=f4e431]
+                      - columnheader "鐢熶骇鏃ユ湡" [ref=f4e436]
+                      - columnheader "璁″垝鏁伴噺" [ref=f4e441]
+                      - columnheader "璐d换浜�" [ref=f4e446]
+                      - columnheader "琚嬬爜鏁伴噺" [ref=f4e451]
+                      - columnheader "鎵樼洏鐮佹暟閲�" [ref=f4e456]
+                      - columnheader "鎵规鐘舵��" [ref=f4e461]
+                      - columnheader "鍒涘缓鏃堕棿" [ref=f4e466]
+                - table [ref=f4e474]:
+                  - rowgroup [ref=f4e489]:
+                    - row [ref=f4e490]:
+                      - cell "ITEM_20260819003" [ref=f4e491]
+                      - cell "娴嬭瘯" [ref=f4e495]
+                      - cell "two" [ref=f4e499]
+                      - cell "浜х嚎浜�" [ref=f4e503]
+                      - cell "2026-08-21 13:39:56" [ref=f4e507]
+                      - cell "100" [ref=f4e511]
+                      - cell "鐙楄泲" [ref=f4e515]
+                      - cell "0" [ref=f4e519]
+                      - cell "0" [ref=f4e523]
+                      - cell "鑽夌" [ref=f4e527]
+                      - cell "2026-08-21 13:40:10" [ref=f4e531]
+                    - row [ref=f4e535]:
+                      - cell "ITEM_20260819003" [ref=f4e536]
+                      - cell "娴嬭瘯" [ref=f4e540]
+                      - cell "two" [ref=f4e544]
+                      - cell "浜х嚎浜�" [ref=f4e548]
+                      - cell "2026-08-19 10:48:02" [ref=f4e552]
+                      - cell "10000" [ref=f4e556]
+                      - cell "瓒呯骇绠$悊鍛�" [ref=f4e560]
+                      - cell "100" [ref=f4e564]
+                      - cell "10" [ref=f4e568]
+                      - cell "宸插畬鎴�" [ref=f4e572]
+                      - cell "2026-08-19 10:48:22" [ref=f4e576]
+              - generic:
+                - generic [ref=f4e580]:
+                  - table [ref=f4e583]:
+                    - rowgroup [ref=f4e598]:
+                      - row [ref=f4e599]:
+                        - columnheader "鎵规鍙�" [ref=f4e600]
+                  - table [ref=f4e607]:
+                    - rowgroup [ref=f4e610]:
+                      - row [ref=f4e611]:
+                        - cell [ref=f4e612]:
+                          - button "PC20260821twoITEM_001" [ref=f4e615] [cursor=pointer]
+                      - row [ref=f4e617]:
+                        - cell [ref=f4e618]:
+                          - button "PC20260819twoITEM_001" [ref=f4e621] [cursor=pointer]
+                - generic [ref=f4e623]:
+                  - table [ref=f4e626]:
+                    - rowgroup [ref=f4e641]:
+                      - row [ref=f4e642]:
+                        - columnheader "鎿嶄綔" [ref=f4e643]
+                  - table [ref=f4e650]:
+                    - rowgroup [ref=f4e653]:
+                      - row [ref=f4e654]:
+                        - cell [ref=f4e655]:
+                          - generic [ref=f4e658]:
+                            - generic [ref=f4e659]:
+                              - button "鏌ョ湅浜岀淮鐮�" [ref=f4e661] [cursor=pointer]
+                              - button "淇敼" [ref=f4e664] [cursor=pointer]
+                              - button "鍒犻櫎" [ref=f4e671] [cursor=pointer]
+                            - button "鏇村" [ref=f4e675] [cursor=pointer]
+                      - row [ref=f4e681]:
+                        - cell [ref=f4e682]:
+                          - generic [ref=f4e685]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f4e688] [cursor=pointer]
+                            - button "鏇村" [ref=f4e690] [cursor=pointer]
+            - generic [ref=f4e702]:
+              - generic [ref=f4e703]: 鍏� 2 鏉¤褰�
+              - generic [ref=f4e705] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f4e706]:
+                  - textbox "璇烽�夋嫨" [ref=f4e707]: 20鏉�/椤�
+                - generic [ref=f4e708]: 睿�
+              - button "飱�" [ref=f4e711]
+              - button "顧�" [ref=f4e713]
+              - button "顫�" [ref=f4e715]
+              - button "1" [ref=f4e718] [cursor=pointer]
+              - button "顫�" [ref=f4e719]
+              - button "顧�" [ref=f4e721]
+              - button "顦�" [ref=f4e723]
+  - dialog [ref=f4e726]:
+    - heading "棰勭敓鎴愭壒娆′簩缁寸爜" [level=2] [ref=f4e728]
+    - generic [ref=f4e732]:
+      - generic [ref=f4e733]:
+        - generic [ref=f4e734]:
+          - generic [ref=f4e735]: "*"
+          - text: 鐢熸垚涓暟
+        - generic [ref=f4e740]:
+          - generic [ref=f4e741]:
+            - button "Increase Value" [ref=f4e742] [cursor=pointer]:
+              - img "up" [ref=f4e743]
+            - button "Decrease Value" [ref=f4e746] [cursor=pointer]:
+              - img "down" [ref=f4e747]
+          - spinbutton "* 鐢熸垚涓暟" [ref=f4e751]: "3"
+      - generic [ref=f4e752]:
+        - generic [ref=f4e753]: 澶囨敞
+        - textbox "澶囨敞" [ref=f4e758]:
+          - /placeholder: 璇疯緭鍏ュ娉�
+    - button [ref=f4e759] [cursor=pointer]
+    - generic [ref=f4e769]:
+      - button "鍙� 娑�" [ref=f4e770] [cursor=pointer]
+      - button "纭� 璁�" [active] [ref=f4e772] [cursor=pointer]
+    - button [ref=f4e774] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T08-59-32-379Z.yml b/.playwright-mcp/page-2026-08-28T08-59-32-379Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T08-59-32-379Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T08-59-49-723Z.yml b/.playwright-mcp/page-2026-08-28T08-59-49-723Z.yml
new file mode 100644
index 0000000..ddb6c93
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T08-59-49-723Z.yml
@@ -0,0 +1 @@
+- generic [active] [ref=f7e1]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T09-00-00-757Z.yml b/.playwright-mcp/page-2026-08-28T09-00-00-757Z.yml
new file mode 100644
index 0000000..0b72361
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T09-00-00-757Z.yml
@@ -0,0 +1,104 @@
+- generic [ref=f7e7]:
+  - complementary [ref=f7e9]:
+    - generic [ref=f7e10]:
+      - generic [ref=f7e11] [cursor=pointer]
+      - link "娴嬭瘯鍏徃鍝堝搱 娴嬭瘯鍏徃鍝堝搱" [ref=f7e16] [cursor=pointer]:
+        - /url: javascript:void 0
+        - img "娴嬭瘯鍏徃鍝堝搱" [ref=f7e19]
+        - generic [ref=f7e20]: 娴嬭瘯鍏徃鍝堝搱
+      - menu [ref=f7e23]:
+        - menuitem "棣栭〉" [ref=f7e24] [cursor=pointer]
+        - listitem [ref=f7e29]:
+          - generic [ref=f7e30] [cursor=pointer]: 鍩虹鏁版嵁
+        - listitem [ref=f7e38]:
+          - generic [ref=f7e39] [cursor=pointer]: 浠撳偍鐗╂祦
+        - listitem [ref=f7e47]:
+          - generic [ref=f7e48] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+          - list:
+            - menuitem "鎵规鐢熶骇绠$悊" [ref=f7e365] [cursor=pointer]
+            - menuitem "璧嬬爜绠$悊" [ref=f7e370] [cursor=pointer]
+            - menuitem "鎵樼洏鐮佺鐞�" [ref=f7e376] [cursor=pointer]
+            - menuitem "浜х嚎缁存姢" [ref=f7e383] [cursor=pointer]
+            - menuitem "鐢熶骇绾挎壂鐮佸叆搴�" [ref=f7e390] [cursor=pointer]
+        - listitem [ref=f7e54]:
+          - generic [ref=f7e55] [cursor=pointer]: 璐ㄩ噺绠$悊
+        - listitem [ref=f7e61]:
+          - generic [ref=f7e62] [cursor=pointer]: 绯荤粺绠$悊
+      - generic [ref=f7e69] [cursor=pointer]
+  - generic [ref=f7e74]:
+    - generic [ref=f7e75]:
+      - banner [ref=f7e76]:
+        - button [ref=f7e77] [cursor=pointer]
+        - button [ref=f7e80] [cursor=pointer]
+        - navigation "breadcrumb" [ref=f7e85]:
+          - list [ref=f7e86]:
+            - listitem [ref=f7e87]:
+              - link "棣栭〉" [disabled] [ref=f7e88]
+        - generic [ref=f7e93]:
+          - generic [ref=f7e95] [cursor=pointer]:
+            - generic [ref=f7e99]: 鎼滅储
+            - generic [ref=f7e100]: Ctrl K
+          - button [ref=f7e102] [cursor=pointer]
+          - button "dark" [ref=f7e107] [cursor=pointer]
+          - button [ref=f7e116] [cursor=pointer]
+          - button [ref=f7e122] [cursor=pointer]
+          - button [ref=f7e125] [cursor=pointer]
+          - button [ref=f7e131] [cursor=pointer]:
+            - button [ref=f7e133]
+          - button "宸ヤ綔鍙�" [ref=f7e137] [cursor=pointer]
+          - button "鐞嗗憳" [ref=f7e141] [cursor=pointer]
+      - generic [ref=f7e148]:
+        - generic [ref=f7e149]: 棣栭〉
+        - generic [ref=f7e168]:
+          - button [ref=f7e169] [cursor=pointer]
+          - generic [ref=f7e176] [cursor=pointer]
+          - generic [ref=f7e180] [cursor=pointer]
+    - main [ref=f7e187]:
+      - generic [ref=f7e190]:
+        - generic [ref=f7e191]:
+          - generic [ref=f7e201] [cursor=pointer]:
+            - generic [ref=f7e202]: 鍝佺鎬绘暟
+            - generic [ref=f7e203]: "1"
+          - generic [ref=f7e214] [cursor=pointer]:
+            - generic [ref=f7e215]: MES 鍝佺
+            - generic [ref=f7e216]: "0"
+          - generic [ref=f7e227] [cursor=pointer]:
+            - generic [ref=f7e228]: 鍝佺鍒嗙被
+            - generic [ref=f7e229]: "1"
+          - generic [ref=f7e238] [cursor=pointer]:
+            - generic [ref=f7e239]: 璁¢噺鍗曚綅
+            - generic [ref=f7e240]: "1"
+        - generic [ref=f7e242]:
+          - generic [ref=f7e250] [cursor=pointer]:
+            - generic [ref=f7e251]: 浜х嚎
+            - generic [ref=f7e252]: "1"
+          - generic [ref=f7e264] [cursor=pointer]:
+            - generic [ref=f7e265]: 鐢熶骇鎵规
+            - generic [ref=f7e266]: "102"
+          - generic [ref=f7e275] [cursor=pointer]:
+            - generic [ref=f7e276]: 琚嬬爜
+            - generic [ref=f7e277]: 1,101
+          - generic [ref=f7e288] [cursor=pointer]:
+            - generic [ref=f7e289]: 鎵樼洏鐮�
+            - generic [ref=f7e290]: "11"
+        - generic [ref=f7e292]:
+          - generic [ref=f7e296]:
+            - generic [ref=f7e297]: 琚嬬爜鐢熸垚瓒嬪娍
+            - generic [ref=f7e299]:
+              - generic [ref=f7e300] [cursor=pointer]:
+                - generic [ref=f7e301]:
+                  - radio "杩� 7 澶�" [checked]
+                - generic [ref=f7e302]: 杩� 7 澶�
+              - generic [ref=f7e303] [cursor=pointer]:
+                - generic [ref=f7e304]:
+                  - radio "杩� 30 澶�"
+                - generic [ref=f7e305]: 杩� 30 澶�
+          - generic [ref=f7e310]: 鎵规鐘舵�佸垎甯�
+          - generic [ref=f7e319]: 琚嬬爜鐘舵�佸垎甯�
+        - generic [ref=f7e328]:
+          - generic [ref=f7e329]: 蹇嵎鍏ュ彛
+          - generic [ref=f7e333]:
+            - generic [ref=f7e334]: 鍝佺绠$悊
+            - generic [ref=f7e342]: 鍝佺鍒嗙被
+            - generic [ref=f7e350]: 鎵规鐢熶骇
+            - generic [ref=f7e359]: 璧嬬爜绠$悊
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T09-00-15-736Z.yml b/.playwright-mcp/page-2026-08-28T09-00-15-736Z.yml
new file mode 100644
index 0000000..dc7e064
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T09-00-15-736Z.yml
@@ -0,0 +1,110 @@
+- generic [ref=f7e7]:
+  - complementary [ref=f7e9]:
+    - generic [ref=f7e10]:
+      - generic [ref=f7e11] [cursor=pointer]
+      - link "娴嬭瘯鍏徃鍝堝搱 娴嬭瘯鍏徃鍝堝搱" [ref=f7e16] [cursor=pointer]:
+        - /url: javascript:void 0
+        - img "娴嬭瘯鍏徃鍝堝搱" [ref=f7e19]
+        - generic [ref=f7e20]: 娴嬭瘯鍏徃鍝堝搱
+      - menu [ref=f7e23]:
+        - menuitem "棣栭〉" [ref=f7e24] [cursor=pointer]
+        - listitem [ref=f7e29]:
+          - generic [ref=f7e30] [cursor=pointer]: 鍩虹鏁版嵁
+        - listitem [ref=f7e38]:
+          - generic [ref=f7e39] [cursor=pointer]: 浠撳偍鐗╂祦
+        - listitem [ref=f7e47]:
+          - generic [ref=f7e48] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+          - list [ref=f7e395]:
+            - menuitem "鎵规鐢熶骇绠$悊" [ref=f7e365] [cursor=pointer]
+            - menuitem "璧嬬爜绠$悊" [ref=f7e370] [cursor=pointer]
+            - menuitem "鎵樼洏鐮佺鐞�" [active] [ref=f7e376] [cursor=pointer]
+            - menuitem "浜х嚎缁存姢" [ref=f7e383] [cursor=pointer]
+            - menuitem "鐢熶骇绾挎壂鐮佸叆搴�" [ref=f7e390] [cursor=pointer]
+        - listitem [ref=f7e54]:
+          - generic [ref=f7e55] [cursor=pointer]: 璐ㄩ噺绠$悊
+        - listitem [ref=f7e61]:
+          - generic [ref=f7e62] [cursor=pointer]: 绯荤粺绠$悊
+      - generic [ref=f7e69] [cursor=pointer]
+  - generic [ref=f7e74]:
+    - generic [ref=f7e75]:
+      - banner [ref=f7e76]:
+        - button [ref=f7e77] [cursor=pointer]
+        - button [ref=f7e80] [cursor=pointer]
+        - navigation "breadcrumb" [ref=f7e85]:
+          - list [ref=f7e86]:
+            - listitem [ref=f7e396]:
+              - link "涓�琚嬩竴鐮佺鐞�" [ref=f7e397] [cursor=pointer]:
+                - /url: javascript:void 0
+              - listitem [ref=f7e401]
+            - listitem [ref=f7e404]:
+              - link "鎵樼洏鐮佺鐞�" [disabled] [ref=f7e405]
+        - generic [ref=f7e93]:
+          - generic [ref=f7e95] [cursor=pointer]:
+            - generic [ref=f7e99]: 鎼滅储
+            - generic [ref=f7e100]: Ctrl K
+          - button [ref=f7e102] [cursor=pointer]
+          - button "dark" [ref=f7e107] [cursor=pointer]
+          - button [ref=f7e116] [cursor=pointer]
+          - button [ref=f7e122] [cursor=pointer]
+          - button [ref=f7e125] [cursor=pointer]
+          - button [ref=f7e131] [cursor=pointer]:
+            - button [ref=f7e133]
+          - button "宸ヤ綔鍙�" [ref=f7e137] [cursor=pointer]
+          - button "鐞嗗憳" [ref=f7e141] [cursor=pointer]
+      - generic [ref=f7e148]:
+        - generic [ref=f7e153]:
+          - generic [ref=f7e154] [cursor=pointer]: 棣栭〉
+          - generic [ref=f7e414] [cursor=pointer]: 鎵樼洏鐮佺鐞�
+        - generic [ref=f7e168]:
+          - button [ref=f7e169] [cursor=pointer]
+          - generic [ref=f7e176] [cursor=pointer]
+          - generic [ref=f7e180] [cursor=pointer]
+    - main [ref=f7e187]:
+      - generic [ref=f7e190]:
+        - generic [ref=f7e191]:
+          - generic [ref=f7e201] [cursor=pointer]:
+            - generic [ref=f7e202]: 鍝佺鎬绘暟
+            - generic [ref=f7e203]: "1"
+          - generic [ref=f7e214] [cursor=pointer]:
+            - generic [ref=f7e215]: MES 鍝佺
+            - generic [ref=f7e216]: "0"
+          - generic [ref=f7e227] [cursor=pointer]:
+            - generic [ref=f7e228]: 鍝佺鍒嗙被
+            - generic [ref=f7e229]: "1"
+          - generic [ref=f7e238] [cursor=pointer]:
+            - generic [ref=f7e239]: 璁¢噺鍗曚綅
+            - generic [ref=f7e240]: "1"
+        - generic [ref=f7e242]:
+          - generic [ref=f7e250] [cursor=pointer]:
+            - generic [ref=f7e251]: 浜х嚎
+            - generic [ref=f7e252]: "1"
+          - generic [ref=f7e264] [cursor=pointer]:
+            - generic [ref=f7e265]: 鐢熶骇鎵规
+            - generic [ref=f7e266]: "102"
+          - generic [ref=f7e275] [cursor=pointer]:
+            - generic [ref=f7e276]: 琚嬬爜
+            - generic [ref=f7e277]: 1,101
+          - generic [ref=f7e288] [cursor=pointer]:
+            - generic [ref=f7e289]: 鎵樼洏鐮�
+            - generic [ref=f7e290]: "11"
+        - generic [ref=f7e292]:
+          - generic [ref=f7e296]:
+            - generic [ref=f7e297]: 琚嬬爜鐢熸垚瓒嬪娍
+            - generic [ref=f7e299]:
+              - generic [ref=f7e300] [cursor=pointer]:
+                - generic [ref=f7e301]:
+                  - radio "杩� 7 澶�" [checked]
+                - generic [ref=f7e302]: 杩� 7 澶�
+              - generic [ref=f7e303] [cursor=pointer]:
+                - generic [ref=f7e304]:
+                  - radio "杩� 30 澶�"
+                - generic [ref=f7e305]: 杩� 30 澶�
+          - generic [ref=f7e310]: 鎵规鐘舵�佸垎甯�
+          - generic [ref=f7e319]: 琚嬬爜鐘舵�佸垎甯�
+        - generic [ref=f7e328]:
+          - generic [ref=f7e329]: 蹇嵎鍏ュ彛
+          - generic [ref=f7e333]:
+            - generic [ref=f7e334]: 鍝佺绠$悊
+            - generic [ref=f7e342]: 鍝佺鍒嗙被
+            - generic [ref=f7e350]: 鎵规鐢熶骇
+            - generic [ref=f7e359]: 璧嬬爜绠$悊
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T09-02-56-093Z.yml b/.playwright-mcp/page-2026-08-28T09-02-56-093Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T09-02-56-093Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T09-03-07-573Z.yml b/.playwright-mcp/page-2026-08-28T09-03-07-573Z.yml
new file mode 100644
index 0000000..40fed56
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T09-03-07-573Z.yml
@@ -0,0 +1,336 @@
+- generic [ref=f9e7]:
+  - complementary [ref=f9e9]:
+    - generic [ref=f9e10]:
+      - generic [ref=f9e11] [cursor=pointer]
+      - link "娴嬭瘯鍏徃鍝堝搱 娴嬭瘯鍏徃鍝堝搱" [ref=f9e16] [cursor=pointer]:
+        - /url: javascript:void 0
+        - img "娴嬭瘯鍏徃鍝堝搱" [ref=f9e19]
+        - generic [ref=f9e20]: 娴嬭瘯鍏徃鍝堝搱
+      - menu [ref=f9e23]:
+        - menuitem "棣栭〉" [ref=f9e24] [cursor=pointer]
+        - listitem [ref=f9e29]:
+          - generic [ref=f9e30] [cursor=pointer]: 鍩虹鏁版嵁
+        - listitem [ref=f9e38]:
+          - generic [ref=f9e39] [cursor=pointer]: 浠撳偍鐗╂祦
+        - listitem [ref=f9e47]:
+          - generic [ref=f9e48] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+          - list [ref=f9e54]:
+            - menuitem "鎵规鐢熶骇绠$悊" [ref=f9e55] [cursor=pointer]
+            - menuitem "璧嬬爜绠$悊" [ref=f9e60] [cursor=pointer]
+            - menuitem "鎵樼洏鐮佺鐞�" [ref=f9e66] [cursor=pointer]
+            - menuitem "浜х嚎缁存姢" [ref=f9e73] [cursor=pointer]
+            - menuitem "鐢熶骇绾挎壂鐮佸叆搴�" [ref=f9e80] [cursor=pointer]
+        - listitem [ref=f9e85]:
+          - generic [ref=f9e86] [cursor=pointer]: 璐ㄩ噺绠$悊
+        - listitem [ref=f9e92]:
+          - generic [ref=f9e93] [cursor=pointer]: 绯荤粺绠$悊
+      - generic [ref=f9e100] [cursor=pointer]
+  - generic [ref=f9e105]:
+    - generic [ref=f9e106]:
+      - banner [ref=f9e107]:
+        - button [ref=f9e108] [cursor=pointer]
+        - button [ref=f9e111] [cursor=pointer]
+        - navigation "breadcrumb" [ref=f9e116]:
+          - list [ref=f9e117]:
+            - listitem [ref=f9e118]:
+              - link "涓�琚嬩竴鐮佺鐞�" [ref=f9e119] [cursor=pointer]:
+                - /url: javascript:void 0
+              - listitem [ref=f9e123]
+            - listitem [ref=f9e126]:
+              - link "鎵樼洏鐮佺鐞�" [disabled] [ref=f9e127]
+        - generic [ref=f9e134]:
+          - generic [ref=f9e136] [cursor=pointer]:
+            - generic [ref=f9e140]: 鎼滅储
+            - generic [ref=f9e141]: Ctrl K
+          - button [ref=f9e143] [cursor=pointer]
+          - button "dark" [ref=f9e148] [cursor=pointer]
+          - button [ref=f9e157] [cursor=pointer]
+          - button [ref=f9e163] [cursor=pointer]
+          - button [ref=f9e166] [cursor=pointer]
+          - button [ref=f9e172] [cursor=pointer]:
+            - button [ref=f9e174]
+          - button "宸ヤ綔鍙�" [ref=f9e178] [cursor=pointer]
+          - button "鐞嗗憳" [ref=f9e182] [cursor=pointer]
+      - generic [ref=f9e189]:
+        - generic [ref=f9e190]: 鎵樼洏鐮佺鐞�
+        - generic [ref=f9e211]:
+          - button [ref=f9e212] [cursor=pointer]
+          - generic [ref=f9e219] [cursor=pointer]
+          - generic [ref=f9e223] [cursor=pointer]
+    - main [ref=f9e230]:
+      - generic [ref=f9e235]:
+        - generic [ref=f9e240]:
+          - generic [ref=f9e241]:
+            - generic [ref=f9e242]: 鎵樼洏鐮�
+            - textbox "鎵樼洏鐮�" [ref=f9e248]:
+              - /placeholder: 璇疯緭鍏ユ墭鐩樼爜
+          - generic [ref=f9e250]:
+            - generic [ref=f9e251]: 鎵规鍙�
+            - textbox "鎵规鍙�" [ref=f9e257]:
+              - /placeholder: 璇疯緭鍏ユ壒娆″彿
+          - generic [ref=f9e259]:
+            - generic [ref=f9e260]: 鎵樼洏鐘舵��
+            - generic [ref=f9e266] [cursor=pointer]:
+              - combobox "鎵樼洏鐘舵��" [ref=f9e268]
+              - generic: 璇烽�夋嫨鎵樼洏鐘舵��
+          - generic [ref=f9e269]:
+            - generic [ref=f9e270]: 鍒涘缓鏃堕棿
+            - generic [ref=f9e275]:
+              - textbox "鍒涘缓鏃堕棿" [ref=f9e277]:
+                - /placeholder: 寮�濮嬫椂闂�
+              - generic "to" [ref=f9e279]:
+                - img "swap-right" [ref=f9e280]
+              - textbox "缁撴潫鏃堕棿" [ref=f9e284]
+              - generic:
+                - img "calendar"
+          - generic [ref=f9e285]:
+            - button "閲� 缃�" [ref=f9e286] [cursor=pointer]
+            - button "鎼� 绱�" [ref=f9e288] [cursor=pointer]
+            - generic [ref=f9e290] [cursor=pointer]: 鏀惰捣
+        - generic [ref=f9e297]:
+          - generic [ref=f9e299]:
+            - generic [ref=f9e300]: 鎵樼洏鐮佸垪琛�
+            - generic [ref=f9e304]:
+              - generic [ref=f9e306]:
+                - button "棰勭敓鎴愪簩缁寸爜" [ref=f9e308] [cursor=pointer]
+                - button "缁戝畾鎵规" [ref=f9e313] [cursor=pointer]
+                - button "鎵爜杩芥函" [ref=f9e320] [cursor=pointer]
+                - button "瀵煎嚭浜岀淮鐮�" [ref=f9e327] [cursor=pointer]
+                - button "瀵煎嚭" [ref=f9e334] [cursor=pointer]
+              - button "顫�" [ref=f9e340] [cursor=pointer]
+            - generic [ref=f9e342]:
+              - button "瞟�" [ref=f9e343] [cursor=pointer]
+              - button "顪�" [ref=f9e345] [cursor=pointer]
+              - button "顦�" [ref=f9e347] [cursor=pointer]
+          - generic [ref=f9e354]:
+            - generic [ref=f9e355]:
+              - table [ref=f9e359]:
+                - rowgroup [ref=f9e371]:
+                  - row [ref=f9e1147]:
+                    - columnheader "睿�" [ref=f9e1148]:
+                      - generic "鍏ㄩ��/鍙栨秷" [ref=f9e378] [cursor=pointer]: 睿�
+                    - columnheader "鎵樼洏搴忓彿" [ref=f9e381]
+                    - columnheader "鎵规鍙�" [ref=f9e386]
+                    - columnheader "鍙琚嬫暟锛堣/鎵樼洏锛�" [ref=f9e391]
+                    - columnheader "宸茬粦琚嬬爜鏁伴噺" [ref=f9e396]
+                    - columnheader "鎵樼洏鐘舵��" [ref=f9e401]
+                    - columnheader "澶囨敞" [ref=f9e406]
+                    - columnheader "鍒涘缓鏃堕棿" [ref=f9e411]
+              - table [ref=f9e419]:
+                - rowgroup [ref=f9e431]:
+                  - row "顧� 鏈粦瀹氭壒娆� 100 0 鍚敤 2026-08-28 16:28:05" [ref=f9e1149]:
+                    - cell "顧�" [ref=f9e1150]
+                    - cell [ref=f9e438]
+                    - cell "鏈粦瀹氭壒娆�" [ref=f9e442]
+                    - cell "100" [ref=f9e446]
+                    - cell "0" [ref=f9e450]
+                    - cell "鍚敤" [ref=f9e454]
+                    - cell [ref=f9e458]
+                    - cell "2026-08-28 16:28:05" [ref=f9e462]
+                  - row "顪� 10 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e466]:
+                    - cell "顪�" [ref=f9e467]
+                    - cell "10" [ref=f9e472]
+                    - cell "PC20260819twoITEM_001" [ref=f9e476]
+                    - cell "1000" [ref=f9e479]
+                    - cell "0" [ref=f9e483]
+                    - cell "鍚敤" [ref=f9e487]
+                    - cell [ref=f9e491]
+                    - cell "2026-08-19 10:53:29" [ref=f9e495]
+                  - row "顪� 9 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e499]:
+                    - cell "顪�" [ref=f9e500]
+                    - cell "9" [ref=f9e505]
+                    - cell "PC20260819twoITEM_001" [ref=f9e509]
+                    - cell "1000" [ref=f9e512]
+                    - cell "0" [ref=f9e516]
+                    - cell "鍚敤" [ref=f9e520]
+                    - cell [ref=f9e524]
+                    - cell "2026-08-19 10:53:29" [ref=f9e528]
+                  - row "顪� 8 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e532]:
+                    - cell "顪�" [ref=f9e533]
+                    - cell "8" [ref=f9e538]
+                    - cell "PC20260819twoITEM_001" [ref=f9e542]
+                    - cell "1000" [ref=f9e545]
+                    - cell "0" [ref=f9e549]
+                    - cell "鍚敤" [ref=f9e553]
+                    - cell [ref=f9e557]
+                    - cell "2026-08-19 10:53:29" [ref=f9e561]
+                  - row "顪� 7 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e565]:
+                    - cell "顪�" [ref=f9e566]
+                    - cell "7" [ref=f9e571]
+                    - cell "PC20260819twoITEM_001" [ref=f9e575]
+                    - cell "1000" [ref=f9e578]
+                    - cell "0" [ref=f9e582]
+                    - cell "鍚敤" [ref=f9e586]
+                    - cell [ref=f9e590]
+                    - cell "2026-08-19 10:53:29" [ref=f9e594]
+                  - row "顪� 6 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e598]:
+                    - cell "顪�" [ref=f9e599]
+                    - cell "6" [ref=f9e604]
+                    - cell "PC20260819twoITEM_001" [ref=f9e608]
+                    - cell "1000" [ref=f9e611]
+                    - cell "0" [ref=f9e615]
+                    - cell "鍚敤" [ref=f9e619]
+                    - cell [ref=f9e623]
+                    - cell "2026-08-19 10:53:29" [ref=f9e627]
+                  - row "顪� 5 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e631]:
+                    - cell "顪�" [ref=f9e632]
+                    - cell "5" [ref=f9e637]
+                    - cell "PC20260819twoITEM_001" [ref=f9e641]
+                    - cell "1000" [ref=f9e644]
+                    - cell "0" [ref=f9e648]
+                    - cell "鍚敤" [ref=f9e652]
+                    - cell [ref=f9e656]
+                    - cell "2026-08-19 10:53:29" [ref=f9e660]
+                  - row "顪� 4 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e664]:
+                    - cell "顪�" [ref=f9e665]
+                    - cell "4" [ref=f9e670]
+                    - cell "PC20260819twoITEM_001" [ref=f9e674]
+                    - cell "1000" [ref=f9e677]
+                    - cell "0" [ref=f9e681]
+                    - cell "鍚敤" [ref=f9e685]
+                    - cell [ref=f9e689]
+                    - cell "2026-08-19 10:53:29" [ref=f9e693]
+                  - row "顪� 3 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e697]:
+                    - cell "顪�" [ref=f9e698]
+                    - cell "3" [ref=f9e703]
+                    - cell "PC20260819twoITEM_001" [ref=f9e707]
+                    - cell "1000" [ref=f9e710]
+                    - cell "0" [ref=f9e714]
+                    - cell "鍚敤" [ref=f9e718]
+                    - cell [ref=f9e722]
+                    - cell "2026-08-19 10:53:29" [ref=f9e726]
+                  - row "顪� 2 PC20260819twoITEM_001 1000 20 鍚敤 2026-08-19 10:53:29" [ref=f9e730]:
+                    - cell "顪�" [ref=f9e731]
+                    - cell "2" [ref=f9e736]
+                    - cell "PC20260819twoITEM_001" [ref=f9e740]
+                    - cell "1000" [ref=f9e743]
+                    - cell "20" [ref=f9e747]
+                    - cell "鍚敤" [ref=f9e751]
+                    - cell [ref=f9e755]
+                    - cell "2026-08-19 10:53:29" [ref=f9e759]
+                  - row "顪� 1 PC20260819twoITEM_001 1000 40 鍚敤 2026-08-19 10:53:29" [ref=f9e763]:
+                    - cell "顪�" [ref=f9e764]
+                    - cell "1" [ref=f9e769]
+                    - cell "PC20260819twoITEM_001" [ref=f9e773]
+                    - cell "1000" [ref=f9e776]
+                    - cell "40" [ref=f9e780]
+                    - cell "鍚敤" [ref=f9e784]
+                    - cell [ref=f9e788]
+                    - cell "2026-08-19 10:53:29" [ref=f9e792]
+            - generic:
+              - generic [ref=f9e796]:
+                - table [ref=f9e799]:
+                  - rowgroup [ref=f9e811]:
+                    - row [ref=f9e812]:
+                      - columnheader "鎵樼洏鐮�" [ref=f9e813]
+                - table [ref=f9e820]:
+                  - rowgroup [ref=f9e823]:
+                    - row [ref=f9e824]:
+                      - cell "PL-00000001 鏈粦瀹氭壒娆�" [ref=f9e825]:
+                        - generic [ref=f9e827]:
+                          - text: PL-00000001
+                          - generic [ref=f9e828]: 鏈粦瀹氭壒娆�
+                    - row [ref=f9e829]:
+                      - cell "PC20260819twoITEM_001-P10" [ref=f9e830]
+                    - row [ref=f9e833]:
+                      - cell "PC20260819twoITEM_001-P09" [ref=f9e834]
+                    - row [ref=f9e837]:
+                      - cell "PC20260819twoITEM_001-P08" [ref=f9e838]
+                    - row [ref=f9e841]:
+                      - cell "PC20260819twoITEM_001-P07" [ref=f9e842]
+                    - row [ref=f9e845]:
+                      - cell "PC20260819twoITEM_001-P06" [ref=f9e846]
+                    - row [ref=f9e849]:
+                      - cell "PC20260819twoITEM_001-P05" [ref=f9e850]
+                    - row [ref=f9e853]:
+                      - cell "PC20260819twoITEM_001-P04" [ref=f9e854]
+                    - row [ref=f9e857]:
+                      - cell "PC20260819twoITEM_001-P03" [ref=f9e858]
+                    - row [ref=f9e861]:
+                      - cell "PC20260819twoITEM_001-P02" [ref=f9e862]
+                    - row [ref=f9e865]:
+                      - cell "PC20260819twoITEM_001-P01" [ref=f9e866]
+              - generic [ref=f9e869]:
+                - table [ref=f9e872]:
+                  - rowgroup [ref=f9e884]:
+                    - row [ref=f9e885]:
+                      - columnheader "鎿嶄綔" [ref=f9e886]
+                - table [ref=f9e893]:
+                  - rowgroup [ref=f9e896]:
+                    - row [ref=f9e897]:
+                      - cell [ref=f9e898]:
+                        - generic [ref=f9e902]:
+                          - button "鏌ョ湅浜岀淮鐮�" [ref=f9e904] [cursor=pointer]
+                          - button "瀵煎嚭浜岀淮鐮�" [ref=f9e907] [cursor=pointer]
+                          - button "鍒犻櫎" [ref=f9e914] [cursor=pointer]
+                    - row [ref=f9e918]:
+                      - cell [ref=f9e919]:
+                        - generic [ref=f9e923]:
+                          - button "鏌ョ湅浜岀淮鐮�" [ref=f9e925] [cursor=pointer]
+                          - button "瀵煎嚭浜岀淮鐮�" [ref=f9e928] [cursor=pointer]
+                          - button "鍒犻櫎" [ref=f9e935] [cursor=pointer]
+                    - row [ref=f9e939]:
+                      - cell [ref=f9e940]:
+                        - generic [ref=f9e944]:
+                          - button "鏌ョ湅浜岀淮鐮�" [ref=f9e946] [cursor=pointer]
+                          - button "瀵煎嚭浜岀淮鐮�" [ref=f9e949] [cursor=pointer]
+                          - button "鍒犻櫎" [ref=f9e956] [cursor=pointer]
+                    - row [ref=f9e960]:
+                      - cell [ref=f9e961]:
+                        - generic [ref=f9e965]:
+                          - button "鏌ョ湅浜岀淮鐮�" [ref=f9e967] [cursor=pointer]
+                          - button "瀵煎嚭浜岀淮鐮�" [ref=f9e970] [cursor=pointer]
+                          - button "鍒犻櫎" [ref=f9e977] [cursor=pointer]
+                    - row [ref=f9e981]:
+                      - cell [ref=f9e982]:
+                        - generic [ref=f9e986]:
+                          - button "鏌ョ湅浜岀淮鐮�" [ref=f9e988] [cursor=pointer]
+                          - button "瀵煎嚭浜岀淮鐮�" [ref=f9e991] [cursor=pointer]
+                          - button "鍒犻櫎" [ref=f9e998] [cursor=pointer]
+                    - row [ref=f9e1002]:
+                      - cell [ref=f9e1003]:
+                        - generic [ref=f9e1007]:
+                          - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1009] [cursor=pointer]
+                          - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1012] [cursor=pointer]
+                          - button "鍒犻櫎" [ref=f9e1019] [cursor=pointer]
+                    - row [ref=f9e1023]:
+                      - cell [ref=f9e1024]:
+                        - generic [ref=f9e1028]:
+                          - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1030] [cursor=pointer]
+                          - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1033] [cursor=pointer]
+                          - button "鍒犻櫎" [ref=f9e1040] [cursor=pointer]
+                    - row [ref=f9e1044]:
+                      - cell [ref=f9e1045]:
+                        - generic [ref=f9e1049]:
+                          - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1051] [cursor=pointer]
+                          - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1054] [cursor=pointer]
+                          - button "鍒犻櫎" [ref=f9e1061] [cursor=pointer]
+                    - row [ref=f9e1065]:
+                      - cell [ref=f9e1066]:
+                        - generic [ref=f9e1070]:
+                          - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1072] [cursor=pointer]
+                          - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1075] [cursor=pointer]
+                          - button "鍒犻櫎" [ref=f9e1082] [cursor=pointer]
+                    - row [ref=f9e1086]:
+                      - cell [ref=f9e1087]:
+                        - generic [ref=f9e1091]:
+                          - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1093] [cursor=pointer]
+                          - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1096] [cursor=pointer]
+                    - row [ref=f9e1102]:
+                      - cell [ref=f9e1103]:
+                        - generic [ref=f9e1107]:
+                          - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1109] [cursor=pointer]
+                          - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1112] [cursor=pointer]
+          - generic [ref=f9e1124]:
+            - generic [ref=f9e1125]: 鍏� 11 鏉¤褰�
+            - generic [ref=f9e1127] [cursor=pointer]:
+              - generic "20鏉�/椤�" [ref=f9e1128]:
+                - textbox "璇烽�夋嫨" [ref=f9e1129]: 20鏉�/椤�
+              - generic [ref=f9e1130]: 睿�
+            - button "飱�" [ref=f9e1133]
+            - button "顧�" [ref=f9e1135]
+            - button "顫�" [ref=f9e1137]
+            - button "1" [ref=f9e1140] [cursor=pointer]
+            - button "顫�" [ref=f9e1141]
+            - button "顧�" [ref=f9e1143]
+            - button "顦�" [ref=f9e1145]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T09-03-14-535Z.yml b/.playwright-mcp/page-2026-08-28T09-03-14-535Z.yml
new file mode 100644
index 0000000..989050c
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T09-03-14-535Z.yml
@@ -0,0 +1,351 @@
+- generic [ref=f9e4]:
+  - generic [ref=f9e7]:
+    - complementary [ref=f9e9]:
+      - generic [ref=f9e10]:
+        - generic [ref=f9e11] [cursor=pointer]
+        - link "娴嬭瘯鍏徃鍝堝搱 娴嬭瘯鍏徃鍝堝搱" [ref=f9e16] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "娴嬭瘯鍏徃鍝堝搱" [ref=f9e19]
+          - generic [ref=f9e20]: 娴嬭瘯鍏徃鍝堝搱
+        - menu [ref=f9e23]:
+          - menuitem "棣栭〉" [ref=f9e24] [cursor=pointer]
+          - listitem [ref=f9e29]:
+            - generic [ref=f9e30] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f9e38]:
+            - generic [ref=f9e39] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f9e47]:
+            - generic [ref=f9e48] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f9e54]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f9e55] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f9e60] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f9e66] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f9e73] [cursor=pointer]
+              - menuitem "鐢熶骇绾挎壂鐮佸叆搴�" [ref=f9e80] [cursor=pointer]
+          - listitem [ref=f9e85]:
+            - generic [ref=f9e86] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f9e92]:
+            - generic [ref=f9e93] [cursor=pointer]: 绯荤粺绠$悊
+        - generic [ref=f9e100] [cursor=pointer]
+    - generic [ref=f9e105]:
+      - generic [ref=f9e106]:
+        - banner [ref=f9e107]:
+          - button [ref=f9e108] [cursor=pointer]
+          - button [ref=f9e111] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f9e116]:
+            - list [ref=f9e117]:
+              - listitem [ref=f9e118]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f9e119] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f9e123]
+              - listitem [ref=f9e126]:
+                - link "鎵樼洏鐮佺鐞�" [disabled] [ref=f9e127]
+          - generic [ref=f9e134]:
+            - generic [ref=f9e136] [cursor=pointer]:
+              - generic [ref=f9e140]: 鎼滅储
+              - generic [ref=f9e141]: Ctrl K
+            - button [ref=f9e143] [cursor=pointer]
+            - button "dark" [ref=f9e148] [cursor=pointer]
+            - button [ref=f9e157] [cursor=pointer]
+            - button [ref=f9e163] [cursor=pointer]
+            - button [ref=f9e166] [cursor=pointer]
+            - button [ref=f9e172] [cursor=pointer]:
+              - button [ref=f9e174]
+            - button "宸ヤ綔鍙�" [ref=f9e178] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f9e182] [cursor=pointer]
+        - generic [ref=f9e189]:
+          - generic [ref=f9e190]: 鎵樼洏鐮佺鐞�
+          - generic [ref=f9e211]:
+            - button [ref=f9e212] [cursor=pointer]
+            - generic [ref=f9e219] [cursor=pointer]
+            - generic [ref=f9e223] [cursor=pointer]
+      - main [ref=f9e230]:
+        - generic [ref=f9e235]:
+          - generic [ref=f9e240]:
+            - generic [ref=f9e241]:
+              - generic [ref=f9e242]: 鎵樼洏鐮�
+              - textbox "鎵樼洏鐮�" [ref=f9e248]:
+                - /placeholder: 璇疯緭鍏ユ墭鐩樼爜
+            - generic [ref=f9e250]:
+              - generic [ref=f9e251]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f9e257]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f9e259]:
+              - generic [ref=f9e260]: 鎵樼洏鐘舵��
+              - generic [ref=f9e266] [cursor=pointer]:
+                - combobox "鎵樼洏鐘舵��" [ref=f9e268]
+                - generic: 璇烽�夋嫨鎵樼洏鐘舵��
+            - generic [ref=f9e269]:
+              - generic [ref=f9e270]: 鍒涘缓鏃堕棿
+              - generic [ref=f9e275]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f9e277]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f9e279]:
+                  - img "swap-right" [ref=f9e280]
+                - textbox "缁撴潫鏃堕棿" [ref=f9e284]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f9e285]:
+              - button "閲� 缃�" [ref=f9e286] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f9e288] [cursor=pointer]
+              - generic [ref=f9e290] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f9e297]:
+            - generic [ref=f9e299]:
+              - generic [ref=f9e300]: 鎵樼洏鐮佸垪琛�
+              - generic [ref=f9e304]:
+                - generic [ref=f9e306]:
+                  - button "棰勭敓鎴愪簩缁寸爜" [ref=f9e308] [cursor=pointer]
+                  - button "缁戝畾鎵规" [active] [ref=f9e313] [cursor=pointer]
+                  - button "鎵爜杩芥函" [ref=f9e320] [cursor=pointer]
+                  - button "瀵煎嚭浜岀淮鐮�" [ref=f9e327] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f9e334] [cursor=pointer]
+                - button "顫�" [ref=f9e340] [cursor=pointer]
+              - generic [ref=f9e342]:
+                - button "瞟�" [ref=f9e343] [cursor=pointer]
+                - button "顪�" [ref=f9e345] [cursor=pointer]
+                - button "顦�" [ref=f9e347] [cursor=pointer]
+            - generic [ref=f9e354]:
+              - generic [ref=f9e355]:
+                - table [ref=f9e359]:
+                  - rowgroup [ref=f9e371]:
+                    - row [ref=f9e1147]:
+                      - columnheader "睿�" [ref=f9e1148]:
+                        - generic "鍏ㄩ��/鍙栨秷" [ref=f9e378] [cursor=pointer]: 睿�
+                      - columnheader "鎵樼洏搴忓彿" [ref=f9e381]
+                      - columnheader "鎵规鍙�" [ref=f9e386]
+                      - columnheader "鍙琚嬫暟锛堣/鎵樼洏锛�" [ref=f9e391]
+                      - columnheader "宸茬粦琚嬬爜鏁伴噺" [ref=f9e396]
+                      - columnheader "鎵樼洏鐘舵��" [ref=f9e401]
+                      - columnheader "澶囨敞" [ref=f9e406]
+                      - columnheader "鍒涘缓鏃堕棿" [ref=f9e411]
+                - table [ref=f9e419]:
+                  - rowgroup [ref=f9e431]:
+                    - row "顧� 鏈粦瀹氭壒娆� 100 0 鍚敤 2026-08-28 16:28:05" [ref=f9e1149]:
+                      - cell "顧�" [ref=f9e1150]
+                      - cell [ref=f9e438]
+                      - cell "鏈粦瀹氭壒娆�" [ref=f9e442]
+                      - cell "100" [ref=f9e446]
+                      - cell "0" [ref=f9e450]
+                      - cell "鍚敤" [ref=f9e454]
+                      - cell [ref=f9e458]
+                      - cell "2026-08-28 16:28:05" [ref=f9e462]
+                    - row "顪� 10 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e466]:
+                      - cell "顪�" [ref=f9e467]
+                      - cell "10" [ref=f9e472]
+                      - cell "PC20260819twoITEM_001" [ref=f9e476]
+                      - cell "1000" [ref=f9e479]
+                      - cell "0" [ref=f9e483]
+                      - cell "鍚敤" [ref=f9e487]
+                      - cell [ref=f9e491]
+                      - cell "2026-08-19 10:53:29" [ref=f9e495]
+                    - row "顪� 9 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e499]:
+                      - cell "顪�" [ref=f9e500]
+                      - cell "9" [ref=f9e505]
+                      - cell "PC20260819twoITEM_001" [ref=f9e509]
+                      - cell "1000" [ref=f9e512]
+                      - cell "0" [ref=f9e516]
+                      - cell "鍚敤" [ref=f9e520]
+                      - cell [ref=f9e524]
+                      - cell "2026-08-19 10:53:29" [ref=f9e528]
+                    - row "顪� 8 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e532]:
+                      - cell "顪�" [ref=f9e533]
+                      - cell "8" [ref=f9e538]
+                      - cell "PC20260819twoITEM_001" [ref=f9e542]
+                      - cell "1000" [ref=f9e545]
+                      - cell "0" [ref=f9e549]
+                      - cell "鍚敤" [ref=f9e553]
+                      - cell [ref=f9e557]
+                      - cell "2026-08-19 10:53:29" [ref=f9e561]
+                    - row "顪� 7 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e565]:
+                      - cell "顪�" [ref=f9e566]
+                      - cell "7" [ref=f9e571]
+                      - cell "PC20260819twoITEM_001" [ref=f9e575]
+                      - cell "1000" [ref=f9e578]
+                      - cell "0" [ref=f9e582]
+                      - cell "鍚敤" [ref=f9e586]
+                      - cell [ref=f9e590]
+                      - cell "2026-08-19 10:53:29" [ref=f9e594]
+                    - row "顪� 6 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e598]:
+                      - cell "顪�" [ref=f9e599]
+                      - cell "6" [ref=f9e604]
+                      - cell "PC20260819twoITEM_001" [ref=f9e608]
+                      - cell "1000" [ref=f9e611]
+                      - cell "0" [ref=f9e615]
+                      - cell "鍚敤" [ref=f9e619]
+                      - cell [ref=f9e623]
+                      - cell "2026-08-19 10:53:29" [ref=f9e627]
+                    - row "顪� 5 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e631]:
+                      - cell "顪�" [ref=f9e632]
+                      - cell "5" [ref=f9e637]
+                      - cell "PC20260819twoITEM_001" [ref=f9e641]
+                      - cell "1000" [ref=f9e644]
+                      - cell "0" [ref=f9e648]
+                      - cell "鍚敤" [ref=f9e652]
+                      - cell [ref=f9e656]
+                      - cell "2026-08-19 10:53:29" [ref=f9e660]
+                    - row "顪� 4 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e664]:
+                      - cell "顪�" [ref=f9e665]
+                      - cell "4" [ref=f9e670]
+                      - cell "PC20260819twoITEM_001" [ref=f9e674]
+                      - cell "1000" [ref=f9e677]
+                      - cell "0" [ref=f9e681]
+                      - cell "鍚敤" [ref=f9e685]
+                      - cell [ref=f9e689]
+                      - cell "2026-08-19 10:53:29" [ref=f9e693]
+                    - row "顪� 3 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e697]:
+                      - cell "顪�" [ref=f9e698]
+                      - cell "3" [ref=f9e703]
+                      - cell "PC20260819twoITEM_001" [ref=f9e707]
+                      - cell "1000" [ref=f9e710]
+                      - cell "0" [ref=f9e714]
+                      - cell "鍚敤" [ref=f9e718]
+                      - cell [ref=f9e722]
+                      - cell "2026-08-19 10:53:29" [ref=f9e726]
+                    - row "顪� 2 PC20260819twoITEM_001 1000 20 鍚敤 2026-08-19 10:53:29" [ref=f9e730]:
+                      - cell "顪�" [ref=f9e731]
+                      - cell "2" [ref=f9e736]
+                      - cell "PC20260819twoITEM_001" [ref=f9e740]
+                      - cell "1000" [ref=f9e743]
+                      - cell "20" [ref=f9e747]
+                      - cell "鍚敤" [ref=f9e751]
+                      - cell [ref=f9e755]
+                      - cell "2026-08-19 10:53:29" [ref=f9e759]
+                    - row "顪� 1 PC20260819twoITEM_001 1000 40 鍚敤 2026-08-19 10:53:29" [ref=f9e763]:
+                      - cell "顪�" [ref=f9e764]
+                      - cell "1" [ref=f9e769]
+                      - cell "PC20260819twoITEM_001" [ref=f9e773]
+                      - cell "1000" [ref=f9e776]
+                      - cell "40" [ref=f9e780]
+                      - cell "鍚敤" [ref=f9e784]
+                      - cell [ref=f9e788]
+                      - cell "2026-08-19 10:53:29" [ref=f9e792]
+              - generic:
+                - generic [ref=f9e796]:
+                  - table [ref=f9e799]:
+                    - rowgroup [ref=f9e811]:
+                      - row [ref=f9e812]:
+                        - columnheader "鎵樼洏鐮�" [ref=f9e813]
+                  - table [ref=f9e820]:
+                    - rowgroup [ref=f9e823]:
+                      - row [ref=f9e824]:
+                        - cell "PL-00000001 鏈粦瀹氭壒娆�" [ref=f9e825]:
+                          - generic [ref=f9e827]:
+                            - text: PL-00000001
+                            - generic [ref=f9e828]: 鏈粦瀹氭壒娆�
+                      - row [ref=f9e829]:
+                        - cell "PC20260819twoITEM_001-P10" [ref=f9e830]
+                      - row [ref=f9e833]:
+                        - cell "PC20260819twoITEM_001-P09" [ref=f9e834]
+                      - row [ref=f9e837]:
+                        - cell "PC20260819twoITEM_001-P08" [ref=f9e838]
+                      - row [ref=f9e841]:
+                        - cell "PC20260819twoITEM_001-P07" [ref=f9e842]
+                      - row [ref=f9e845]:
+                        - cell "PC20260819twoITEM_001-P06" [ref=f9e846]
+                      - row [ref=f9e849]:
+                        - cell "PC20260819twoITEM_001-P05" [ref=f9e850]
+                      - row [ref=f9e853]:
+                        - cell "PC20260819twoITEM_001-P04" [ref=f9e854]
+                      - row [ref=f9e857]:
+                        - cell "PC20260819twoITEM_001-P03" [ref=f9e858]
+                      - row [ref=f9e861]:
+                        - cell "PC20260819twoITEM_001-P02" [ref=f9e862]
+                      - row [ref=f9e865]:
+                        - cell "PC20260819twoITEM_001-P01" [ref=f9e866]
+                - generic [ref=f9e869]:
+                  - table [ref=f9e872]:
+                    - rowgroup [ref=f9e884]:
+                      - row [ref=f9e885]:
+                        - columnheader "鎿嶄綔" [ref=f9e886]
+                  - table [ref=f9e893]:
+                    - rowgroup [ref=f9e896]:
+                      - row [ref=f9e897]:
+                        - cell [ref=f9e898]:
+                          - generic [ref=f9e902]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e904] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e907] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e914] [cursor=pointer]
+                      - row [ref=f9e918]:
+                        - cell [ref=f9e919]:
+                          - generic [ref=f9e923]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e925] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e928] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e935] [cursor=pointer]
+                      - row [ref=f9e939]:
+                        - cell [ref=f9e940]:
+                          - generic [ref=f9e944]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e946] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e949] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e956] [cursor=pointer]
+                      - row [ref=f9e960]:
+                        - cell [ref=f9e961]:
+                          - generic [ref=f9e965]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e967] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e970] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e977] [cursor=pointer]
+                      - row [ref=f9e981]:
+                        - cell [ref=f9e982]:
+                          - generic [ref=f9e986]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e988] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e991] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e998] [cursor=pointer]
+                      - row [ref=f9e1002]:
+                        - cell [ref=f9e1003]:
+                          - generic [ref=f9e1007]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1009] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1012] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e1019] [cursor=pointer]
+                      - row [ref=f9e1023]:
+                        - cell [ref=f9e1024]:
+                          - generic [ref=f9e1028]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1030] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1033] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e1040] [cursor=pointer]
+                      - row [ref=f9e1044]:
+                        - cell [ref=f9e1045]:
+                          - generic [ref=f9e1049]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1051] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1054] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e1061] [cursor=pointer]
+                      - row [ref=f9e1065]:
+                        - cell [ref=f9e1066]:
+                          - generic [ref=f9e1070]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1072] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1075] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e1082] [cursor=pointer]
+                      - row [ref=f9e1086]:
+                        - cell [ref=f9e1087]:
+                          - generic [ref=f9e1091]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1093] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1096] [cursor=pointer]
+                      - row [ref=f9e1102]:
+                        - cell [ref=f9e1103]:
+                          - generic [ref=f9e1107]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1109] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1112] [cursor=pointer]
+            - generic [ref=f9e1124]:
+              - generic [ref=f9e1125]: 鍏� 11 鏉¤褰�
+              - generic [ref=f9e1127] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f9e1128]:
+                  - textbox "璇烽�夋嫨" [ref=f9e1129]: 20鏉�/椤�
+                - generic [ref=f9e1130]: 睿�
+              - button "飱�" [ref=f9e1133]
+              - button "顧�" [ref=f9e1135]
+              - button "顫�" [ref=f9e1137]
+              - button "1" [ref=f9e1140] [cursor=pointer]
+              - button "顫�" [ref=f9e1141]
+              - button "顧�" [ref=f9e1143]
+              - button "顦�" [ref=f9e1145]
+  - dialog [ref=f9e1152]:
+    - heading "鎵樼洏鐮佺粦瀹氱敓浜ф壒娆�" [level=2] [ref=f9e1154]
+    - generic [ref=f9e1159]:
+      - generic [ref=f9e1160]:
+        - generic [ref=f9e1161]: "*"
+        - text: 鐢熶骇鎵规
+      - generic [ref=f9e1167]:
+        - combobox "* 鐢熶骇鎵规" [ref=f9e1169]
+        - generic: 璇烽�夋嫨宸茶ˉ褰曚笖鐢熶骇涓殑鎵规
+    - button [ref=f9e1170] [cursor=pointer]
+    - generic [ref=f9e1180]:
+      - button "鍙� 娑�" [ref=f9e1181] [cursor=pointer]
+      - button "纭� 璁�" [ref=f9e1183] [cursor=pointer]
+    - button [ref=f9e1185] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T09-04-30-577Z.yml b/.playwright-mcp/page-2026-08-28T09-04-30-577Z.yml
new file mode 100644
index 0000000..6b82cb1
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T09-04-30-577Z.yml
@@ -0,0 +1,354 @@
+- generic [ref=f9e4]:
+  - generic [ref=f9e7]:
+    - complementary [ref=f9e9]:
+      - generic [ref=f9e10]:
+        - generic [ref=f9e11] [cursor=pointer]
+        - link "娴嬭瘯鍏徃鍝堝搱 娴嬭瘯鍏徃鍝堝搱" [ref=f9e16] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "娴嬭瘯鍏徃鍝堝搱" [ref=f9e19]
+          - generic [ref=f9e20]: 娴嬭瘯鍏徃鍝堝搱
+        - menu [ref=f9e23]:
+          - menuitem "棣栭〉" [ref=f9e24] [cursor=pointer]
+          - listitem [ref=f9e29]:
+            - generic [ref=f9e30] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f9e38]:
+            - generic [ref=f9e39] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f9e47]:
+            - generic [ref=f9e48] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f9e54]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f9e55] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f9e60] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f9e66] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f9e73] [cursor=pointer]
+              - menuitem "鐢熶骇绾挎壂鐮佸叆搴�" [ref=f9e80] [cursor=pointer]
+          - listitem [ref=f9e85]:
+            - generic [ref=f9e86] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f9e92]:
+            - generic [ref=f9e93] [cursor=pointer]: 绯荤粺绠$悊
+        - generic [ref=f9e100] [cursor=pointer]
+    - generic [ref=f9e105]:
+      - generic [ref=f9e106]:
+        - banner [ref=f9e107]:
+          - button [ref=f9e108] [cursor=pointer]
+          - button [ref=f9e111] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f9e116]:
+            - list [ref=f9e117]:
+              - listitem [ref=f9e118]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f9e119] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f9e123]
+              - listitem [ref=f9e126]:
+                - link "鎵樼洏鐮佺鐞�" [disabled] [ref=f9e127]
+          - generic [ref=f9e134]:
+            - generic [ref=f9e136] [cursor=pointer]:
+              - generic [ref=f9e140]: 鎼滅储
+              - generic [ref=f9e141]: Ctrl K
+            - button [ref=f9e143] [cursor=pointer]
+            - button "dark" [ref=f9e148] [cursor=pointer]
+            - button [ref=f9e157] [cursor=pointer]
+            - button [ref=f9e163] [cursor=pointer]
+            - button [ref=f9e166] [cursor=pointer]
+            - button [ref=f9e172] [cursor=pointer]:
+              - button [ref=f9e174]
+            - button "宸ヤ綔鍙�" [ref=f9e178] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f9e182] [cursor=pointer]
+        - generic [ref=f9e189]:
+          - generic [ref=f9e190]: 鎵樼洏鐮佺鐞�
+          - generic [ref=f9e211]:
+            - button [ref=f9e212] [cursor=pointer]
+            - generic [ref=f9e219] [cursor=pointer]
+            - generic [ref=f9e223] [cursor=pointer]
+      - main [ref=f9e230]:
+        - generic [ref=f9e235]:
+          - generic [ref=f9e240]:
+            - generic [ref=f9e241]:
+              - generic [ref=f9e242]: 鎵樼洏鐮�
+              - textbox "鎵樼洏鐮�" [ref=f9e248]:
+                - /placeholder: 璇疯緭鍏ユ墭鐩樼爜
+            - generic [ref=f9e250]:
+              - generic [ref=f9e251]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f9e257]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f9e259]:
+              - generic [ref=f9e260]: 鎵樼洏鐘舵��
+              - generic [ref=f9e266] [cursor=pointer]:
+                - combobox "鎵樼洏鐘舵��" [ref=f9e268]
+                - generic: 璇烽�夋嫨鎵樼洏鐘舵��
+            - generic [ref=f9e269]:
+              - generic [ref=f9e270]: 鍒涘缓鏃堕棿
+              - generic [ref=f9e275]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f9e277]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f9e279]:
+                  - img "swap-right" [ref=f9e280]
+                - textbox "缁撴潫鏃堕棿" [ref=f9e284]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f9e285]:
+              - button "閲� 缃�" [ref=f9e286] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f9e288] [cursor=pointer]
+              - generic [ref=f9e290] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f9e297]:
+            - generic [ref=f9e299]:
+              - generic [ref=f9e300]: 鎵樼洏鐮佸垪琛�
+              - generic [ref=f9e304]:
+                - generic [ref=f9e306]:
+                  - button "棰勭敓鎴愪簩缁寸爜" [ref=f9e308] [cursor=pointer]
+                  - button "缁戝畾鎵规" [ref=f9e313] [cursor=pointer]
+                  - button "鎵爜杩芥函" [ref=f9e320] [cursor=pointer]
+                  - button "瀵煎嚭浜岀淮鐮�" [ref=f9e327] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f9e334] [cursor=pointer]
+                - button "顫�" [ref=f9e340] [cursor=pointer]
+              - generic [ref=f9e342]:
+                - button "瞟�" [ref=f9e343] [cursor=pointer]
+                - button "顪�" [ref=f9e345] [cursor=pointer]
+                - button "顦�" [ref=f9e347] [cursor=pointer]
+            - generic [ref=f9e354]:
+              - generic [ref=f9e355]:
+                - table [ref=f9e359]:
+                  - rowgroup [ref=f9e371]:
+                    - row [ref=f9e1147]:
+                      - columnheader "睿�" [ref=f9e1148]:
+                        - generic "鍏ㄩ��/鍙栨秷" [ref=f9e378] [cursor=pointer]: 睿�
+                      - columnheader "鎵樼洏搴忓彿" [ref=f9e381]
+                      - columnheader "鎵规鍙�" [ref=f9e386]
+                      - columnheader "鍙琚嬫暟锛堣/鎵樼洏锛�" [ref=f9e391]
+                      - columnheader "宸茬粦琚嬬爜鏁伴噺" [ref=f9e396]
+                      - columnheader "鎵樼洏鐘舵��" [ref=f9e401]
+                      - columnheader "澶囨敞" [ref=f9e406]
+                      - columnheader "鍒涘缓鏃堕棿" [ref=f9e411]
+                - table [ref=f9e419]:
+                  - rowgroup [ref=f9e431]:
+                    - row "顧� 鏈粦瀹氭壒娆� 100 0 鍚敤 2026-08-28 16:28:05" [ref=f9e1149]:
+                      - cell "顧�" [ref=f9e1150]
+                      - cell [ref=f9e438]
+                      - cell "鏈粦瀹氭壒娆�" [ref=f9e442]
+                      - cell "100" [ref=f9e446]
+                      - cell "0" [ref=f9e450]
+                      - cell "鍚敤" [ref=f9e454]
+                      - cell [ref=f9e458]
+                      - cell "2026-08-28 16:28:05" [ref=f9e462]
+                    - row "顪� 10 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e466]:
+                      - cell "顪�" [ref=f9e467]
+                      - cell "10" [ref=f9e472]
+                      - cell "PC20260819twoITEM_001" [ref=f9e476]
+                      - cell "1000" [ref=f9e479]
+                      - cell "0" [ref=f9e483]
+                      - cell "鍚敤" [ref=f9e487]
+                      - cell [ref=f9e491]
+                      - cell "2026-08-19 10:53:29" [ref=f9e495]
+                    - row "顪� 9 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e499]:
+                      - cell "顪�" [ref=f9e500]
+                      - cell "9" [ref=f9e505]
+                      - cell "PC20260819twoITEM_001" [ref=f9e509]
+                      - cell "1000" [ref=f9e512]
+                      - cell "0" [ref=f9e516]
+                      - cell "鍚敤" [ref=f9e520]
+                      - cell [ref=f9e524]
+                      - cell "2026-08-19 10:53:29" [ref=f9e528]
+                    - row "顪� 8 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e532]:
+                      - cell "顪�" [ref=f9e533]
+                      - cell "8" [ref=f9e538]
+                      - cell "PC20260819twoITEM_001" [ref=f9e542]
+                      - cell "1000" [ref=f9e545]
+                      - cell "0" [ref=f9e549]
+                      - cell "鍚敤" [ref=f9e553]
+                      - cell [ref=f9e557]
+                      - cell "2026-08-19 10:53:29" [ref=f9e561]
+                    - row "顪� 7 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e565]:
+                      - cell "顪�" [ref=f9e566]
+                      - cell "7" [ref=f9e571]
+                      - cell "PC20260819twoITEM_001" [ref=f9e575]
+                      - cell "1000" [ref=f9e578]
+                      - cell "0" [ref=f9e582]
+                      - cell "鍚敤" [ref=f9e586]
+                      - cell [ref=f9e590]
+                      - cell "2026-08-19 10:53:29" [ref=f9e594]
+                    - row "顪� 6 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e598]:
+                      - cell "顪�" [ref=f9e599]
+                      - cell "6" [ref=f9e604]
+                      - cell "PC20260819twoITEM_001" [ref=f9e608]
+                      - cell "1000" [ref=f9e611]
+                      - cell "0" [ref=f9e615]
+                      - cell "鍚敤" [ref=f9e619]
+                      - cell [ref=f9e623]
+                      - cell "2026-08-19 10:53:29" [ref=f9e627]
+                    - row "顪� 5 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e631]:
+                      - cell "顪�" [ref=f9e632]
+                      - cell "5" [ref=f9e637]
+                      - cell "PC20260819twoITEM_001" [ref=f9e641]
+                      - cell "1000" [ref=f9e644]
+                      - cell "0" [ref=f9e648]
+                      - cell "鍚敤" [ref=f9e652]
+                      - cell [ref=f9e656]
+                      - cell "2026-08-19 10:53:29" [ref=f9e660]
+                    - row "顪� 4 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e664]:
+                      - cell "顪�" [ref=f9e665]
+                      - cell "4" [ref=f9e670]
+                      - cell "PC20260819twoITEM_001" [ref=f9e674]
+                      - cell "1000" [ref=f9e677]
+                      - cell "0" [ref=f9e681]
+                      - cell "鍚敤" [ref=f9e685]
+                      - cell [ref=f9e689]
+                      - cell "2026-08-19 10:53:29" [ref=f9e693]
+                    - row "顪� 3 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e697]:
+                      - cell "顪�" [ref=f9e698]
+                      - cell "3" [ref=f9e703]
+                      - cell "PC20260819twoITEM_001" [ref=f9e707]
+                      - cell "1000" [ref=f9e710]
+                      - cell "0" [ref=f9e714]
+                      - cell "鍚敤" [ref=f9e718]
+                      - cell [ref=f9e722]
+                      - cell "2026-08-19 10:53:29" [ref=f9e726]
+                    - row "顪� 2 PC20260819twoITEM_001 1000 20 鍚敤 2026-08-19 10:53:29" [ref=f9e730]:
+                      - cell "顪�" [ref=f9e731]
+                      - cell "2" [ref=f9e736]
+                      - cell "PC20260819twoITEM_001" [ref=f9e740]
+                      - cell "1000" [ref=f9e743]
+                      - cell "20" [ref=f9e747]
+                      - cell "鍚敤" [ref=f9e751]
+                      - cell [ref=f9e755]
+                      - cell "2026-08-19 10:53:29" [ref=f9e759]
+                    - row "顪� 1 PC20260819twoITEM_001 1000 40 鍚敤 2026-08-19 10:53:29" [ref=f9e763]:
+                      - cell "顪�" [ref=f9e764]
+                      - cell "1" [ref=f9e769]
+                      - cell "PC20260819twoITEM_001" [ref=f9e773]
+                      - cell "1000" [ref=f9e776]
+                      - cell "40" [ref=f9e780]
+                      - cell "鍚敤" [ref=f9e784]
+                      - cell [ref=f9e788]
+                      - cell "2026-08-19 10:53:29" [ref=f9e792]
+              - generic:
+                - generic [ref=f9e796]:
+                  - table [ref=f9e799]:
+                    - rowgroup [ref=f9e811]:
+                      - row [ref=f9e812]:
+                        - columnheader "鎵樼洏鐮�" [ref=f9e813]
+                  - table [ref=f9e820]:
+                    - rowgroup [ref=f9e823]:
+                      - row [ref=f9e824]:
+                        - cell "PL-00000001 鏈粦瀹氭壒娆�" [ref=f9e825]:
+                          - generic [ref=f9e827]:
+                            - text: PL-00000001
+                            - generic [ref=f9e828]: 鏈粦瀹氭壒娆�
+                      - row [ref=f9e829]:
+                        - cell "PC20260819twoITEM_001-P10" [ref=f9e830]
+                      - row [ref=f9e833]:
+                        - cell "PC20260819twoITEM_001-P09" [ref=f9e834]
+                      - row [ref=f9e837]:
+                        - cell "PC20260819twoITEM_001-P08" [ref=f9e838]
+                      - row [ref=f9e841]:
+                        - cell "PC20260819twoITEM_001-P07" [ref=f9e842]
+                      - row [ref=f9e845]:
+                        - cell "PC20260819twoITEM_001-P06" [ref=f9e846]
+                      - row [ref=f9e849]:
+                        - cell "PC20260819twoITEM_001-P05" [ref=f9e850]
+                      - row [ref=f9e853]:
+                        - cell "PC20260819twoITEM_001-P04" [ref=f9e854]
+                      - row [ref=f9e857]:
+                        - cell "PC20260819twoITEM_001-P03" [ref=f9e858]
+                      - row [ref=f9e861]:
+                        - cell "PC20260819twoITEM_001-P02" [ref=f9e862]
+                      - row [ref=f9e865]:
+                        - cell "PC20260819twoITEM_001-P01" [ref=f9e866]
+                - generic [ref=f9e869]:
+                  - table [ref=f9e872]:
+                    - rowgroup [ref=f9e884]:
+                      - row [ref=f9e885]:
+                        - columnheader "鎿嶄綔" [ref=f9e886]
+                  - table [ref=f9e893]:
+                    - rowgroup [ref=f9e896]:
+                      - row [ref=f9e897]:
+                        - cell [ref=f9e898]:
+                          - generic [ref=f9e902]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e904] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e907] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e914] [cursor=pointer]
+                      - row [ref=f9e918]:
+                        - cell [ref=f9e919]:
+                          - generic [ref=f9e923]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e925] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e928] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e935] [cursor=pointer]
+                      - row [ref=f9e939]:
+                        - cell [ref=f9e940]:
+                          - generic [ref=f9e944]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e946] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e949] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e956] [cursor=pointer]
+                      - row [ref=f9e960]:
+                        - cell [ref=f9e961]:
+                          - generic [ref=f9e965]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e967] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e970] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e977] [cursor=pointer]
+                      - row [ref=f9e981]:
+                        - cell [ref=f9e982]:
+                          - generic [ref=f9e986]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e988] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e991] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e998] [cursor=pointer]
+                      - row [ref=f9e1002]:
+                        - cell [ref=f9e1003]:
+                          - generic [ref=f9e1007]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1009] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1012] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e1019] [cursor=pointer]
+                      - row [ref=f9e1023]:
+                        - cell [ref=f9e1024]:
+                          - generic [ref=f9e1028]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1030] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1033] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e1040] [cursor=pointer]
+                      - row [ref=f9e1044]:
+                        - cell [ref=f9e1045]:
+                          - generic [ref=f9e1049]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1051] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1054] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e1061] [cursor=pointer]
+                      - row [ref=f9e1065]:
+                        - cell [ref=f9e1066]:
+                          - generic [ref=f9e1070]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1072] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1075] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e1082] [cursor=pointer]
+                      - row [ref=f9e1086]:
+                        - cell [ref=f9e1087]:
+                          - generic [ref=f9e1091]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1093] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1096] [cursor=pointer]
+                      - row [ref=f9e1102]:
+                        - cell [ref=f9e1103]:
+                          - generic [ref=f9e1107]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1109] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1112] [cursor=pointer]
+            - generic [ref=f9e1124]:
+              - generic [ref=f9e1125]: 鍏� 11 鏉¤褰�
+              - generic [ref=f9e1127] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f9e1128]:
+                  - textbox "璇烽�夋嫨" [ref=f9e1129]: 20鏉�/椤�
+                - generic [ref=f9e1130]: 睿�
+              - button "飱�" [ref=f9e1133]
+              - button "顧�" [ref=f9e1135]
+              - button "顫�" [ref=f9e1137]
+              - button "1" [ref=f9e1140] [cursor=pointer]
+              - button "顫�" [ref=f9e1141]
+              - button "顧�" [ref=f9e1143]
+              - button "顦�" [ref=f9e1145]
+  - dialog [ref=f9e1152]:
+    - heading "鎵樼洏鐮佺粦瀹氱敓浜ф壒娆�" [level=2] [ref=f9e1154]
+    - generic [ref=f9e1159]:
+      - generic [ref=f9e1160]:
+        - generic [ref=f9e1161]: "*"
+        - text: 鐢熶骇鎵规
+      - generic [ref=f9e1167]:
+        - combobox "* 鐢熶骇鎵规" [expanded] [active] [ref=f9e1169]:
+          - listbox:
+            - option "PC20260828twoITEM_001": "102"
+        - generic: 璇烽�夋嫨宸茶ˉ褰曚笖鐢熶骇涓殑鎵规
+    - button [ref=f9e1170] [cursor=pointer]
+    - generic [ref=f9e1180]:
+      - button "鍙� 娑�" [ref=f9e1181] [cursor=pointer]
+      - button "纭� 璁�" [ref=f9e1183] [cursor=pointer]
+    - button [ref=f9e1185] [cursor=pointer]
+  - generic "PC20260828twoITEM_001" [ref=f9e1195] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T09-04-44-764Z.yml b/.playwright-mcp/page-2026-08-28T09-04-44-764Z.yml
new file mode 100644
index 0000000..66a5d44
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T09-04-44-764Z.yml
@@ -0,0 +1,353 @@
+- generic [ref=f9e4]:
+  - generic [ref=f9e7]:
+    - complementary [ref=f9e9]:
+      - generic [ref=f9e10]:
+        - generic [ref=f9e11] [cursor=pointer]
+        - link "娴嬭瘯鍏徃鍝堝搱 娴嬭瘯鍏徃鍝堝搱" [ref=f9e16] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "娴嬭瘯鍏徃鍝堝搱" [ref=f9e19]
+          - generic [ref=f9e20]: 娴嬭瘯鍏徃鍝堝搱
+        - menu [ref=f9e23]:
+          - menuitem "棣栭〉" [ref=f9e24] [cursor=pointer]
+          - listitem [ref=f9e29]:
+            - generic [ref=f9e30] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f9e38]:
+            - generic [ref=f9e39] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f9e47]:
+            - generic [ref=f9e48] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f9e54]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f9e55] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f9e60] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f9e66] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f9e73] [cursor=pointer]
+              - menuitem "鐢熶骇绾挎壂鐮佸叆搴�" [ref=f9e80] [cursor=pointer]
+          - listitem [ref=f9e85]:
+            - generic [ref=f9e86] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f9e92]:
+            - generic [ref=f9e93] [cursor=pointer]: 绯荤粺绠$悊
+        - generic [ref=f9e100] [cursor=pointer]
+    - generic [ref=f9e105]:
+      - generic [ref=f9e106]:
+        - banner [ref=f9e107]:
+          - button [ref=f9e108] [cursor=pointer]
+          - button [ref=f9e111] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f9e116]:
+            - list [ref=f9e117]:
+              - listitem [ref=f9e118]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f9e119] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f9e123]
+              - listitem [ref=f9e126]:
+                - link "鎵樼洏鐮佺鐞�" [disabled] [ref=f9e127]
+          - generic [ref=f9e134]:
+            - generic [ref=f9e136] [cursor=pointer]:
+              - generic [ref=f9e140]: 鎼滅储
+              - generic [ref=f9e141]: Ctrl K
+            - button [ref=f9e143] [cursor=pointer]
+            - button "dark" [ref=f9e148] [cursor=pointer]
+            - button [ref=f9e157] [cursor=pointer]
+            - button [ref=f9e163] [cursor=pointer]
+            - button [ref=f9e166] [cursor=pointer]
+            - button [ref=f9e172] [cursor=pointer]:
+              - button [ref=f9e174]
+            - button "宸ヤ綔鍙�" [ref=f9e178] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f9e182] [cursor=pointer]
+        - generic [ref=f9e189]:
+          - generic [ref=f9e190]: 鎵樼洏鐮佺鐞�
+          - generic [ref=f9e211]:
+            - button [ref=f9e212] [cursor=pointer]
+            - generic [ref=f9e219] [cursor=pointer]
+            - generic [ref=f9e223] [cursor=pointer]
+      - main [ref=f9e230]:
+        - generic [ref=f9e235]:
+          - generic [ref=f9e240]:
+            - generic [ref=f9e241]:
+              - generic [ref=f9e242]: 鎵樼洏鐮�
+              - textbox "鎵樼洏鐮�" [ref=f9e248]:
+                - /placeholder: 璇疯緭鍏ユ墭鐩樼爜
+            - generic [ref=f9e250]:
+              - generic [ref=f9e251]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f9e257]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f9e259]:
+              - generic [ref=f9e260]: 鎵樼洏鐘舵��
+              - generic [ref=f9e266] [cursor=pointer]:
+                - combobox "鎵樼洏鐘舵��" [ref=f9e268]
+                - generic: 璇烽�夋嫨鎵樼洏鐘舵��
+            - generic [ref=f9e269]:
+              - generic [ref=f9e270]: 鍒涘缓鏃堕棿
+              - generic [ref=f9e275]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f9e277]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f9e279]:
+                  - img "swap-right" [ref=f9e280]
+                - textbox "缁撴潫鏃堕棿" [ref=f9e284]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f9e285]:
+              - button "閲� 缃�" [ref=f9e286] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f9e288] [cursor=pointer]
+              - generic [ref=f9e290] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f9e297]:
+            - generic [ref=f9e299]:
+              - generic [ref=f9e300]: 鎵樼洏鐮佸垪琛�
+              - generic [ref=f9e304]:
+                - generic [ref=f9e306]:
+                  - button "棰勭敓鎴愪簩缁寸爜" [ref=f9e308] [cursor=pointer]
+                  - button "缁戝畾鎵规" [ref=f9e313] [cursor=pointer]
+                  - button "鎵爜杩芥函" [ref=f9e320] [cursor=pointer]
+                  - button "瀵煎嚭浜岀淮鐮�" [ref=f9e327] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f9e334] [cursor=pointer]
+                - button "顫�" [ref=f9e340] [cursor=pointer]
+              - generic [ref=f9e342]:
+                - button "瞟�" [ref=f9e343] [cursor=pointer]
+                - button "顪�" [ref=f9e345] [cursor=pointer]
+                - button "顦�" [ref=f9e347] [cursor=pointer]
+            - generic [ref=f9e354]:
+              - generic [ref=f9e355]:
+                - table [ref=f9e359]:
+                  - rowgroup [ref=f9e371]:
+                    - row [ref=f9e1147]:
+                      - columnheader "睿�" [ref=f9e1148]:
+                        - generic "鍏ㄩ��/鍙栨秷" [ref=f9e378] [cursor=pointer]: 睿�
+                      - columnheader "鎵樼洏搴忓彿" [ref=f9e381]
+                      - columnheader "鎵规鍙�" [ref=f9e386]
+                      - columnheader "鍙琚嬫暟锛堣/鎵樼洏锛�" [ref=f9e391]
+                      - columnheader "宸茬粦琚嬬爜鏁伴噺" [ref=f9e396]
+                      - columnheader "鎵樼洏鐘舵��" [ref=f9e401]
+                      - columnheader "澶囨敞" [ref=f9e406]
+                      - columnheader "鍒涘缓鏃堕棿" [ref=f9e411]
+                - table [ref=f9e419]:
+                  - rowgroup [ref=f9e431]:
+                    - row "顧� 鏈粦瀹氭壒娆� 100 0 鍚敤 2026-08-28 16:28:05" [ref=f9e1149]:
+                      - cell "顧�" [ref=f9e1150]
+                      - cell [ref=f9e438]
+                      - cell "鏈粦瀹氭壒娆�" [ref=f9e442]
+                      - cell "100" [ref=f9e446]
+                      - cell "0" [ref=f9e450]
+                      - cell "鍚敤" [ref=f9e454]
+                      - cell [ref=f9e458]
+                      - cell "2026-08-28 16:28:05" [ref=f9e462]
+                    - row "顪� 10 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e466]:
+                      - cell "顪�" [ref=f9e467]
+                      - cell "10" [ref=f9e472]
+                      - cell "PC20260819twoITEM_001" [ref=f9e476]
+                      - cell "1000" [ref=f9e479]
+                      - cell "0" [ref=f9e483]
+                      - cell "鍚敤" [ref=f9e487]
+                      - cell [ref=f9e491]
+                      - cell "2026-08-19 10:53:29" [ref=f9e495]
+                    - row "顪� 9 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e499]:
+                      - cell "顪�" [ref=f9e500]
+                      - cell "9" [ref=f9e505]
+                      - cell "PC20260819twoITEM_001" [ref=f9e509]
+                      - cell "1000" [ref=f9e512]
+                      - cell "0" [ref=f9e516]
+                      - cell "鍚敤" [ref=f9e520]
+                      - cell [ref=f9e524]
+                      - cell "2026-08-19 10:53:29" [ref=f9e528]
+                    - row "顪� 8 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e532]:
+                      - cell "顪�" [ref=f9e533]
+                      - cell "8" [ref=f9e538]
+                      - cell "PC20260819twoITEM_001" [ref=f9e542]
+                      - cell "1000" [ref=f9e545]
+                      - cell "0" [ref=f9e549]
+                      - cell "鍚敤" [ref=f9e553]
+                      - cell [ref=f9e557]
+                      - cell "2026-08-19 10:53:29" [ref=f9e561]
+                    - row "顪� 7 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e565]:
+                      - cell "顪�" [ref=f9e566]
+                      - cell "7" [ref=f9e571]
+                      - cell "PC20260819twoITEM_001" [ref=f9e575]
+                      - cell "1000" [ref=f9e578]
+                      - cell "0" [ref=f9e582]
+                      - cell "鍚敤" [ref=f9e586]
+                      - cell [ref=f9e590]
+                      - cell "2026-08-19 10:53:29" [ref=f9e594]
+                    - row "顪� 6 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e598]:
+                      - cell "顪�" [ref=f9e599]
+                      - cell "6" [ref=f9e604]
+                      - cell "PC20260819twoITEM_001" [ref=f9e608]
+                      - cell "1000" [ref=f9e611]
+                      - cell "0" [ref=f9e615]
+                      - cell "鍚敤" [ref=f9e619]
+                      - cell [ref=f9e623]
+                      - cell "2026-08-19 10:53:29" [ref=f9e627]
+                    - row "顪� 5 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e631]:
+                      - cell "顪�" [ref=f9e632]
+                      - cell "5" [ref=f9e637]
+                      - cell "PC20260819twoITEM_001" [ref=f9e641]
+                      - cell "1000" [ref=f9e644]
+                      - cell "0" [ref=f9e648]
+                      - cell "鍚敤" [ref=f9e652]
+                      - cell [ref=f9e656]
+                      - cell "2026-08-19 10:53:29" [ref=f9e660]
+                    - row "顪� 4 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e664]:
+                      - cell "顪�" [ref=f9e665]
+                      - cell "4" [ref=f9e670]
+                      - cell "PC20260819twoITEM_001" [ref=f9e674]
+                      - cell "1000" [ref=f9e677]
+                      - cell "0" [ref=f9e681]
+                      - cell "鍚敤" [ref=f9e685]
+                      - cell [ref=f9e689]
+                      - cell "2026-08-19 10:53:29" [ref=f9e693]
+                    - row "顪� 3 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e697]:
+                      - cell "顪�" [ref=f9e698]
+                      - cell "3" [ref=f9e703]
+                      - cell "PC20260819twoITEM_001" [ref=f9e707]
+                      - cell "1000" [ref=f9e710]
+                      - cell "0" [ref=f9e714]
+                      - cell "鍚敤" [ref=f9e718]
+                      - cell [ref=f9e722]
+                      - cell "2026-08-19 10:53:29" [ref=f9e726]
+                    - row "顪� 2 PC20260819twoITEM_001 1000 20 鍚敤 2026-08-19 10:53:29" [ref=f9e730]:
+                      - cell "顪�" [ref=f9e731]
+                      - cell "2" [ref=f9e736]
+                      - cell "PC20260819twoITEM_001" [ref=f9e740]
+                      - cell "1000" [ref=f9e743]
+                      - cell "20" [ref=f9e747]
+                      - cell "鍚敤" [ref=f9e751]
+                      - cell [ref=f9e755]
+                      - cell "2026-08-19 10:53:29" [ref=f9e759]
+                    - row "顪� 1 PC20260819twoITEM_001 1000 40 鍚敤 2026-08-19 10:53:29" [ref=f9e763]:
+                      - cell "顪�" [ref=f9e764]
+                      - cell "1" [ref=f9e769]
+                      - cell "PC20260819twoITEM_001" [ref=f9e773]
+                      - cell "1000" [ref=f9e776]
+                      - cell "40" [ref=f9e780]
+                      - cell "鍚敤" [ref=f9e784]
+                      - cell [ref=f9e788]
+                      - cell "2026-08-19 10:53:29" [ref=f9e792]
+              - generic:
+                - generic [ref=f9e796]:
+                  - table [ref=f9e799]:
+                    - rowgroup [ref=f9e811]:
+                      - row [ref=f9e812]:
+                        - columnheader "鎵樼洏鐮�" [ref=f9e813]
+                  - table [ref=f9e820]:
+                    - rowgroup [ref=f9e823]:
+                      - row [ref=f9e824]:
+                        - cell "PL-00000001 鏈粦瀹氭壒娆�" [ref=f9e825]:
+                          - generic [ref=f9e827]:
+                            - text: PL-00000001
+                            - generic [ref=f9e828]: 鏈粦瀹氭壒娆�
+                      - row [ref=f9e829]:
+                        - cell "PC20260819twoITEM_001-P10" [ref=f9e830]
+                      - row [ref=f9e833]:
+                        - cell "PC20260819twoITEM_001-P09" [ref=f9e834]
+                      - row [ref=f9e837]:
+                        - cell "PC20260819twoITEM_001-P08" [ref=f9e838]
+                      - row [ref=f9e841]:
+                        - cell "PC20260819twoITEM_001-P07" [ref=f9e842]
+                      - row [ref=f9e845]:
+                        - cell "PC20260819twoITEM_001-P06" [ref=f9e846]
+                      - row [ref=f9e849]:
+                        - cell "PC20260819twoITEM_001-P05" [ref=f9e850]
+                      - row [ref=f9e853]:
+                        - cell "PC20260819twoITEM_001-P04" [ref=f9e854]
+                      - row [ref=f9e857]:
+                        - cell "PC20260819twoITEM_001-P03" [ref=f9e858]
+                      - row [ref=f9e861]:
+                        - cell "PC20260819twoITEM_001-P02" [ref=f9e862]
+                      - row [ref=f9e865]:
+                        - cell "PC20260819twoITEM_001-P01" [ref=f9e866]
+                - generic [ref=f9e869]:
+                  - table [ref=f9e872]:
+                    - rowgroup [ref=f9e884]:
+                      - row [ref=f9e885]:
+                        - columnheader "鎿嶄綔" [ref=f9e886]
+                  - table [ref=f9e893]:
+                    - rowgroup [ref=f9e896]:
+                      - row [ref=f9e897]:
+                        - cell [ref=f9e898]:
+                          - generic [ref=f9e902]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e904] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e907] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e914] [cursor=pointer]
+                      - row [ref=f9e918]:
+                        - cell [ref=f9e919]:
+                          - generic [ref=f9e923]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e925] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e928] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e935] [cursor=pointer]
+                      - row [ref=f9e939]:
+                        - cell [ref=f9e940]:
+                          - generic [ref=f9e944]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e946] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e949] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e956] [cursor=pointer]
+                      - row [ref=f9e960]:
+                        - cell [ref=f9e961]:
+                          - generic [ref=f9e965]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e967] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e970] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e977] [cursor=pointer]
+                      - row [ref=f9e981]:
+                        - cell [ref=f9e982]:
+                          - generic [ref=f9e986]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e988] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e991] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e998] [cursor=pointer]
+                      - row [ref=f9e1002]:
+                        - cell [ref=f9e1003]:
+                          - generic [ref=f9e1007]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1009] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1012] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e1019] [cursor=pointer]
+                      - row [ref=f9e1023]:
+                        - cell [ref=f9e1024]:
+                          - generic [ref=f9e1028]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1030] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1033] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e1040] [cursor=pointer]
+                      - row [ref=f9e1044]:
+                        - cell [ref=f9e1045]:
+                          - generic [ref=f9e1049]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1051] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1054] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e1061] [cursor=pointer]
+                      - row [ref=f9e1065]:
+                        - cell [ref=f9e1066]:
+                          - generic [ref=f9e1070]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1072] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1075] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e1082] [cursor=pointer]
+                      - row [ref=f9e1086]:
+                        - cell [ref=f9e1087]:
+                          - generic [ref=f9e1091]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1093] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1096] [cursor=pointer]
+                      - row [ref=f9e1102]:
+                        - cell [ref=f9e1103]:
+                          - generic [ref=f9e1107]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1109] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1112] [cursor=pointer]
+            - generic [ref=f9e1124]:
+              - generic [ref=f9e1125]: 鍏� 11 鏉¤褰�
+              - generic [ref=f9e1127] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f9e1128]:
+                  - textbox "璇烽�夋嫨" [ref=f9e1129]: 20鏉�/椤�
+                - generic [ref=f9e1130]: 睿�
+              - button "飱�" [ref=f9e1133]
+              - button "顧�" [ref=f9e1135]
+              - button "顫�" [ref=f9e1137]
+              - button "1" [ref=f9e1140] [cursor=pointer]
+              - button "顫�" [ref=f9e1141]
+              - button "顧�" [ref=f9e1143]
+              - button "顦�" [ref=f9e1145]
+  - dialog [ref=f9e1152]:
+    - heading "鎵樼洏鐮佺粦瀹氱敓浜ф壒娆�" [level=2] [ref=f9e1154]
+    - generic [ref=f9e1159]:
+      - generic [ref=f9e1160]:
+        - generic [ref=f9e1161]: "*"
+        - text: 鐢熶骇鎵规
+      - generic [ref=f9e1166] [cursor=pointer]:
+        - generic: PC20260828twoITEM_001
+        - generic [ref=f9e1167]:
+          - combobox "* 鐢熶骇鎵规" [active] [ref=f9e1169]
+          - generic "PC20260828twoITEM_001" [ref=f9e1197]
+    - button [ref=f9e1170] [cursor=pointer]
+    - generic [ref=f9e1180]:
+      - button "鍙� 娑�" [ref=f9e1181] [cursor=pointer]
+      - button "纭� 璁�" [ref=f9e1183] [cursor=pointer]
+    - button [ref=f9e1185] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-28T09-04-52-568Z.yml b/.playwright-mcp/page-2026-08-28T09-04-52-568Z.yml
new file mode 100644
index 0000000..e065646
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-28T09-04-52-568Z.yml
@@ -0,0 +1,337 @@
+- generic [ref=f9e4]:
+  - generic [ref=f9e7]:
+    - complementary [ref=f9e9]:
+      - generic [ref=f9e10]:
+        - generic [ref=f9e11] [cursor=pointer]
+        - link "娴嬭瘯鍏徃鍝堝搱 娴嬭瘯鍏徃鍝堝搱" [ref=f9e16] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "娴嬭瘯鍏徃鍝堝搱" [ref=f9e19]
+          - generic [ref=f9e20]: 娴嬭瘯鍏徃鍝堝搱
+        - menu [ref=f9e23]:
+          - menuitem "棣栭〉" [ref=f9e24] [cursor=pointer]
+          - listitem [ref=f9e29]:
+            - generic [ref=f9e30] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f9e38]:
+            - generic [ref=f9e39] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f9e47]:
+            - generic [ref=f9e48] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f9e54]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f9e55] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f9e60] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f9e66] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f9e73] [cursor=pointer]
+              - menuitem "鐢熶骇绾挎壂鐮佸叆搴�" [ref=f9e80] [cursor=pointer]
+          - listitem [ref=f9e85]:
+            - generic [ref=f9e86] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f9e92]:
+            - generic [ref=f9e93] [cursor=pointer]: 绯荤粺绠$悊
+        - generic [ref=f9e100] [cursor=pointer]
+    - generic [ref=f9e105]:
+      - generic [ref=f9e106]:
+        - banner [ref=f9e107]:
+          - button [ref=f9e108] [cursor=pointer]
+          - button [ref=f9e111] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f9e116]:
+            - list [ref=f9e117]:
+              - listitem [ref=f9e118]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f9e119] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f9e123]
+              - listitem [ref=f9e126]:
+                - link "鎵樼洏鐮佺鐞�" [disabled] [ref=f9e127]
+          - generic [ref=f9e134]:
+            - generic [ref=f9e136] [cursor=pointer]:
+              - generic [ref=f9e140]: 鎼滅储
+              - generic [ref=f9e141]: Ctrl K
+            - button [ref=f9e143] [cursor=pointer]
+            - button "dark" [ref=f9e148] [cursor=pointer]
+            - button [ref=f9e157] [cursor=pointer]
+            - button [ref=f9e163] [cursor=pointer]
+            - button [ref=f9e166] [cursor=pointer]
+            - button [ref=f9e172] [cursor=pointer]:
+              - button [ref=f9e174]
+            - button "宸ヤ綔鍙�" [ref=f9e178] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f9e182] [cursor=pointer]
+        - generic [ref=f9e189]:
+          - generic [ref=f9e190]: 鎵樼洏鐮佺鐞�
+          - generic [ref=f9e211]:
+            - button [ref=f9e212] [cursor=pointer]
+            - generic [ref=f9e219] [cursor=pointer]
+            - generic [ref=f9e223] [cursor=pointer]
+      - main [ref=f9e230]:
+        - generic [ref=f9e235]:
+          - generic [ref=f9e240]:
+            - generic [ref=f9e241]:
+              - generic [ref=f9e242]: 鎵樼洏鐮�
+              - textbox "鎵樼洏鐮�" [ref=f9e248]:
+                - /placeholder: 璇疯緭鍏ユ墭鐩樼爜
+            - generic [ref=f9e250]:
+              - generic [ref=f9e251]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f9e257]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f9e259]:
+              - generic [ref=f9e260]: 鎵樼洏鐘舵��
+              - generic [ref=f9e266] [cursor=pointer]:
+                - combobox "鎵樼洏鐘舵��" [ref=f9e268]
+                - generic: 璇烽�夋嫨鎵樼洏鐘舵��
+            - generic [ref=f9e269]:
+              - generic [ref=f9e270]: 鍒涘缓鏃堕棿
+              - generic [ref=f9e275]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f9e277]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f9e279]:
+                  - img "swap-right" [ref=f9e280]
+                - textbox "缁撴潫鏃堕棿" [ref=f9e284]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f9e285]:
+              - button "閲� 缃�" [ref=f9e286] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f9e288] [cursor=pointer]
+              - generic [ref=f9e290] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f9e297]:
+            - generic [ref=f9e299]:
+              - generic [ref=f9e300]: 鎵樼洏鐮佸垪琛�
+              - generic [ref=f9e304]:
+                - generic [ref=f9e306]:
+                  - button "棰勭敓鎴愪簩缁寸爜" [ref=f9e308] [cursor=pointer]
+                  - button "缁戝畾鎵规" [active] [ref=f9e313] [cursor=pointer]
+                  - button "鎵爜杩芥函" [ref=f9e320] [cursor=pointer]
+                  - button "瀵煎嚭浜岀淮鐮�" [ref=f9e327] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f9e334] [cursor=pointer]
+                - button "顫�" [ref=f9e340] [cursor=pointer]
+              - generic [ref=f9e342]:
+                - button "瞟�" [ref=f9e343] [cursor=pointer]
+                - button "顪�" [ref=f9e345] [cursor=pointer]
+                - button "顦�" [ref=f9e347] [cursor=pointer]
+            - generic [ref=f9e354]:
+              - generic [ref=f9e355]:
+                - table [ref=f9e359]:
+                  - rowgroup [ref=f9e371]:
+                    - row [ref=f9e1147]:
+                      - columnheader "睿�" [ref=f9e1148]:
+                        - generic "鍏ㄩ��/鍙栨秷" [ref=f9e378] [cursor=pointer]: 睿�
+                      - columnheader "鎵樼洏搴忓彿" [ref=f9e381]
+                      - columnheader "鎵规鍙�" [ref=f9e386]
+                      - columnheader "鍙琚嬫暟锛堣/鎵樼洏锛�" [ref=f9e391]
+                      - columnheader "宸茬粦琚嬬爜鏁伴噺" [ref=f9e396]
+                      - columnheader "鎵樼洏鐘舵��" [ref=f9e401]
+                      - columnheader "澶囨敞" [ref=f9e406]
+                      - columnheader "鍒涘缓鏃堕棿" [ref=f9e411]
+                - table [ref=f9e419]:
+                  - rowgroup [ref=f9e431]:
+                    - row "顧� 1 PC20260828twoITEM_001 100 0 鍚敤 2026-08-28 16:28:05" [ref=f9e1198]:
+                      - cell "顧�" [ref=f9e1150]
+                      - cell "1" [ref=f9e1199]
+                      - cell "PC20260828twoITEM_001" [ref=f9e1200]
+                      - cell "100" [ref=f9e446]
+                      - cell "0" [ref=f9e450]
+                      - cell "鍚敤" [ref=f9e454]
+                      - cell [ref=f9e458]
+                      - cell "2026-08-28 16:28:05" [ref=f9e462]
+                    - row "顪� 10 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e466]:
+                      - cell "顪�" [ref=f9e467]
+                      - cell "10" [ref=f9e472]
+                      - cell "PC20260819twoITEM_001" [ref=f9e476]
+                      - cell "1000" [ref=f9e479]
+                      - cell "0" [ref=f9e483]
+                      - cell "鍚敤" [ref=f9e487]
+                      - cell [ref=f9e491]
+                      - cell "2026-08-19 10:53:29" [ref=f9e495]
+                    - row "顪� 9 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e499]:
+                      - cell "顪�" [ref=f9e500]
+                      - cell "9" [ref=f9e505]
+                      - cell "PC20260819twoITEM_001" [ref=f9e509]
+                      - cell "1000" [ref=f9e512]
+                      - cell "0" [ref=f9e516]
+                      - cell "鍚敤" [ref=f9e520]
+                      - cell [ref=f9e524]
+                      - cell "2026-08-19 10:53:29" [ref=f9e528]
+                    - row "顪� 8 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e532]:
+                      - cell "顪�" [ref=f9e533]
+                      - cell "8" [ref=f9e538]
+                      - cell "PC20260819twoITEM_001" [ref=f9e542]
+                      - cell "1000" [ref=f9e545]
+                      - cell "0" [ref=f9e549]
+                      - cell "鍚敤" [ref=f9e553]
+                      - cell [ref=f9e557]
+                      - cell "2026-08-19 10:53:29" [ref=f9e561]
+                    - row "顪� 7 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e565]:
+                      - cell "顪�" [ref=f9e566]
+                      - cell "7" [ref=f9e571]
+                      - cell "PC20260819twoITEM_001" [ref=f9e575]
+                      - cell "1000" [ref=f9e578]
+                      - cell "0" [ref=f9e582]
+                      - cell "鍚敤" [ref=f9e586]
+                      - cell [ref=f9e590]
+                      - cell "2026-08-19 10:53:29" [ref=f9e594]
+                    - row "顪� 6 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e598]:
+                      - cell "顪�" [ref=f9e599]
+                      - cell "6" [ref=f9e604]
+                      - cell "PC20260819twoITEM_001" [ref=f9e608]
+                      - cell "1000" [ref=f9e611]
+                      - cell "0" [ref=f9e615]
+                      - cell "鍚敤" [ref=f9e619]
+                      - cell [ref=f9e623]
+                      - cell "2026-08-19 10:53:29" [ref=f9e627]
+                    - row "顪� 5 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e631]:
+                      - cell "顪�" [ref=f9e632]
+                      - cell "5" [ref=f9e637]
+                      - cell "PC20260819twoITEM_001" [ref=f9e641]
+                      - cell "1000" [ref=f9e644]
+                      - cell "0" [ref=f9e648]
+                      - cell "鍚敤" [ref=f9e652]
+                      - cell [ref=f9e656]
+                      - cell "2026-08-19 10:53:29" [ref=f9e660]
+                    - row "顪� 4 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e664]:
+                      - cell "顪�" [ref=f9e665]
+                      - cell "4" [ref=f9e670]
+                      - cell "PC20260819twoITEM_001" [ref=f9e674]
+                      - cell "1000" [ref=f9e677]
+                      - cell "0" [ref=f9e681]
+                      - cell "鍚敤" [ref=f9e685]
+                      - cell [ref=f9e689]
+                      - cell "2026-08-19 10:53:29" [ref=f9e693]
+                    - row "顪� 3 PC20260819twoITEM_001 1000 0 鍚敤 2026-08-19 10:53:29" [ref=f9e697]:
+                      - cell "顪�" [ref=f9e698]
+                      - cell "3" [ref=f9e703]
+                      - cell "PC20260819twoITEM_001" [ref=f9e707]
+                      - cell "1000" [ref=f9e710]
+                      - cell "0" [ref=f9e714]
+                      - cell "鍚敤" [ref=f9e718]
+                      - cell [ref=f9e722]
+                      - cell "2026-08-19 10:53:29" [ref=f9e726]
+                    - row "顪� 2 PC20260819twoITEM_001 1000 20 鍚敤 2026-08-19 10:53:29" [ref=f9e730]:
+                      - cell "顪�" [ref=f9e731]
+                      - cell "2" [ref=f9e736]
+                      - cell "PC20260819twoITEM_001" [ref=f9e740]
+                      - cell "1000" [ref=f9e743]
+                      - cell "20" [ref=f9e747]
+                      - cell "鍚敤" [ref=f9e751]
+                      - cell [ref=f9e755]
+                      - cell "2026-08-19 10:53:29" [ref=f9e759]
+                    - row "顪� 1 PC20260819twoITEM_001 1000 40 鍚敤 2026-08-19 10:53:29" [ref=f9e763]:
+                      - cell "顪�" [ref=f9e764]
+                      - cell "1" [ref=f9e769]
+                      - cell "PC20260819twoITEM_001" [ref=f9e773]
+                      - cell "1000" [ref=f9e776]
+                      - cell "40" [ref=f9e780]
+                      - cell "鍚敤" [ref=f9e784]
+                      - cell [ref=f9e788]
+                      - cell "2026-08-19 10:53:29" [ref=f9e792]
+              - generic:
+                - generic [ref=f9e796]:
+                  - table [ref=f9e799]:
+                    - rowgroup [ref=f9e811]:
+                      - row [ref=f9e812]:
+                        - columnheader "鎵樼洏鐮�" [ref=f9e813]
+                  - table [ref=f9e820]:
+                    - rowgroup [ref=f9e823]:
+                      - row [ref=f9e1201]:
+                        - cell "PC20260828twoITEM_001-P01" [ref=f9e1202]
+                      - row [ref=f9e829]:
+                        - cell "PC20260819twoITEM_001-P10" [ref=f9e830]
+                      - row [ref=f9e833]:
+                        - cell "PC20260819twoITEM_001-P09" [ref=f9e834]
+                      - row [ref=f9e837]:
+                        - cell "PC20260819twoITEM_001-P08" [ref=f9e838]
+                      - row [ref=f9e841]:
+                        - cell "PC20260819twoITEM_001-P07" [ref=f9e842]
+                      - row [ref=f9e845]:
+                        - cell "PC20260819twoITEM_001-P06" [ref=f9e846]
+                      - row [ref=f9e849]:
+                        - cell "PC20260819twoITEM_001-P05" [ref=f9e850]
+                      - row [ref=f9e853]:
+                        - cell "PC20260819twoITEM_001-P04" [ref=f9e854]
+                      - row [ref=f9e857]:
+                        - cell "PC20260819twoITEM_001-P03" [ref=f9e858]
+                      - row [ref=f9e861]:
+                        - cell "PC20260819twoITEM_001-P02" [ref=f9e862]
+                      - row [ref=f9e865]:
+                        - cell "PC20260819twoITEM_001-P01" [ref=f9e866]
+                - generic [ref=f9e869]:
+                  - table [ref=f9e872]:
+                    - rowgroup [ref=f9e884]:
+                      - row [ref=f9e885]:
+                        - columnheader "鎿嶄綔" [ref=f9e886]
+                  - table [ref=f9e893]:
+                    - rowgroup [ref=f9e896]:
+                      - row [ref=f9e897]:
+                        - cell [ref=f9e898]:
+                          - generic [ref=f9e902]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e904] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e907] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e914] [cursor=pointer]
+                      - row [ref=f9e918]:
+                        - cell [ref=f9e919]:
+                          - generic [ref=f9e923]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e925] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e928] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e935] [cursor=pointer]
+                      - row [ref=f9e939]:
+                        - cell [ref=f9e940]:
+                          - generic [ref=f9e944]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e946] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e949] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e956] [cursor=pointer]
+                      - row [ref=f9e960]:
+                        - cell [ref=f9e961]:
+                          - generic [ref=f9e965]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e967] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e970] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e977] [cursor=pointer]
+                      - row [ref=f9e981]:
+                        - cell [ref=f9e982]:
+                          - generic [ref=f9e986]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e988] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e991] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e998] [cursor=pointer]
+                      - row [ref=f9e1002]:
+                        - cell [ref=f9e1003]:
+                          - generic [ref=f9e1007]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1009] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1012] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e1019] [cursor=pointer]
+                      - row [ref=f9e1023]:
+                        - cell [ref=f9e1024]:
+                          - generic [ref=f9e1028]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1030] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1033] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e1040] [cursor=pointer]
+                      - row [ref=f9e1044]:
+                        - cell [ref=f9e1045]:
+                          - generic [ref=f9e1049]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1051] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1054] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e1061] [cursor=pointer]
+                      - row [ref=f9e1065]:
+                        - cell [ref=f9e1066]:
+                          - generic [ref=f9e1070]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1072] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1075] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=f9e1082] [cursor=pointer]
+                      - row [ref=f9e1086]:
+                        - cell [ref=f9e1087]:
+                          - generic [ref=f9e1091]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1093] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1096] [cursor=pointer]
+                      - row [ref=f9e1102]:
+                        - cell [ref=f9e1103]:
+                          - generic [ref=f9e1107]:
+                            - button "鏌ョ湅浜岀淮鐮�" [ref=f9e1109] [cursor=pointer]
+                            - button "瀵煎嚭浜岀淮鐮�" [ref=f9e1112] [cursor=pointer]
+            - generic [ref=f9e1124]:
+              - generic [ref=f9e1125]: 鍏� 11 鏉¤褰�
+              - generic [ref=f9e1127] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f9e1128]:
+                  - textbox "璇烽�夋嫨" [ref=f9e1129]: 20鏉�/椤�
+                - generic [ref=f9e1130]: 睿�
+              - button "飱�" [ref=f9e1133]
+              - button "顧�" [ref=f9e1135]
+              - button "顫�" [ref=f9e1137]
+              - button "1" [ref=f9e1140] [cursor=pointer]
+              - button "顫�" [ref=f9e1141]
+              - button "顧�" [ref=f9e1143]
+              - button "顦�" [ref=f9e1145]
+  - generic [ref=f9e1204]:
+    - img "check-circle" [ref=f9e1205]
+    - text: 鎿嶄綔鎴愬姛
\ No newline at end of file
diff --git a/docs/mes_bag_code_integration.md b/docs/mes_bag_code_integration.md
new file mode 100644
index 0000000..c574bc8
--- /dev/null
+++ b/docs/mes_bag_code_integration.md
@@ -0,0 +1,124 @@
+# MES 涓�琚嬩竴鐮侊紙鎵规 / 鎵樼洏 / 琚嬬爜锛夊墠绔仈璋冩柟妗�
+
+## 娑夊強椤甸潰
+
+- 鐢熶骇鎵规绠$悊锛坄mes/pro/batch`锛�
+- 鎵樼洏鐮佺鐞嗭紙`mes/pro/pallet`锛�
+- 琚嬬爜璧嬬爜绠$悊锛坄mes/pro/bagCode`锛�
+- 鎵爜杩芥函寮圭獥锛坄mes/pro/components/qr-trace-modal`锛�
+
+## 鎬讳綋娴佺▼
+
+涓夌被鐮佺粺涓�閲囩敤鈥滃厛鐢熸垚鍞竴浜岀淮鐮侊紝鍐嶅綍鍏ヤ笟鍔′俊鎭�濓細
+
+1. 鐢熶骇鎵规锛氶鐢熸垚涓存椂鎵规鐮侊紙`PB-YYYYYYYY`锛夆啋 琛ュ綍鍝佺銆佽鍨嬨�佷骇绾裤�佹棩鏈熴�佽矗浠讳汉銆佺敓浜т汉鍛橈紙鐢熸垚姝e紡鎵规鍙� `PC...`锛夈��
+2. 鎵樼洏锛氶鐢熸垚涓存椂鎵樼洏鐮侊紙`PL-YYYYYYYY`锛屼笉缁戝畾鎵规锛夆啋 缁戝畾宸叉寮忚ˉ褰曚笖鐢熶骇涓殑鐢熶骇鎵规锛堢敓鎴愭寮忔墭鐩樼爜 `鎵规鍙�-PXX`锛夈��
+3. 琚嬬爜锛氬厛鐢熸垚鍞竴琚嬬爜锛坄BAG-YYYYYYYY`锛屼笉缁戝畾鎵规锛夆啋 褰曞叆宸叉寮忚ˉ褰曚笖鐢熶骇涓殑鐢熶骇鎵规 鈫� 缁戝畾鍚屾壒娆℃墭鐩樸��
+
+浜岀淮鐮佷竴缁忔墦鍗颁笉浼氬洜鈥滆浆姝e紡鈥濊�屽け鏁堬細鎵爜杩芥函鍚屾椂鍏煎姝e紡鐮佷笌涓存椂鐮侊紝涓存椂鐮佹壂鐮佸洖鎸佷箙淇濈暀骞舵槧灏勫埌鍘熻褰曘��
+
+## API
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|---|---|---|
+| POST | `/mes/pro/batch/pre-generate` | 棰勭敓鎴愭壒娆′复鏃朵簩缁寸爜锛堜笉褰曞叆涓氬姟淇℃伅锛� |
+| PUT | `/mes/pro/batch/fill-info` | 鎵规琛ュ綍姝e紡淇℃伅锛堢敓鎴愭寮忔壒娆″彿锛� |
+| GET | `/mes/pro/batch/get-by-code?code=` | 鎵规鎵爜杩芥函锛堝吋瀹规寮忕爜涓庝复鏃剁爜锛� |
+| GET | `/mes/pro/batch/export-qr?batchId=` | 鎸夋壒娆″鍑烘暣濂椾簩缁寸爜 ZIP |
+| POST | `/mes/pro/pallet/pre-generate` | 棰勭敓鎴愭墭鐩樹复鏃朵簩缁寸爜锛堜笉缁戝畾鎵规锛� |
+| PUT | `/mes/pro/pallet/bind-batch` | 鎵樼洏缁戝畾鐢熶骇鎵规锛堢敓鎴愭寮忔墭鐩樼爜锛� |
+| POST | `/mes/pro/pallet/export-qr-by-ids` | 鎸夌紪鍙峰垪琛ㄥ鍑烘墭鐩樹簩缁寸爜 ZIP锛堟敮鎸佷复鏃舵墭鐩橈級 |
+| GET | `/mes/pro/pallet/export-qr?batchId=` | 鎸夋壒娆″鍑烘墭鐩樹簩缁寸爜 ZIP |
+| GET | `/mes/pro/pallet/get-by-code?code=` | 鎵樼洏鎵爜杩芥函锛堝吋瀹规寮忕爜涓庝复鏃剁爜锛� |
+| POST | `/mes/pro/bag-code/generate` | 鍙敓鎴愬敮涓�琚嬬爜锛屼笉缁戝畾鐢熶骇鎵规 |
+| PUT | `/mes/pro/bag-code/bind-batch` | 琚嬬爜褰曞叆鐢熶骇鎵规 |
+| GET | `/mes/pro/bag-code/get-by-code?code=` | 琚嬬爜鎵爜杩芥函 |
+
+### 鎵规鎺ュ彛
+
+**棰勭敓鎴愯姹傦紙`/mes/pro/batch/pre-generate`锛夛細**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|---|---|---|---|
+| `count` | Integer | 鏄� | 鐢熸垚鎵规涓暟锛屽繀椤诲ぇ浜� 0 |
+| `remark` | String | 鍚� | 澶囨敞 |
+
+鍝嶅簲 `data`锛歚[{ id, tempCode }]`锛宍tempCode` 涓轰复鏃舵壒娆$爜锛堜簩缁寸爜鍐呭锛夈��
+
+**琛ュ綍淇℃伅璇锋眰锛坄/mes/pro/batch/fill-info`锛夛細**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|---|---|---|---|
+| `id` | Long | 鏄� | 涓存椂鎵规缂栧彿 |
+| `itemId` | Long | 鏄� | 鍝佺锛堜骇鍝佺墿鏂欙級缂栧彿 |
+| `lineId` | Long | 鏄� | 浜х嚎缂栧彿 |
+| `produceDate` | Datetime | 鏄� | 鐢熶骇鏃ユ湡 |
+| `ownerUserId` | Long | 鏄� | 璐d换浜� |
+| `workers` | List | 鏄� | 鐢熶骇浜哄憳閰嶇疆锛坲ser_id / worker_type锛� |
+| `remark` | String | 鍚� | 澶囨敞 |
+
+鏈嶅姟绔牎楠岄�氳繃鍚庣敓鎴愭寮忔壒娆″彿骞跺皢鎵规鐘舵�佷繚鎸佷负鑽夌锛沗code` 涓烘寮忔壒娆″彿锛宍tempCode` 浠嶄繚鐣欎緵鍘嗗彶鎵爜銆�
+
+### 鎵樼洏鎺ュ彛
+
+**棰勭敓鎴愯姹傦紙`/mes/pro/pallet/pre-generate`锛夛細**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|---|---|---|---|
+| `count` | Integer | 鏄� | 鐢熸垚鏁伴噺锛屽繀椤诲ぇ浜� 0 |
+| `capacity` | Integer | 鍚� | 鍙琚嬫暟锛堣/鎵樼洏锛� |
+| `remark` | String | 鍚� | 澶囨敞 |
+
+鍝嶅簲 `data`锛歚[{ id, tempCode }]`锛宍tempCode` 涓轰复鏃舵墭鐩樼爜锛堜簩缁寸爜鍐呭锛夈��
+
+**缁戝畾鎵规璇锋眰锛坄/mes/pro/pallet/bind-batch`锛夛細**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|---|---|---|---|
+| `ids` | Long[] | 鏄� | 寰呯粦瀹氱殑涓存椂鎵樼洏缂栧彿鍒楄〃 |
+| `batchId` | Long | 鏄� | 鐢熶骇鎵规缂栧彿 |
+
+浠呭厑璁告湭缁戝畾鎵规鐨勪复鏃舵墭鐩樼粦瀹氾紱鐩爣鎵规蹇呴』宸插畬鎴愭寮忎俊鎭ˉ褰曚笖澶勪簬鐢熶骇涓�傜粦瀹氬悗鎸夋壒娆″唴搴忓彿鐢熸垚姝e紡鎵樼洏鐮併��
+
+**鎸夌紪鍙峰鍑轰簩缁寸爜锛坄/mes/pro/pallet/export-qr-by-ids`锛夛細** 璇锋眰 `{ ids: Long[] }`锛岃繑鍥� ZIP锛涙湭缁戝畾鎵规鐨勪复鏃舵墭鐩樹細鏄剧ず鈥滄湭缁戝畾鎵规鈥濈姸鎬佽�岄潪铏氭瀯鎵规淇℃伅銆�
+
+### 琚嬬爜褰曞叆鎵规璇锋眰锛坄/mes/pro/bag-code/bind-batch`锛�
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|---|---|---|---|
+| `ids` | Long[] | 鏄� | 寰呭綍鍏ョ殑琚嬬爜 ID 鍒楄〃 |
+| `batchId` | Long | 鏄� | 鐢熶骇鎵规 ID |
+
+鐩爣鎵规蹇呴』宸插畬鎴愭寮忎俊鎭ˉ褰曪紙`code` 闈炵┖锛変笖澶勪簬鐢熶骇涓紱褰曞叆鍚庢壒娆$殑琚嬬爜鏁伴噺鍚屾閲嶇畻銆傛墭鐩樹竴寰嬮�氳繃鎵嬪伐鈥滈鐢熸垚 鈫� 缁戝畾鎵规 鈫� 缁戝畾琚嬬爜鈥濇祦绋嬬淮鎶ゃ��
+
+## 瀛楁灞曠ず瑙勫垯
+
+| 瀛楁 | 灞曠ず浣嶇疆 | 璇存槑 |
+|---|---|---|
+| `code` | 鍒楄〃銆佽鎯呫�佷簩缁寸爜 | 姝e紡鎵规鍙� / 姝e紡鎵樼洏鐮� |
+| `tempCode` | 鍒楄〃銆佽鎯呫�佹壂鐮佽拷婧紙鏂板锛� | 涓存椂鎵规鐮侊紙`PB-`锛�/ 涓存椂鎵樼洏鐮侊紙`PL-`锛夛紱鏈ˉ褰�/鏈粦瀹氭椂浣滀负浜岀淮鐮佸睍绀哄�� |
+| `status`锛堟壒娆★級 | 鍒楄〃銆佽拷韪� | 鏈ˉ褰曚复鏃舵壒娆′负鈥滆崏绋库�濓紝鍒楄〃鏄剧ず鈥滃緟琛ュ綍鈥濇爣绛� |
+| `batchId` / `batchCode`锛堟墭鐩橈級 | 鍒楄〃銆佽鎯� | 鏈粦瀹氫负绌猴紝鍒楄〃鏄剧ず鈥滄湭缁戝畾鎵规鈥濇爣绛� |
+| 鎵规涓氬姟瀛楁 | 杩芥函 | 鏈ˉ褰�/鏈粦瀹氭椂涓嶅睍绀鸿櫄鏋勭殑鍝佺銆佷骇绾裤�佹棩鏈熴�佽矗浠讳汉 |
+
+## 涓氬姟瑙勫垯璇存槑
+
+| 鍦烘櫙 | 瑙勫垯 |
+|---|---|
+| 棰勭敓鎴愭壒娆� | 涓嶈姹傚搧绉�/琚嬪瀷/浜х嚎/鏃ユ湡/璐d换浜猴紱鐢熸垚鍏ㄥ眬鍞竴涓存椂鎵规鐮侊紝鐘舵�佷负鑽夌 |
+| 鎵规琛ュ綍 | 浠呭厑璁稿皻鏈敓鎴愭寮忔壒娆″彿鐨勪复鏃舵壒娆★紱閲嶅琛ュ綍鎻愮ず鈥滃凡琛ュ綍鈥� |
+| 鎵规寮�濮嬬敓浜� | 鏈ˉ褰曟寮忎俊鎭殑涓存椂鎵规涓嶅厑璁歌繘鍏ョ敓浜э紙鍚庣鏍¢獙 + 鍓嶇鎸夐挳闅愯棌锛� |
+| 棰勭敓鎴愭墭鐩� | 涓嶈姹傜敓浜ф壒娆★紱鐢熸垚鍏ㄥ眬鍞竴涓存椂鎵樼洏鐮侊紝`batchId` 涓虹┖ |
+| 鎵樼洏缁戝畾鎵规 | 涓存椂鎵樼洏浠呰兘缁戝畾宸叉寮忚ˉ褰曚笖鐢熶骇涓殑鎵规锛涜法鎵规銆侀噸澶嶇粦瀹氳鎷掔粷 |
+| 涓存椂鎵樼洏鍑哄簱 | 鏈粦瀹氭壒娆$殑鎵樼洏绂佹鍙備笌閿�鍞嚭搴撶瓑涓氬姟鎿嶄綔 |
+| 琚嬬爜褰曞叆鎵规 | 浠呭厑璁哥敓浜т腑鐨勬寮忔壒娆★紱涓存椂鎵规涓嶅彲浣滀负褰曞叆鐩爣 |
+| 琚嬬爜缁戝畾鎵樼洏 | 鍙屾柟蹇呴』涓哄悓涓�姝e紡鎵规锛涙湭缁戝畾鎵规鐨勪复鏃舵墭鐩樹笉鍙弬涓庣粦瀹� |
+| 浜岀淮鐮佸鍑� | 涓存椂鎵规/涓存椂鎵樼洏鎸変复鏃剁爜瀵煎嚭锛涗笟鍔′俊鎭负绌烘椂涓嶆樉绀鸿櫄鏋勫唴瀹� |
+| 鎵爜璇嗗埆 | `PB-YYYYYYYY`鈫掓壒娆°�乣PL-YYYYYYYY`鈫掓墭鐩樸�乣鎵规鍙�-PXX`鈫掓墭鐩樸�乣BAG-YYYYYYYY`鈫掕鐮侊紱姝e紡鎵规鍙�/鎵樼洏鐮佺収甯歌瘑鍒� |
+
+## 娉ㄦ剰浜嬮」
+
+- 鍓嶇璋冪敤椤哄簭锛氭壒娆♀�滈鐢熸垚 鈫� 琛ュ綍淇℃伅 鈫� 寮�濮嬬敓浜р�濓紱鎵樼洏鈥滈鐢熸垚 鈫� 缁戝畾鎵规 鈫� 缁戝畾琚嬬爜鈥濓紱琚嬬爜鈥滅敓鎴� 鈫� 褰曞叆鎵规 鈫� 缁戝畾鎵樼洏鈥濄��
+- 鎵规姝e紡鍖栧悗 `tempCode` 涓嶅垹闄わ紝鍘嗗彶鎵撳嵃鐨勪复鏃朵簩缁寸爜鎵爜浠嶈兘杩芥函锛屽嬁鐢ㄦ寮忕爜瑕嗙洊涓存椂鐮併��
+- 涓存椂鎵樼洏鍦ㄧ粦瀹氭壒娆″墠涓嶅彲琚鐮佺粦瀹氥�佷笉鍙攢鍞嚭搴擄紱鎵归噺缁戝畾闇�鍏堝嬀閫夊鏉′复鏃舵墭鐩樿褰曘��
+- 琛ュ綍/缁戝畾澶辫触鏃朵繚鐣欏綋鍓嶉�夋嫨锛岄伩鍏嶈浠ヤ负宸插畬鎴愪笟鍔″叧鑱斻��
\ No newline at end of file
diff --git a/docs/mes_pro_pallet_auto_generation_integration.md b/docs/mes_pro_pallet_auto_generation_integration.md
deleted file mode 100644
index ab94b06..0000000
--- a/docs/mes_pro_pallet_auto_generation_integration.md
+++ /dev/null
@@ -1,144 +0,0 @@
-# MES 鎵樼洏鐮佽嚜鍔ㄧ敓鎴� - 鍓嶇鑱旇皟鏂规
-
-## 娑夊強椤甸潰
-
-- 鐢熶骇鎵规绠$悊锛氭柊澧�/缂栬緫鎵规鏃堕�夋嫨鍖呰琚嬪瀷銆�
-- 琚嬬爜绠$悊锛氱敓鎴愯鐮佹垚鍔熷悗鎺ユ敹鑷姩鎵樼洏鏍囩鏁版嵁銆�
-- 鎵樼洏鐮佺鐞嗭細鏌ョ湅鑷姩鐢熸垚鎵樼洏鍙婂叾缁戝畾琚嬫暟銆�
-- 浜岀淮鐮佹墦鍗板尯鍩燂細鏍规嵁鏍囩鏁版嵁涓�娆℃覆鏌撳悓涓�鎵樼洏鐨� 3 浠芥爣绛惧苟瑙﹀彂涓�娆℃祻瑙堝櫒鎵撳嵃銆�
-
-## 涓氬姟娴佺▼涓庢暟鎹甫鍏�
-
-1. 鍒涘缓鎴栫紪杈戞壒娆℃椂锛屽繀椤婚�夋嫨鍖呰琚嬪瀷锛氬皬琚嬶紙鍊� 10锛夋垨澶ц锛堝�� 20锛夈�傚皬琚嬭嚜鍔ㄦ墭鐩橀槇鍊间负 100 琚嬶紝澶ц鑷姩鎵樼洏闃堝�间负 48 琚嬨��
-2. 鎵规杩涘叆鐢熶骇涓悗锛岃皟鐢ㄧ敓鎴愯鐮佹帴鍙c�傝鐮佺殑鎵规鍙枫�佸搧绉嶃�佷骇绾裤�佺敓浜ф棩鏈熷拰璐d换浜虹敱鎵规鑷姩甯﹀叆銆�
-3. 鍚庣鍦ㄥ悓涓�浜嬪姟涓粺璁¤鎵规鏈夋晥琚嬬爜锛氭湭閫昏緫鍒犻櫎涓旂姸鎬佷笉鏄凡浣滃簾锛屽苟鎸夎搴忓彿鍗囧簭鍙栧畬鏁撮槇鍊肩粍銆�
-4. 姣忎釜瀹屾暣闃堝�肩粍鑷姩鍒涘缓涓�涓墭鐩樼爜锛屽苟灏嗙粍鍐呭叏閮ㄨ鐮佸啓鍏ュ悓涓�鎵樼洏鐨勬墭鐩樼紪鍙峰拰鎵樼洏鐮併�傛湭杈惧埌瀹屾暣闃堝�肩殑浣欐暟琚嬬爜淇濇寔鏈粦瀹氥��
-5. 鑷姩鎵樼洏鐢熸垚鍚庯紝鐢熸垚琚嬬爜鎺ュ彛鍝嶅簲涓殑 `autoPallets` 杩斿洖鏈鏂板缓鎵樼洏鏍囩鏁版嵁銆傛瘡涓爣绛剧殑 `copies` 鍥哄畾涓� 3锛岃〃绀哄悓涓�鎵樼洏浜岀淮鐮佹墦鍗� 3 浠斤紝涓嶆槸鐢熸垚 3 涓墭鐩樸��
-6. 鍓嶇鏀跺埌 `autoPallets` 鍚庯紝涓烘瘡涓墭鐩樻爣绛炬覆鏌� 3 涓墦鍗板壇鏈紝骞跺彧璋冪敤涓�娆℃祻瑙堝櫒鎵撳嵃銆傛櫘閫氱綉椤垫墦鍗颁細鎵撳紑娴忚鍣ㄦ墦鍗版祦绋嬶紝鍚庣涓嶈繑鍥為潤榛樻墦鍗版垚鍔熺姸鎬併��
-
-## API
-
-### 1. 鎵规鍒涘缓/鏇存柊
-
-| 鏂规硶 | 璺緞 | 璇存槑 |
-|---|---|---|
-| POST | `/mes/pro/batch/create` | 鍒涘缓鐢熶骇鎵规锛屽寘瑁呰鍨嬪繀濉� |
-| PUT | `/mes/pro/batch/update` | 鏇存柊鐢熶骇鎵规锛涚敓鎴愯鐮佹垨鎵樼洏鍚庝笉鍏佽淇敼琚嬪瀷 |
-
-璇锋眰鍙傛暟鏂板锛�
-
-| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
-|---|---|---|---|
-| bagType | Integer | 鏄� | 10 灏忚锛堥槇鍊�100锛夛紝20 澶ц锛堥槇鍊�48锛� |
-
-鍝嶅簲瀛楁鏂板锛�
-
-| 瀛楁 | 绫诲瀷 | 璇存槑 |
-|---|---|---|
-| bagType | Integer | 褰撳墠鎵规鍖呰琚嬪瀷 |
-
-### 2. 鐢熸垚琚嬬爜骞惰嚜鍔ㄧ敓鎴愭墭鐩�
-
-| 鏂规硶 | 璺緞 | 璇存槑 |
-|---|---|---|
-| POST | `/mes/pro/bag-code/generate` | 鐢熸垚琚嬬爜锛涙湁鏁堣鐮佽揪鍒板畬鏁撮槇鍊兼椂鑷姩鐢熸垚鎵樼洏骞剁粦瀹� |
-
-璇锋眰鍙傛暟锛�
-
-| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
-|---|---|---|---|
-| batchId | Long | 鏄� | 鐢熶骇涓壒娆$紪鍙� |
-| count | Integer | 鏄� | 鏈鐢熸垚琚嬬爜鏁伴噺锛屽ぇ浜�0 |
-| remark | String | 鍚� | 琚嬬爜澶囨敞 |
-
-鍝嶅簲 `data`锛�
-
-| 瀛楁 | 绫诲瀷 | 璇存槑 |
-|---|---|---|
-| uuid | String | 鏈琚嬬爜鐢熸垚缁� UUID |
-| autoPallets | Array | 鏈鑷姩鐢熸垚鎵樼洏鏍囩鍒楄〃锛涙湭璺ㄨ繃瀹屾暣闃堝�兼椂涓虹┖ |
-
-`autoPallets` 瀛楁锛�
-
-| 瀛楁 | 绫诲瀷 | 璇存槑 |
-|---|---|---|
-| id | Long | 鎵樼洏缂栧彿 |
-| code | String | 鎵樼洏浜岀淮鐮佸唴瀹� |
-| batchId | Long | 鐢熶骇鎵规缂栧彿 |
-| batchCode | String | 鎵规鍙� |
-| palletNo | Integer | 鎵规鍐呮墭鐩樺簭鍙� |
-| capacity | Integer | 鎵樼洏瀹归噺锛岀瓑浜庤鍨嬮槇鍊� |
-| bagCount | Integer | 宸茶琚嬫暟锛岃嚜鍔ㄦ墭鐩樼敓鎴愬悗绛変簬瀹归噺 |
-| copies | Integer | 鏍囩鎵撳嵃浠芥暟锛屽浐瀹氫负3 |
-| itemId/itemCode/itemName/itemSpecification | 鈥� | 鍝佺淇℃伅 |
-| lineCode/lineName | String | 浜х嚎淇℃伅 |
-| produceDate | String | 鐢熶骇鏃ユ湡 |
-| ownerUserId/ownerUserName | 鈥� | 璐d换浜轰俊鎭� |
-
-鍝嶅簲绀轰緥锛�
-
-```json
-{
-  "code": 0,
-  "data": {
-    "uuid": "鐢熸垚缁刄UID",
-    "autoPallets": [
-      {
-        "id": 1001,
-        "code": "PC20260821L01A001-P01",
-        "batchId": 1024,
-        "batchCode": "PC20260821L01A001",
-        "palletNo": 1,
-        "capacity": 100,
-        "bagCount": 100,
-        "copies": 3,
-        "itemId": 2001,
-        "itemCode": "ITEM001",
-        "itemName": "浜у搧A",
-        "itemSpecification": "瑙勬牸A",
-        "lineCode": "L01",
-        "lineName": "鍖呰涓�绾�",
-        "produceDate": "2026-08-21 08:00:00",
-        "ownerUserId": 1,
-        "ownerUserName": "寮犱笁"
-      }
-    ]
-  }
-}
-```
-
-## 瀛楁灞曠ず瑙勫垯
-
-| 瀛楁 | 灞曠ず浣嶇疆 | 璇存槑 |
-|---|---|---|
-| bagType | 鎵规鏂板/缂栬緫銆佹壒娆″垪琛ㄣ�佹壒娆¤鎯� | 閫氳繃瀛楀吀鏄剧ず灏忚/澶ц锛涙壒娆″凡鏈夎鐮佹垨鎵樼洏鍚庡彧璇� |
-| bagQuantity | 鎵规鍒楄〃/璇︽儏 | 鏈夋晥琚嬬爜绱鏁伴噺 |
-| palletQuantity | 鎵规鍒楄〃/璇︽儏 | 宸茬敓鎴愭墭鐩樻暟閲忥紝鍖呭惈鎵嬪伐鍜岃嚜鍔ㄦ墭鐩� |
-| autoGenerated | 鎵樼洏鍒楄〃/璇︽儏 | 鏍囪瘑璇ユ墭鐩樻槸鍚︾敱闃堝�艰嚜鍔ㄧ敓鎴� |
-| autoPallets[].code | 鎵撳嵃鏍囩 | 浣滀负浜岀淮鐮佺紪鐮佸唴瀹癸紝鍚屾椂鏄剧ず鎵樼洏鐮佹枃鏈� |
-| autoPallets[].copies | 鎵撳嵃鎺у埗 | 鍚屼竴鎵樼洏鏍囩鎵撳嵃3浠斤紱涓嶈杩炵画璋冪敤涓夋鎵撳嵃 |
-| autoPallets[].batchCode | 鎵撳嵃鏍囩 | 鏄剧ず鍏宠仈鎵规鍙� |
-| autoPallets[].bagCount/capacity | 鎵撳嵃鏍囩鎴栬鎯� | 鑷姩鎵樼洏姝e父鎯呭喌涓嬬浉绛夛紝鍧囦负瀵瑰簲闃堝�� |
-
-## 涓氬姟瑙勫垯璇存槑
-
-| 鍦烘櫙 | 瑙勫垯 |
-|---|---|
-| 灏忚 | 鏈夋晥琚嬬爜姣忕疮璁�100涓嚜鍔ㄧ敓鎴愪竴涓墭鐩� |
-| 澶ц | 鏈夋晥琚嬬爜姣忕疮璁�48涓嚜鍔ㄧ敓鎴愪竴涓墭鐩� |
-| 鏈夋晥琚嬬爜 | `deleted = 0` 涓� `status <> 30`锛屽凡缁戝畾浜哄伐鎵樼洏鐨勮鐮佷笉鍙備笌鑷姩褰掗泦 |
-| 琚嬬爜鍒嗙粍 | 鎸� `bagNo` 鍗囧簭锛屾瘡缁勫繀椤昏揪鍒板畬鏁撮槇鍊硷紱浣欐暟涓嶇粦瀹� |
-| 鑷姩鎵樼洏瀹归噺 | 鍥哄畾涓哄綋鍓嶆壒娆¢槇鍊硷紝涓嶄娇鐢ㄦ墜宸ユ墭鐩樺閲� |
-| 閲嶅鐢熸垚 | 鍚屼竴鎵规璇锋眰涓茶閿佸畾锛涘凡缁戝畾琚嬬爜涓嶄細鍐嶆鍊欓�夛紝閲嶅璋冪敤涓嶉噸澶嶅垱寤� |
-| 浜哄伐缁戝畾 | 鑷姩娴佺▼涓嶆敼缁戝凡浜哄伐缁戝畾琚嬬爜锛涗汉宸ョ粦瀹氬拰瑙g粦闇�瑕佸湪鏈嶅姟绔姞閿� |
-| 鐮存崯鏇挎崲 | 鏂拌鐮佺户鎵挎棫琚嬬爜宸叉湁鎵樼洏锛涙湁鏁堟暟閲忎笉澧炲姞锛屼笉閲嶅瑙﹀彂鏂版墭鐩� |
-| 鍒犻櫎/浣滃簾 | 浣滃簾琚嬬爜涓嶈鍏ユ湁鏁堟暟锛涘凡缁戝畾琚嬬爜涓嶅厑璁搁�氳繃鐢熸垚缁勫垹闄� |
-| 鎵撳嵃 | 鍚庣鍙繑鍥炴爣绛炬暟鎹紱娴忚鍣ㄧ涓�娆℃覆鏌�3浠藉苟璋冪敤涓�娆� `window.print()`锛屾棤娉曚繚璇侀潤榛樻墦鍗� |
-
-## 娉ㄦ剰浜嬮」
-
-- 鍘嗗彶鎵规鐨� `bagType` 闇�瑕佸湪鍚敤鑷姩鎵樼洏鍓嶈ˉ榻愶紝涓嶈兘鐢卞悗绔寽娴嬨��
-- 鍙湁鐢熶骇涓壒娆″厑璁哥敓鎴愯鐮佸拰鑷姩鎵樼洏銆�
-- 鏅�氭祻瑙堝櫒鏃犳硶缁曡繃绯荤粺鎵撳嵃瀵硅瘽妗嗭紱鑻ヨ姹傛棤浜哄�煎畧鎵撳嵃锛岄渶瑕佸彟琛屾帴鍏ユ湰鍦版墦鍗颁唬鐞嗘垨鎵撳嵃鎺т欢銆�
-- 涓嶈鎶� ZIP 涓嬭浇鍝嶅簲褰撲綔鑷姩鎵撳嵃缁撴灉锛涚幇鏈� ZIP 鎺ュ彛缁х画鐢ㄤ簬鎵归噺瀵煎嚭銆�
-- 鑷姩鎵樼洏涓殑琚嬬爜瀹屾暣鍏宠仈浠ヨ鐮佽褰曠殑 `palletId`銆乣palletCode` 鍜屾墭鐩樼殑 `bagCount` 涓哄噯銆�
diff --git a/sql/mysql/mes_pro_batch_bag_code_init.sql b/sql/mysql/mes_pro_batch_bag_code_init.sql
index 8c7a86f..ed7fc6c 100644
--- a/sql/mysql/mes_pro_batch_bag_code_init.sql
+++ b/sql/mysql/mes_pro_batch_bag_code_init.sql
@@ -12,8 +12,10 @@
 -- ----------------------------
 CREATE TABLE IF NOT EXISTS `mes_pro_batch` (
     `id`              BIGINT       NOT NULL AUTO_INCREMENT COMMENT '缂栧彿',
-    `code`            VARCHAR(64)  NOT NULL COMMENT '鎵规鍙凤紙鑷姩鐢熸垚锛氬墠缂�+鏃ユ湡+浜х嚎+鍝佺+娴佹按鍙凤級',
+    `code`            VARCHAR(64)  DEFAULT NULL COMMENT '鎵规鍙凤紙琛ュ綍涓氬姟淇℃伅鍚庤嚜鍔ㄧ敓鎴愶紱鍗曟褰曞叆鎴栬ˉ褰曟祦绋嬪繀濉級',
+    `temp_code`       VARCHAR(64)  DEFAULT NULL COMMENT '涓存椂鎵规鐮侊紙PB-8浣嶅叏灞�搴忓彿锛岄鐢熸垚浜岀淮鐮侀樁娈典娇鐢級',
     `item_id`         BIGINT       NOT NULL COMMENT '鍝佺锛堜骇鍝佺墿鏂欙級缂栧彿锛屽叧鑱� mdm_item.id',
+    `line_id`         BIGINT       DEFAULT NULL COMMENT '浜х嚎缂栧彿锛屽叧鑱� mes_pro_line.id',
     `line_code`       VARCHAR(32)  DEFAULT NULL COMMENT '浜х嚎缂栫爜锛堟墜濉紝鍙備笌鎵规鍙风敓鎴愶級',
     `line_name`       VARCHAR(64)  DEFAULT NULL COMMENT '浜х嚎鍚嶇О锛堟墜濉級',
     `machinery_id`    BIGINT       DEFAULT NULL COMMENT '鐢熶骇璁惧缂栧彿锛堟満锛夛紝鍏宠仈 mes_dv_machinery.id',
@@ -23,6 +25,11 @@
     `owner_user_id`   BIGINT       DEFAULT NULL COMMENT '璐d换浜虹敤鎴风紪鍙凤紙璐d换钀藉疄鍒颁汉锛夛紝鍏宠仈 system_users.id',
     `bag_quantity`    INT          NOT NULL DEFAULT 0 COMMENT '宸茬敓鎴愯鐮佹暟閲忥紙涓�琚嬩竴鐮侊級',
     `pallet_quantity` INT          NOT NULL DEFAULT 0 COMMENT '宸茬敓鎴愭墭鐩樼爜鏁伴噺',
+    `inbound_time`    DATETIME     DEFAULT NULL COMMENT '鍏ュ簱鏃堕棿',
+    `inbound_bag_quantity` INT      DEFAULT NULL COMMENT '绱鍏ュ簱琚嬫暟',
+    `inbound_event_id` BIGINT      DEFAULT NULL COMMENT '鏈�杩戝叆搴撲簨浠剁紪鍙�',
+    `inbound_device_code` VARCHAR(64) DEFAULT NULL COMMENT '鍏ュ簱璁惧缂栫爜',
+    `inbound_line_code` VARCHAR(64) DEFAULT NULL COMMENT '鍏ュ簱浜х嚎缂栫爜',
     `status`          TINYINT      NOT NULL DEFAULT 10 COMMENT '鎵规鐘舵�侊紙瀛楀吀 mes_pro_batch_status锛�10 鑽夌 20 鐢熶骇涓� 30 宸插畬鎴� 40 宸蹭綔搴燂級',
     `remark`          VARCHAR(500) DEFAULT NULL COMMENT '澶囨敞',
     `creator`         VARCHAR(64)  DEFAULT '' COMMENT '鍒涘缓鑰�',
@@ -32,6 +39,7 @@
     `deleted`         BIT(1)       NOT NULL DEFAULT b'0' COMMENT '鏄惁鍒犻櫎',
     PRIMARY KEY (`id`),
     UNIQUE KEY `uk_code` (`code`),
+    UNIQUE KEY `uk_temp_code` (`temp_code`),
     KEY `idx_item_id` (`item_id`),
     KEY `idx_work_order_id` (`work_order_id`),
     KEY `idx_status` (`status`)
@@ -61,12 +69,14 @@
 -- ----------------------------
 CREATE TABLE IF NOT EXISTS `mes_pro_pallet` (
     `id`         BIGINT       NOT NULL AUTO_INCREMENT COMMENT '缂栧彿',
-    `code`       VARCHAR(64)  NOT NULL COMMENT '鎵樼洏鐮侊紙鎵规鍙�-P+鎵樼洏搴忓彿锛屽叏灞�鍞竴锛�',
-    `batch_id`   BIGINT       NOT NULL COMMENT '鐢熶骇鎵规缂栧彿锛屽叧鑱� mes_pro_batch.id',
+    `code`       VARCHAR(64)  DEFAULT NULL COMMENT '鎵樼洏鐮侊紙鎵规鍙�-P+鎵樼洏搴忓彿锛岀粦瀹氭壒娆″悗鐢熸垚锛�',
+    `temp_code`  VARCHAR(64)  DEFAULT NULL COMMENT '涓存椂鎵樼洏鐮侊紙PL-8浣嶅叏灞�搴忓彿锛岄鐢熸垚浜岀淮鐮侀樁娈典娇鐢級',
+    `batch_id`   BIGINT       DEFAULT NULL COMMENT '鐢熶骇鎵规缂栧彿锛岀粦瀹氭壒娆″悗鍏宠仈 mes_pro_batch.id',
     `batch_code` VARCHAR(64)  DEFAULT NULL COMMENT '鎵规鍙凤紙鍐椾綑锛屼究浜庡睍绀猴級',
-    `pallet_no`  INT          NOT NULL COMMENT '鎵规鍐呮墭鐩樺簭鍙�',
+    `pallet_no`  INT          DEFAULT NULL COMMENT '鎵规鍐呮墭鐩樺簭鍙凤紙缁戝畾鎵规鍚庣敓鎴愶級',
     `capacity`   INT          DEFAULT NULL COMMENT '鍙琚嬫暟锛堣/鎵樼洏锛�',
     `bag_count`  INT          NOT NULL DEFAULT 0 COMMENT '宸茬粦瀹氳鐮佹暟閲�',
+    `auto_generated` BIT(1)    NOT NULL DEFAULT b'0' COMMENT '鏄惁鑷姩鐢熸垚',
     `status`     TINYINT      NOT NULL DEFAULT 10 COMMENT '鐘舵�侊紙瀛楀吀 mes_pro_pallet_status锛�10 鍚敤 20 浣滃簾锛�',
     `remark`     VARCHAR(255) DEFAULT NULL COMMENT '澶囨敞',
     `creator`    VARCHAR(64)  DEFAULT '' COMMENT '鍒涘缓鑰�',
@@ -76,6 +86,7 @@
     `deleted`    BIT(1)       NOT NULL DEFAULT b'0' COMMENT '鏄惁鍒犻櫎',
     PRIMARY KEY (`id`),
     UNIQUE KEY `uk_code` (`code`),
+    UNIQUE KEY `uk_temp_code` (`temp_code`),
     KEY `idx_batch_id` (`batch_id`)
 ) ENGINE = InnoDB COMMENT = 'MES 鎵樼洏鐮�';
 
@@ -85,9 +96,9 @@
 CREATE TABLE IF NOT EXISTS `mes_pro_bag_code` (
     `id`          BIGINT       NOT NULL AUTO_INCREMENT COMMENT '缂栧彿',
     `uuid`        VARCHAR(32)  DEFAULT NULL COMMENT '鐢熸垚缁� UUID锛堟爣璁板悓涓�娆$敓鎴愮殑鏁版嵁鍖咃級',
-    `code`        VARCHAR(64)  NOT NULL COMMENT '琚嬬爜锛堜簩缁寸爜鍐呭锛氭壒娆″彿-琚嬪簭鍙凤紝鍏ㄥ眬鍞竴锛�',
-    `bag_no`      INT          NOT NULL COMMENT '鎵规鍐呰搴忓彿',
-    `batch_id`    BIGINT       NOT NULL COMMENT '鐢熶骇鎵规缂栧彿锛屽叧鑱� mes_pro_batch.id',
+    `code`        VARCHAR(64)  NOT NULL COMMENT '琚嬬爜锛堜簩缁寸爜鍐呭锛屽叏灞�鍞竴锛�',
+    `bag_no`      INT          NOT NULL COMMENT '鍏ㄥ眬琚嬪簭鍙�',
+    `batch_id`    BIGINT       DEFAULT NULL COMMENT '鐢熶骇鎵规缂栧彿锛屽綍鍏ヤ俊鎭悗鍏宠仈 mes_pro_batch.id',
     `batch_code`  VARCHAR(64)  DEFAULT NULL COMMENT '鎵规鍙凤紙鍐椾綑锛屼究浜庡睍绀猴級',
     `item_id`     BIGINT       DEFAULT NULL COMMENT '鍝佺锛堜骇鍝佺墿鏂欙級缂栧彿锛堝啑浣欒嚜鎵规锛�',
     `pallet_id`   BIGINT       DEFAULT NULL COMMENT '缁戝畾鎵樼洏缂栧彿锛屽叧鑱� mes_pro_pallet.id',
diff --git a/sql/mysql/mes_pro_pallet_auto_threshold.sql b/sql/mysql/mes_pro_pallet_auto_threshold.sql
deleted file mode 100644
index 874007a..0000000
--- a/sql/mysql/mes_pro_pallet_auto_threshold.sql
+++ /dev/null
@@ -1,44 +0,0 @@
--- =============================================
--- MES 鎵樼洏鐮佽嚜鍔ㄧ敓鎴愶紙鎸夋湁鏁堣鐮佺疮璁¢槇鍊硷級杩佺Щ鑴氭湰
--- 1. mes_pro_batch 澧炲姞鍖呰琚嬪瀷 bag_type锛堝皬琚� 10 / 澶ц 20锛�
--- 2. mes_pro_pallet 澧炲姞 auto_generated 鑷姩鐢熸垚鏍囪瘑
--- 3. 澧炲姞鍖呰琚嬪瀷瀛楀吀
--- MySQL 8.4 閫傜敤锛屼笉鍖呭惈 tenant_id
--- =============================================
-
-SET NAMES utf8mb4;
-
--- ----------------------------
--- 1. 鐢熶骇鎵规澧炲姞鍖呰琚嬪瀷
--- ----------------------------
-SET @batch_bag_type_exists = (SELECT COUNT(*) FROM information_schema.columns
-    WHERE table_schema = DATABASE() AND table_name = 'mes_pro_batch' AND column_name = 'bag_type');
-SET @batch_bag_type_sql = IF(@batch_bag_type_exists = 0,
-    'ALTER TABLE mes_pro_batch ADD COLUMN bag_type TINYINT DEFAULT NULL COMMENT ''鍖呰琚嬪瀷锛堝瓧鍏� mes_pro_bag_type锛�10 灏忚 20 澶ц锛夛紝鐢ㄤ簬鑷姩褰掗泦鎵樼洏'' AFTER item_id',
-    'SELECT 1');
-PREPARE batch_bag_type_stmt FROM @batch_bag_type_sql;
-EXECUTE batch_bag_type_stmt;
-DEALLOCATE PREPARE batch_bag_type_stmt;
-
--- ----------------------------
--- 2. 鎵樼洏鐮佽〃澧炲姞鑷姩鐢熸垚鏍囪瘑
--- ----------------------------
-SET @pallet_auto_generated_exists = (SELECT COUNT(*) FROM information_schema.columns
-    WHERE table_schema = DATABASE() AND table_name = 'mes_pro_pallet' AND column_name = 'auto_generated');
-SET @pallet_auto_generated_sql = IF(@pallet_auto_generated_exists = 0,
-    'ALTER TABLE mes_pro_pallet ADD COLUMN auto_generated BIT(1) NOT NULL DEFAULT b''0'' COMMENT ''鏄惁鑷姩鐢熸垚锛堟寜鏈夋晥琚嬬爜绱闃堝�肩敓鎴愶紝瀹归噺鍥哄畾涓洪槇鍊硷級'' AFTER bag_count',
-    'SELECT 1');
-PREPARE pallet_auto_generated_stmt FROM @pallet_auto_generated_sql;
-EXECUTE pallet_auto_generated_stmt;
-DEALLOCATE PREPARE pallet_auto_generated_stmt;
-
--- ----------------------------
--- 3. 鍖呰琚嬪瀷瀛楀吀
--- ----------------------------
-INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
-SELECT 'MES 鍖呰琚嬪瀷', 'mes_pro_bag_type', 0, '鎵樼洏鑷姩褰掗泦闃堝�煎垽瀹�', '1', NOW(), '1', NOW(), b'0' FROM DUAL
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_dict_type WHERE `type` = 'mes_pro_bag_type' AND deleted = 0) t);
-
-INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
-(1065364, 1, '灏忚', '10', 'mes_pro_bag_type', 0, 'primary', '', '1', NOW(), '1', NOW(), b'0'),
-(1065365, 2, '澶ц', '20', 'mes_pro_bag_type', 0, 'warning', '', '1', NOW(), '1', NOW(), b'0');
\ No newline at end of file
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/MesProBagCodeController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/MesProBagCodeController.java
index 37c315b..fa1455f 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/MesProBagCodeController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/MesProBagCodeController.java
@@ -9,6 +9,7 @@
 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeBindBatchReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeBindReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeGenerateRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeGenerateReqVO;
@@ -95,6 +96,14 @@
         return success(true);
     }
 
+    @PutMapping("/bind-batch")
+    @Operation(summary = "琚嬬爜褰曞叆鐢熶骇鎵规")
+    @PreAuthorize("@ss.hasPermission('mes:pro-bag-code:update')")
+    public CommonResult<Boolean> bindBatch(@Valid @RequestBody MesProBagCodeBindBatchReqVO bindReqVO) {
+        bagCodeService.bindBatch(bindReqVO);
+        return success(true);
+    }
+
     @PutMapping("/bind-pallet")
     @Operation(summary = "琚嬬爜缁戝畾鎵樼洏")
     @PreAuthorize("@ss.hasPermission('mes:pro-bag-code:update')")
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeBindBatchReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeBindBatchReqVO.java
new file mode 100644
index 0000000..409dfec
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeBindBatchReqVO.java
@@ -0,0 +1,21 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.util.List;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 琚嬬爜褰曞叆鐢熶骇鎵规 Request VO")
+@Data
+public class MesProBagCodeBindBatchReqVO {
+
+    @Schema(description = "琚嬬爜缂栧彿鍒楄〃", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "琚嬬爜缂栧彿鍒楄〃涓嶈兘涓虹┖")
+    private List<Long> ids;
+
+    @Schema(description = "鐢熶骇鎵规缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    @NotNull(message = "鐢熶骇鎵规缂栧彿涓嶈兘涓虹┖")
+    private Long batchId;
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeGenerateReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeGenerateReqVO.java
index 9fc8107..3a708f4 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeGenerateReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeGenerateReqVO.java
@@ -9,10 +9,6 @@
 @Data
 public class MesProBagCodeGenerateReqVO {
 
-    @Schema(description = "鐢熶骇鎵规缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
-    @NotNull(message = "鐢熶骇鎵规缂栧彿涓嶈兘涓虹┖")
-    private Long batchId;
-
     @Schema(description = "鐢熸垚琚嬫暟锛堟湰娆$敓鎴愮殑琚嬬爜鏁伴噺锛�", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
     @NotNull(message = "鐢熸垚琚嬫暟涓嶈兘涓虹┖")
     @Positive(message = "鐢熸垚琚嬫暟蹇呴』澶т簬 0")
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeGenerateRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeGenerateRespVO.java
index 1fd1c6a..87f5d35 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeGenerateRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeGenerateRespVO.java
@@ -1,10 +1,7 @@
 package cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo;
 
-import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletAutoPrintRespVO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
-
-import java.util.List;
 
 @Schema(description = "绠$悊鍚庡彴 - MES 琚嬬爜鐢熸垚鍝嶅簲")
 @Data
@@ -12,7 +9,4 @@
 
     @Schema(description = "鐢熸垚缁� UUID")
     private String uuid;
-
-    @Schema(description = "鏈鑷姩鐢熸垚鐨勬墭鐩樻爣绛撅紱姣忎釜鏍囩 copies 鍥哄畾涓� 3")
-    private List<MesProPalletAutoPrintRespVO> autoPallets;
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/MesProBatchController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/MesProBatchController.java
index 55a450b..6c4830a 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/MesProBatchController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/MesProBatchController.java
@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.mes.controller.admin.pro.batch;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
@@ -10,6 +11,8 @@
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchPageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchPreGenerateReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchPreGenerateRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchSaveReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchTraceRespVO;
@@ -75,10 +78,27 @@
     private MesProBagCodeService bagCodeService;
 
     @PostMapping("/create")
-    @Operation(summary = "鍒涘缓鐢熶骇鎵规锛堣嚜鍔ㄧ敓鎴愭壒娆″彿锛�")
+    @Operation(summary = "鍒涘缓鐢熶骇鎵规锛堜竴娆″綍鍏ヤ笟鍔′俊鎭紝鑷姩鐢熸垚鎵规鍙凤級")
     @PreAuthorize("@ss.hasPermission('mes:pro-batch:create')")
     public CommonResult<Long> createBatch(@Valid @RequestBody MesProBatchSaveReqVO createReqVO) {
         return success(batchService.createBatch(createReqVO));
+    }
+
+    @PostMapping("/pre-generate")
+    @Operation(summary = "棰勭敓鎴愮敓浜ф壒娆′簩缁寸爜锛堜粎鐢熸垚涓存椂鎵规鐮侊紝涓嶅綍鍏ヤ笟鍔′俊鎭級")
+    @PreAuthorize("@ss.hasPermission('mes:pro-batch:create')")
+    public CommonResult<List<MesProBatchPreGenerateRespVO>> preGenerateBatch(
+            @Valid @RequestBody MesProBatchPreGenerateReqVO preGenerateReqVO) {
+        List<MesProBatchDO> list = batchService.preGenerateBatch(preGenerateReqVO);
+        return success(BeanUtils.toBean(list, MesProBatchPreGenerateRespVO.class));
+    }
+
+    @PutMapping("/fill-info")
+    @Operation(summary = "琛ュ綍鐢熶骇鎵规涓氬姟淇℃伅锛堢敓鎴愭寮忔壒娆″彿锛屼粎涓存椂鎵规鍙敤锛�")
+    @PreAuthorize("@ss.hasPermission('mes:pro-batch:update')")
+    public CommonResult<Boolean> fillBatchInfo(@Valid @RequestBody MesProBatchSaveReqVO fillReqVO) {
+        batchService.fillBatchInfo(fillReqVO);
+        return success(true);
     }
 
     @PutMapping("/update")
@@ -183,7 +203,8 @@
         if (pallets.size() + 1 > QrCodeImageUtils.MAX_QR_EXPORT) {
             throw exception(PRO_QR_EXPORT_TOO_MANY);
         }
-        QrCodeImageUtils.writeZip(response, "鎵规浜岀淮鐮�-" + batch.getCode(), buildBatchQrLabels(batch, pallets));
+        String qrCode = StrUtil.blankToDefault(batch.getCode(), batch.getTempCode());
+        QrCodeImageUtils.writeZip(response, "鎵规浜岀淮鐮�-" + qrCode, buildBatchQrLabels(batch, pallets));
     }
 
     // ==================== 鎷兼帴 VO ====================
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchPageReqVO.java
index d8cc18f..552dd1e 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchPageReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchPageReqVO.java
@@ -20,6 +20,9 @@
     @Schema(description = "鎵规鍙�", example = "PC20260818L01NY001")
     private String code;
 
+    @Schema(description = "涓存椂鎵规鐮�", example = "PB-00000001")
+    private String tempCode;
+
     @Schema(description = "鍝佺锛堜骇鍝佺墿鏂欙級缂栧彿", example = "1")
     private Long itemId;
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchPreGenerateReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchPreGenerateReqVO.java
new file mode 100644
index 0000000..89caac7
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchPreGenerateReqVO.java
@@ -0,0 +1,20 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Positive;
+import lombok.Data;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 鐢熶骇鎵规棰勭敓鎴愪簩缁寸爜 Request VO锛堜粎鐢熸垚涓存椂鎵规鐮侊紝涓嶅綍鍏ヤ笟鍔′俊鎭級")
+@Data
+public class MesProBatchPreGenerateReqVO {
+
+    @Schema(description = "鐢熸垚鎵规涓暟", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "鐢熸垚鎵规涓暟涓嶈兘涓虹┖")
+    @Positive(message = "鐢熸垚鎵规涓暟蹇呴』澶т簬 0")
+    private Integer count;
+
+    @Schema(description = "澶囨敞", example = "寰呰ˉ褰曞搧绉嶄俊鎭�")
+    private String remark;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchPreGenerateRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchPreGenerateRespVO.java
new file mode 100644
index 0000000..26006d4
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchPreGenerateRespVO.java
@@ -0,0 +1,16 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 鐢熶骇鎵规棰勭敓鎴愪簩缁寸爜 Response VO")
+@Data
+public class MesProBatchPreGenerateRespVO {
+
+    @Schema(description = "鐢熶骇鎵规缂栧彿", example = "1024")
+    private Long id;
+
+    @Schema(description = "涓存椂鎵规鐮侊紙浜岀淮鐮佸唴瀹癸級", example = "PB-00000001")
+    private String tempCode;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchRespVO.java
index 3f8657e..8a97fa6 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchRespVO.java
@@ -26,14 +26,13 @@
     @ColumnWidth(25)
     private String code;
 
+    @Schema(description = "涓存椂鎵规鐮侊紙棰勭敓鎴愪簩缁寸爜闃舵浣跨敤锛涜ˉ褰曟寮忎俊鎭悗涓虹┖鎴栦繚鐣欙級", example = "PB-00000001")
+    @ExcelIgnore
+    private String tempCode;
+
     @Schema(description = "鍝佺锛堜骇鍝佺墿鏂欙級缂栧彿", example = "1")
     @ExcelIgnore
     private Long itemId;
-
-    @Schema(description = "鍖呰琚嬪瀷锛堝瓧鍏� mes_pro_bag_type锛�", example = "10")
-    @ExcelProperty("鍖呰琚嬪瀷")
-    @DictFormat(DictTypeConstants.MES_PRO_BAG_TYPE)
-    private Integer bagType;
 
     @Schema(description = "鍝佺缂栫爜")
     @ExcelProperty("鍝佺缂栫爜")
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchSaveReqVO.java
index fcfa2c3..6b5cd8d 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchSaveReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchSaveReqVO.java
@@ -24,10 +24,6 @@
     @NotNull(message = "鍝佺涓嶈兘涓虹┖")
     private Long itemId;
 
-    @Schema(description = "鍖呰琚嬪瀷锛堝瓧鍏� mes_pro_bag_type锛�10 灏忚銆�20 澶ц锛�", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
-    @NotNull(message = "鍖呰琚嬪瀷涓嶈兘涓虹┖")
-    private Integer bagType;
-
     @Schema(description = "浜х嚎缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     @NotNull(message = "浜х嚎涓嶈兘涓虹┖")
     private Long lineId;
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchTraceRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchTraceRespVO.java
index b20faf9..29ace3e 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchTraceRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchTraceRespVO.java
@@ -17,8 +17,11 @@
     @Schema(description = "鐢熶骇鎵规缂栧彿", example = "1024")
     private Long id;
 
-    @Schema(description = "鎵规鍙凤紙浜岀淮鐮佸唴瀹癸級", example = "PC20260818L01001")
+    @Schema(description = "鎵规鍙凤紙琛ュ綍鍚庣殑姝e紡鎵规鍙凤級", example = "PC20260818L01001")
     private String code;
+
+    @Schema(description = "涓存椂鎵规鐮侊紙浜岀淮鐮佸唴瀹癸紱鏈ˉ褰曚俊鎭椂灞曠ず锛�", example = "PB-00000001")
+    private String tempCode;
 
     @Schema(description = "鎵规鐘舵�侊紙瀛楀吀 mes_pro_batch_status锛�", example = "20")
     private Integer status;
@@ -51,9 +54,6 @@
     private String remark;
 
     // ========== 鍝佺淇℃伅 ==========
-
-    @Schema(description = "鍖呰琚嬪瀷锛堝瓧鍏� mes_pro_bag_type锛�", example = "10")
-    private Integer bagType;
 
     @Schema(description = "鍝佺锛堢墿鏂欙級缂栧彿", example = "1024")
     private Long itemId;
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/MesProPalletController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/MesProPalletController.java
index 0489480..9139d30 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/MesProPalletController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/MesProPalletController.java
@@ -10,7 +10,11 @@
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletBatchCreateReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletBindBatchReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletExportQrReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletPageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletPreGenerateReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletPreGenerateRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletTraceRespVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
@@ -69,10 +73,43 @@
     private AdminUserApi adminUserApi;
 
     @PostMapping("/batch-create")
-    @Operation(summary = "鎵归噺鐢熸垚鎵樼洏鐮�")
+    @Operation(summary = "鎵归噺鐢熸垚鎵樼洏鐮侊紙涓�娆″綍鍏ユ壒娆$敓鎴愭寮忔墭鐩樼爜锛�")
     @PreAuthorize("@ss.hasPermission('mes:pro-pallet:create')")
     public CommonResult<List<Long>> batchCreatePallet(@Valid @RequestBody MesProPalletBatchCreateReqVO createReqVO) {
         return success(palletService.batchCreatePallet(createReqVO));
+    }
+
+    @PostMapping("/pre-generate")
+    @Operation(summary = "棰勭敓鎴愭墭鐩樼爜浜岀淮鐮侊紙浠呯敓鎴愪复鏃舵墭鐩樼爜锛屼笉缁戝畾鐢熶骇鎵规锛�")
+    @PreAuthorize("@ss.hasPermission('mes:pro-pallet:create')")
+    public CommonResult<List<MesProPalletPreGenerateRespVO>> preGeneratePallet(
+            @Valid @RequestBody MesProPalletPreGenerateReqVO preGenerateReqVO) {
+        List<MesProPalletDO> list = palletService.preGeneratePallet(preGenerateReqVO);
+        return success(BeanUtils.toBean(list, MesProPalletPreGenerateRespVO.class));
+    }
+
+    @PutMapping("/bind-batch")
+    @Operation(summary = "鎵樼洏鐮佺粦瀹氱敓浜ф壒娆★紙鐢熸垚姝e紡鎵樼洏鐮侊級")
+    @PreAuthorize("@ss.hasPermission('mes:pro-pallet:update')")
+    public CommonResult<Boolean> bindBatch(@Valid @RequestBody MesProPalletBindBatchReqVO bindReqVO) {
+        palletService.bindBatch(bindReqVO);
+        return success(true);
+    }
+
+    @PostMapping("/export-qr-by-ids")
+    @Operation(summary = "鎸夋墭鐩樼爜缂栧彿鍒楄〃鎵归噺瀵煎嚭浜岀淮鐮佸浘鐗� ZIP锛堟敮鎸佹湭缁戝畾鎵规鐨勪复鏃舵墭鐩橈級")
+    @PreAuthorize("@ss.hasPermission('mes:pro-pallet:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportPalletQrByIds(@Valid @RequestBody MesProPalletExportQrReqVO exportReqVO,
+                                    HttpServletResponse response) throws IOException {
+        List<MesProPalletDO> list = palletService.getPalletListByIds(exportReqVO.getIds());
+        if (CollUtil.isEmpty(list)) {
+            throw exception(PRO_PALLET_NOT_EXISTS);
+        }
+        if (list.size() > QrCodeImageUtils.MAX_QR_EXPORT) {
+            throw exception(PRO_QR_EXPORT_TOO_MANY);
+        }
+        QrCodeImageUtils.writeZip(response, "鎵樼洏鐮佷簩缁寸爜", buildPalletQrLabels(list));
     }
 
     @DeleteMapping("/delete")
@@ -155,8 +192,8 @@
 
     private MesProPalletTraceRespVO buildPalletTraceRespVO(MesProPalletDO pallet) {
         MesProPalletTraceRespVO respVO = BeanUtils.toBean(pallet, MesProPalletTraceRespVO.class);
-        // 鎵规淇℃伅
-        MesProBatchDO batch = batchService.getBatch(pallet.getBatchId());
+        // 鎵规淇℃伅锛堜复鏃舵墭鐩樻湭缁戝畾鎵规鏃朵负绌烘壒娆★級
+        MesProBatchDO batch = pallet.getBatchId() == null ? null : batchService.getBatch(pallet.getBatchId());
         if (batch != null) {
             respVO.setBatchStatus(batch.getStatus())
                     .setProduceDate(batch.getProduceDate())
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletAutoPrintRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletAutoPrintRespVO.java
deleted file mode 100644
index 21d9ee7..0000000
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletAutoPrintRespVO.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-
-@Schema(description = "绠$悊鍚庡彴 - MES 鑷姩鎵樼洏鎵撳嵃鏍囩")
-@Data
-public class MesProPalletAutoPrintRespVO {
-
-    @Schema(description = "鎵樼洏缂栧彿")
-    private Long id;
-    @Schema(description = "鎵樼洏鐮�")
-    private String code;
-    @Schema(description = "鎵规缂栧彿")
-    private Long batchId;
-    @Schema(description = "鎵规鍙�")
-    private String batchCode;
-    @Schema(description = "鎵规鍐呮墭鐩樺簭鍙�")
-    private Integer palletNo;
-    @Schema(description = "鏍囩鎵撳嵃浠芥暟")
-    private Integer copies;
-    @Schema(description = "鍙琚嬫暟")
-    private Integer capacity;
-    @Schema(description = "宸茶琚嬫暟")
-    private Integer bagCount;
-    @Schema(description = "鍝佺缂栧彿")
-    private Long itemId;
-    @Schema(description = "鍝佺缂栫爜")
-    private String itemCode;
-    @Schema(description = "鍝佺鍚嶇О")
-    private String itemName;
-    @Schema(description = "鍝佺瑙勬牸")
-    private String itemSpecification;
-    @Schema(description = "浜х嚎缂栫爜")
-    private String lineCode;
-    @Schema(description = "浜х嚎鍚嶇О")
-    private String lineName;
-    @Schema(description = "鐢熶骇鏃ユ湡")
-    private LocalDateTime produceDate;
-    @Schema(description = "璐d换浜虹敤鎴风紪鍙�")
-    private Long ownerUserId;
-    @Schema(description = "璐d换浜烘樀绉�")
-    private String ownerUserName;
-}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletBindBatchReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletBindBatchReqVO.java
new file mode 100644
index 0000000..eab84e2
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletBindBatchReqVO.java
@@ -0,0 +1,22 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.util.List;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 鎵樼洏鐮佺粦瀹氱敓浜ф壒娆� Request VO")
+@Data
+public class MesProPalletBindBatchReqVO {
+
+    @Schema(description = "鎵樼洏鐮佺紪鍙峰垪琛�", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "鎵樼洏鐮佺紪鍙峰垪琛ㄤ笉鑳戒负绌�")
+    private List<Long> ids;
+
+    @Schema(description = "鐢熶骇鎵规缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    @NotNull(message = "鐢熶骇鎵规缂栧彿涓嶈兘涓虹┖")
+    private Long batchId;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletExportQrReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletExportQrReqVO.java
new file mode 100644
index 0000000..678d4d9
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletExportQrReqVO.java
@@ -0,0 +1,17 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Data;
+
+import java.util.List;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 鎵樼洏鐮佹寜缂栧彿鍒楄〃瀵煎嚭浜岀淮鐮� Request VO")
+@Data
+public class MesProPalletExportQrReqVO {
+
+    @Schema(description = "鎵樼洏鐮佺紪鍙峰垪琛�", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "鎵樼洏鐮佺紪鍙峰垪琛ㄤ笉鑳戒负绌�")
+    private List<Long> ids;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletPageReqVO.java
index 1f5ff36..98a1db2 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletPageReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletPageReqVO.java
@@ -20,6 +20,9 @@
     @Schema(description = "鎵樼洏鐮�", example = "PC20260818L01A001-P01")
     private String code;
 
+    @Schema(description = "涓存椂鎵樼洏鐮�", example = "PL-00000001")
+    private String tempCode;
+
     @Schema(description = "鐢熶骇鎵规缂栧彿", example = "1024")
     private Long batchId;
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletPreGenerateReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletPreGenerateReqVO.java
new file mode 100644
index 0000000..8d6b510
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletPreGenerateReqVO.java
@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Positive;
+import lombok.Data;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 鎵樼洏鐮侀鐢熸垚浜岀淮鐮� Request VO锛堜笉缁戝畾鐢熶骇鎵规锛�")
+@Data
+public class MesProPalletPreGenerateReqVO {
+
+    @Schema(description = "鐢熸垚鏁伴噺", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
+    @NotNull(message = "鐢熸垚鏁伴噺涓嶈兘涓虹┖")
+    @Positive(message = "鐢熸垚鏁伴噺蹇呴』澶т簬 0")
+    private Integer count;
+
+    @Schema(description = "鍙琚嬫暟锛堣/鎵樼洏锛�", example = "25")
+    @Positive(message = "鍙琚嬫暟蹇呴』澶т簬 0")
+    private Integer capacity;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletPreGenerateRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletPreGenerateRespVO.java
new file mode 100644
index 0000000..4ee9611
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletPreGenerateRespVO.java
@@ -0,0 +1,16 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 鎵樼洏鐮侀鐢熸垚浜岀淮鐮� Response VO")
+@Data
+public class MesProPalletPreGenerateRespVO {
+
+    @Schema(description = "鎵樼洏鐮佺紪鍙�", example = "1024")
+    private Long id;
+
+    @Schema(description = "涓存椂鎵樼洏鐮侊紙浜岀淮鐮佸唴瀹癸級", example = "PL-00000001")
+    private String tempCode;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletRespVO.java
index 120b3d0..15181be 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletRespVO.java
@@ -24,6 +24,10 @@
     @ColumnWidth(30)
     private String code;
 
+    @Schema(description = "涓存椂鎵樼洏鐮侊紙棰勭敓鎴愪簩缁寸爜闃舵浣跨敤锛涚粦瀹氭壒娆″悗涓虹┖鎴栦繚鐣欙級", example = "PL-00000001")
+    @ExcelIgnore
+    private String tempCode;
+
     @Schema(description = "鐢熶骇鎵规缂栧彿", example = "1024")
     @ExcelIgnore
     private Long batchId;
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletTraceRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletTraceRespVO.java
index 93a600a..50f71e7 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletTraceRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletTraceRespVO.java
@@ -16,9 +16,12 @@
     @Schema(description = "鎵樼洏鐮佺紪鍙�", example = "1024")
     private Long id;
 
-    @Schema(description = "鎵樼洏鐮侊紙浜岀淮鐮佸唴瀹癸級", example = "PC20260818L01001-P01")
+    @Schema(description = "鎵樼洏鐮侊紙缁戝畾鎵规鍚庣殑姝e紡鎵樼洏鐮侊級", example = "PC20260818L01001-P01")
     private String code;
 
+    @Schema(description = "涓存椂鎵樼洏鐮侊紙浜岀淮鐮佸唴瀹癸紱鏈粦瀹氭壒娆℃椂灞曠ず锛�", example = "PL-00000001")
+    private String tempCode;
+
     @Schema(description = "鎵规鍐呮墭鐩樺簭鍙�", example = "1")
     private Integer palletNo;
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/batch/MesProBatchDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/batch/MesProBatchDO.java
index 9d4990b..6bf42be 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/batch/MesProBatchDO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/batch/MesProBatchDO.java
@@ -35,19 +35,19 @@
     @TableId
     private Long id;
     /**
-     * 鎵规鍙凤紙鑷姩鐢熸垚锛氬墠缂� + 鏃ユ湡 + 浜х嚎缂栫爜 + 鍝佺缂栫爜 + 娴佹按鍙凤級
+     * 鎵规鍙凤紙鑷姩鐢熸垚锛氬墠缂� + 鏃ユ湡 + 浜х嚎缂栫爜 + 鍝佺缂栫爜 + 娴佹按鍙凤紱琛ュ綍涓氬姟淇℃伅鍚庣敓鎴愶級
      */
     private String code;
+    /**
+     * 涓存椂鎵规鐮侊紙鐮佸�硷細PB-8浣嶅叏灞�搴忓彿锛岄鐢熸垚浜岀淮鐮侀樁娈典娇鐢紱琛ュ綍姝e紡淇℃伅鍚庝粛鍙壂鐮佽拷婧級
+     */
+    private String tempCode;
     /**
      * 鍝佺锛堜骇鍝佺墿鏂欙級缂栧彿
      * <p>
      * 鍏宠仈 {@link cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO#getId()}
      */
     private Long itemId;
-    /**
-     * 鍖呰琚嬪瀷锛堝瓧鍏� mes_pro_bag_type锛�
-     */
-    private Integer bagType;
     /**
      * 浜х嚎缂栧彿
      * <p>
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/pallet/MesProPalletDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/pallet/MesProPalletDO.java
index c246328..43024f1 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/pallet/MesProPalletDO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/pallet/MesProPalletDO.java
@@ -32,10 +32,14 @@
     @TableId
     private Long id;
     /**
-     * 鎵樼洏鐮侊紙鎵规鍙�-P+鎵樼洏搴忓彿锛屽叏灞�鍞竴锛�
+     * 鎵樼洏鐮侊紙鎵规鍙�-P+鎵樼洏搴忓彿锛岀粦瀹氭壒娆″悗鐢熸垚锛�
      */
     private String code;
     /**
+     * 涓存椂鎵樼洏鐮侊紙鐮佸�硷細PL-8浣嶅叏灞�搴忓彿锛岄鐢熸垚浜岀淮鐮侀樁娈典娇鐢紱缁戝畾鎵规鍚庝粛鍙壂鐮佽拷婧級
+     */
+    private String tempCode;
+    /**
      * 鐢熶骇鎵规缂栧彿
      * <p>
      * 鍏宠仈 {@link MesProBatchDO#getId()}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/bagcode/MesProBagCodeMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/bagcode/MesProBagCodeMapper.java
index 226c82a..0675ba6 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/bagcode/MesProBagCodeMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/bagcode/MesProBagCodeMapper.java
@@ -5,7 +5,6 @@
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodePageReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO;
-import cn.iocoder.yudao.module.mes.enums.pro.MesProBagCodeStatusEnum;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -47,15 +46,6 @@
 
     default List<MesProBagCodeDO> selectListByBatchId(Long batchId) {
         return selectList(MesProBagCodeDO::getBatchId, batchId);
-    }
-
-    default List<MesProBagCodeDO> selectUnboundEffectiveListByBatchId(Long batchId) {
-        return selectList(new LambdaQueryWrapperX<MesProBagCodeDO>()
-                .eq(MesProBagCodeDO::getBatchId, batchId)
-                .isNull(MesProBagCodeDO::getPalletId)
-                .ne(MesProBagCodeDO::getStatus, MesProBagCodeStatusEnum.CANCELED.getStatus())
-                .orderByAsc(MesProBagCodeDO::getBagNo)
-                .last("FOR UPDATE"));
     }
 
     default Long selectCountByBatchId(Long batchId) {
@@ -114,8 +104,14 @@
      * @param batchId 鎵规缂栧彿
      * @return 鏈�澶ц搴忓彿锛屾棤璁板綍杩斿洖 0
      */
-    @Select("SELECT IFNULL(MAX(bag_no), 0) FROM mes_pro_bag_code WHERE batch_id = #{batchId}")
-    Integer selectMaxBagNo(@Param("batchId") Long batchId);
+    @Select("SELECT IFNULL(MAX(bag_no), 0) FROM mes_pro_bag_code")
+    Integer selectMaxBagNo();
+
+    @Update("<script>UPDATE mes_pro_bag_code SET batch_id = #{batchId}, batch_code = #{batchCode}, update_time = NOW() " +
+            "WHERE deleted = 0 AND batch_id IS NULL AND status = #{status} AND id IN " +
+            "<foreach collection='ids' item='id' open='(' separator=',' close=')'>#{id}</foreach></script>")
+    int bindBatchByIds(@Param("ids") Collection<Long> ids, @Param("batchId") Long batchId,
+                       @Param("batchCode") String batchCode, @Param("status") Integer status);
 
     default List<MesProBagCodeDO> selectListByIdsForUpdate(Collection<Long> ids) {
         return selectList(new LambdaQueryWrapperX<MesProBagCodeDO>()
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/batch/MesProBatchMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/batch/MesProBatchMapper.java
index 02b3f45..29ea3a2 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/batch/MesProBatchMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/batch/MesProBatchMapper.java
@@ -20,6 +20,14 @@
         return selectOne(MesProBatchDO::getCode, code);
     }
 
+    default MesProBatchDO selectByTempCode(String tempCode) {
+        return selectOne(MesProBatchDO::getTempCode, tempCode);
+    }
+
+    /** 鐢熸垚涓存椂鎵规鐮佺敤鐨勫叏灞�搴忓彿锛氳В鏋� temp_code 鐨勬暟瀛楀悗缂�锛屼笉瀛樺湪鍒欒繑鍥� 0 */
+    @Select("SELECT IFNULL(MAX(CAST(SUBSTRING(temp_code, 4) AS UNSIGNED)), 0) FROM mes_pro_batch WHERE deleted = 0")
+    Integer selectMaxTempCodeSeq();
+
     default Long selectCountByLineId(Long lineId) {
         return selectCount(MesProBatchDO::getLineId, lineId);
     }
@@ -34,6 +42,7 @@
     default PageResult<MesProBatchDO> selectPage(MesProBatchPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<MesProBatchDO>()
                 .likeIfPresent(MesProBatchDO::getCode, reqVO.getCode())
+                .likeIfPresent(MesProBatchDO::getTempCode, reqVO.getTempCode())
                 .eqIfPresent(MesProBatchDO::getItemId, reqVO.getItemId())
                 .eqIfPresent(MesProBatchDO::getLineId, reqVO.getLineId())
                 .likeIfPresent(MesProBatchDO::getLineCode, reqVO.getLineCode())
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/pallet/MesProPalletMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/pallet/MesProPalletMapper.java
index 293487b..6bbc566 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/pallet/MesProPalletMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/pallet/MesProPalletMapper.java
@@ -23,6 +23,14 @@
         return selectOne(MesProPalletDO::getCode, code);
     }
 
+    default MesProPalletDO selectByTempCode(String tempCode) {
+        return selectOne(MesProPalletDO::getTempCode, tempCode);
+    }
+
+    /** 鐢熸垚涓存椂鎵樼洏鐮佺敤鐨勫叏灞�搴忓彿锛氳В鏋� temp_code 鐨勬暟瀛楀悗缂�锛屼笉瀛樺湪鍒欒繑鍥� 0 */
+    @Select("SELECT IFNULL(MAX(CAST(SUBSTRING(temp_code, 4) AS UNSIGNED)), 0) FROM mes_pro_pallet WHERE deleted = 0")
+    Integer selectMaxTempCodeSeq();
+
     @Select("SELECT * FROM mes_pro_pallet WHERE id = #{id} AND deleted = 0 FOR UPDATE")
     MesProPalletDO selectByIdForUpdate(@Param("id") Long id);
 
@@ -33,6 +41,7 @@
     default PageResult<MesProPalletDO> selectPage(MesProPalletPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<MesProPalletDO>()
                 .likeIfPresent(MesProPalletDO::getCode, reqVO.getCode())
+                .likeIfPresent(MesProPalletDO::getTempCode, reqVO.getTempCode())
                 .eqIfPresent(MesProPalletDO::getBatchId, reqVO.getBatchId())
                 .likeIfPresent(MesProPalletDO::getBatchCode, reqVO.getBatchCode())
                 .eqIfPresent(MesProPalletDO::getStatus, reqVO.getStatus())
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java
index ac15b5d..5b53458 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java
@@ -31,7 +31,6 @@
     String MES_PRO_TASK_STATUS = "mes_pro_task_status"; // MES 浠诲姟鐘舵��
     String MES_PRO_BATCH_STATUS = "mes_pro_batch_status"; // MES 鐢熶骇鎵规鐘舵��
     String MES_PRO_BATCH_WORKER_TYPE = "mes_pro_batch_worker_type"; // MES 鎵规浜哄憳宀椾綅绫诲瀷
-    String MES_PRO_BAG_TYPE = "mes_pro_bag_type"; // MES 鍖呰琚嬪瀷
     String MES_PRO_BAG_CODE_STATUS = "mes_pro_bag_code_status"; // MES 琚嬬爜鐘舵��
     String MES_PRO_PALLET_STATUS = "mes_pro_pallet_status"; // MES 鎵樼洏鐮佺姸鎬�
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
index 033f956..3657c40 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -829,8 +829,8 @@
     ErrorCode PRO_QR_EXPORT_TOO_MANY = new ErrorCode(1_040_750_007, "浜岀淮鐮佹壒閲忓鍑烘暟閲忚秴杩囦笂闄�");
     ErrorCode PRO_QR_IMAGE_GENERATE_ERROR = new ErrorCode(1_040_750_008, "浜岀淮鐮佸浘鐗囩敓鎴愬け璐�");
     ErrorCode PRO_QR_EXPORT_PARAMS_INVALID = new ErrorCode(1_040_750_009, "浜岀淮鐮佹壒閲忓鍑虹己灏戞煡璇㈡潯浠�");
-    ErrorCode PRO_BATCH_BAG_TYPE_INVALID = new ErrorCode(1_040_750_010, "鍖呰琚嬪瀷鏃犳晥");
-    ErrorCode PRO_BATCH_BAG_TYPE_NOT_ALLOW_CHANGE = new ErrorCode(1_040_750_011, "鎵规宸茬敓鎴愯鐮佹垨鎵樼洏鐮侊紝涓嶅厑璁镐慨鏀瑰寘瑁呰鍨�");
+    ErrorCode PRO_BATCH_ALREADY_FILLED = new ErrorCode(1_040_750_012, "鐢熶骇鎵规宸茶ˉ褰曟寮忎俊鎭紝涓嶅厑璁搁噸澶嶈ˉ褰�");
+    ErrorCode PRO_BATCH_NOT_FILLED = new ErrorCode(1_040_750_013, "鐢熶骇鎵规灏氭湭琛ュ綍姝e紡淇℃伅");
 
     // ========== MES 鐢熶骇绠$悊-琚嬬爜璧嬬爜锛�1-040-752-000锛� ==========
     ErrorCode PRO_BAG_CODE_NOT_EXISTS = new ErrorCode(1_040_752_000, "琚嬬爜涓嶅瓨鍦�");
@@ -850,6 +850,9 @@
     ErrorCode PRO_PALLET_NOT_EXISTS = new ErrorCode(1_040_753_000, "鎵樼洏鐮佷笉瀛樺湪");
     ErrorCode PRO_PALLET_HAS_BAG_NOT_DELETE = new ErrorCode(1_040_753_001, "鎵樼洏鐮佸凡缁戝畾琚嬬爜锛屼笉鍏佽鍒犻櫎");
     ErrorCode PRO_PALLET_GENERATE_COUNT_INVALID = new ErrorCode(1_040_753_002, "鎵樼洏鐮佺敓鎴愭暟閲忓繀椤诲ぇ浜� 0");
+    ErrorCode PRO_PALLET_ALREADY_BIND_BATCH = new ErrorCode(1_040_753_003, "鎵樼洏宸茬粦瀹氱敓浜ф壒娆℃垨宸茬敓鎴愭寮忔墭鐩樼爜锛屼笉鍏佽閲嶅缁戝畾");
+    ErrorCode PRO_PALLET_BIND_IDS_EMPTY = new ErrorCode(1_040_753_004, "寰呯粦瀹氭壒娆$殑鎵樼洏缂栧彿鍒楄〃涓嶈兘涓虹┖");
+    ErrorCode PRO_PALLET_NOT_BIND_BATCH = new ErrorCode(1_040_753_005, "鎵樼洏灏氭湭缁戝畾鐢熶骇鎵规");
 
     // ========== MES 鐢熶骇绠$悊-浜х嚎缁存姢锛�1-040-754-000锛� ==========
     ErrorCode PRO_LINE_NOT_EXISTS = new ErrorCode(1_040_754_000, "浜х嚎涓嶅瓨鍦�");
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProBagTypeEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProBagTypeEnum.java
deleted file mode 100644
index 6824151..0000000
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProBagTypeEnum.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package cn.iocoder.yudao.module.mes.enums.pro;
-
-import cn.iocoder.yudao.framework.common.core.ArrayValuable;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.Arrays;
-
-@Getter
-@AllArgsConstructor
-public enum MesProBagTypeEnum implements ArrayValuable<Integer> {
-
-    SMALL(10, "灏忚", 100),
-    LARGE(20, "澶ц", 48);
-
-    public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesProBagTypeEnum::getType).toArray(Integer[]::new);
-
-    private final Integer type;
-    private final String name;
-    private final int threshold;
-
-    @Override
-    public Integer[] array() {
-        return ARRAYS;
-    }
-
-    public static MesProBagTypeEnum valueOfType(Integer type) {
-        return Arrays.stream(values()).filter(item -> item.type.equals(type)).findFirst().orElse(null);
-    }
-}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/MesProQrLabelBuilder.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/MesProQrLabelBuilder.java
index d22a870..822e040 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/MesProQrLabelBuilder.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/MesProQrLabelBuilder.java
@@ -26,16 +26,24 @@
     public static QrLabelInfo buildBatchLabel(MesProBatchDO batch,
                                               Map<Long, MesMdmItemDO> itemMap,
                                               Map<Long, AdminUserRespDTO> userMap) {
+        // 鏈ˉ褰曚笟鍔′俊鎭椂鐢ㄤ复鏃舵壒娆$爜浣滀负浜岀淮鐮佸唴瀹癸紝骞舵槑纭彁绀虹姸鎬侊紱鍝佺/浜х嚎绛変俊鎭己澶辨椂涓嶆嫾鎺ョ┖鏂囨湰
+        String code = StrUtil.blankToDefault(batch.getCode(), batch.getTempCode());
         LinkedHashMap<String, String> keyValues = new LinkedHashMap<>();
-        keyValues.put("鎵规鍙�", batch.getCode());
+        keyValues.put("鎵规鍙�", code);
+        if (StrUtil.isEmpty(batch.getCode())) {
+            keyValues.put("鐘舵��", "寰呰ˉ褰�");
+        }
         MesMdmItemDO item = itemMap.get(batch.getItemId());
         if (item != null) {
             keyValues.put("鍝佺", item.getName());
             keyValues.put("瑙勬牸", item.getSpecification());
         }
-        keyValues.put("浜х嚎", StrUtil.join(" / ", batch.getLineName(), batch.getLineCode()));
-        keyValues.put("鐢熶骇鏃ユ湡", batch.getProduceDate() == null ? ""
-                : LocalDateTimeUtil.format(batch.getProduceDate(), "yyyy-MM-dd HH:mm"));
+        if (StrUtil.isNotEmpty(batch.getLineName()) || StrUtil.isNotEmpty(batch.getLineCode())) {
+            keyValues.put("浜х嚎", StrUtil.join(" / ", batch.getLineName(), batch.getLineCode()));
+        }
+        if (batch.getProduceDate() != null) {
+            keyValues.put("鐢熶骇鏃ユ湡", LocalDateTimeUtil.format(batch.getProduceDate(), "yyyy-MM-dd HH:mm"));
+        }
         if (batch.getPlanQuantity() != null) {
             keyValues.put("璁″垝鏁伴噺", String.valueOf(batch.getPlanQuantity()));
         }
@@ -43,7 +51,7 @@
         if (user != null) {
             keyValues.put("璐d换浜�", user.getNickname());
         }
-        return QrLabelInfo.builder().fileName(batch.getCode()).code(batch.getCode()).keyValues(keyValues).build();
+        return QrLabelInfo.builder().fileName(code).code(code).keyValues(keyValues).build();
     }
 
     /**
@@ -53,17 +61,24 @@
                                                MesProBatchDO batch,
                                                Map<Long, MesMdmItemDO> itemMap,
                                                Map<Long, AdminUserRespDTO> userMap) {
+        // 鏈粦瀹氭壒娆★紙涓存椂鎵樼洏鐮侊級鏃剁敤涓存椂鐮佷綔涓轰簩缁寸爜鍐呭骞舵槑纭彁绀虹姸鎬�
+        String code = StrUtil.blankToDefault(pallet.getCode(), pallet.getTempCode());
         LinkedHashMap<String, String> keyValues = new LinkedHashMap<>();
-        keyValues.put("鎵樼洏鐮�", pallet.getCode());
+        keyValues.put("鎵樼洏鐮�", code);
+        if (StrUtil.isEmpty(pallet.getCode())) {
+            keyValues.put("鐘舵��", "鏈粦瀹氭壒娆�");
+        }
         keyValues.put("鎵樼洏搴忓彿", pallet.getPalletNo() == null ? "" : String.valueOf(pallet.getPalletNo()));
-        keyValues.put("鎵规鍙�", pallet.getBatchCode());
+        if (StrUtil.isNotEmpty(pallet.getBatchCode())) {
+            keyValues.put("鎵规鍙�", pallet.getBatchCode());
+        }
         if (pallet.getBagCount() != null) {
             keyValues.put("宸茶琚嬫暟", String.valueOf(pallet.getBagCount()));
         }
         if (batch != null) {
             fillBatchKeyValues(keyValues, batch, itemMap, userMap);
         }
-        return QrLabelInfo.builder().fileName(pallet.getCode()).code(pallet.getCode()).keyValues(keyValues).build();
+        return QrLabelInfo.builder().fileName(code).code(code).keyValues(keyValues).build();
     }
 
     /**
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeService.java
index c498951..6ffee5f 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeService.java
@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.mes.service.pro.bagcode;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeBindBatchReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeBindReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeGenerateReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeGenerateRespVO;
@@ -30,6 +31,8 @@
      */
     MesProBagCodeGenerateRespVO generateBagCodes(@Valid MesProBagCodeGenerateReqVO generateReqVO);
 
+    void bindBatch(@Valid MesProBagCodeBindBatchReqVO bindReqVO);
+
     /**
      * 浣滃簾鐮存崯琚嬬爜骞跺湪鍘熸壒娆$敓鎴愮瓑閲忔浛鎹㈣鐮�
      */
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeServiceImpl.java
index 2f69f53..1611599 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeServiceImpl.java
@@ -4,6 +4,7 @@
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeBindBatchReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeBindReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeGenerateReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeGenerateRespVO;
@@ -64,44 +65,53 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public MesProBagCodeGenerateRespVO generateBagCodes(MesProBagCodeGenerateReqVO generateReqVO) {
-        // 1. 鏍¢獙鎵规瀛樺湪涓斿浜庣敓浜т腑鐘舵��
-        MesProBatchDO batch = batchMapper.selectByIdForUpdate(generateReqVO.getBatchId());
-        if (batch == null) {
-            throw exception(PRO_BATCH_NOT_EXISTS);
-        }
-        if (!MesProBatchStatusEnum.PRODUCING.getStatus().equals(batch.getStatus())) {
-            throw exception(PRO_BATCH_STATUS_NOT_GENERATE_CODE);
-        }
         if (generateReqVO.getCount() == null || generateReqVO.getCount() <= 0) {
             throw exception(PRO_BAG_CODE_GENERATE_COUNT_INVALID);
         }
 
-        // 2. 璁$畻璧峰搴忓彿锛堝寘鍚凡閫昏緫鍒犻櫎璁板綍锛屼繚璇佸簭鍙蜂笉鍥為��銆佺爜鍊煎敮涓�锛�
-        int startNo = bagCodeMapper.selectMaxBagNo(batch.getId()) + 1;
-
-        // 3. 鎵归噺鐢熸垚琚嬬爜锛氭壒娆″彿 + - + 4 浣嶈搴忓彿锛屽悓涓�娆$敓鎴愬叡浜悓涓� UUID锛堟暟鎹寘锛�
+        // 鐢熸垚闃舵鍙垱寤哄叏灞�鍞竴琚嬬爜锛岀敓浜ф壒娆″湪鍚庣画褰曞叆
+        int startNo = bagCodeMapper.selectMaxBagNo() + 1;
         String uuid = IdUtil.fastSimpleUUID();
         List<MesProBagCodeDO> bagCodes = new ArrayList<>(generateReqVO.getCount());
         for (int i = 0; i < generateReqVO.getCount(); i++) {
             int bagNo = startNo + i;
             bagCodes.add(new MesProBagCodeDO()
                     .setUuid(uuid)
-                    .setCode(batch.getCode() + "-" + StrUtil.padPre(String.valueOf(bagNo), 4, '0'))
+                    .setCode("BAG-" + StrUtil.padPre(String.valueOf(bagNo), 8, '0'))
                     .setBagNo(bagNo)
-                    .setBatchId(batch.getId())
-                    .setBatchCode(batch.getCode())
                     .setStatus(MesProBagCodeStatusEnum.GENERATED.getStatus())
                     .setRemark(generateReqVO.getRemark()));
         }
         bagCodeMapper.insertBatch(bagCodes);
+        return new MesProBagCodeGenerateRespVO().setUuid(uuid);
+    }
 
-        // 4. 鍥炲啓鎵规琚嬬爜鏁伴噺
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void bindBatch(MesProBagCodeBindBatchReqVO bindReqVO) {
+        MesProBatchDO batch = batchMapper.selectByIdForUpdate(bindReqVO.getBatchId());
+        if (batch == null) {
+            throw exception(PRO_BATCH_NOT_EXISTS);
+        }
+        if (!MesProBatchStatusEnum.PRODUCING.getStatus().equals(batch.getStatus())) {
+            throw exception(PRO_BATCH_STATUS_NOT_GENERATE_CODE);
+        }
+        // 涓存椂鎵规锛堟湭琛ュ綍姝e紡鎵规鍙凤級涓嶅厑璁歌鐮佸綍鍏�
+        if (StrUtil.isEmpty(batch.getCode())) {
+            throw exception(PRO_BATCH_NOT_FILLED);
+        }
+        List<Long> ids = bindReqVO.getIds().stream().distinct().toList();
+        List<MesProBagCodeDO> bagCodes = bagCodeMapper.selectListByIdsForUpdate(ids);
+        if (bagCodes.size() != ids.size() || bagCodes.stream().anyMatch(code ->
+                code.getBatchId() != null || !MesProBagCodeStatusEnum.GENERATED.getStatus().equals(code.getStatus()))) {
+            throw exception(PRO_BAG_CODE_STATUS_NOT_GENERATED);
+        }
+        if (bagCodeMapper.bindBatchByIds(ids, batch.getId(), batch.getCode(),
+                MesProBagCodeStatusEnum.GENERATED.getStatus()) != ids.size()) {
+            throw exception(PRO_BAG_CODE_STATUS_NOT_GENERATED);
+        }
         batchMapper.updateById(new MesProBatchDO().setId(batch.getId())
-                .setBagQuantity((batch.getBagQuantity() == null ? 0 : batch.getBagQuantity())
-                        + generateReqVO.getCount()));
-        return new MesProBagCodeGenerateRespVO()
-                .setUuid(uuid)
-                .setAutoPallets(palletService.autoCreatePallets(batch.getId()));
+                .setBagQuantity(bagCodeMapper.selectEffectiveCountByBatchId(batch.getId())));
     }
 
     @Override
@@ -147,7 +157,7 @@
 
         String replaceUuid = IdUtil.fastSimpleUUID();
         LocalDateTime replaceTime = LocalDateTime.now();
-        int startNo = bagCodeMapper.selectMaxBagNo(batch.getId()) + 1;
+        int startNo = bagCodeMapper.selectMaxBagNo() + 1;
         List<MesProBagCodeDO> newBagCodes = new ArrayList<>(oldBagCodes.size());
         List<MesProBagCodeReplaceDO> replacements = new ArrayList<>(oldBagCodes.size());
         List<MesProBagCodeReplaceItemRespVO> items = new ArrayList<>(oldBagCodes.size());
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchService.java
index 03a02a6..96934f0 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchService.java
@@ -2,6 +2,7 @@
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchPageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchPreGenerateReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchWorkerDO;
@@ -26,6 +27,21 @@
     Long createBatch(@Valid MesProBatchSaveReqVO createReqVO);
 
     /**
+     * 棰勭敓鎴愮敓浜ф壒娆′簩缁寸爜锛氫粎鍒涘缓鎼哄甫涓存椂鎵规鐮佺殑鎵规璁板綍锛屼笉褰曞叆涓氬姟淇℃伅锛岀姸鎬佷负鑽夌
+     *
+     * @param reqVO 棰勭敓鎴愪俊鎭�
+     * @return 鏂板缓鐨勬壒娆¤褰曪紙鍚复鏃舵壒娆$爜锛�
+     */
+    List<MesProBatchDO> preGenerateBatch(@Valid MesProBatchPreGenerateReqVO reqVO);
+
+    /**
+     * 琛ュ綍鐢熶骇鎵规涓氬姟淇℃伅锛堝搧绉嶃�佽鍨嬨�佷骇绾裤�佹棩鏈熴�佽矗浠讳汉銆佺敓浜т汉鍛橈級锛岀敓鎴愭寮忔壒娆″彿
+     *
+     * @param fillReqVO 琛ュ綍淇℃伅锛宨d 蹇呭~
+     */
+    void fillBatchInfo(@Valid MesProBatchSaveReqVO fillReqVO);
+
+    /**
      * 鏇存柊鐢熶骇鎵规锛堝惈鐢熶骇浜哄憳閰嶇疆锛�
      *
      * @param updateReqVO 鏇存柊淇℃伅
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchServiceImpl.java
index e50290c..c0efa4f 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchServiceImpl.java
@@ -5,6 +5,7 @@
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchPageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchPreGenerateReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO;
@@ -15,7 +16,6 @@
 import cn.iocoder.yudao.module.mes.dal.mysql.pro.batch.MesProBatchWorkerMapper;
 import cn.iocoder.yudao.module.mes.dal.mysql.pro.pallet.MesProPalletMapper;
 import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum;
-import cn.iocoder.yudao.module.mes.enums.pro.MesProBagTypeEnum;
 import cn.iocoder.yudao.module.mes.enums.pro.MesProBatchStatusEnum;
 import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
 import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
@@ -27,6 +27,7 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
@@ -68,7 +69,6 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long createBatch(MesProBatchSaveReqVO createReqVO) {
-        validateBagType(createReqVO.getBagType());
         // 1. 鏍¢獙鍏宠仈鏁版嵁锛堝搧绉嶃�佷骇绾裤�佺敓浜т汉鍛橈級
         MesMdmItemDO item = mdmItemService.validateItemExists(createReqVO.getItemId());
         MesProLineDO line = lineService.validateLineExistsAndEnable(createReqVO.getLineId());
@@ -82,7 +82,6 @@
                 .setCode(code)
                 .setLineCode(line.getCode())
                 .setLineName(line.getName())
-                .setBagType(createReqVO.getBagType())
                 .setBagQuantity(0)
                 .setPalletQuantity(0)
                 .setStatus(MesProBatchStatusEnum.DRAFT.getStatus());
@@ -95,28 +94,72 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    public List<MesProBatchDO> preGenerateBatch(MesProBatchPreGenerateReqVO reqVO) {
+        // 1. 鐢熸垚涓存椂鎵规鐮侊紙鍏ㄥ眬 8 浣嶅簭鍙凤紝鏍煎紡 PB-00000001锛�
+        int startSeq = batchMapper.selectMaxTempCodeSeq() + 1;
+        List<MesProBatchDO> list = new ArrayList<>(reqVO.getCount());
+        for (int i = 0; i < reqVO.getCount(); i++) {
+            list.add(new MesProBatchDO()
+                    .setTempCode("PB-" + StrUtil.padPre(String.valueOf(startSeq + i), 8, '0'))
+                    .setBagQuantity(0)
+                    .setPalletQuantity(0)
+                    .setStatus(MesProBatchStatusEnum.DRAFT.getStatus())
+                    .setRemark(reqVO.getRemark()));
+        }
+        // 2. 鎵归噺鎻掑叆锛堣崏绋跨姸鎬侊紝绛夊緟琛ュ綍涓氬姟淇℃伅锛�
+        for (MesProBatchDO batch : list) {
+            batchMapper.insert(batch);
+        }
+        return list;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void fillBatchInfo(MesProBatchSaveReqVO fillReqVO) {
+        // 1. 閿佸畾鎵规锛屼粎鍏佽灏氭湭琛ュ綍姝e紡淇℃伅鐨勪复鏃舵壒娆�
+        MesProBatchDO batch = batchMapper.selectByIdForUpdate(fillReqVO.getId());
+        if (batch == null) {
+            throw exception(PRO_BATCH_NOT_EXISTS);
+        }
+        if (StrUtil.isNotEmpty(batch.getCode())) {
+            throw exception(PRO_BATCH_ALREADY_FILLED);
+        }
+        // 2. 鏍¢獙鍏宠仈鏁版嵁骞剁敓鎴愭寮忔壒娆″彿
+        MesMdmItemDO item = mdmItemService.validateItemExists(fillReqVO.getItemId());
+        MesProLineDO line = lineService.validateLineExistsAndEnable(fillReqVO.getLineId());
+        validateRelations(fillReqVO);
+        String code = generateBatchCode(line.getCode(), item.getCode());
+        // 3. 钀藉簱涓氬姟淇℃伅锛堜繚鐣欎复鏃舵壒娆$爜鐢ㄤ簬鍘嗗彶鎵爜杩芥函锛涗骇绾跨紪鐮�/鍚嶇О鍐椾綑鍥炲~锛�
+        MesProBatchDO updateObj = BeanUtils.toBean(fillReqVO, MesProBatchDO.class)
+                .setCode(code)
+                .setLineCode(line.getCode())
+                .setLineName(line.getName())
+                .setStatus(MesProBatchStatusEnum.DRAFT.getStatus());
+        batchMapper.updateById(updateObj);
+        // 4. 閲嶅缓鐢熶骇浜哄憳閰嶇疆
+        batchWorkerMapper.deleteByBatchId(fillReqVO.getId());
+        insertBatchWorkers(fillReqVO.getId(), fillReqVO.getWorkers());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public void updateBatch(MesProBatchSaveReqVO updateReqVO) {
         // 1. 鏍¢獙瀛樺湪 + 鐘舵�侊紙鑽夌/鐢熶骇涓墠鍏佽淇敼锛�
         MesProBatchDO oldBatch = validateBatchExists(updateReqVO.getId());
         validateBatchEditable(oldBatch);
-        // 2. 宸茬敓鎴愯鐮佹垨鎵樼洏鐮佸悗涓嶅厑璁镐慨鏀硅鍨嬶紙閬垮厤鍚屼竴鎵规闃堝�煎彉鍖栧鑷村綊闆嗛敊涔憋級
-        if (updateReqVO.getBagType() != null && !Objects.equals(oldBatch.getBagType(), updateReqVO.getBagType())
-                && (bagQuantityOrPalletCreated(oldBatch))) {
-            throw exception(PRO_BATCH_BAG_TYPE_NOT_ALLOW_CHANGE);
-        }
-        validateBagType(updateReqVO.getBagType());
         // 2. 鏍¢獙鍏宠仈鏁版嵁锛堢敓浜т汉鍛橈級
         validateRelations(updateReqVO);
 
-        // 3. 鍝佺/浜х嚎鍙樺寲鏃堕噸鏂扮敓鎴愭壒娆″彿锛堟壒娆″彿鍖呭惈浜х嚎缂栫爜 + 鍝佺缂栫爜瑕佺礌锛�
+        // 3. 鏈敓鎴愭寮忔壒娆″彿鎴栧搧绉�/浜х嚎鍙樺寲鏃堕噸鏂扮敓鎴愭壒娆″彿锛堟壒娆″彿鍖呭惈浜х嚎缂栫爜 + 鍝佺缂栫爜瑕佺礌锛�
+        boolean codeEmpty = StrUtil.isEmpty(oldBatch.getCode());
         boolean itemChanged = !Objects.equals(oldBatch.getItemId(), updateReqVO.getItemId());
         boolean lineChanged = !Objects.equals(oldBatch.getLineId(), updateReqVO.getLineId());
         String code = oldBatch.getCode();
         MesProBatchDO updateObj = BeanUtils.toBean(updateReqVO, MesProBatchDO.class);
-        if (itemChanged || lineChanged) {
+        if (codeEmpty || itemChanged || lineChanged) {
             MesMdmItemDO item = mdmItemService.validateItemExists(updateReqVO.getItemId());
             // 鍙樻洿浜х嚎鏃讹紝鐩爣浜х嚎蹇呴』鍚敤锛涙湭鍙樻洿鍒欎粎鏍¢獙瀛樺湪锛堥伩鍏嶅仠鐢ㄤ骇绾跨殑鍘嗗彶鎵规鏃犳硶缂栬緫鍏朵粬瀛楁锛�
-            MesProLineDO line = lineChanged
+            MesProLineDO line = (lineChanged || codeEmpty)
                     ? lineService.validateLineExistsAndEnable(updateReqVO.getLineId())
                     : lineService.validateLineExists(updateReqVO.getLineId());
             code = generateBatchCode(line.getCode(), item.getCode());
@@ -168,7 +211,10 @@
             throw exception(PRO_BATCH_STATUS_INVALID);
         }
         if (MesProBatchStatusEnum.PRODUCING.getStatus().equals(status)) {
-            validateBagType(batch.getBagType());
+            // 鏈ˉ褰曚笟鍔′俊鎭殑涓存椂鎵规涓嶅厑璁歌繘鍏ョ敓浜�
+            if (StrUtil.isEmpty(batch.getCode())) {
+                throw exception(PRO_BATCH_NOT_FILLED);
+            }
         }
         // 3. 鏇存柊鐘舵��
         batchMapper.updateById(new MesProBatchDO().setId(id).setStatus(status));
@@ -181,7 +227,11 @@
 
     @Override
     public MesProBatchDO getBatchByCode(String code) {
-        return batchMapper.selectByCode(code);
+        MesProBatchDO batch = batchMapper.selectByCode(code);
+        if (batch == null) {
+            batch = batchMapper.selectByTempCode(code);
+        }
+        return batch;
     }
 
     @Override
@@ -255,23 +305,6 @@
                 && !MesProBatchStatusEnum.PRODUCING.getStatus().equals(batch.getStatus())) {
             throw exception(PRO_BATCH_STATUS_NOT_DRAFT_OR_PRODUCING);
         }
-    }
-
-    /**
-     * 鏍¢獙鍖呰琚嬪瀷鏈夋晥
-     */
-    private void validateBagType(Integer bagType) {
-        if (bagType != null && MesProBagTypeEnum.valueOfType(bagType) == null) {
-            throw exception(PRO_BATCH_BAG_TYPE_INVALID);
-        }
-    }
-
-    /**
-     * 鍒ゆ柇鎵规鏄惁宸茬敓鎴愯鐮佹垨鎵樼洏鐮侊紙鐢ㄤ簬绂佹淇敼琚嬪瀷锛�
-     */
-    private boolean bagQuantityOrPalletCreated(MesProBatchDO batch) {
-        return (batch.getBagQuantity() != null && batch.getBagQuantity() > 0)
-                || (batch.getPalletQuantity() != null && batch.getPalletQuantity() > 0);
     }
 
     /**
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/pallet/MesProPalletService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/pallet/MesProPalletService.java
index 9407667..e8c8fc4 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/pallet/MesProPalletService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/pallet/MesProPalletService.java
@@ -1,12 +1,14 @@
 package cn.iocoder.yudao.module.mes.service.pro.pallet;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletAutoPrintRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletBatchCreateReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletBindBatchReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletPageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletPreGenerateReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.pallet.MesProPalletDO;
 import jakarta.validation.Valid;
 
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -25,12 +27,20 @@
     List<Long> batchCreatePallet(@Valid MesProPalletBatchCreateReqVO createReqVO);
 
     /**
-     * 鎸夋壒娆℃湁鏁堣鐮佹暟閲忚嚜鍔ㄧ敓鎴愬苟缁戝畾鏁存墭琚嬬爜
+     * 棰勭敓鎴愭墭鐩樼爜浜岀淮鐮侊細涓嶇粦瀹氱敓浜ф壒娆★紝浠呭垱寤烘惡甯︿复鏃舵墭鐩樼爜鐨勮褰�
      *
-     * @param batchId 鎵规缂栧彿
-     * @return 鏈鏂扮敓鎴愮殑鎵樼洏鎵撳嵃鏁版嵁
+     * @param reqVO 棰勭敓鎴愪俊鎭�
+     * @return 鏂板缓鐨勬墭鐩樼爜璁板綍锛堝惈涓存椂鎵樼洏鐮侊級
      */
-    List<MesProPalletAutoPrintRespVO> autoCreatePallets(Long batchId);
+    List<MesProPalletDO> preGeneratePallet(@Valid MesProPalletPreGenerateReqVO reqVO);
+
+    /**
+     * 鎵樼洏鐮佺粦瀹氱敓浜ф壒娆★細鐢熸垚姝e紡鎵樼洏鐮侊紙鎵规鍙�-P+鎵樼洏搴忓彿锛夛紝骞跺洖鍐欐壒娆℃墭鐩樻暟閲�
+     *
+     * @param bindReqVO 缁戝畾淇℃伅
+     * @return 鏈缁戝畾鐨勬墭鐩樻暟閲�
+     */
+    int bindBatch(@Valid MesProPalletBindBatchReqVO bindReqVO);
 
     /**
      * 鍒犻櫎鎵樼洏鐮侊紙鏈粦瀹氳鐮佹墠鍏佽鍒犻櫎锛�
@@ -80,6 +90,14 @@
     List<MesProPalletDO> getPalletListByBatchId(Long batchId);
 
     /**
+     * 鑾峰緱鎵樼洏鐮佸垪琛紙鎸夌紪鍙峰垪琛級
+     *
+     * @param ids 缂栧彿鍒楄〃
+     * @return 鎵樼洏鐮佸垪琛�
+     */
+    List<MesProPalletDO> getPalletListByIds(Collection<Long> ids);
+
+    /**
      * 鏇存柊鎵樼洏宸茬粦瀹氳鐮佹暟閲�
      *
      * @param palletId 鎵樼洏缂栧彿
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/pallet/MesProPalletServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/pallet/MesProPalletServiceImpl.java
index 66e33ed..33794e4 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/pallet/MesProPalletServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/pallet/MesProPalletServiceImpl.java
@@ -1,22 +1,19 @@
 package cn.iocoder.yudao.module.mes.service.pro.pallet;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletAutoPrintRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletBatchCreateReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletBindBatchReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletPageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletPreGenerateReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.pallet.MesProPalletDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.pro.bagcode.MesProBagCodeMapper;
 import cn.iocoder.yudao.module.mes.dal.mysql.pro.batch.MesProBatchMapper;
 import cn.iocoder.yudao.module.mes.dal.mysql.pro.pallet.MesProPalletMapper;
-import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
-import cn.iocoder.yudao.module.mes.enums.pro.MesProBagTypeEnum;
 import cn.iocoder.yudao.module.mes.enums.pro.MesProBatchStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.pro.MesProPalletStatusEnum;
-import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
-import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
-import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -24,7 +21,7 @@
 import org.springframework.validation.annotation.Validated;
 
 import java.util.ArrayList;
-import java.util.Collections;
+import java.util.Collection;
 import java.util.List;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -46,10 +43,6 @@
     private MesProBagCodeMapper bagCodeMapper;
     @Resource
     private MesProBatchMapper batchMapper;
-    @Resource
-    private MesMdmItemService mdmItemService;
-    @Resource
-    private AdminUserApi adminUserApi;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -95,53 +88,69 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public List<MesProPalletAutoPrintRespVO> autoCreatePallets(Long batchId) {
-        MesProBatchDO batch = batchMapper.selectByIdForUpdate(batchId);
+    public List<MesProPalletDO> preGeneratePallet(MesProPalletPreGenerateReqVO reqVO) {
+        // 1. 鐢熸垚涓存椂鎵樼洏鐮侊紙鍏ㄥ眬 8 浣嶅簭鍙凤紝鏍煎紡 PL-00000001锛�
+        int startSeq = palletMapper.selectMaxTempCodeSeq() + 1;
+        List<MesProPalletDO> list = new ArrayList<>(reqVO.getCount());
+        for (int i = 0; i < reqVO.getCount(); i++) {
+            list.add(new MesProPalletDO()
+                    .setTempCode("PL-" + StrUtil.padPre(String.valueOf(startSeq + i), 8, '0'))
+                    .setCapacity(reqVO.getCapacity())
+                    .setBagCount(0)
+                    .setAutoGenerated(false)
+                    .setStatus(MesProPalletStatusEnum.IN_USE.getStatus())
+                    .setRemark(reqVO.getRemark()));
+        }
+        // 2. 鎵归噺鎻掑叆锛堟湭缁戝畾鐢熶骇鎵规锛岀瓑寰呯粦瀹氾級
+        palletMapper.insertBatch(list);
+        return list;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int bindBatch(MesProPalletBindBatchReqVO bindReqVO) {
+        // 1. 閿佸畾鐩爣鎵规骞舵牎楠屽凡琛ュ綍姝e紡淇℃伅 + 鐢熶骇涓�
+        MesProBatchDO batch = batchMapper.selectByIdForUpdate(bindReqVO.getBatchId());
         if (batch == null) {
             throw exception(PRO_BATCH_NOT_EXISTS);
         }
         if (!MesProBatchStatusEnum.PRODUCING.getStatus().equals(batch.getStatus())) {
             throw exception(PRO_BATCH_STATUS_NOT_GENERATE_CODE);
         }
-        MesProBagTypeEnum bagType = MesProBagTypeEnum.valueOfType(batch.getBagType());
-        if (bagType == null) {
-            throw exception(PRO_BATCH_BAG_TYPE_INVALID);
+        if (StrUtil.isEmpty(batch.getCode())) {
+            throw exception(PRO_BATCH_NOT_FILLED);
         }
-        List<cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO> candidates =
-                bagCodeMapper.selectUnboundEffectiveListByBatchId(batchId);
-        int threshold = bagType.getThreshold();
-        int palletCount = candidates.size() / threshold;
-        if (palletCount == 0) {
-            return Collections.emptyList();
+        // 2. 閿佸畾鎵樼洏锛屾牎楠屽潎鏈粦瀹氭壒娆′笖鏈敓鎴愭寮忔墭鐩樼爜
+        List<Long> ids = bindReqVO.getIds().stream().distinct().sorted().toList();
+        if (ids.isEmpty()) {
+            throw exception(PRO_PALLET_BIND_IDS_EMPTY);
         }
-
-        int startNo = palletMapper.selectMaxPalletNo(batchId) + 1;
-        List<MesProPalletDO> pallets = new ArrayList<>(palletCount);
-        List<List<Long>> bagIdGroups = new ArrayList<>(palletCount);
-        for (int i = 0; i < palletCount; i++) {
-            int palletNo = startNo + i;
-            MesProPalletDO pallet = new MesProPalletDO()
-                    .setCode(batch.getCode() + "-P" + StrUtil.padPre(String.valueOf(palletNo), 2, '0'))
-                    .setBatchId(batchId)
-                    .setBatchCode(batch.getCode())
-                    .setPalletNo(palletNo)
-                    .setCapacity(threshold)
-                    .setBagCount(threshold)
-                    .setAutoGenerated(true)
-                    .setStatus(MesProPalletStatusEnum.IN_USE.getStatus())
-                    .setRemark("鎸夋湁鏁堣鐮侀槇鍊艰嚜鍔ㄧ敓鎴�");
+        List<MesProPalletDO> pallets = new ArrayList<>(ids.size());
+        for (Long id : ids) {
+            MesProPalletDO pallet = palletMapper.selectByIdForUpdate(id);
+            if (pallet == null) {
+                throw exception(PRO_PALLET_NOT_EXISTS);
+            }
+            if (pallet.getBatchId() != null || StrUtil.isNotEmpty(pallet.getCode())) {
+                throw exception(PRO_PALLET_ALREADY_BIND_BATCH);
+            }
             pallets.add(pallet);
-            bagIdGroups.add(candidates.subList(i * threshold, (i + 1) * threshold).stream()
-                    .map(cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO::getId).toList());
         }
-        palletMapper.insertBatch(pallets);
+        // 3. 鍒嗛厤姝e紡鎵樼洏鐮侊細鎵规鍙� + -P + 2 浣嶆墭鐩樺簭鍙凤紙鍚�昏緫鍒犻櫎璁板綍鍙備笌搴忓彿锛屼繚璇佷笉鍥為��銆佺爜鍊煎敮涓�锛�
+        int startNo = palletMapper.selectMaxPalletNo(batch.getId()) + 1;
         for (int i = 0; i < pallets.size(); i++) {
-            MesProPalletDO pallet = pallets.get(i);
-            bagCodeMapper.bindPalletByIds(bagIdGroups.get(i), pallet.getId(), pallet.getCode());
+            int palletNo = startNo + i;
+            palletMapper.updateById(new MesProPalletDO()
+                    .setId(pallets.get(i).getId())
+                    .setCode(batch.getCode() + "-P" + StrUtil.padPre(String.valueOf(palletNo), 2, '0'))
+                    .setBatchId(batch.getId())
+                    .setBatchCode(batch.getCode())
+                    .setPalletNo(palletNo));
         }
-        batchMapper.updateById(new MesProBatchDO().setId(batchId)
+        // 4. 鍥炲啓鎵规鎵樼洏鐮佹暟閲�
+        batchMapper.updateById(new MesProBatchDO().setId(batch.getId())
                 .setPalletQuantity((batch.getPalletQuantity() == null ? 0 : batch.getPalletQuantity()) + pallets.size()));
-        return buildAutoPrintVOs(pallets, batch);
+        return pallets.size();
     }
 
     @Override
@@ -155,36 +164,12 @@
         }
         // 3. 鍒犻櫎鎵樼洏鐮�
         palletMapper.deleteById(id);
-        // 4. 鍥炲噺鎵规鎵樼洏鐮佹暟閲�
-        MesProBatchDO batch = batchMapper.selectById(pallet.getBatchId());
+        // 4. 鍥炲噺鎵规鎵樼洏鐮佹暟閲忥紙涓存椂鎵樼洏鏈粦瀹氭壒娆℃棤闇�鍥炲噺锛�
+        MesProBatchDO batch = pallet.getBatchId() == null ? null : batchMapper.selectById(pallet.getBatchId());
         if (batch != null && batch.getPalletQuantity() != null && batch.getPalletQuantity() > 0) {
             batchMapper.updateById(new MesProBatchDO().setId(batch.getId())
                     .setPalletQuantity(batch.getPalletQuantity() - 1));
         }
-    }
-
-    private List<MesProPalletAutoPrintRespVO> buildAutoPrintVOs(List<MesProPalletDO> pallets, MesProBatchDO batch) {
-        MesMdmItemDO item = batch.getItemId() == null ? null : mdmItemService.getItem(batch.getItemId());
-        AdminUserRespDTO owner = batch.getOwnerUserId() == null ? null : adminUserApi.getUser(batch.getOwnerUserId());
-        return pallets.stream().map(pallet -> new MesProPalletAutoPrintRespVO()
-                .setId(pallet.getId())
-                .setCode(pallet.getCode())
-                .setBatchId(pallet.getBatchId())
-                .setBatchCode(pallet.getBatchCode())
-                .setPalletNo(pallet.getPalletNo())
-                .setCopies(3)
-                .setCapacity(pallet.getCapacity())
-                .setBagCount(pallet.getBagCount())
-                .setItemId(batch.getItemId())
-                .setItemCode(item == null ? null : item.getCode())
-                .setItemName(item == null ? null : item.getName())
-                .setItemSpecification(item == null ? null : item.getSpecification())
-                .setLineCode(batch.getLineCode())
-                .setLineName(batch.getLineName())
-                .setProduceDate(batch.getProduceDate())
-                .setOwnerUserId(batch.getOwnerUserId())
-                .setOwnerUserName(owner == null ? null : owner.getNickname()))
-                .toList();
     }
 
     @Override
@@ -194,7 +179,11 @@
 
     @Override
     public MesProPalletDO getPalletByCode(String code) {
-        return palletMapper.selectByCode(code);
+        MesProPalletDO pallet = palletMapper.selectByCode(code);
+        if (pallet == null) {
+            pallet = palletMapper.selectByTempCode(code);
+        }
+        return pallet;
     }
 
     @Override
@@ -217,6 +206,14 @@
     }
 
     @Override
+    public List<MesProPalletDO> getPalletListByIds(Collection<Long> ids) {
+        if (CollUtil.isEmpty(ids)) {
+            return List.of();
+        }
+        return palletMapper.selectBatchIds(ids);
+    }
+
+    @Override
     public void updatePalletBagCount(Long palletId, Integer bagCount) {
         palletMapper.updateById(new MesProPalletDO().setId(palletId).setBagCount(bagCount));
     }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java
index c2a2cc6..00652fd 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java
@@ -228,6 +228,10 @@
         if (pallet == null && bag == null) {
             throw exception(WM_MATERIAL_STOCK_NOT_EXISTS);
         }
+        // 鏈粦瀹氱敓浜ф壒娆$殑涓存椂鎵樼洏涓嶅厑璁稿弬涓庨攢鍞嚭搴�
+        if (pallet != null && pallet.getBatchId() == null) {
+            throw exception(PRO_PALLET_NOT_BIND_BATCH);
+        }
         Long codeId = pallet != null ? pallet.getId() : bag.getId();
         MesWmProductSalesDetailDO existed = pallet != null
                 ? productSalesDetailMapper.selectBySalesIdAndPalletCodeId(reqVO.getSalesId(), codeId)

--
Gitblit v1.9.3