From 06321d70dd7617fdc7d475b190e629143fec3263 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 19 八月 2026 10:37:52 +0800
Subject: [PATCH] feat(mes): 新增MES生产批次管理和二维码生成功能

---
 .playwright-mcp/page-2026-08-19T02-32-09-962Z.yml                                                                           |    1 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/pallet/MesProPalletService.java                      |   81 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeRespVO.java         |   79 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchTraceRespVO.java        |   81 
 .playwright-mcp/page-2026-08-19T02-33-50-857Z.yml                                                                           |    1 
 .playwright-mcp/page-2026-08-18T08-24-47-027Z.yml                                                                           |  566 +
 .playwright-mcp/page-2026-08-19T02-22-56-693Z.yml                                                                           |    1 
 .playwright-mcp/page-2026-08-18T08-13-18-864Z.yml                                                                           |  497 +
 docs/mes_bag_code_module_decouple.md                                                                                        |   69 
 .playwright-mcp/page-2026-08-18T08-27-07-283Z.yml                                                                           |  274 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/batch/MesProBatchWorkerMapper.java                 |   30 
 .playwright-mcp/page-2026-08-19T02-24-27-322Z.yml                                                                           |    1 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/line/vo/MesProLineSaveReqVO.java            |   30 
 .playwright-mcp/page-2026-08-19T02-23-31-534Z.yml                                                                           |    1 
 .playwright-mcp/page-2026-08-18T08-09-41-564Z.yml                                                                           |  267 
 .playwright-mcp/page-2026-08-18T08-12-24-644Z.yml                                                                           |  271 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/line/MesProLineServiceImpl.java                      |  145 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/home/MesBagCodeHomeStatisticsService.java                |   30 
 .playwright-mcp/page-2026-08-18T08-23-57-412Z.yml                                                                           |  643 +
 .playwright-mcp/page-2026-08-18T08-26-48-898Z.yml                                                                           |  290 
 .playwright-mcp/page-2026-08-18T08-09-59-674Z.yml                                                                           |  276 
 .playwright-mcp/page-2026-08-19T02-31-49-797Z.yml                                                                           |  122 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeTraceRespVO.java    |   77 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/batch/MesProBatchMapper.java                       |   40 
 .playwright-mcp/page-2026-08-19T02-26-06-325Z.yml                                                                           |    1 
 .playwright-mcp/page-2026-08-18T08-11-23-345Z.yml                                                                           |  399 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/pallet/MesProPalletMapper.java                     |   49 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProBagCodeStatusEnum.java                           |   38 
 .playwright-mcp/page-2026-08-19T02-29-21-301Z.yml                                                                           |  114 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java                                     |    4 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/line/MesProLineController.java              |  103 
 .playwright-mcp/page-2026-08-18T08-13-07-718Z.yml                                                                           |  272 
 .playwright-mcp/page-2026-08-18T08-19-51-138Z.yml                                                                           |    1 
 docs/mes_pro_batch_bag_code_integration.md                                                                                  |  268 
 .playwright-mcp/page-2026-08-18T08-23-34-308Z.yml                                                                           |  288 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/home/vo/MesBagCodeHomeStatusRespVO.java         |   20 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/pallet/MesProPalletDO.java                    |   72 
 .playwright-mcp/page-2026-08-19T02-31-28-342Z.yml                                                                           |    1 
 .playwright-mcp/page-2026-08-18T08-39-53-074Z.yml                                                                           |    1 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/line/MesProLineService.java                          |  103 
 .playwright-mcp/page-2026-08-18T08-24-41-010Z.yml                                                                           |  497 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/bagcode/MesProBagCodeDO.java                  |   86 
 .playwright-mcp/page-2026-08-18T08-10-25-770Z.yml                                                                           |  269 
 .playwright-mcp/page-2026-08-18T08-26-27-866Z.yml                                                                           |  288 
 .playwright-mcp/page-2026-08-18T08-11-46-362Z.yml                                                                           |  277 
 yudao-dependencies/pom.xml                                                                                                  |   13 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/batch/MesProBatchWorkerDO.java                |   57 
 .playwright-mcp/page-2026-08-19T02-17-32-337Z.yml                                                                           |  111 
 yudao-server/src/main/resources/application-local.yaml                                                                      |    2 
 .playwright-mcp/page-2026-08-19T02-29-38-624Z.yml                                                                           |  124 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/line/vo/MesProLineRespVO.java               |   41 
 .playwright-mcp/page-2026-08-18T08-40-08-857Z.yml                                                                           |    1 
 .playwright-mcp/page-2026-08-18T08-12-10-057Z.yml                                                                           |  277 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/home/MesBagCodeHomeStatisticsMapper.java               |   74 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeGenerateReqVO.java  |   24 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeService.java                    |  114 
 .playwright-mcp/page-2026-08-18T08-23-20-161Z.yml                                                                           |  451 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchRespVO.java             |  100 
 .playwright-mcp/page-2026-08-19T02-29-47-885Z.yml                                                                           |   42 
 .playwright-mcp/page-2026-08-18T08-23-42-579Z.yml                                                                           |  292 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/bagcode/MesProBagCodeMapper.java                   |  116 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchPageReqVO.java          |   49 
 .playwright-mcp/page-2026-08-18T08-08-37-184Z.yml                                                                           |  259 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/line/MesProLineDO.java                        |   53 
 .playwright-mcp/page-2026-08-19T02-26-42-507Z.yml                                                                           |    1 
 .playwright-mcp/page-2026-08-18T08-09-33-409Z.yml                                                                           |  492 +
 yudao-module-mes/pom.xml                                                                                                    |   10 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletPageReqVO.java        |   36 
 .playwright-mcp/page-2026-08-18T08-39-14-991Z.yml                                                                           |    1 
 .playwright-mcp/page-2026-08-18T08-13-38-423Z.yml                                                                           |  275 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodePageReqVO.java      |   42 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/MesProBagCodeController.java        |  255 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/line/vo/MesProLinePageReqVO.java            |   33 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProBatchStatusEnum.java                             |   39 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/line/MesProLineMapper.java                         |   41 
 .playwright-mcp/page-2026-08-18T08-08-56-287Z.yml                                                                           |  267 
 sql/mysql/mes_pro_batch_bag_code_init.sql                                                                                   |  202 
 .playwright-mcp/page-2026-08-18T08-25-41-120Z.yml                                                                           |  497 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletRespVO.java           |   63 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProBatchWorkerTypeEnum.java                         |   40 
 .playwright-mcp/page-2026-08-19T02-25-12-056Z.yml                                                                           |    1 
 .playwright-mcp/page-2026-08-19T02-29-31-299Z.yml                                                                           |  169 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchServiceImpl.java                    |  264 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java                 |    3 
 .playwright-mcp/page-2026-08-19T02-17-17-019Z.yml                                                                           |    1 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/MesProPalletController.java          |  218 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeServiceImpl.java                |  226 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/pallet/MesProPalletServiceImpl.java                  |  137 
 .playwright-mcp/page-2026-08-18T08-41-15-036Z.yml                                                                           |  284 
 .playwright-mcp/page-2026-08-18T08-11-29-772Z.yml                                                                           |  267 
 docs/mes_pro_line_and_item_restore.md                                                                                       |  131 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/QrLabelInfo.java                                |   24 
 .playwright-mcp/page-2026-08-19T02-25-31-773Z.yml                                                                           |  155 
 .playwright-mcp/page-2026-08-19T02-34-08-855Z.yml                                                                           |  105 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java                                    |   33 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/home/vo/MesBagCodeHomeTrendRespVO.java          |   20 
 .playwright-mcp/page-2026-08-19T02-28-43-496Z.yml                                                                           |    1 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletBatchCreateReqVO.java |   28 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProPalletStatusEnum.java                            |   37 
 .playwright-mcp/page-2026-08-19T02-33-58-475Z.yml                                                                           |  102 
 .playwright-mcp/page-2026-08-18T08-11-35-526Z.yml                                                                           |  277 
 yudao-module-mes/src/main/resources/mapper/home/MesBagCodeHomeStatisticsMapper.xml                                          |   97 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/home/MesBagCodeHomeStatisticsController.java    |   49 
 .playwright-mcp/page-2026-08-18T08-10-38-848Z.yml                                                                           |  399 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeBindReqVO.java      |   22 
 yudao-server/src/main/resources/application-thzy.yaml                                                                       |  198 
 .playwright-mcp/page-2026-08-19T02-32-18-582Z.yml                                                                           |  105 
 .playwright-mcp/page-2026-08-18T08-21-00-151Z.yml                                                                           |  197 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/batch/MesProBatchDO.java                      |   95 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/home/MesBagCodeHomeStatisticsServiceImpl.java            |   99 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/MesProQrLabelBuilder.java                       |  108 
 .playwright-mcp/page-2026-08-18T08-08-16-647Z.yml                                                                           |    1 
 .playwright-mcp/page-2026-08-18T08-24-05-557Z.yml                                                                           |  647 ++
 .playwright-mcp/page-2026-08-18T08-42-30-730Z.yml                                                                           |  273 
 .playwright-mcp/page-2026-08-18T08-25-58-788Z.yml                                                                           |  272 
 .playwright-mcp/page-2026-08-18T08-21-47-467Z.yml                                                                           |  267 
 .playwright-mcp/page-2026-08-18T08-09-14-099Z.yml                                                                           |  492 +
 .playwright-mcp/page-2026-08-19T02-23-37-571Z.yml                                                                           |    1 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/home/vo/MesBagCodeHomeSummaryRespVO.java        |   48 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchSaveReqVO.java          |   71 
 .playwright-mcp/page-2026-08-19T02-31-43-280Z.yml                                                                           |  163 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/MesProBatchController.java            |  281 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchService.java                        |  106 
 .playwright-mcp/page-2026-08-18T08-23-09-413Z.yml                                                                           |  399 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/QrCodeImageUtils.java                           |  233 
 .playwright-mcp/page-2026-08-18T08-42-38-843Z.yml                                                                           |  211 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletTraceRespVO.java      |   80 
 .playwright-mcp/page-2026-08-18T08-22-01-568Z.yml                                                                           |  399 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchWorkerRespVO.java       |   35 
 .playwright-mcp/page-2026-08-19T02-28-56-514Z.yml                                                                           |    1 
 130 files changed, 19,348 insertions(+), 2 deletions(-)

diff --git a/.playwright-mcp/page-2026-08-18T08-08-16-647Z.yml b/.playwright-mcp/page-2026-08-18T08-08-16-647Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-08-16-647Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-08-37-184Z.yml b/.playwright-mcp/page-2026-08-18T08-08-37-184Z.yml
new file mode 100644
index 0000000..0a5ba4f
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-08-37-184Z.yml
@@ -0,0 +1,259 @@
+- generic [ref=e4]:
+  - generic [ref=e7]:
+    - complementary [ref=e8]:
+      - generic [ref=e9]:
+        - generic [ref=e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+          - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e22]:
+          - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+          - listitem [ref=e30]:
+            - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e39]:
+            - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=e46]:
+            - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=e53]:
+            - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=e61]:
+            - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=e70]:
+            - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=e78]:
+            - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+          - listitem [ref=e111]:
+            - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=e118]:
+            - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=e125]:
+            - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=e132]:
+            - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=e139]:
+            - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=e146]:
+            - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=e153]:
+            - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=e160]:
+            - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=e169] [cursor=pointer]
+    - generic [ref=e174]:
+      - generic [ref=e175]:
+        - banner [ref=e176]:
+          - button [ref=e177] [cursor=pointer]
+          - button [ref=e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e185]:
+            - list [ref=e186]:
+              - listitem [ref=e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=e192]
+              - listitem [ref=e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+          - generic [ref=e201]:
+            - generic [ref=e203] [cursor=pointer]:
+              - generic [ref=e207]: 鎼滅储
+              - generic [ref=e208]: Ctrl K
+            - button [ref=e210] [cursor=pointer]
+            - button "dark" [ref=e215] [cursor=pointer]
+            - button [ref=e224] [cursor=pointer]
+            - button [ref=e230] [cursor=pointer]
+            - button [ref=e233] [cursor=pointer]
+            - button [ref=e239] [cursor=pointer]:
+              - button [ref=e241]
+            - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=e250] [cursor=pointer]
+        - generic [ref=e257]:
+          - generic [ref=e262]:
+            - generic [ref=e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=e298]:
+            - button [ref=e299] [cursor=pointer]
+            - generic [ref=e306] [cursor=pointer]
+            - generic [ref=e310] [cursor=pointer]
+      - main [ref=e317]:
+        - generic [ref=e322]:
+          - generic [ref=e327]:
+            - generic [ref=e328]:
+              - generic [ref=e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=e337]:
+              - generic [ref=e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+            - generic [ref=e351]:
+              - generic [ref=e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=e360]:
+              - generic [ref=e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=e369]:
+              - generic [ref=e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+            - generic [ref=e383]:
+              - generic [ref=e384]: 鎵规鐘舵��
+              - generic [ref=e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=e393]:
+              - generic [ref=e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e403]:
+                  - img "swap-right" [ref=e404]
+                - textbox "缁撴潫鏃堕棿" [ref=e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e409]:
+              - generic [ref=e410]: 鍒涘缓鏃堕棿
+              - generic [ref=e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e419]:
+                  - img "swap-right" [ref=e420]
+                - textbox "缁撴潫鏃堕棿" [ref=e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e425]:
+              - button "閲� 缃�" [ref=e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+              - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=e437]:
+            - generic [ref=e439]:
+              - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=e444]:
+                - generic [ref=e446]:
+                  - button "鏂板鎵规" [active] [ref=e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+                - button "顫�" [ref=e459] [cursor=pointer]
+              - generic [ref=e461]:
+                - button "瞟�" [ref=e462] [cursor=pointer]
+                - button "顪�" [ref=e464] [cursor=pointer]
+                - button "顦�" [ref=e466] [cursor=pointer]
+            - generic [ref=e470]:
+              - generic [ref=e473]:
+                - generic [ref=e474]:
+                  - table [ref=e478]:
+                    - rowgroup [ref=e493]:
+                      - row [ref=e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=e520]
+                        - columnheader "璐d换浜�" [ref=e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                        - columnheader "鎵规鐘舵��" [ref=e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+                  - generic [ref=e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=e553]:
+                    - table [ref=e556]:
+                      - rowgroup [ref=e571]:
+                        - row [ref=e572]:
+                          - columnheader "鎵规鍙�" [ref=e573]
+                    - generic [ref=e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=e580]:
+                    - table [ref=e583]:
+                      - rowgroup [ref=e598]:
+                        - row [ref=e599]:
+                          - columnheader "鎿嶄綔" [ref=e600]
+                    - generic [ref=e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=e621]:
+              - generic [ref=e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=e625]:
+                  - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+                - generic [ref=e627]: 睿�
+              - button "飱�" [ref=e630]
+              - button "顧�" [ref=e632]
+              - button "顫�" [ref=e634]
+              - button "1" [ref=e637] [cursor=pointer]
+              - button "顫�" [ref=e638]
+              - button "顧�" [ref=e640]
+              - button "顦�" [ref=e642]
+  - dialog [ref=e645]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=e647]
+    - generic [ref=e649]:
+      - generic [ref=e651]:
+        - generic [ref=e652]:
+          - generic [ref=e653]:
+            - generic [ref=e654]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=e661]
+        - generic [ref=e667]:
+          - generic [ref=e668]:
+            - generic [ref=e669]: "*"
+            - text: 浜х嚎
+          - generic [ref=e675]:
+            - combobox "* 浜х嚎" [ref=e677]
+            - generic: 璇烽�夋嫨浜х嚎
+        - generic [ref=e678]:
+          - generic [ref=e679]:
+            - generic [ref=e680]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=e686]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=e687]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=e688]:
+          - generic [ref=e689]: 璁″垝鏁伴噺
+          - generic [ref=e694]:
+            - generic [ref=e695]:
+              - button "Increase Value" [ref=e696] [cursor=pointer]:
+                - img "up" [ref=e697]
+              - button "Decrease Value" [ref=e700] [cursor=pointer]:
+                - img "down" [ref=e701]
+            - spinbutton "璁″垝鏁伴噺" [ref=e705]
+        - generic [ref=e706]:
+          - generic [ref=e707]:
+            - generic [ref=e708]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=e715]
+        - generic [ref=e721]:
+          - generic [ref=e722]: 澶囨敞
+          - textbox "澶囨敞" [ref=e727]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=e728]:
+        - generic [ref=e729]:
+          - generic [ref=e730]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=e731] [cursor=pointer]
+        - generic [ref=e739]:
+          - generic [ref=e743]:
+            - table [ref=e747]:
+              - rowgroup [ref=e753]:
+                - row [ref=e754]:
+                  - columnheader "鐢熶骇浜哄憳" [ref=e755]
+                  - columnheader "宀椾綅绫诲瀷" [ref=e760]
+                  - columnheader "澶囨敞" [ref=e765]
+                  - columnheader "鎿嶄綔" [ref=e770]
+            - generic [ref=e776]:
+              - table:
+                - rowgroup
+          - generic: 鏆傛棤鏁版嵁
+    - button [ref=e786] [cursor=pointer]
+    - generic [ref=e796]:
+      - button "纭� 璁�" [ref=e797] [cursor=pointer]
+      - button "鍙� 娑�" [ref=e800] [cursor=pointer]
+    - button [ref=e802] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-08-56-287Z.yml b/.playwright-mcp/page-2026-08-18T08-08-56-287Z.yml
new file mode 100644
index 0000000..260e658
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-08-56-287Z.yml
@@ -0,0 +1,267 @@
+- generic [ref=e4]:
+  - generic [ref=e7]:
+    - complementary [ref=e8]:
+      - generic [ref=e9]:
+        - generic [ref=e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+          - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e22]:
+          - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+          - listitem [ref=e30]:
+            - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e39]:
+            - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=e46]:
+            - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=e53]:
+            - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=e61]:
+            - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=e70]:
+            - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=e78]:
+            - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+          - listitem [ref=e111]:
+            - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=e118]:
+            - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=e125]:
+            - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=e132]:
+            - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=e139]:
+            - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=e146]:
+            - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=e153]:
+            - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=e160]:
+            - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=e169] [cursor=pointer]
+    - generic [ref=e174]:
+      - generic [ref=e175]:
+        - banner [ref=e176]:
+          - button [ref=e177] [cursor=pointer]
+          - button [ref=e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e185]:
+            - list [ref=e186]:
+              - listitem [ref=e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=e192]
+              - listitem [ref=e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+          - generic [ref=e201]:
+            - generic [ref=e203] [cursor=pointer]:
+              - generic [ref=e207]: 鎼滅储
+              - generic [ref=e208]: Ctrl K
+            - button [ref=e210] [cursor=pointer]
+            - button "dark" [ref=e215] [cursor=pointer]
+            - button [ref=e224] [cursor=pointer]
+            - button [ref=e230] [cursor=pointer]
+            - button [ref=e233] [cursor=pointer]
+            - button [ref=e239] [cursor=pointer]:
+              - button [ref=e241]
+            - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=e250] [cursor=pointer]
+        - generic [ref=e257]:
+          - generic [ref=e262]:
+            - generic [ref=e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=e298]:
+            - button [ref=e299] [cursor=pointer]
+            - generic [ref=e306] [cursor=pointer]
+            - generic [ref=e310] [cursor=pointer]
+      - main [ref=e317]:
+        - generic [ref=e322]:
+          - generic [ref=e327]:
+            - generic [ref=e328]:
+              - generic [ref=e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=e337]:
+              - generic [ref=e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+            - generic [ref=e351]:
+              - generic [ref=e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=e360]:
+              - generic [ref=e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=e369]:
+              - generic [ref=e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+            - generic [ref=e383]:
+              - generic [ref=e384]: 鎵规鐘舵��
+              - generic [ref=e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=e393]:
+              - generic [ref=e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e403]:
+                  - img "swap-right" [ref=e404]
+                - textbox "缁撴潫鏃堕棿" [ref=e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e409]:
+              - generic [ref=e410]: 鍒涘缓鏃堕棿
+              - generic [ref=e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e419]:
+                  - img "swap-right" [ref=e420]
+                - textbox "缁撴潫鏃堕棿" [ref=e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e425]:
+              - button "閲� 缃�" [ref=e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+              - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=e437]:
+            - generic [ref=e439]:
+              - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=e444]:
+                - generic [ref=e446]:
+                  - button "鏂板鎵规" [ref=e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+                - button "顫�" [ref=e459] [cursor=pointer]
+              - generic [ref=e461]:
+                - button "瞟�" [ref=e462] [cursor=pointer]
+                - button "顪�" [ref=e464] [cursor=pointer]
+                - button "顦�" [ref=e466] [cursor=pointer]
+            - generic [ref=e470]:
+              - generic [ref=e473]:
+                - generic [ref=e474]:
+                  - table [ref=e478]:
+                    - rowgroup [ref=e493]:
+                      - row [ref=e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=e520]
+                        - columnheader "璐d换浜�" [ref=e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                        - columnheader "鎵规鐘舵��" [ref=e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+                  - generic [ref=e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=e553]:
+                    - table [ref=e556]:
+                      - rowgroup [ref=e571]:
+                        - row [ref=e572]:
+                          - columnheader "鎵规鍙�" [ref=e573]
+                    - generic [ref=e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=e580]:
+                    - table [ref=e583]:
+                      - rowgroup [ref=e598]:
+                        - row [ref=e599]:
+                          - columnheader "鎿嶄綔" [ref=e600]
+                    - generic [ref=e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=e621]:
+              - generic [ref=e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=e625]:
+                  - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+                - generic [ref=e627]: 睿�
+              - button "飱�" [ref=e630]
+              - button "顧�" [ref=e632]
+              - button "顫�" [ref=e634]
+              - button "1" [ref=e637] [cursor=pointer]
+              - button "顫�" [ref=e638]
+              - button "顧�" [ref=e640]
+              - button "顦�" [ref=e642]
+  - dialog [ref=e645]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=e647]
+    - generic [ref=e649]:
+      - generic [ref=e651]:
+        - generic [ref=e652]:
+          - generic [ref=e653]:
+            - generic [ref=e654]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=e661]
+        - generic [ref=e667]:
+          - generic [ref=e668]:
+            - generic [ref=e669]: "*"
+            - text: 浜х嚎
+          - generic [ref=e675]:
+            - combobox "* 浜х嚎" [ref=e677]
+            - generic: 璇烽�夋嫨浜х嚎
+        - generic [ref=e678]:
+          - generic [ref=e679]:
+            - generic [ref=e680]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=e686]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=e687]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=e688]:
+          - generic [ref=e689]: 璁″垝鏁伴噺
+          - generic [ref=e694]:
+            - generic [ref=e695]:
+              - button "Increase Value" [ref=e696] [cursor=pointer]:
+                - img "up" [ref=e697]
+              - button "Decrease Value" [ref=e700] [cursor=pointer]:
+                - img "down" [ref=e701]
+            - spinbutton "璁″垝鏁伴噺" [ref=e705]
+        - generic [ref=e706]:
+          - generic [ref=e707]:
+            - generic [ref=e708]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=e715]
+        - generic [ref=e721]:
+          - generic [ref=e722]: 澶囨敞
+          - textbox "澶囨敞" [ref=e727]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=e728]:
+        - generic [ref=e729]:
+          - generic [ref=e730]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [active] [ref=e731] [cursor=pointer]
+        - generic [ref=e743]:
+          - table [ref=e747]:
+            - rowgroup [ref=e753]:
+              - row [ref=e754]:
+                - columnheader "鐢熶骇浜哄憳" [ref=e755]
+                - columnheader "宀椾綅绫诲瀷" [ref=e760]
+                - columnheader "澶囨敞" [ref=e765]
+                - columnheader "鎿嶄綔" [ref=e770]
+          - table [ref=e806]:
+            - rowgroup [ref=e812]:
+              - row [ref=e813]:
+                - cell [ref=e814]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=e819]
+                - cell [ref=e825]:
+                  - generic [ref=e829] [cursor=pointer]:
+                    - combobox [ref=e831]
+                    - generic: 璇烽�夋嫨宀椾綅绫诲瀷
+                - cell [ref=e832]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=e835]
+                - cell [ref=e836]:
+                  - button "鍒犻櫎" [ref=e842] [cursor=pointer]
+    - button [ref=e786] [cursor=pointer]
+    - generic [ref=e796]:
+      - button "纭� 璁�" [ref=e797] [cursor=pointer]
+      - button "鍙� 娑�" [ref=e800] [cursor=pointer]
+    - button [ref=e802] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-09-14-099Z.yml b/.playwright-mcp/page-2026-08-18T08-09-14-099Z.yml
new file mode 100644
index 0000000..605ad61
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-09-14-099Z.yml
@@ -0,0 +1,492 @@
+- generic [ref=e4]:
+  - generic [ref=e7]:
+    - complementary [ref=e8]:
+      - generic [ref=e9]:
+        - generic [ref=e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+          - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e22]:
+          - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+          - listitem [ref=e30]:
+            - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e39]:
+            - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=e46]:
+            - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=e53]:
+            - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=e61]:
+            - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=e70]:
+            - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=e78]:
+            - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+          - listitem [ref=e111]:
+            - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=e118]:
+            - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=e125]:
+            - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=e132]:
+            - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=e139]:
+            - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=e146]:
+            - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=e153]:
+            - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=e160]:
+            - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=e169] [cursor=pointer]
+    - generic [ref=e174]:
+      - generic [ref=e175]:
+        - banner [ref=e176]:
+          - button [ref=e177] [cursor=pointer]
+          - button [ref=e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e185]:
+            - list [ref=e186]:
+              - listitem [ref=e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=e192]
+              - listitem [ref=e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+          - generic [ref=e201]:
+            - generic [ref=e203] [cursor=pointer]:
+              - generic [ref=e207]: 鎼滅储
+              - generic [ref=e208]: Ctrl K
+            - button [ref=e210] [cursor=pointer]
+            - button "dark" [ref=e215] [cursor=pointer]
+            - button [ref=e224] [cursor=pointer]
+            - button [ref=e230] [cursor=pointer]
+            - button [ref=e233] [cursor=pointer]
+            - button [ref=e239] [cursor=pointer]:
+              - button [ref=e241]
+            - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=e250] [cursor=pointer]
+        - generic [ref=e257]:
+          - generic [ref=e262]:
+            - generic [ref=e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=e298]:
+            - button [ref=e299] [cursor=pointer]
+            - generic [ref=e306] [cursor=pointer]
+            - generic [ref=e310] [cursor=pointer]
+      - main [ref=e317]:
+        - generic [ref=e322]:
+          - generic [ref=e327]:
+            - generic [ref=e328]:
+              - generic [ref=e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=e337]:
+              - generic [ref=e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+            - generic [ref=e351]:
+              - generic [ref=e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=e360]:
+              - generic [ref=e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=e369]:
+              - generic [ref=e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+            - generic [ref=e383]:
+              - generic [ref=e384]: 鎵规鐘舵��
+              - generic [ref=e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=e393]:
+              - generic [ref=e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e403]:
+                  - img "swap-right" [ref=e404]
+                - textbox "缁撴潫鏃堕棿" [ref=e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e409]:
+              - generic [ref=e410]: 鍒涘缓鏃堕棿
+              - generic [ref=e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e419]:
+                  - img "swap-right" [ref=e420]
+                - textbox "缁撴潫鏃堕棿" [ref=e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e425]:
+              - button "閲� 缃�" [ref=e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+              - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=e437]:
+            - generic [ref=e439]:
+              - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=e444]:
+                - generic [ref=e446]:
+                  - button "鏂板鎵规" [ref=e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+                - button "顫�" [ref=e459] [cursor=pointer]
+              - generic [ref=e461]:
+                - button "瞟�" [ref=e462] [cursor=pointer]
+                - button "顪�" [ref=e464] [cursor=pointer]
+                - button "顦�" [ref=e466] [cursor=pointer]
+            - generic [ref=e470]:
+              - generic [ref=e473]:
+                - generic [ref=e474]:
+                  - table [ref=e478]:
+                    - rowgroup [ref=e493]:
+                      - row [ref=e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=e520]
+                        - columnheader "璐d换浜�" [ref=e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                        - columnheader "鎵规鐘舵��" [ref=e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+                  - generic [ref=e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=e553]:
+                    - table [ref=e556]:
+                      - rowgroup [ref=e571]:
+                        - row [ref=e572]:
+                          - columnheader "鎵规鍙�" [ref=e573]
+                    - generic [ref=e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=e580]:
+                    - table [ref=e583]:
+                      - rowgroup [ref=e598]:
+                        - row [ref=e599]:
+                          - columnheader "鎿嶄綔" [ref=e600]
+                    - generic [ref=e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=e621]:
+              - generic [ref=e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=e625]:
+                  - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+                - generic [ref=e627]: 睿�
+              - button "飱�" [ref=e630]
+              - button "顧�" [ref=e632]
+              - button "顫�" [ref=e634]
+              - button "1" [ref=e637] [cursor=pointer]
+              - button "顫�" [ref=e638]
+              - button "顧�" [ref=e640]
+              - button "顦�" [ref=e642]
+  - dialog [ref=e645]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=e647]
+    - generic [ref=e649]:
+      - generic [ref=e651]:
+        - generic [ref=e652]:
+          - generic [ref=e653]:
+            - generic [ref=e654]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=e661]
+        - generic [ref=e667]:
+          - generic [ref=e668]:
+            - generic [ref=e669]: "*"
+            - text: 浜х嚎
+          - generic [ref=e675]:
+            - combobox "* 浜х嚎" [ref=e677]
+            - generic: 璇烽�夋嫨浜х嚎
+        - generic [ref=e678]:
+          - generic [ref=e679]:
+            - generic [ref=e680]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=e686]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=e687]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=e688]:
+          - generic [ref=e689]: 璁″垝鏁伴噺
+          - generic [ref=e694]:
+            - generic [ref=e695]:
+              - button "Increase Value" [ref=e696] [cursor=pointer]:
+                - img "up" [ref=e697]
+              - button "Decrease Value" [ref=e700] [cursor=pointer]:
+                - img "down" [ref=e701]
+            - spinbutton "璁″垝鏁伴噺" [ref=e705]
+        - generic [ref=e706]:
+          - generic [ref=e707]:
+            - generic [ref=e708]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=e715]
+        - generic [ref=e721]:
+          - generic [ref=e722]: 澶囨敞
+          - textbox "澶囨敞" [ref=e727]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=e728]:
+        - generic [ref=e729]:
+          - generic [ref=e730]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=e731] [cursor=pointer]
+        - generic [ref=e743]:
+          - table [ref=e747]:
+            - rowgroup [ref=e753]:
+              - row [ref=e754]:
+                - columnheader "鐢熶骇浜哄憳" [ref=e755]
+                - columnheader "宀椾綅绫诲瀷" [ref=e760]
+                - columnheader "澶囨敞" [ref=e765]
+                - columnheader "鎿嶄綔" [ref=e770]
+          - table [ref=e806]:
+            - rowgroup [ref=e812]:
+              - row [ref=e813]:
+                - cell [ref=e814]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=e819]
+                - cell [ref=e825]:
+                  - generic [ref=e829] [cursor=pointer]:
+                    - combobox [ref=e831]
+                    - generic: 璇烽�夋嫨宀椾綅绫诲瀷
+                - cell [ref=e832]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=e835]
+                - cell [ref=e836]:
+                  - button "鍒犻櫎" [ref=e842] [cursor=pointer]
+    - button [ref=e786] [cursor=pointer]
+    - generic [ref=e796]:
+      - button "纭� 璁�" [ref=e797] [cursor=pointer]
+      - button "鍙� 娑�" [ref=e800] [cursor=pointer]
+    - button [ref=e802] [cursor=pointer]
+  - dialog "浜哄憳閫夋嫨" [ref=e845]:
+    - document:
+      - generic [ref=e846]:
+        - button "Close" [ref=e847] [cursor=pointer]:
+          - img "close" [ref=e849]
+        - generic [ref=e852]: 浜哄憳閫夋嫨
+        - generic [ref=e855]:
+          - generic [ref=e857]:
+            - textbox "鎼滅储閮ㄩ棬" [ref=e864]
+            - tree [ref=e868]:
+              - generic:
+                - textbox "for screen reader"
+              - generic [ref=e872]:
+                - generic [ref=e873]:
+                  - img "caret-down" [ref=e875] [cursor=pointer]
+                  - generic "鎬诲叕鍙�" [ref=e878] [cursor=pointer]
+                - generic [ref=e879]:
+                  - img "caret-down" [ref=e882] [cursor=pointer]
+                  - generic "娣卞湷鎬诲叕鍙�" [ref=e885] [cursor=pointer]
+                - generic "鐮斿彂閮ㄩ棬" [ref=e889] [cursor=pointer]
+                - generic "甯傚満閮ㄩ棬" [ref=e893] [cursor=pointer]
+                - generic "娴嬭瘯閮ㄩ棬" [ref=e897] [cursor=pointer]
+                - generic "璐㈠姟閮ㄩ棬" [ref=e901] [cursor=pointer]
+                - generic "杩愮淮閮ㄩ棬" [ref=e905] [cursor=pointer]
+                - generic [ref=e906]:
+                  - img "caret-down" [ref=e909] [cursor=pointer]
+                  - generic "闀挎矙鍒嗗叕鍙�" [ref=e912] [cursor=pointer]
+                - generic "甯傚満閮ㄩ棬" [ref=e916] [cursor=pointer]
+                - generic "璐㈠姟閮ㄩ棬" [ref=e920] [cursor=pointer]
+                - generic "鏂伴儴闂�" [ref=e923] [cursor=pointer]
+                - generic "椤剁骇閮ㄩ棬" [ref=e926] [cursor=pointer]
+                - generic "鏌愪釜瀛愰儴闂�" [ref=e929] [cursor=pointer]
+                - generic "鏌愪釜瀛愰儴闂� 2" [ref=e932] [cursor=pointer]
+          - generic [ref=e935]:
+            - generic [ref=e940]:
+              - generic [ref=e941]:
+                - generic [ref=e942]: 鐢ㄦ埛鍚嶇О
+                - textbox "鐢ㄦ埛鍚嶇О" [ref=e948]:
+                  - /placeholder: 璇疯緭鍏ョ敤鎴峰悕绉�
+              - generic [ref=e950]:
+                - generic [ref=e951]: 鐢ㄦ埛鏄电О
+                - textbox "鐢ㄦ埛鏄电О" [ref=e957]:
+                  - /placeholder: 璇疯緭鍏ョ敤鎴锋樀绉�
+              - generic [ref=e959]:
+                - generic [ref=e960]: 鎵嬫満鍙风爜
+                - textbox "鎵嬫満鍙风爜" [ref=e966]:
+                  - /placeholder: 璇疯緭鍏ユ墜鏈哄彿鐮�
+              - generic [ref=e968]:
+                - generic [ref=e969]: 鐘舵��
+                - generic [ref=e975] [cursor=pointer]:
+                  - combobox "鐘舵��" [ref=e977]
+                  - generic "寮�鍚�" [ref=e978]
+              - generic [ref=e983]:
+                - button "閲� 缃�" [ref=e984] [cursor=pointer]
+                - button "鎼� 绱�" [ref=e986] [cursor=pointer]
+                - generic [ref=e988] [cursor=pointer]: 鏀惰捣
+            - generic [ref=e995]:
+              - generic [ref=e997]:
+                - generic [ref=e998]: 鐢ㄦ埛鍒楄〃
+                - button "顫�" [ref=e1003] [cursor=pointer]
+                - generic [ref=e1005]:
+                  - button "瞟�" [ref=e1006] [cursor=pointer]
+                  - button "顪�" [ref=e1008] [cursor=pointer]
+                  - button "顦�" [ref=e1010] [cursor=pointer]
+              - generic [ref=e1018]:
+                - table [ref=e1022]:
+                  - rowgroup [ref=e1030]:
+                    - row "鐢ㄦ埛缂栧彿 鐢ㄦ埛鍚嶇О 鐢ㄦ埛鏄电О 鎵嬫満鍙风爜 鐘舵��" [ref=e1031]:
+                      - columnheader [ref=e1032]
+                      - columnheader "鐢ㄦ埛缂栧彿" [ref=e1035]
+                      - columnheader "鐢ㄦ埛鍚嶇О" [ref=e1040]
+                      - columnheader "鐢ㄦ埛鏄电О" [ref=e1045]
+                      - columnheader "鎵嬫満鍙风爜" [ref=e1050]
+                      - columnheader "鐘舵��" [ref=e1055]
+                - table [ref=e1063]:
+                  - rowgroup [ref=e1071]:
+                    - row [ref=e1072]:
+                      - cell "顭�" [ref=e1073]
+                      - cell "230" [ref=e1078]
+                      - cell "18333333333" [ref=e1082]
+                      - cell "222" [ref=e1086]
+                      - cell "18333333333" [ref=e1090]
+                      - cell "寮�鍚�" [ref=e1094]
+                    - row [ref=e1098]:
+                      - cell "顭�" [ref=e1099]
+                      - cell "229" [ref=e1104]
+                      - cell "15822054764" [ref=e1108]
+                      - cell "鏀惧亣" [ref=e1112]
+                      - cell "15822054764" [ref=e1116]
+                      - cell "寮�鍚�" [ref=e1120]
+                    - row [ref=e1124]:
+                      - cell "顭�" [ref=e1125]
+                      - cell "228" [ref=e1130]
+                      - cell "15822054766" [ref=e1134]
+                      - cell "涓嶆兂涓婄彮" [ref=e1138]
+                      - cell "15822054766" [ref=e1142]
+                      - cell "寮�鍚�" [ref=e1146]
+                    - row [ref=e1150]:
+                      - cell "顭�" [ref=e1151]
+                      - cell "227" [ref=e1156]
+                      - cell "15822054767" [ref=e1160]
+                      - cell "澶ф槑鏄�" [ref=e1164]
+                      - cell "15822054767" [ref=e1168]
+                      - cell "寮�鍚�" [ref=e1172]
+                    - row [ref=e1176]:
+                      - cell "顭�" [ref=e1177]
+                      - cell "226" [ref=e1182]
+                      - cell "15822054763" [ref=e1186]
+                      - cell "鍗冨厠" [ref=e1190]
+                      - cell "15822054763" [ref=e1194]
+                      - cell "寮�鍚�" [ref=e1198]
+                    - row [ref=e1202]:
+                      - cell "顭�" [ref=e1203]
+                      - cell "225" [ref=e1208]
+                      - cell "15822054762" [ref=e1212]
+                      - cell "鍗楃摐瀛�" [ref=e1216]
+                      - cell "15822054762" [ref=e1220]
+                      - cell "寮�鍚�" [ref=e1224]
+                    - row "顭� 144 aoteman001 aoteman00112 鍏抽棴" [ref=e1228]:
+                      - cell "顭�" [ref=e1229]
+                      - cell "144" [ref=e1234]
+                      - cell "aoteman001" [ref=e1238]
+                      - cell "aoteman00112" [ref=e1242]
+                      - cell [ref=e1246]
+                      - cell "鍏抽棴" [ref=e1250]
+                    - row "顭� 143 a00001 a00001 寮�鍚�" [ref=e1254]:
+                      - cell "顭�" [ref=e1255]
+                      - cell "143" [ref=e1260]
+                      - cell "a00001" [ref=e1264]
+                      - cell "a00001" [ref=e1268]
+                      - cell [ref=e1272]
+                      - cell "寮�鍚�" [ref=e1276]
+                    - row [ref=e1280]:
+                      - cell "顭�" [ref=e1281]
+                      - cell "142" [ref=e1286]
+                      - cell "test01" [ref=e1290]
+                      - cell "test01" [ref=e1294]
+                      - cell "19021719925" [ref=e1298]
+                      - cell "寮�鍚�" [ref=e1302]
+                    - row "顭� 141 admin1 鏂扮敤鎴� 寮�鍚�" [ref=e1306]:
+                      - cell "顭�" [ref=e1307]
+                      - cell "141" [ref=e1312]
+                      - cell "admin1" [ref=e1316]
+                      - cell "鏂扮敤鎴�" [ref=e1320]
+                      - cell [ref=e1324]
+                      - cell "寮�鍚�" [ref=e1328]
+                    - row "顭� 139 wwbwwb 灏忕澶� 寮�鍚�" [ref=e1332]:
+                      - cell "顭�" [ref=e1333]
+                      - cell "139" [ref=e1338]
+                      - cell "wwbwwb" [ref=e1342]
+                      - cell "灏忕澶�" [ref=e1346]
+                      - cell [ref=e1350]
+                      - cell "寮�鍚�" [ref=e1354]
+                    - row [ref=e1358]:
+                      - cell "顭�" [ref=e1359]
+                      - cell "118" [ref=e1364]
+                      - cell "goudan" [ref=e1368]
+                      - cell "鐙楄泲" [ref=e1372]
+                      - cell "15601691239" [ref=e1376]
+                      - cell "寮�鍚�" [ref=e1380]
+                    - row [ref=e1384]:
+                      - cell "顭�" [ref=e1385]
+                      - cell "117" [ref=e1390]
+                      - cell "admin123" [ref=e1394]
+                      - cell "娴嬭瘯鍙�02" [ref=e1398]
+                      - cell "15601691234" [ref=e1402]
+                      - cell "寮�鍚�" [ref=e1406]
+                    - row [ref=e1410]:
+                      - cell "顭�" [ref=e1411]
+                      - cell "115" [ref=e1416]
+                      - cell "aotemane" [ref=e1420]
+                      - cell "闃垮憜" [ref=e1424]
+                      - cell "15601691229" [ref=e1428]
+                      - cell "寮�鍚�" [ref=e1432]
+                    - row [ref=e1436]:
+                      - cell "顭�" [ref=e1437]
+                      - cell "114" [ref=e1442]
+                      - cell "hrmgr" [ref=e1446]
+                      - cell "hr 灏忓濮�" [ref=e1450]
+                      - cell "15601691236" [ref=e1454]
+                      - cell "寮�鍚�" [ref=e1458]
+                    - row [ref=e1462]:
+                      - cell "顭�" [ref=e1463]
+                      - cell "113" [ref=e1468]
+                      - cell "aoteman" [ref=e1472]
+                      - cell "绠$悊鍛�1" [ref=e1476]
+                      - cell "15601691300" [ref=e1480]
+                      - cell "寮�鍚�" [ref=e1484]
+                    - row [ref=e1488]:
+                      - cell "顭�" [ref=e1489]
+                      - cell "112" [ref=e1494]
+                      - cell "newobject" [ref=e1498]
+                      - cell "鏂板璞�" [ref=e1502]
+                      - cell "15601691235" [ref=e1506]
+                      - cell "寮�鍚�" [ref=e1510]
+                    - row "顭� 111 test 娴嬭瘯鐢ㄦ埛 寮�鍚�" [ref=e1514]:
+                      - cell "顭�" [ref=e1515]
+                      - cell "111" [ref=e1520]
+                      - cell "test" [ref=e1524]
+                      - cell "娴嬭瘯鐢ㄦ埛" [ref=e1528]
+                      - cell [ref=e1532]
+                      - cell "寮�鍚�" [ref=e1536]
+                    - row [ref=e1540]:
+                      - cell "顭�" [ref=e1541]
+                      - cell "1" [ref=e1546]
+                      - cell "admin" [ref=e1550]
+                      - cell "瓒呯骇绠$悊鍛�" [ref=e1554]
+                      - cell "18818260272" [ref=e1558]
+                      - cell "寮�鍚�" [ref=e1562]
+              - generic [ref=e1573]:
+                - generic [ref=e1574]: 鍏� 19 鏉¤褰�
+                - generic [ref=e1576] [cursor=pointer]:
+                  - generic "20鏉�/椤�" [ref=e1577]:
+                    - textbox "璇烽�夋嫨" [ref=e1578]: 20鏉�/椤�
+                  - generic [ref=e1579]: 睿�
+                - button "飱�" [ref=e1582]
+                - button "顧�" [ref=e1584]
+                - button "顫�" [ref=e1586]
+                - button "1" [ref=e1589] [cursor=pointer]
+                - button "顫�" [ref=e1590]
+                - button "顧�" [ref=e1592]
+                - button "顦�" [ref=e1594]
+        - generic [ref=e1596]:
+          - button "鍙� 娑�" [ref=e1597] [cursor=pointer]
+          - button "纭� 瀹�" [ref=e1599] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-09-33-409Z.yml b/.playwright-mcp/page-2026-08-18T08-09-33-409Z.yml
new file mode 100644
index 0000000..f5c11b1
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-09-33-409Z.yml
@@ -0,0 +1,492 @@
+- generic [ref=e4]:
+  - generic [ref=e7]:
+    - complementary [ref=e8]:
+      - generic [ref=e9]:
+        - generic [ref=e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+          - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e22]:
+          - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+          - listitem [ref=e30]:
+            - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e39]:
+            - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=e46]:
+            - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=e53]:
+            - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=e61]:
+            - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=e70]:
+            - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=e78]:
+            - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+          - listitem [ref=e111]:
+            - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=e118]:
+            - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=e125]:
+            - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=e132]:
+            - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=e139]:
+            - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=e146]:
+            - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=e153]:
+            - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=e160]:
+            - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=e169] [cursor=pointer]
+    - generic [ref=e174]:
+      - generic [ref=e175]:
+        - banner [ref=e176]:
+          - button [ref=e177] [cursor=pointer]
+          - button [ref=e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e185]:
+            - list [ref=e186]:
+              - listitem [ref=e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=e192]
+              - listitem [ref=e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+          - generic [ref=e201]:
+            - generic [ref=e203] [cursor=pointer]:
+              - generic [ref=e207]: 鎼滅储
+              - generic [ref=e208]: Ctrl K
+            - button [ref=e210] [cursor=pointer]
+            - button "dark" [ref=e215] [cursor=pointer]
+            - button [ref=e224] [cursor=pointer]
+            - button [ref=e230] [cursor=pointer]
+            - button [ref=e233] [cursor=pointer]
+            - button [ref=e239] [cursor=pointer]:
+              - button [ref=e241]
+            - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=e250] [cursor=pointer]
+        - generic [ref=e257]:
+          - generic [ref=e262]:
+            - generic [ref=e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=e298]:
+            - button [ref=e299] [cursor=pointer]
+            - generic [ref=e306] [cursor=pointer]
+            - generic [ref=e310] [cursor=pointer]
+      - main [ref=e317]:
+        - generic [ref=e322]:
+          - generic [ref=e327]:
+            - generic [ref=e328]:
+              - generic [ref=e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=e337]:
+              - generic [ref=e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+            - generic [ref=e351]:
+              - generic [ref=e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=e360]:
+              - generic [ref=e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=e369]:
+              - generic [ref=e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+            - generic [ref=e383]:
+              - generic [ref=e384]: 鎵规鐘舵��
+              - generic [ref=e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=e393]:
+              - generic [ref=e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e403]:
+                  - img "swap-right" [ref=e404]
+                - textbox "缁撴潫鏃堕棿" [ref=e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e409]:
+              - generic [ref=e410]: 鍒涘缓鏃堕棿
+              - generic [ref=e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e419]:
+                  - img "swap-right" [ref=e420]
+                - textbox "缁撴潫鏃堕棿" [ref=e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e425]:
+              - button "閲� 缃�" [ref=e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+              - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=e437]:
+            - generic [ref=e439]:
+              - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=e444]:
+                - generic [ref=e446]:
+                  - button "鏂板鎵规" [ref=e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+                - button "顫�" [ref=e459] [cursor=pointer]
+              - generic [ref=e461]:
+                - button "瞟�" [ref=e462] [cursor=pointer]
+                - button "顪�" [ref=e464] [cursor=pointer]
+                - button "顦�" [ref=e466] [cursor=pointer]
+            - generic [ref=e470]:
+              - generic [ref=e473]:
+                - generic [ref=e474]:
+                  - table [ref=e478]:
+                    - rowgroup [ref=e493]:
+                      - row [ref=e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=e520]
+                        - columnheader "璐d换浜�" [ref=e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                        - columnheader "鎵规鐘舵��" [ref=e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+                  - generic [ref=e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=e553]:
+                    - table [ref=e556]:
+                      - rowgroup [ref=e571]:
+                        - row [ref=e572]:
+                          - columnheader "鎵规鍙�" [ref=e573]
+                    - generic [ref=e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=e580]:
+                    - table [ref=e583]:
+                      - rowgroup [ref=e598]:
+                        - row [ref=e599]:
+                          - columnheader "鎿嶄綔" [ref=e600]
+                    - generic [ref=e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=e621]:
+              - generic [ref=e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=e625]:
+                  - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+                - generic [ref=e627]: 睿�
+              - button "飱�" [ref=e630]
+              - button "顧�" [ref=e632]
+              - button "顫�" [ref=e634]
+              - button "1" [ref=e637] [cursor=pointer]
+              - button "顫�" [ref=e638]
+              - button "顧�" [ref=e640]
+              - button "顦�" [ref=e642]
+  - dialog [ref=e645]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=e647]
+    - generic [ref=e649]:
+      - generic [ref=e651]:
+        - generic [ref=e652]:
+          - generic [ref=e653]:
+            - generic [ref=e654]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=e661]
+        - generic [ref=e667]:
+          - generic [ref=e668]:
+            - generic [ref=e669]: "*"
+            - text: 浜х嚎
+          - generic [ref=e675]:
+            - combobox "* 浜х嚎" [ref=e677]
+            - generic: 璇烽�夋嫨浜х嚎
+        - generic [ref=e678]:
+          - generic [ref=e679]:
+            - generic [ref=e680]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=e686]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=e687]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=e688]:
+          - generic [ref=e689]: 璁″垝鏁伴噺
+          - generic [ref=e694]:
+            - generic [ref=e695]:
+              - button "Increase Value" [ref=e696] [cursor=pointer]:
+                - img "up" [ref=e697]
+              - button "Decrease Value" [ref=e700] [cursor=pointer]:
+                - img "down" [ref=e701]
+            - spinbutton "璁″垝鏁伴噺" [ref=e705]
+        - generic [ref=e706]:
+          - generic [ref=e707]:
+            - generic [ref=e708]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=e715]
+        - generic [ref=e721]:
+          - generic [ref=e722]: 澶囨敞
+          - textbox "澶囨敞" [ref=e727]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=e728]:
+        - generic [ref=e729]:
+          - generic [ref=e730]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=e731] [cursor=pointer]
+        - generic [ref=e743]:
+          - table [ref=e747]:
+            - rowgroup [ref=e753]:
+              - row [ref=e754]:
+                - columnheader "鐢熶骇浜哄憳" [ref=e755]
+                - columnheader "宀椾綅绫诲瀷" [ref=e760]
+                - columnheader "澶囨敞" [ref=e765]
+                - columnheader "鎿嶄綔" [ref=e770]
+          - table [ref=e806]:
+            - rowgroup [ref=e812]:
+              - row [ref=e813]:
+                - cell [ref=e814]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=e819]
+                - cell [ref=e825]:
+                  - generic [ref=e829] [cursor=pointer]:
+                    - combobox [ref=e831]
+                    - generic: 璇烽�夋嫨宀椾綅绫诲瀷
+                - cell [ref=e832]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=e835]
+                - cell [ref=e836]:
+                  - button "鍒犻櫎" [ref=e842] [cursor=pointer]
+    - button [ref=e786] [cursor=pointer]
+    - generic [ref=e796]:
+      - button "纭� 璁�" [ref=e797] [cursor=pointer]
+      - button "鍙� 娑�" [ref=e800] [cursor=pointer]
+    - button [ref=e802] [cursor=pointer]
+  - dialog "浜哄憳閫夋嫨" [ref=e845]:
+    - document:
+      - generic [ref=e846]:
+        - button "Close" [ref=e847] [cursor=pointer]:
+          - img "close" [ref=e849]
+        - generic [ref=e852]: 浜哄憳閫夋嫨
+        - generic [ref=e855]:
+          - generic [ref=e857]:
+            - textbox "鎼滅储閮ㄩ棬" [ref=e864]
+            - tree [ref=e868]:
+              - generic:
+                - textbox "for screen reader"
+              - generic [ref=e872]:
+                - generic [ref=e873]:
+                  - img "caret-down" [ref=e875] [cursor=pointer]
+                  - generic "鎬诲叕鍙�" [ref=e878] [cursor=pointer]
+                - generic [ref=e879]:
+                  - img "caret-down" [ref=e882] [cursor=pointer]
+                  - generic "娣卞湷鎬诲叕鍙�" [ref=e885] [cursor=pointer]
+                - generic "鐮斿彂閮ㄩ棬" [ref=e889] [cursor=pointer]
+                - generic "甯傚満閮ㄩ棬" [ref=e893] [cursor=pointer]
+                - generic "娴嬭瘯閮ㄩ棬" [ref=e897] [cursor=pointer]
+                - generic "璐㈠姟閮ㄩ棬" [ref=e901] [cursor=pointer]
+                - generic "杩愮淮閮ㄩ棬" [ref=e905] [cursor=pointer]
+                - generic [ref=e906]:
+                  - img "caret-down" [ref=e909] [cursor=pointer]
+                  - generic "闀挎矙鍒嗗叕鍙�" [ref=e912] [cursor=pointer]
+                - generic "甯傚満閮ㄩ棬" [ref=e916] [cursor=pointer]
+                - generic "璐㈠姟閮ㄩ棬" [ref=e920] [cursor=pointer]
+                - generic "鏂伴儴闂�" [ref=e923] [cursor=pointer]
+                - generic "椤剁骇閮ㄩ棬" [ref=e926] [cursor=pointer]
+                - generic "鏌愪釜瀛愰儴闂�" [ref=e929] [cursor=pointer]
+                - generic "鏌愪釜瀛愰儴闂� 2" [ref=e932] [cursor=pointer]
+          - generic [ref=e935]:
+            - generic [ref=e940]:
+              - generic [ref=e941]:
+                - generic [ref=e942]: 鐢ㄦ埛鍚嶇О
+                - textbox "鐢ㄦ埛鍚嶇О" [ref=e948]:
+                  - /placeholder: 璇疯緭鍏ョ敤鎴峰悕绉�
+              - generic [ref=e950]:
+                - generic [ref=e951]: 鐢ㄦ埛鏄电О
+                - textbox "鐢ㄦ埛鏄电О" [ref=e957]:
+                  - /placeholder: 璇疯緭鍏ョ敤鎴锋樀绉�
+              - generic [ref=e959]:
+                - generic [ref=e960]: 鎵嬫満鍙风爜
+                - textbox "鎵嬫満鍙风爜" [ref=e966]:
+                  - /placeholder: 璇疯緭鍏ユ墜鏈哄彿鐮�
+              - generic [ref=e968]:
+                - generic [ref=e969]: 鐘舵��
+                - generic [ref=e975] [cursor=pointer]:
+                  - combobox "鐘舵��" [ref=e977]
+                  - generic "寮�鍚�" [ref=e978]
+              - generic [ref=e983]:
+                - button "閲� 缃�" [ref=e984] [cursor=pointer]
+                - button "鎼� 绱�" [ref=e986] [cursor=pointer]
+                - generic [ref=e988] [cursor=pointer]: 鏀惰捣
+            - generic [ref=e995]:
+              - generic [ref=e997]:
+                - generic [ref=e998]: 鐢ㄦ埛鍒楄〃
+                - button "顫�" [ref=e1003] [cursor=pointer]
+                - generic [ref=e1005]:
+                  - button "瞟�" [ref=e1006] [cursor=pointer]
+                  - button "顪�" [ref=e1008] [cursor=pointer]
+                  - button "顦�" [ref=e1010] [cursor=pointer]
+              - generic [ref=e1018]:
+                - table [ref=e1022]:
+                  - rowgroup [ref=e1030]:
+                    - row "鐢ㄦ埛缂栧彿 鐢ㄦ埛鍚嶇О 鐢ㄦ埛鏄电О 鎵嬫満鍙风爜 鐘舵��" [ref=e1031]:
+                      - columnheader [ref=e1032]
+                      - columnheader "鐢ㄦ埛缂栧彿" [ref=e1035]
+                      - columnheader "鐢ㄦ埛鍚嶇О" [ref=e1040]
+                      - columnheader "鐢ㄦ埛鏄电О" [ref=e1045]
+                      - columnheader "鎵嬫満鍙风爜" [ref=e1050]
+                      - columnheader "鐘舵��" [ref=e1055]
+                - table [ref=e1063]:
+                  - rowgroup [ref=e1071]:
+                    - row [ref=e1601]:
+                      - cell "顫�" [ref=e1602]
+                      - cell "230" [ref=e1078]
+                      - cell "18333333333" [ref=e1082]
+                      - cell "222" [ref=e1086]
+                      - cell "18333333333" [ref=e1090]
+                      - cell "寮�鍚�" [ref=e1094]
+                    - row [ref=e1098]:
+                      - cell "顭�" [ref=e1099]
+                      - cell "229" [ref=e1104]
+                      - cell "15822054764" [ref=e1108]
+                      - cell "鏀惧亣" [ref=e1112]
+                      - cell "15822054764" [ref=e1116]
+                      - cell "寮�鍚�" [ref=e1120]
+                    - row [ref=e1124]:
+                      - cell "顭�" [ref=e1125]
+                      - cell "228" [ref=e1130]
+                      - cell "15822054766" [ref=e1134]
+                      - cell "涓嶆兂涓婄彮" [ref=e1138]
+                      - cell "15822054766" [ref=e1142]
+                      - cell "寮�鍚�" [ref=e1146]
+                    - row [ref=e1150]:
+                      - cell "顭�" [ref=e1151]
+                      - cell "227" [ref=e1156]
+                      - cell "15822054767" [ref=e1160]
+                      - cell "澶ф槑鏄�" [ref=e1164]
+                      - cell "15822054767" [ref=e1168]
+                      - cell "寮�鍚�" [ref=e1172]
+                    - row [ref=e1176]:
+                      - cell "顭�" [ref=e1177]
+                      - cell "226" [ref=e1182]
+                      - cell "15822054763" [ref=e1186]
+                      - cell "鍗冨厠" [ref=e1190]
+                      - cell "15822054763" [ref=e1194]
+                      - cell "寮�鍚�" [ref=e1198]
+                    - row [ref=e1202]:
+                      - cell "顭�" [ref=e1203]
+                      - cell "225" [ref=e1208]
+                      - cell "15822054762" [ref=e1212]
+                      - cell "鍗楃摐瀛�" [ref=e1216]
+                      - cell "15822054762" [ref=e1220]
+                      - cell "寮�鍚�" [ref=e1224]
+                    - row "顭� 144 aoteman001 aoteman00112 鍏抽棴" [ref=e1228]:
+                      - cell "顭�" [ref=e1229]
+                      - cell "144" [ref=e1234]
+                      - cell "aoteman001" [ref=e1238]
+                      - cell "aoteman00112" [ref=e1242]
+                      - cell [ref=e1246]
+                      - cell "鍏抽棴" [ref=e1250]
+                    - row "顭� 143 a00001 a00001 寮�鍚�" [ref=e1254]:
+                      - cell "顭�" [ref=e1255]
+                      - cell "143" [ref=e1260]
+                      - cell "a00001" [ref=e1264]
+                      - cell "a00001" [ref=e1268]
+                      - cell [ref=e1272]
+                      - cell "寮�鍚�" [ref=e1276]
+                    - row [ref=e1280]:
+                      - cell "顭�" [ref=e1281]
+                      - cell "142" [ref=e1286]
+                      - cell "test01" [ref=e1290]
+                      - cell "test01" [ref=e1294]
+                      - cell "19021719925" [ref=e1298]
+                      - cell "寮�鍚�" [ref=e1302]
+                    - row "顭� 141 admin1 鏂扮敤鎴� 寮�鍚�" [ref=e1306]:
+                      - cell "顭�" [ref=e1307]
+                      - cell "141" [ref=e1312]
+                      - cell "admin1" [ref=e1316]
+                      - cell "鏂扮敤鎴�" [ref=e1320]
+                      - cell [ref=e1324]
+                      - cell "寮�鍚�" [ref=e1328]
+                    - row "顭� 139 wwbwwb 灏忕澶� 寮�鍚�" [ref=e1332]:
+                      - cell "顭�" [ref=e1333]
+                      - cell "139" [ref=e1338]
+                      - cell "wwbwwb" [ref=e1342]
+                      - cell "灏忕澶�" [ref=e1346]
+                      - cell [ref=e1350]
+                      - cell "寮�鍚�" [ref=e1354]
+                    - row [ref=e1358]:
+                      - cell "顭�" [ref=e1359]
+                      - cell "118" [ref=e1364]
+                      - cell "goudan" [ref=e1368]
+                      - cell "鐙楄泲" [ref=e1372]
+                      - cell "15601691239" [ref=e1376]
+                      - cell "寮�鍚�" [ref=e1380]
+                    - row [ref=e1384]:
+                      - cell "顭�" [ref=e1385]
+                      - cell "117" [ref=e1390]
+                      - cell "admin123" [ref=e1394]
+                      - cell "娴嬭瘯鍙�02" [ref=e1398]
+                      - cell "15601691234" [ref=e1402]
+                      - cell "寮�鍚�" [ref=e1406]
+                    - row [ref=e1410]:
+                      - cell "顭�" [ref=e1411]
+                      - cell "115" [ref=e1416]
+                      - cell "aotemane" [ref=e1420]
+                      - cell "闃垮憜" [ref=e1424]
+                      - cell "15601691229" [ref=e1428]
+                      - cell "寮�鍚�" [ref=e1432]
+                    - row [ref=e1436]:
+                      - cell "顭�" [ref=e1437]
+                      - cell "114" [ref=e1442]
+                      - cell "hrmgr" [ref=e1446]
+                      - cell "hr 灏忓濮�" [ref=e1450]
+                      - cell "15601691236" [ref=e1454]
+                      - cell "寮�鍚�" [ref=e1458]
+                    - row [ref=e1462]:
+                      - cell "顭�" [ref=e1463]
+                      - cell "113" [ref=e1468]
+                      - cell "aoteman" [ref=e1472]
+                      - cell "绠$悊鍛�1" [ref=e1476]
+                      - cell "15601691300" [ref=e1480]
+                      - cell "寮�鍚�" [ref=e1484]
+                    - row [ref=e1488]:
+                      - cell "顭�" [ref=e1489]
+                      - cell "112" [ref=e1494]
+                      - cell "newobject" [ref=e1498]
+                      - cell "鏂板璞�" [ref=e1502]
+                      - cell "15601691235" [ref=e1506]
+                      - cell "寮�鍚�" [ref=e1510]
+                    - row "顭� 111 test 娴嬭瘯鐢ㄦ埛 寮�鍚�" [ref=e1514]:
+                      - cell "顭�" [ref=e1515]
+                      - cell "111" [ref=e1520]
+                      - cell "test" [ref=e1524]
+                      - cell "娴嬭瘯鐢ㄦ埛" [ref=e1528]
+                      - cell [ref=e1532]
+                      - cell "寮�鍚�" [ref=e1536]
+                    - row [ref=e1540]:
+                      - cell "顭�" [ref=e1541]
+                      - cell "1" [ref=e1546]
+                      - cell "admin" [ref=e1550]
+                      - cell "瓒呯骇绠$悊鍛�" [ref=e1554]
+                      - cell "18818260272" [ref=e1558]
+                      - cell "寮�鍚�" [ref=e1562]
+              - generic [ref=e1573]:
+                - generic [ref=e1574]: 鍏� 19 鏉¤褰�
+                - generic [ref=e1576] [cursor=pointer]:
+                  - generic "20鏉�/椤�" [ref=e1577]:
+                    - textbox "璇烽�夋嫨" [ref=e1578]: 20鏉�/椤�
+                  - generic [ref=e1579]: 睿�
+                - button "飱�" [ref=e1582]
+                - button "顧�" [ref=e1584]
+                - button "顫�" [ref=e1586]
+                - button "1" [ref=e1589] [cursor=pointer]
+                - button "顫�" [ref=e1590]
+                - button "顧�" [ref=e1592]
+                - button "顦�" [ref=e1594]
+        - generic [ref=e1596]:
+          - button "鍙� 娑�" [ref=e1597] [cursor=pointer]
+          - button "纭� 瀹�" [ref=e1599] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-09-41-564Z.yml b/.playwright-mcp/page-2026-08-18T08-09-41-564Z.yml
new file mode 100644
index 0000000..e635484
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-09-41-564Z.yml
@@ -0,0 +1,267 @@
+- generic [ref=e4]:
+  - generic [ref=e7]:
+    - complementary [ref=e8]:
+      - generic [ref=e9]:
+        - generic [ref=e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+          - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e22]:
+          - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+          - listitem [ref=e30]:
+            - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e39]:
+            - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=e46]:
+            - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=e53]:
+            - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=e61]:
+            - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=e70]:
+            - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=e78]:
+            - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+          - listitem [ref=e111]:
+            - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=e118]:
+            - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=e125]:
+            - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=e132]:
+            - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=e139]:
+            - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=e146]:
+            - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=e153]:
+            - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=e160]:
+            - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=e169] [cursor=pointer]
+    - generic [ref=e174]:
+      - generic [ref=e175]:
+        - banner [ref=e176]:
+          - button [ref=e177] [cursor=pointer]
+          - button [ref=e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e185]:
+            - list [ref=e186]:
+              - listitem [ref=e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=e192]
+              - listitem [ref=e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+          - generic [ref=e201]:
+            - generic [ref=e203] [cursor=pointer]:
+              - generic [ref=e207]: 鎼滅储
+              - generic [ref=e208]: Ctrl K
+            - button [ref=e210] [cursor=pointer]
+            - button "dark" [ref=e215] [cursor=pointer]
+            - button [ref=e224] [cursor=pointer]
+            - button [ref=e230] [cursor=pointer]
+            - button [ref=e233] [cursor=pointer]
+            - button [ref=e239] [cursor=pointer]:
+              - button [ref=e241]
+            - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=e250] [cursor=pointer]
+        - generic [ref=e257]:
+          - generic [ref=e262]:
+            - generic [ref=e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=e298]:
+            - button [ref=e299] [cursor=pointer]
+            - generic [ref=e306] [cursor=pointer]
+            - generic [ref=e310] [cursor=pointer]
+      - main [ref=e317]:
+        - generic [ref=e322]:
+          - generic [ref=e327]:
+            - generic [ref=e328]:
+              - generic [ref=e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=e337]:
+              - generic [ref=e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+            - generic [ref=e351]:
+              - generic [ref=e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=e360]:
+              - generic [ref=e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=e369]:
+              - generic [ref=e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+            - generic [ref=e383]:
+              - generic [ref=e384]: 鎵规鐘舵��
+              - generic [ref=e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=e393]:
+              - generic [ref=e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e403]:
+                  - img "swap-right" [ref=e404]
+                - textbox "缁撴潫鏃堕棿" [ref=e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e409]:
+              - generic [ref=e410]: 鍒涘缓鏃堕棿
+              - generic [ref=e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e419]:
+                  - img "swap-right" [ref=e420]
+                - textbox "缁撴潫鏃堕棿" [ref=e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e425]:
+              - button "閲� 缃�" [ref=e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+              - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=e437]:
+            - generic [ref=e439]:
+              - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=e444]:
+                - generic [ref=e446]:
+                  - button "鏂板鎵规" [ref=e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+                - button "顫�" [ref=e459] [cursor=pointer]
+              - generic [ref=e461]:
+                - button "瞟�" [ref=e462] [cursor=pointer]
+                - button "顪�" [ref=e464] [cursor=pointer]
+                - button "顦�" [ref=e466] [cursor=pointer]
+            - generic [ref=e470]:
+              - generic [ref=e473]:
+                - generic [ref=e474]:
+                  - table [ref=e478]:
+                    - rowgroup [ref=e493]:
+                      - row [ref=e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=e520]
+                        - columnheader "璐d换浜�" [ref=e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                        - columnheader "鎵规鐘舵��" [ref=e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+                  - generic [ref=e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=e553]:
+                    - table [ref=e556]:
+                      - rowgroup [ref=e571]:
+                        - row [ref=e572]:
+                          - columnheader "鎵规鍙�" [ref=e573]
+                    - generic [ref=e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=e580]:
+                    - table [ref=e583]:
+                      - rowgroup [ref=e598]:
+                        - row [ref=e599]:
+                          - columnheader "鎿嶄綔" [ref=e600]
+                    - generic [ref=e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=e621]:
+              - generic [ref=e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=e625]:
+                  - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+                - generic [ref=e627]: 睿�
+              - button "飱�" [ref=e630]
+              - button "顧�" [ref=e632]
+              - button "顫�" [ref=e634]
+              - button "1" [ref=e637] [cursor=pointer]
+              - button "顫�" [ref=e638]
+              - button "顧�" [ref=e640]
+              - button "顦�" [ref=e642]
+  - dialog [ref=e645]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=e647]
+    - generic [ref=e649]:
+      - generic [ref=e651]:
+        - generic [ref=e652]:
+          - generic [ref=e653]:
+            - generic [ref=e654]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=e661]
+        - generic [ref=e667]:
+          - generic [ref=e668]:
+            - generic [ref=e669]: "*"
+            - text: 浜х嚎
+          - generic [ref=e675]:
+            - combobox "* 浜х嚎" [ref=e677]
+            - generic: 璇烽�夋嫨浜х嚎
+        - generic [ref=e678]:
+          - generic [ref=e679]:
+            - generic [ref=e680]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=e686]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=e687]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=e688]:
+          - generic [ref=e689]: 璁″垝鏁伴噺
+          - generic [ref=e694]:
+            - generic [ref=e695]:
+              - button "Increase Value" [ref=e696] [cursor=pointer]:
+                - img "up" [ref=e697]
+              - button "Decrease Value" [ref=e700] [cursor=pointer]:
+                - img "down" [ref=e701]
+            - spinbutton "璁″垝鏁伴噺" [ref=e705]
+        - generic [ref=e706]:
+          - generic [ref=e707]:
+            - generic [ref=e708]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=e715]
+        - generic [ref=e721]:
+          - generic [ref=e722]: 澶囨敞
+          - textbox "澶囨敞" [ref=e727]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=e728]:
+        - generic [ref=e729]:
+          - generic [ref=e730]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=e731] [cursor=pointer]
+        - generic [ref=e743]:
+          - table [ref=e747]:
+            - rowgroup [ref=e753]:
+              - row [ref=e754]:
+                - columnheader "鐢熶骇浜哄憳" [ref=e755]
+                - columnheader "宀椾綅绫诲瀷" [ref=e760]
+                - columnheader "澶囨敞" [ref=e765]
+                - columnheader "鎿嶄綔" [ref=e770]
+          - table [ref=e806]:
+            - rowgroup [ref=e812]:
+              - row [ref=e1603]:
+                - cell [ref=e1604]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [active] [ref=e819]: "222"
+                - cell [ref=e825]:
+                  - generic [ref=e829] [cursor=pointer]:
+                    - combobox [ref=e831]
+                    - generic: 璇烽�夋嫨宀椾綅绫诲瀷
+                - cell [ref=e832]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=e835]
+                - cell [ref=e836]:
+                  - button "鍒犻櫎" [ref=e842] [cursor=pointer]
+    - button [ref=e786] [cursor=pointer]
+    - generic [ref=e796]:
+      - button "纭� 璁�" [ref=e797] [cursor=pointer]
+      - button "鍙� 娑�" [ref=e800] [cursor=pointer]
+    - button [ref=e802] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-09-59-674Z.yml b/.playwright-mcp/page-2026-08-18T08-09-59-674Z.yml
new file mode 100644
index 0000000..0046de8
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-09-59-674Z.yml
@@ -0,0 +1,276 @@
+- generic [ref=e4]:
+  - generic [ref=e7]:
+    - complementary [ref=e8]:
+      - generic [ref=e9]:
+        - generic [ref=e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+          - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e22]:
+          - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+          - listitem [ref=e30]:
+            - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e39]:
+            - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=e46]:
+            - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=e53]:
+            - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=e61]:
+            - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=e70]:
+            - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=e78]:
+            - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+          - listitem [ref=e111]:
+            - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=e118]:
+            - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=e125]:
+            - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=e132]:
+            - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=e139]:
+            - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=e146]:
+            - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=e153]:
+            - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=e160]:
+            - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=e169] [cursor=pointer]
+    - generic [ref=e174]:
+      - generic [ref=e175]:
+        - banner [ref=e176]:
+          - button [ref=e177] [cursor=pointer]
+          - button [ref=e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e185]:
+            - list [ref=e186]:
+              - listitem [ref=e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=e192]
+              - listitem [ref=e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+          - generic [ref=e201]:
+            - generic [ref=e203] [cursor=pointer]:
+              - generic [ref=e207]: 鎼滅储
+              - generic [ref=e208]: Ctrl K
+            - button [ref=e210] [cursor=pointer]
+            - button "dark" [ref=e215] [cursor=pointer]
+            - button [ref=e224] [cursor=pointer]
+            - button [ref=e230] [cursor=pointer]
+            - button [ref=e233] [cursor=pointer]
+            - button [ref=e239] [cursor=pointer]:
+              - button [ref=e241]
+            - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=e250] [cursor=pointer]
+        - generic [ref=e257]:
+          - generic [ref=e262]:
+            - generic [ref=e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=e298]:
+            - button [ref=e299] [cursor=pointer]
+            - generic [ref=e306] [cursor=pointer]
+            - generic [ref=e310] [cursor=pointer]
+      - main [ref=e317]:
+        - generic [ref=e322]:
+          - generic [ref=e327]:
+            - generic [ref=e328]:
+              - generic [ref=e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=e337]:
+              - generic [ref=e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+            - generic [ref=e351]:
+              - generic [ref=e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=e360]:
+              - generic [ref=e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=e369]:
+              - generic [ref=e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+            - generic [ref=e383]:
+              - generic [ref=e384]: 鎵规鐘舵��
+              - generic [ref=e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=e393]:
+              - generic [ref=e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e403]:
+                  - img "swap-right" [ref=e404]
+                - textbox "缁撴潫鏃堕棿" [ref=e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e409]:
+              - generic [ref=e410]: 鍒涘缓鏃堕棿
+              - generic [ref=e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e419]:
+                  - img "swap-right" [ref=e420]
+                - textbox "缁撴潫鏃堕棿" [ref=e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e425]:
+              - button "閲� 缃�" [ref=e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+              - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=e437]:
+            - generic [ref=e439]:
+              - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=e444]:
+                - generic [ref=e446]:
+                  - button "鏂板鎵规" [ref=e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+                - button "顫�" [ref=e459] [cursor=pointer]
+              - generic [ref=e461]:
+                - button "瞟�" [ref=e462] [cursor=pointer]
+                - button "顪�" [ref=e464] [cursor=pointer]
+                - button "顦�" [ref=e466] [cursor=pointer]
+            - generic [ref=e470]:
+              - generic [ref=e473]:
+                - generic [ref=e474]:
+                  - table [ref=e478]:
+                    - rowgroup [ref=e493]:
+                      - row [ref=e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=e520]
+                        - columnheader "璐d换浜�" [ref=e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                        - columnheader "鎵规鐘舵��" [ref=e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+                  - generic [ref=e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=e553]:
+                    - table [ref=e556]:
+                      - rowgroup [ref=e571]:
+                        - row [ref=e572]:
+                          - columnheader "鎵规鍙�" [ref=e573]
+                    - generic [ref=e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=e580]:
+                    - table [ref=e583]:
+                      - rowgroup [ref=e598]:
+                        - row [ref=e599]:
+                          - columnheader "鎿嶄綔" [ref=e600]
+                    - generic [ref=e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=e621]:
+              - generic [ref=e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=e625]:
+                  - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+                - generic [ref=e627]: 睿�
+              - button "飱�" [ref=e630]
+              - button "顧�" [ref=e632]
+              - button "顫�" [ref=e634]
+              - button "1" [ref=e637] [cursor=pointer]
+              - button "顫�" [ref=e638]
+              - button "顧�" [ref=e640]
+              - button "顦�" [ref=e642]
+  - dialog [ref=e645]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=e647]
+    - generic [ref=e649]:
+      - generic [ref=e651]:
+        - generic [ref=e652]:
+          - generic [ref=e653]:
+            - generic [ref=e654]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=e661]
+        - generic [ref=e667]:
+          - generic [ref=e668]:
+            - generic [ref=e669]: "*"
+            - text: 浜х嚎
+          - generic [ref=e675]:
+            - combobox "* 浜х嚎" [ref=e677]
+            - generic: 璇烽�夋嫨浜х嚎
+        - generic [ref=e678]:
+          - generic [ref=e679]:
+            - generic [ref=e680]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=e686]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=e687]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=e688]:
+          - generic [ref=e689]: 璁″垝鏁伴噺
+          - generic [ref=e694]:
+            - generic [ref=e695]:
+              - button "Increase Value" [ref=e696] [cursor=pointer]:
+                - img "up" [ref=e697]
+              - button "Decrease Value" [ref=e700] [cursor=pointer]:
+                - img "down" [ref=e701]
+            - spinbutton "璁″垝鏁伴噺" [ref=e705]
+        - generic [ref=e706]:
+          - generic [ref=e707]:
+            - generic [ref=e708]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=e715]
+        - generic [ref=e721]:
+          - generic [ref=e722]: 澶囨敞
+          - textbox "澶囨敞" [ref=e727]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=e728]:
+        - generic [ref=e729]:
+          - generic [ref=e730]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=e731] [cursor=pointer]
+        - generic [ref=e743]:
+          - table [ref=e747]:
+            - rowgroup [ref=e753]:
+              - row [ref=e754]:
+                - columnheader "鐢熶骇浜哄憳" [ref=e755]
+                - columnheader "宀椾綅绫诲瀷" [ref=e760]
+                - columnheader "澶囨敞" [ref=e765]
+                - columnheader "鎿嶄綔" [ref=e770]
+          - table [ref=e806]:
+            - rowgroup [ref=e812]:
+              - row [ref=e1603]:
+                - cell [ref=e1604]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=e819]: "222"
+                - cell [ref=e825]:
+                  - generic [ref=e829] [cursor=pointer]:
+                    - combobox [expanded] [active] [ref=e831]:
+                      - listbox:
+                        - option "缁勯暱": "10"
+                        - option "鎿嶄綔宸�": "20"
+                    - generic: 璇烽�夋嫨宀椾綅绫诲瀷
+                - cell [ref=e832]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=e835]
+                - cell [ref=e836]:
+                  - button "鍒犻櫎" [ref=e842] [cursor=pointer]
+    - button [ref=e786] [cursor=pointer]
+    - generic [ref=e796]:
+      - button "纭� 璁�" [ref=e797] [cursor=pointer]
+      - button "鍙� 娑�" [ref=e800] [cursor=pointer]
+    - button [ref=e802] [cursor=pointer]
+  - generic [ref=e1610]:
+    - generic "缁勯暱" [ref=e1611] [cursor=pointer]
+    - generic "鎿嶄綔宸�" [ref=e1613] [cursor=pointer]
+    - generic "鍖呰宸�" [ref=e1615] [cursor=pointer]
+    - generic "璐ㄦ鍛�" [ref=e1617] [cursor=pointer]
+    - generic "鍏朵粬" [ref=e1619] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-10-25-770Z.yml b/.playwright-mcp/page-2026-08-18T08-10-25-770Z.yml
new file mode 100644
index 0000000..dfa23f0
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-10-25-770Z.yml
@@ -0,0 +1,269 @@
+- generic [ref=e4]:
+  - generic [ref=e7]:
+    - complementary [ref=e8]:
+      - generic [ref=e9]:
+        - generic [ref=e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+          - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e22]:
+          - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+          - listitem [ref=e30]:
+            - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e39]:
+            - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=e46]:
+            - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=e53]:
+            - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=e61]:
+            - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=e70]:
+            - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=e78]:
+            - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+          - listitem [ref=e111]:
+            - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=e118]:
+            - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=e125]:
+            - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=e132]:
+            - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=e139]:
+            - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=e146]:
+            - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=e153]:
+            - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=e160]:
+            - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=e169] [cursor=pointer]
+    - generic [ref=e174]:
+      - generic [ref=e175]:
+        - banner [ref=e176]:
+          - button [ref=e177] [cursor=pointer]
+          - button [ref=e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e185]:
+            - list [ref=e186]:
+              - listitem [ref=e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=e192]
+              - listitem [ref=e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+          - generic [ref=e201]:
+            - generic [ref=e203] [cursor=pointer]:
+              - generic [ref=e207]: 鎼滅储
+              - generic [ref=e208]: Ctrl K
+            - button [ref=e210] [cursor=pointer]
+            - button "dark" [ref=e215] [cursor=pointer]
+            - button [ref=e224] [cursor=pointer]
+            - button [ref=e230] [cursor=pointer]
+            - button [ref=e233] [cursor=pointer]
+            - button [ref=e239] [cursor=pointer]:
+              - button [ref=e241]
+            - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=e250] [cursor=pointer]
+        - generic [ref=e257]:
+          - generic [ref=e262]:
+            - generic [ref=e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=e298]:
+            - button [ref=e299] [cursor=pointer]
+            - generic [ref=e306] [cursor=pointer]
+            - generic [ref=e310] [cursor=pointer]
+      - main [ref=e317]:
+        - generic [ref=e322]:
+          - generic [ref=e327]:
+            - generic [ref=e328]:
+              - generic [ref=e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=e337]:
+              - generic [ref=e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+            - generic [ref=e351]:
+              - generic [ref=e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=e360]:
+              - generic [ref=e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=e369]:
+              - generic [ref=e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+            - generic [ref=e383]:
+              - generic [ref=e384]: 鎵规鐘舵��
+              - generic [ref=e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=e393]:
+              - generic [ref=e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e403]:
+                  - img "swap-right" [ref=e404]
+                - textbox "缁撴潫鏃堕棿" [ref=e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e409]:
+              - generic [ref=e410]: 鍒涘缓鏃堕棿
+              - generic [ref=e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e419]:
+                  - img "swap-right" [ref=e420]
+                - textbox "缁撴潫鏃堕棿" [ref=e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e425]:
+              - button "閲� 缃�" [ref=e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+              - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=e437]:
+            - generic [ref=e439]:
+              - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=e444]:
+                - generic [ref=e446]:
+                  - button "鏂板鎵规" [ref=e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+                - button "顫�" [ref=e459] [cursor=pointer]
+              - generic [ref=e461]:
+                - button "瞟�" [ref=e462] [cursor=pointer]
+                - button "顪�" [ref=e464] [cursor=pointer]
+                - button "顦�" [ref=e466] [cursor=pointer]
+            - generic [ref=e470]:
+              - generic [ref=e473]:
+                - generic [ref=e474]:
+                  - table [ref=e478]:
+                    - rowgroup [ref=e493]:
+                      - row [ref=e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=e520]
+                        - columnheader "璐d换浜�" [ref=e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                        - columnheader "鎵规鐘舵��" [ref=e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+                  - generic [ref=e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=e553]:
+                    - table [ref=e556]:
+                      - rowgroup [ref=e571]:
+                        - row [ref=e572]:
+                          - columnheader "鎵规鍙�" [ref=e573]
+                    - generic [ref=e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=e580]:
+                    - table [ref=e583]:
+                      - rowgroup [ref=e598]:
+                        - row [ref=e599]:
+                          - columnheader "鎿嶄綔" [ref=e600]
+                    - generic [ref=e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=e621]:
+              - generic [ref=e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=e625]:
+                  - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+                - generic [ref=e627]: 睿�
+              - button "飱�" [ref=e630]
+              - button "顧�" [ref=e632]
+              - button "顫�" [ref=e634]
+              - button "1" [ref=e637] [cursor=pointer]
+              - button "顫�" [ref=e638]
+              - button "顧�" [ref=e640]
+              - button "顦�" [ref=e642]
+  - dialog [ref=e645]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=e647]
+    - generic [ref=e649]:
+      - generic [ref=e651]:
+        - generic [ref=e652]:
+          - generic [ref=e653]:
+            - generic [ref=e654]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=e661]
+        - generic [ref=e667]:
+          - generic [ref=e668]:
+            - generic [ref=e669]: "*"
+            - text: 浜х嚎
+          - generic [ref=e675]:
+            - combobox "* 浜х嚎" [ref=e677]
+            - generic: 璇烽�夋嫨浜х嚎
+        - generic [ref=e678]:
+          - generic [ref=e679]:
+            - generic [ref=e680]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=e686]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=e687]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=e688]:
+          - generic [ref=e689]: 璁″垝鏁伴噺
+          - generic [ref=e694]:
+            - generic [ref=e695]:
+              - button "Increase Value" [ref=e696] [cursor=pointer]:
+                - img "up" [ref=e697]
+              - button "Decrease Value" [ref=e700] [cursor=pointer]:
+                - img "down" [ref=e701]
+            - spinbutton "璁″垝鏁伴噺" [ref=e705]
+        - generic [ref=e706]:
+          - generic [ref=e707]:
+            - generic [ref=e708]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=e715]
+        - generic [ref=e721]:
+          - generic [ref=e722]: 澶囨敞
+          - textbox "澶囨敞" [ref=e727]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=e728]:
+        - generic [ref=e729]:
+          - generic [ref=e730]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=e731] [cursor=pointer]
+        - generic [ref=e743]:
+          - table [ref=e747]:
+            - rowgroup [ref=e753]:
+              - row [ref=e754]:
+                - columnheader "鐢熶骇浜哄憳" [ref=e755]
+                - columnheader "宀椾綅绫诲瀷" [ref=e760]
+                - columnheader "澶囨敞" [ref=e765]
+                - columnheader "鎿嶄綔" [ref=e770]
+          - table [ref=e806]:
+            - rowgroup [ref=e812]:
+              - row [ref=e1621]:
+                - cell [ref=e1604]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=e819]: "222"
+                - cell "缁勯暱 缁勯暱" [ref=e1622]:
+                  - generic [ref=e828] [cursor=pointer]:
+                    - generic: 缁勯暱
+                    - generic [ref=e829]:
+                      - combobox [active] [ref=e831]
+                      - generic "缁勯暱" [ref=e1623]
+                - cell [ref=e832]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=e835]
+                - cell [ref=e836]:
+                  - button "鍒犻櫎" [ref=e842] [cursor=pointer]
+    - button [ref=e786] [cursor=pointer]
+    - generic [ref=e796]:
+      - button "纭� 璁�" [ref=e797] [cursor=pointer]
+      - button "鍙� 娑�" [ref=e800] [cursor=pointer]
+    - button [ref=e802] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-10-38-848Z.yml b/.playwright-mcp/page-2026-08-18T08-10-38-848Z.yml
new file mode 100644
index 0000000..d2f8047
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-10-38-848Z.yml
@@ -0,0 +1,399 @@
+- generic [ref=e4]:
+  - generic [ref=e7]:
+    - complementary [ref=e8]:
+      - generic [ref=e9]:
+        - generic [ref=e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+          - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e22]:
+          - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+          - listitem [ref=e30]:
+            - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e39]:
+            - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=e46]:
+            - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=e53]:
+            - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=e61]:
+            - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=e70]:
+            - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=e78]:
+            - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+          - listitem [ref=e111]:
+            - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=e118]:
+            - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=e125]:
+            - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=e132]:
+            - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=e139]:
+            - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=e146]:
+            - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=e153]:
+            - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=e160]:
+            - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=e169] [cursor=pointer]
+    - generic [ref=e174]:
+      - generic [ref=e175]:
+        - banner [ref=e176]:
+          - button [ref=e177] [cursor=pointer]
+          - button [ref=e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e185]:
+            - list [ref=e186]:
+              - listitem [ref=e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=e192]
+              - listitem [ref=e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+          - generic [ref=e201]:
+            - generic [ref=e203] [cursor=pointer]:
+              - generic [ref=e207]: 鎼滅储
+              - generic [ref=e208]: Ctrl K
+            - button [ref=e210] [cursor=pointer]
+            - button "dark" [ref=e215] [cursor=pointer]
+            - button [ref=e224] [cursor=pointer]
+            - button [ref=e230] [cursor=pointer]
+            - button [ref=e233] [cursor=pointer]
+            - button [ref=e239] [cursor=pointer]:
+              - button [ref=e241]
+            - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=e250] [cursor=pointer]
+        - generic [ref=e257]:
+          - generic [ref=e262]:
+            - generic [ref=e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=e298]:
+            - button [ref=e299] [cursor=pointer]
+            - generic [ref=e306] [cursor=pointer]
+            - generic [ref=e310] [cursor=pointer]
+      - main [ref=e317]:
+        - generic [ref=e322]:
+          - generic [ref=e327]:
+            - generic [ref=e328]:
+              - generic [ref=e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=e337]:
+              - generic [ref=e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+            - generic [ref=e351]:
+              - generic [ref=e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=e360]:
+              - generic [ref=e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=e369]:
+              - generic [ref=e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+            - generic [ref=e383]:
+              - generic [ref=e384]: 鎵规鐘舵��
+              - generic [ref=e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=e393]:
+              - generic [ref=e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e403]:
+                  - img "swap-right" [ref=e404]
+                - textbox "缁撴潫鏃堕棿" [ref=e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e409]:
+              - generic [ref=e410]: 鍒涘缓鏃堕棿
+              - generic [ref=e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e419]:
+                  - img "swap-right" [ref=e420]
+                - textbox "缁撴潫鏃堕棿" [ref=e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e425]:
+              - button "閲� 缃�" [ref=e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+              - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=e437]:
+            - generic [ref=e439]:
+              - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=e444]:
+                - generic [ref=e446]:
+                  - button "鏂板鎵规" [ref=e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+                - button "顫�" [ref=e459] [cursor=pointer]
+              - generic [ref=e461]:
+                - button "瞟�" [ref=e462] [cursor=pointer]
+                - button "顪�" [ref=e464] [cursor=pointer]
+                - button "顦�" [ref=e466] [cursor=pointer]
+            - generic [ref=e470]:
+              - generic [ref=e473]:
+                - generic [ref=e474]:
+                  - table [ref=e478]:
+                    - rowgroup [ref=e493]:
+                      - row [ref=e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=e520]
+                        - columnheader "璐d换浜�" [ref=e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                        - columnheader "鎵规鐘舵��" [ref=e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+                  - generic [ref=e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=e553]:
+                    - table [ref=e556]:
+                      - rowgroup [ref=e571]:
+                        - row [ref=e572]:
+                          - columnheader "鎵规鍙�" [ref=e573]
+                    - generic [ref=e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=e580]:
+                    - table [ref=e583]:
+                      - rowgroup [ref=e598]:
+                        - row [ref=e599]:
+                          - columnheader "鎿嶄綔" [ref=e600]
+                    - generic [ref=e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=e621]:
+              - generic [ref=e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=e625]:
+                  - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+                - generic [ref=e627]: 睿�
+              - button "飱�" [ref=e630]
+              - button "顧�" [ref=e632]
+              - button "顫�" [ref=e634]
+              - button "1" [ref=e637] [cursor=pointer]
+              - button "顫�" [ref=e638]
+              - button "顧�" [ref=e640]
+              - button "顦�" [ref=e642]
+  - dialog [ref=e645]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=e647]
+    - generic [ref=e649]:
+      - generic [ref=e651]:
+        - generic [ref=e652]:
+          - generic [ref=e653]:
+            - generic [ref=e654]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=e661]
+        - generic [ref=e667]:
+          - generic [ref=e668]:
+            - generic [ref=e669]: "*"
+            - text: 浜х嚎
+          - generic [ref=e675]:
+            - combobox "* 浜х嚎" [ref=e677]
+            - generic: 璇烽�夋嫨浜х嚎
+        - generic [ref=e678]:
+          - generic [ref=e679]:
+            - generic [ref=e680]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=e686]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=e687]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=e688]:
+          - generic [ref=e689]: 璁″垝鏁伴噺
+          - generic [ref=e694]:
+            - generic [ref=e695]:
+              - button "Increase Value" [ref=e696] [cursor=pointer]:
+                - img "up" [ref=e697]
+              - button "Decrease Value" [ref=e700] [cursor=pointer]:
+                - img "down" [ref=e701]
+            - spinbutton "璁″垝鏁伴噺" [ref=e705]
+        - generic [ref=e706]:
+          - generic [ref=e707]:
+            - generic [ref=e708]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=e715]
+        - generic [ref=e721]:
+          - generic [ref=e722]: 澶囨敞
+          - textbox "澶囨敞" [ref=e727]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=e728]:
+        - generic [ref=e729]:
+          - generic [ref=e730]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=e731] [cursor=pointer]
+        - generic [ref=e743]:
+          - table [ref=e747]:
+            - rowgroup [ref=e753]:
+              - row [ref=e754]:
+                - columnheader "鐢熶骇浜哄憳" [ref=e755]
+                - columnheader "宀椾綅绫诲瀷" [ref=e760]
+                - columnheader "澶囨敞" [ref=e765]
+                - columnheader "鎿嶄綔" [ref=e770]
+          - table [ref=e806]:
+            - rowgroup [ref=e812]:
+              - row [ref=e1624]:
+                - cell [ref=e1604]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=e819]: "222"
+                - cell "缁勯暱" [ref=e1625]:
+                  - generic [ref=e829] [cursor=pointer]:
+                    - combobox [ref=e831]
+                    - generic "缁勯暱" [ref=e1623]
+                - cell [ref=e832]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=e835]
+                - cell [ref=e836]:
+                  - button "鍒犻櫎" [ref=e842] [cursor=pointer]
+    - button [ref=e786] [cursor=pointer]
+    - generic [ref=e796]:
+      - button "纭� 璁�" [ref=e797] [cursor=pointer]
+      - button "鍙� 娑�" [ref=e800] [cursor=pointer]
+    - button [ref=e802] [cursor=pointer]
+  - dialog "鐗╂枡浜у搧閫夋嫨" [ref=e1627]:
+    - document:
+      - generic [ref=e1628]:
+        - button "Close" [ref=e1629] [cursor=pointer]:
+          - img "close" [ref=e1631]
+        - generic [ref=e1634]: 鐗╂枡浜у搧閫夋嫨
+        - generic [ref=e1637]:
+          - generic [ref=e1640]:
+            - textbox "鎼滅储鍒嗙被" [ref=e1647]
+            - tree [ref=e1651]:
+              - generic:
+                - textbox "for screen reader"
+              - generic [ref=e1655]:
+                - generic "鍘熸潗鏂�" [ref=e1658] [cursor=pointer]
+                - generic "鍗婃垚鍝�" [ref=e1661] [cursor=pointer]
+                - generic [ref=e1662]:
+                  - img "caret-down" [ref=e1664] [cursor=pointer]
+                  - generic "鎴愬搧" [ref=e1667] [cursor=pointer]
+                - generic [ref=e1668]:
+                  - img "caret-down" [ref=e1671] [cursor=pointer]
+                  - generic "1" [ref=e1674] [cursor=pointer]
+                - generic [ref=e1675]:
+                  - img "caret-down" [ref=e1678] [cursor=pointer]
+                  - generic "2" [ref=e1681] [cursor=pointer]
+                - generic "33" [ref=e1685] [cursor=pointer]
+                - generic "杈呮枡" [ref=e1688] [cursor=pointer]
+          - generic [ref=e1691]:
+            - generic [ref=e1696]:
+              - generic [ref=e1697]:
+                - generic [ref=e1698]: 鐗╂枡缂栫爜
+                - textbox "鐗╂枡缂栫爜" [ref=e1704]:
+                  - /placeholder: 璇疯緭鍏ョ墿鏂欑紪鐮�
+              - generic [ref=e1706]:
+                - generic [ref=e1707]: 鐗╂枡鍚嶇О
+                - textbox "鐗╂枡鍚嶇О" [ref=e1713]:
+                  - /placeholder: 璇疯緭鍏ョ墿鏂欏悕绉�
+              - generic [ref=e1715]:
+                - button "閲� 缃�" [ref=e1716] [cursor=pointer]
+                - button "鎼� 绱�" [ref=e1718] [cursor=pointer]
+                - generic [ref=e1720] [cursor=pointer]: 鏀惰捣
+            - generic [ref=e1727]:
+              - generic [ref=e1729]:
+                - generic [ref=e1730]: 鐗╂枡浜у搧鍒楄〃
+                - button "顫�" [ref=e1735] [cursor=pointer]
+                - generic [ref=e1737]:
+                  - button "瞟�" [ref=e1738] [cursor=pointer]
+                  - button "顪�" [ref=e1740] [cursor=pointer]
+                  - button "顦�" [ref=e1742] [cursor=pointer]
+              - generic [ref=e1750]:
+                - table [ref=e1754]:
+                  - rowgroup [ref=e1764]:
+                    - row "鐗╂枡缂栫爜 鐗╂枡鍚嶇О 瑙勬牸鍨嬪彿 鍗曚綅 鐗╂枡/浜у搧 鎵�灞炲垎绫� 鍒涘缓鏃堕棿" [ref=e1765]:
+                      - columnheader [ref=e1766]
+                      - columnheader "鐗╂枡缂栫爜" [ref=e1769]
+                      - columnheader "鐗╂枡鍚嶇О" [ref=e1774]
+                      - columnheader "瑙勬牸鍨嬪彿" [ref=e1779]
+                      - columnheader "鍗曚綅" [ref=e1784]
+                      - columnheader "鐗╂枡/浜у搧" [ref=e1789]
+                      - columnheader "鎵�灞炲垎绫�" [ref=e1794]
+                      - columnheader "鍒涘缓鏃堕棿" [ref=e1799]
+                - table [ref=e1807]:
+                  - rowgroup [ref=e1817]:
+                    - row [ref=e1818]:
+                      - cell "顭�" [ref=e1819]
+                      - cell "ITEM_20260729001" [ref=e1824]
+                      - cell "閾濆悎瀵间綋" [ref=e1828]
+                      - cell "LH8030JY-10" [ref=e1832]
+                      - cell "鍗冪背" [ref=e1836]
+                      - cell "鐗╂枡" [ref=e1840]
+                      - cell "33" [ref=e1844]
+                      - cell "2026-07-29 14:19:03" [ref=e1848]
+                    - row [ref=e1852]:
+                      - cell "顭�" [ref=e1853]
+                      - cell "ITEM_20260720001" [ref=e1858]
+                      - cell "闇�瑕佺敓浜х殑鎴愬搧11" [ref=e1862]
+                      - cell "涓�" [ref=e1866]
+                      - cell "鍗冨厠" [ref=e1870]
+                      - cell "浜у搧" [ref=e1874]
+                      - cell "鎴愬搧" [ref=e1878]
+                      - cell "2026-07-20 09:17:13" [ref=e1882]
+                    - row [ref=e1886]:
+                      - cell "顭�" [ref=e1887]
+                      - cell "ITEM_20260716008" [ref=e1892]
+                      - cell "闀�閿岄挗绾�" [ref=e1896]
+                      - cell "JG3A-1*1.5" [ref=e1900]
+                      - cell "鍗冨厠" [ref=e1904]
+                      - cell "鐗╂枡" [ref=e1908]
+                      - cell "鍘熸潗鏂�" [ref=e1912]
+                      - cell "2026-07-16 16:51:57" [ref=e1916]
+                    - row [ref=e1920]:
+                      - cell "顭�" [ref=e1921]
+                      - cell "ITEM_20260716006" [ref=e1926]
+                      - cell "閽㈣姱閾濈粸绾�" [ref=e1930]
+                      - cell "JL/L1-40/10-6/1" [ref=e1934]
+                      - cell "鍗冨厠" [ref=e1938]
+                      - cell "浜у搧" [ref=e1942]
+                      - cell "鎴愬搧" [ref=e1946]
+                      - cell "2026-07-16 16:48:49" [ref=e1950]
+                    - row [ref=e1954]:
+                      - cell "顭�" [ref=e1955]
+                      - cell "ITEM_20260716005" [ref=e1960]
+                      - cell "閾濆崟绾�" [ref=e1964]
+                      - cell "L-1.72" [ref=e1968]
+                      - cell "鍗冨厠" [ref=e1972]
+                      - cell "鐗╂枡" [ref=e1976]
+                      - cell "鍗婃垚鍝�" [ref=e1980]
+                      - cell "2026-07-16 16:48:03" [ref=e1984]
+                    - row [ref=e1988]:
+                      - cell "顭�" [ref=e1989]
+                      - cell "ITEM_20260716004" [ref=e1994]
+                      - cell "閾濇潌" [ref=e1998]
+                      - cell "1A60" [ref=e2002]
+                      - cell "鍗冨厠" [ref=e2006]
+                      - cell "鐗╂枡" [ref=e2010]
+                      - cell "鍘熸潗鏂�" [ref=e2014]
+                      - cell "2026-07-16 16:45:13" [ref=e2018]
+              - generic [ref=e2028]:
+                - generic [ref=e2029]: 鍏� 6 鏉¤褰�
+                - generic [ref=e2031] [cursor=pointer]:
+                  - generic "20鏉�/椤�" [ref=e2032]:
+                    - textbox "璇烽�夋嫨" [ref=e2033]: 20鏉�/椤�
+                  - generic [ref=e2034]: 睿�
+                - button "飱�" [ref=e2037]
+                - button "顧�" [ref=e2039]
+                - button "顫�" [ref=e2041]
+                - button "1" [ref=e2044] [cursor=pointer]
+                - button "顫�" [ref=e2045]
+                - button "顧�" [ref=e2047]
+                - button "顦�" [ref=e2049]
+        - generic [ref=e2051]:
+          - button "鍙� 娑�" [ref=e2052] [cursor=pointer]
+          - button "纭� 瀹�" [ref=e2054] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-11-23-345Z.yml b/.playwright-mcp/page-2026-08-18T08-11-23-345Z.yml
new file mode 100644
index 0000000..4cbac42
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-11-23-345Z.yml
@@ -0,0 +1,399 @@
+- generic [ref=e4]:
+  - generic [ref=e7]:
+    - complementary [ref=e8]:
+      - generic [ref=e9]:
+        - generic [ref=e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+          - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e22]:
+          - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+          - listitem [ref=e30]:
+            - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e39]:
+            - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=e46]:
+            - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=e53]:
+            - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=e61]:
+            - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=e70]:
+            - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=e78]:
+            - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+          - listitem [ref=e111]:
+            - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=e118]:
+            - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=e125]:
+            - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=e132]:
+            - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=e139]:
+            - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=e146]:
+            - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=e153]:
+            - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=e160]:
+            - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=e169] [cursor=pointer]
+    - generic [ref=e174]:
+      - generic [ref=e175]:
+        - banner [ref=e176]:
+          - button [ref=e177] [cursor=pointer]
+          - button [ref=e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e185]:
+            - list [ref=e186]:
+              - listitem [ref=e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=e192]
+              - listitem [ref=e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+          - generic [ref=e201]:
+            - generic [ref=e203] [cursor=pointer]:
+              - generic [ref=e207]: 鎼滅储
+              - generic [ref=e208]: Ctrl K
+            - button [ref=e210] [cursor=pointer]
+            - button "dark" [ref=e215] [cursor=pointer]
+            - button [ref=e224] [cursor=pointer]
+            - button [ref=e230] [cursor=pointer]
+            - button [ref=e233] [cursor=pointer]
+            - button [ref=e239] [cursor=pointer]:
+              - button [ref=e241]
+            - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=e250] [cursor=pointer]
+        - generic [ref=e257]:
+          - generic [ref=e262]:
+            - generic [ref=e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=e298]:
+            - button [ref=e299] [cursor=pointer]
+            - generic [ref=e306] [cursor=pointer]
+            - generic [ref=e310] [cursor=pointer]
+      - main [ref=e317]:
+        - generic [ref=e322]:
+          - generic [ref=e327]:
+            - generic [ref=e328]:
+              - generic [ref=e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=e337]:
+              - generic [ref=e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+            - generic [ref=e351]:
+              - generic [ref=e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=e360]:
+              - generic [ref=e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=e369]:
+              - generic [ref=e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+            - generic [ref=e383]:
+              - generic [ref=e384]: 鎵规鐘舵��
+              - generic [ref=e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=e393]:
+              - generic [ref=e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e403]:
+                  - img "swap-right" [ref=e404]
+                - textbox "缁撴潫鏃堕棿" [ref=e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e409]:
+              - generic [ref=e410]: 鍒涘缓鏃堕棿
+              - generic [ref=e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e419]:
+                  - img "swap-right" [ref=e420]
+                - textbox "缁撴潫鏃堕棿" [ref=e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e425]:
+              - button "閲� 缃�" [ref=e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+              - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=e437]:
+            - generic [ref=e439]:
+              - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=e444]:
+                - generic [ref=e446]:
+                  - button "鏂板鎵规" [ref=e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+                - button "顫�" [ref=e459] [cursor=pointer]
+              - generic [ref=e461]:
+                - button "瞟�" [ref=e462] [cursor=pointer]
+                - button "顪�" [ref=e464] [cursor=pointer]
+                - button "顦�" [ref=e466] [cursor=pointer]
+            - generic [ref=e470]:
+              - generic [ref=e473]:
+                - generic [ref=e474]:
+                  - table [ref=e478]:
+                    - rowgroup [ref=e493]:
+                      - row [ref=e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=e520]
+                        - columnheader "璐d换浜�" [ref=e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                        - columnheader "鎵规鐘舵��" [ref=e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+                  - generic [ref=e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=e553]:
+                    - table [ref=e556]:
+                      - rowgroup [ref=e571]:
+                        - row [ref=e572]:
+                          - columnheader "鎵规鍙�" [ref=e573]
+                    - generic [ref=e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=e580]:
+                    - table [ref=e583]:
+                      - rowgroup [ref=e598]:
+                        - row [ref=e599]:
+                          - columnheader "鎿嶄綔" [ref=e600]
+                    - generic [ref=e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=e621]:
+              - generic [ref=e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=e625]:
+                  - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+                - generic [ref=e627]: 睿�
+              - button "飱�" [ref=e630]
+              - button "顧�" [ref=e632]
+              - button "顫�" [ref=e634]
+              - button "1" [ref=e637] [cursor=pointer]
+              - button "顫�" [ref=e638]
+              - button "顧�" [ref=e640]
+              - button "顦�" [ref=e642]
+  - dialog [ref=e645]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=e647]
+    - generic [ref=e649]:
+      - generic [ref=e651]:
+        - generic [ref=e652]:
+          - generic [ref=e653]:
+            - generic [ref=e654]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=e661]
+        - generic [ref=e667]:
+          - generic [ref=e668]:
+            - generic [ref=e669]: "*"
+            - text: 浜х嚎
+          - generic [ref=e675]:
+            - combobox "* 浜х嚎" [ref=e677]
+            - generic: 璇烽�夋嫨浜х嚎
+        - generic [ref=e678]:
+          - generic [ref=e679]:
+            - generic [ref=e680]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=e686]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=e687]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=e688]:
+          - generic [ref=e689]: 璁″垝鏁伴噺
+          - generic [ref=e694]:
+            - generic [ref=e695]:
+              - button "Increase Value" [ref=e696] [cursor=pointer]:
+                - img "up" [ref=e697]
+              - button "Decrease Value" [ref=e700] [cursor=pointer]:
+                - img "down" [ref=e701]
+            - spinbutton "璁″垝鏁伴噺" [ref=e705]
+        - generic [ref=e706]:
+          - generic [ref=e707]:
+            - generic [ref=e708]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=e715]
+        - generic [ref=e721]:
+          - generic [ref=e722]: 澶囨敞
+          - textbox "澶囨敞" [ref=e727]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=e728]:
+        - generic [ref=e729]:
+          - generic [ref=e730]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=e731] [cursor=pointer]
+        - generic [ref=e743]:
+          - table [ref=e747]:
+            - rowgroup [ref=e753]:
+              - row [ref=e754]:
+                - columnheader "鐢熶骇浜哄憳" [ref=e755]
+                - columnheader "宀椾綅绫诲瀷" [ref=e760]
+                - columnheader "澶囨敞" [ref=e765]
+                - columnheader "鎿嶄綔" [ref=e770]
+          - table [ref=e806]:
+            - rowgroup [ref=e812]:
+              - row [ref=e1624]:
+                - cell [ref=e1604]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=e819]: "222"
+                - cell "缁勯暱" [ref=e1625]:
+                  - generic [ref=e829] [cursor=pointer]:
+                    - combobox [ref=e831]
+                    - generic "缁勯暱" [ref=e1623]
+                - cell [ref=e832]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=e835]
+                - cell [ref=e836]:
+                  - button "鍒犻櫎" [ref=e842] [cursor=pointer]
+    - button [ref=e786] [cursor=pointer]
+    - generic [ref=e796]:
+      - button "纭� 璁�" [ref=e797] [cursor=pointer]
+      - button "鍙� 娑�" [ref=e800] [cursor=pointer]
+    - button [ref=e802] [cursor=pointer]
+  - dialog "鐗╂枡浜у搧閫夋嫨" [ref=e1627]:
+    - document:
+      - generic [ref=e1628]:
+        - button "Close" [ref=e1629] [cursor=pointer]:
+          - img "close" [ref=e1631]
+        - generic [ref=e1634]: 鐗╂枡浜у搧閫夋嫨
+        - generic [ref=e1637]:
+          - generic [ref=e1640]:
+            - textbox "鎼滅储鍒嗙被" [ref=e1647]
+            - tree [ref=e1651]:
+              - generic:
+                - textbox "for screen reader"
+              - generic [ref=e1655]:
+                - generic "鍘熸潗鏂�" [ref=e1658] [cursor=pointer]
+                - generic "鍗婃垚鍝�" [ref=e1661] [cursor=pointer]
+                - generic [ref=e1662]:
+                  - img "caret-down" [ref=e1664] [cursor=pointer]
+                  - generic "鎴愬搧" [ref=e1667] [cursor=pointer]
+                - generic [ref=e1668]:
+                  - img "caret-down" [ref=e1671] [cursor=pointer]
+                  - generic "1" [ref=e1674] [cursor=pointer]
+                - generic [ref=e1675]:
+                  - img "caret-down" [ref=e1678] [cursor=pointer]
+                  - generic "2" [ref=e1681] [cursor=pointer]
+                - generic "33" [ref=e1685] [cursor=pointer]
+                - generic "杈呮枡" [ref=e1688] [cursor=pointer]
+          - generic [ref=e1691]:
+            - generic [ref=e1696]:
+              - generic [ref=e1697]:
+                - generic [ref=e1698]: 鐗╂枡缂栫爜
+                - textbox "鐗╂枡缂栫爜" [ref=e1704]:
+                  - /placeholder: 璇疯緭鍏ョ墿鏂欑紪鐮�
+              - generic [ref=e1706]:
+                - generic [ref=e1707]: 鐗╂枡鍚嶇О
+                - textbox "鐗╂枡鍚嶇О" [ref=e1713]:
+                  - /placeholder: 璇疯緭鍏ョ墿鏂欏悕绉�
+              - generic [ref=e1715]:
+                - button "閲� 缃�" [ref=e1716] [cursor=pointer]
+                - button "鎼� 绱�" [ref=e1718] [cursor=pointer]
+                - generic [ref=e1720] [cursor=pointer]: 鏀惰捣
+            - generic [ref=e1727]:
+              - generic [ref=e1729]:
+                - generic [ref=e1730]: 鐗╂枡浜у搧鍒楄〃
+                - button "顫�" [ref=e1735] [cursor=pointer]
+                - generic [ref=e1737]:
+                  - button "瞟�" [ref=e1738] [cursor=pointer]
+                  - button "顪�" [ref=e1740] [cursor=pointer]
+                  - button "顦�" [ref=e1742] [cursor=pointer]
+              - generic [ref=e1750]:
+                - table [ref=e1754]:
+                  - rowgroup [ref=e1764]:
+                    - row "鐗╂枡缂栫爜 鐗╂枡鍚嶇О 瑙勬牸鍨嬪彿 鍗曚綅 鐗╂枡/浜у搧 鎵�灞炲垎绫� 鍒涘缓鏃堕棿" [ref=e1765]:
+                      - columnheader [ref=e1766]
+                      - columnheader "鐗╂枡缂栫爜" [ref=e1769]
+                      - columnheader "鐗╂枡鍚嶇О" [ref=e1774]
+                      - columnheader "瑙勬牸鍨嬪彿" [ref=e1779]
+                      - columnheader "鍗曚綅" [ref=e1784]
+                      - columnheader "鐗╂枡/浜у搧" [ref=e1789]
+                      - columnheader "鎵�灞炲垎绫�" [ref=e1794]
+                      - columnheader "鍒涘缓鏃堕棿" [ref=e1799]
+                - table [ref=e1807]:
+                  - rowgroup [ref=e1817]:
+                    - row [ref=e2056]:
+                      - cell "顫�" [ref=e2057]
+                      - cell "ITEM_20260729001" [ref=e1824]
+                      - cell "閾濆悎瀵间綋" [ref=e1828]
+                      - cell "LH8030JY-10" [ref=e1832]
+                      - cell "鍗冪背" [ref=e1836]
+                      - cell "鐗╂枡" [ref=e1840]
+                      - cell "33" [ref=e1844]
+                      - cell "2026-07-29 14:19:03" [ref=e1848]
+                    - row [ref=e1852]:
+                      - cell "顭�" [ref=e1853]
+                      - cell "ITEM_20260720001" [ref=e1858]
+                      - cell "闇�瑕佺敓浜х殑鎴愬搧11" [ref=e1862]
+                      - cell "涓�" [ref=e1866]
+                      - cell "鍗冨厠" [ref=e1870]
+                      - cell "浜у搧" [ref=e1874]
+                      - cell "鎴愬搧" [ref=e1878]
+                      - cell "2026-07-20 09:17:13" [ref=e1882]
+                    - row [ref=e1886]:
+                      - cell "顭�" [ref=e1887]
+                      - cell "ITEM_20260716008" [ref=e1892]
+                      - cell "闀�閿岄挗绾�" [ref=e1896]
+                      - cell "JG3A-1*1.5" [ref=e1900]
+                      - cell "鍗冨厠" [ref=e1904]
+                      - cell "鐗╂枡" [ref=e1908]
+                      - cell "鍘熸潗鏂�" [ref=e1912]
+                      - cell "2026-07-16 16:51:57" [ref=e1916]
+                    - row [ref=e1920]:
+                      - cell "顭�" [ref=e1921]
+                      - cell "ITEM_20260716006" [ref=e1926]
+                      - cell "閽㈣姱閾濈粸绾�" [ref=e1930]
+                      - cell "JL/L1-40/10-6/1" [ref=e1934]
+                      - cell "鍗冨厠" [ref=e1938]
+                      - cell "浜у搧" [ref=e1942]
+                      - cell "鎴愬搧" [ref=e1946]
+                      - cell "2026-07-16 16:48:49" [ref=e1950]
+                    - row [ref=e1954]:
+                      - cell "顭�" [ref=e1955]
+                      - cell "ITEM_20260716005" [ref=e1960]
+                      - cell "閾濆崟绾�" [ref=e1964]
+                      - cell "L-1.72" [ref=e1968]
+                      - cell "鍗冨厠" [ref=e1972]
+                      - cell "鐗╂枡" [ref=e1976]
+                      - cell "鍗婃垚鍝�" [ref=e1980]
+                      - cell "2026-07-16 16:48:03" [ref=e1984]
+                    - row [ref=e1988]:
+                      - cell "顭�" [ref=e1989]
+                      - cell "ITEM_20260716004" [ref=e1994]
+                      - cell "閾濇潌" [ref=e1998]
+                      - cell "1A60" [ref=e2002]
+                      - cell "鍗冨厠" [ref=e2006]
+                      - cell "鐗╂枡" [ref=e2010]
+                      - cell "鍘熸潗鏂�" [ref=e2014]
+                      - cell "2026-07-16 16:45:13" [ref=e2018]
+              - generic [ref=e2028]:
+                - generic [ref=e2029]: 鍏� 6 鏉¤褰�
+                - generic [ref=e2031] [cursor=pointer]:
+                  - generic "20鏉�/椤�" [ref=e2032]:
+                    - textbox "璇烽�夋嫨" [ref=e2033]: 20鏉�/椤�
+                  - generic [ref=e2034]: 睿�
+                - button "飱�" [ref=e2037]
+                - button "顧�" [ref=e2039]
+                - button "顫�" [ref=e2041]
+                - button "1" [ref=e2044] [cursor=pointer]
+                - button "顫�" [ref=e2045]
+                - button "顧�" [ref=e2047]
+                - button "顦�" [ref=e2049]
+        - generic [ref=e2051]:
+          - button "鍙� 娑�" [ref=e2052] [cursor=pointer]
+          - button "纭� 瀹�" [ref=e2054] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-11-29-772Z.yml b/.playwright-mcp/page-2026-08-18T08-11-29-772Z.yml
new file mode 100644
index 0000000..7cab386
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-11-29-772Z.yml
@@ -0,0 +1,267 @@
+- generic [ref=e4]:
+  - generic [ref=e7]:
+    - complementary [ref=e8]:
+      - generic [ref=e9]:
+        - generic [ref=e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+          - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e22]:
+          - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+          - listitem [ref=e30]:
+            - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e39]:
+            - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=e46]:
+            - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=e53]:
+            - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=e61]:
+            - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=e70]:
+            - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=e78]:
+            - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+          - listitem [ref=e111]:
+            - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=e118]:
+            - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=e125]:
+            - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=e132]:
+            - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=e139]:
+            - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=e146]:
+            - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=e153]:
+            - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=e160]:
+            - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=e169] [cursor=pointer]
+    - generic [ref=e174]:
+      - generic [ref=e175]:
+        - banner [ref=e176]:
+          - button [ref=e177] [cursor=pointer]
+          - button [ref=e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e185]:
+            - list [ref=e186]:
+              - listitem [ref=e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=e192]
+              - listitem [ref=e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+          - generic [ref=e201]:
+            - generic [ref=e203] [cursor=pointer]:
+              - generic [ref=e207]: 鎼滅储
+              - generic [ref=e208]: Ctrl K
+            - button [ref=e210] [cursor=pointer]
+            - button "dark" [ref=e215] [cursor=pointer]
+            - button [ref=e224] [cursor=pointer]
+            - button [ref=e230] [cursor=pointer]
+            - button [ref=e233] [cursor=pointer]
+            - button [ref=e239] [cursor=pointer]:
+              - button [ref=e241]
+            - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=e250] [cursor=pointer]
+        - generic [ref=e257]:
+          - generic [ref=e262]:
+            - generic [ref=e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=e298]:
+            - button [ref=e299] [cursor=pointer]
+            - generic [ref=e306] [cursor=pointer]
+            - generic [ref=e310] [cursor=pointer]
+      - main [ref=e317]:
+        - generic [ref=e322]:
+          - generic [ref=e327]:
+            - generic [ref=e328]:
+              - generic [ref=e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=e337]:
+              - generic [ref=e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+            - generic [ref=e351]:
+              - generic [ref=e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=e360]:
+              - generic [ref=e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=e369]:
+              - generic [ref=e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+            - generic [ref=e383]:
+              - generic [ref=e384]: 鎵规鐘舵��
+              - generic [ref=e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=e393]:
+              - generic [ref=e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e403]:
+                  - img "swap-right" [ref=e404]
+                - textbox "缁撴潫鏃堕棿" [ref=e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e409]:
+              - generic [ref=e410]: 鍒涘缓鏃堕棿
+              - generic [ref=e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e419]:
+                  - img "swap-right" [ref=e420]
+                - textbox "缁撴潫鏃堕棿" [ref=e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e425]:
+              - button "閲� 缃�" [ref=e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+              - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=e437]:
+            - generic [ref=e439]:
+              - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=e444]:
+                - generic [ref=e446]:
+                  - button "鏂板鎵规" [ref=e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+                - button "顫�" [ref=e459] [cursor=pointer]
+              - generic [ref=e461]:
+                - button "瞟�" [ref=e462] [cursor=pointer]
+                - button "顪�" [ref=e464] [cursor=pointer]
+                - button "顦�" [ref=e466] [cursor=pointer]
+            - generic [ref=e470]:
+              - generic [ref=e473]:
+                - generic [ref=e474]:
+                  - table [ref=e478]:
+                    - rowgroup [ref=e493]:
+                      - row [ref=e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=e520]
+                        - columnheader "璐d换浜�" [ref=e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                        - columnheader "鎵规鐘舵��" [ref=e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+                  - generic [ref=e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=e553]:
+                    - table [ref=e556]:
+                      - rowgroup [ref=e571]:
+                        - row [ref=e572]:
+                          - columnheader "鎵规鍙�" [ref=e573]
+                    - generic [ref=e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=e580]:
+                    - table [ref=e583]:
+                      - rowgroup [ref=e598]:
+                        - row [ref=e599]:
+                          - columnheader "鎿嶄綔" [ref=e600]
+                    - generic [ref=e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=e621]:
+              - generic [ref=e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=e625]:
+                  - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+                - generic [ref=e627]: 睿�
+              - button "飱�" [ref=e630]
+              - button "顧�" [ref=e632]
+              - button "顫�" [ref=e634]
+              - button "1" [ref=e637] [cursor=pointer]
+              - button "顫�" [ref=e638]
+              - button "顧�" [ref=e640]
+              - button "顦�" [ref=e642]
+  - dialog [ref=e645]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=e647]
+    - generic [ref=e649]:
+      - generic [ref=e651]:
+        - generic [ref=e652]:
+          - generic [ref=e653]:
+            - generic [ref=e654]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [active] [ref=e661]: 閾濆悎瀵间綋
+        - generic [ref=e667]:
+          - generic [ref=e668]:
+            - generic [ref=e669]: "*"
+            - text: 浜х嚎
+          - generic [ref=e675]:
+            - combobox "* 浜х嚎" [ref=e677]
+            - generic: 璇烽�夋嫨浜х嚎
+        - generic [ref=e678]:
+          - generic [ref=e679]:
+            - generic [ref=e680]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=e686]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=e687]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=e688]:
+          - generic [ref=e689]: 璁″垝鏁伴噺
+          - generic [ref=e694]:
+            - generic [ref=e695]:
+              - button "Increase Value" [ref=e696] [cursor=pointer]:
+                - img "up" [ref=e697]
+              - button "Decrease Value" [ref=e700] [cursor=pointer]:
+                - img "down" [ref=e701]
+            - spinbutton "璁″垝鏁伴噺" [ref=e705]
+        - generic [ref=e706]:
+          - generic [ref=e707]:
+            - generic [ref=e708]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=e715]
+        - generic [ref=e721]:
+          - generic [ref=e722]: 澶囨敞
+          - textbox "澶囨敞" [ref=e727]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=e728]:
+        - generic [ref=e729]:
+          - generic [ref=e730]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=e731] [cursor=pointer]
+        - generic [ref=e743]:
+          - table [ref=e747]:
+            - rowgroup [ref=e753]:
+              - row [ref=e754]:
+                - columnheader "鐢熶骇浜哄憳" [ref=e755]
+                - columnheader "宀椾綅绫诲瀷" [ref=e760]
+                - columnheader "澶囨敞" [ref=e765]
+                - columnheader "鎿嶄綔" [ref=e770]
+          - table [ref=e806]:
+            - rowgroup [ref=e812]:
+              - row [ref=e1624]:
+                - cell [ref=e1604]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=e819]: "222"
+                - cell "缁勯暱" [ref=e1625]:
+                  - generic [ref=e829] [cursor=pointer]:
+                    - combobox [ref=e831]
+                    - generic "缁勯暱" [ref=e1623]
+                - cell [ref=e832]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=e835]
+                - cell [ref=e836]:
+                  - button "鍒犻櫎" [ref=e842] [cursor=pointer]
+    - button [ref=e786] [cursor=pointer]
+    - generic [ref=e796]:
+      - button "纭� 璁�" [ref=e797] [cursor=pointer]
+      - button "鍙� 娑�" [ref=e800] [cursor=pointer]
+    - button [ref=e802] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-11-35-526Z.yml b/.playwright-mcp/page-2026-08-18T08-11-35-526Z.yml
new file mode 100644
index 0000000..7c641c9
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-11-35-526Z.yml
@@ -0,0 +1,277 @@
+- generic [ref=e4]:
+  - generic [ref=e7]:
+    - complementary [ref=e8]:
+      - generic [ref=e9]:
+        - generic [ref=e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+          - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e22]:
+          - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+          - listitem [ref=e30]:
+            - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e39]:
+            - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=e46]:
+            - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=e53]:
+            - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=e61]:
+            - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=e70]:
+            - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=e78]:
+            - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+          - listitem [ref=e111]:
+            - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=e118]:
+            - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=e125]:
+            - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=e132]:
+            - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=e139]:
+            - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=e146]:
+            - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=e153]:
+            - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=e160]:
+            - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=e169] [cursor=pointer]
+    - generic [ref=e174]:
+      - generic [ref=e175]:
+        - banner [ref=e176]:
+          - button [ref=e177] [cursor=pointer]
+          - button [ref=e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e185]:
+            - list [ref=e186]:
+              - listitem [ref=e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=e192]
+              - listitem [ref=e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+          - generic [ref=e201]:
+            - generic [ref=e203] [cursor=pointer]:
+              - generic [ref=e207]: 鎼滅储
+              - generic [ref=e208]: Ctrl K
+            - button [ref=e210] [cursor=pointer]
+            - button "dark" [ref=e215] [cursor=pointer]
+            - button [ref=e224] [cursor=pointer]
+            - button [ref=e230] [cursor=pointer]
+            - button [ref=e233] [cursor=pointer]
+            - button [ref=e239] [cursor=pointer]:
+              - button [ref=e241]
+            - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=e250] [cursor=pointer]
+        - generic [ref=e257]:
+          - generic [ref=e262]:
+            - generic [ref=e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=e298]:
+            - button [ref=e299] [cursor=pointer]
+            - generic [ref=e306] [cursor=pointer]
+            - generic [ref=e310] [cursor=pointer]
+      - main [ref=e317]:
+        - generic [ref=e322]:
+          - generic [ref=e327]:
+            - generic [ref=e328]:
+              - generic [ref=e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=e337]:
+              - generic [ref=e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+            - generic [ref=e351]:
+              - generic [ref=e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=e360]:
+              - generic [ref=e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=e369]:
+              - generic [ref=e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+            - generic [ref=e383]:
+              - generic [ref=e384]: 鎵规鐘舵��
+              - generic [ref=e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=e393]:
+              - generic [ref=e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e403]:
+                  - img "swap-right" [ref=e404]
+                - textbox "缁撴潫鏃堕棿" [ref=e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e409]:
+              - generic [ref=e410]: 鍒涘缓鏃堕棿
+              - generic [ref=e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e419]:
+                  - img "swap-right" [ref=e420]
+                - textbox "缁撴潫鏃堕棿" [ref=e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e425]:
+              - button "閲� 缃�" [ref=e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+              - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=e437]:
+            - generic [ref=e439]:
+              - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=e444]:
+                - generic [ref=e446]:
+                  - button "鏂板鎵规" [ref=e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+                - button "顫�" [ref=e459] [cursor=pointer]
+              - generic [ref=e461]:
+                - button "瞟�" [ref=e462] [cursor=pointer]
+                - button "顪�" [ref=e464] [cursor=pointer]
+                - button "顦�" [ref=e466] [cursor=pointer]
+            - generic [ref=e470]:
+              - generic [ref=e473]:
+                - generic [ref=e474]:
+                  - table [ref=e478]:
+                    - rowgroup [ref=e493]:
+                      - row [ref=e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=e520]
+                        - columnheader "璐d换浜�" [ref=e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                        - columnheader "鎵规鐘舵��" [ref=e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+                  - generic [ref=e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=e553]:
+                    - table [ref=e556]:
+                      - rowgroup [ref=e571]:
+                        - row [ref=e572]:
+                          - columnheader "鎵规鍙�" [ref=e573]
+                    - generic [ref=e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=e580]:
+                    - table [ref=e583]:
+                      - rowgroup [ref=e598]:
+                        - row [ref=e599]:
+                          - columnheader "鎿嶄綔" [ref=e600]
+                    - generic [ref=e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=e621]:
+              - generic [ref=e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=e625]:
+                  - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+                - generic [ref=e627]: 睿�
+              - button "飱�" [ref=e630]
+              - button "顧�" [ref=e632]
+              - button "顫�" [ref=e634]
+              - button "1" [ref=e637] [cursor=pointer]
+              - button "顫�" [ref=e638]
+              - button "顧�" [ref=e640]
+              - button "顦�" [ref=e642]
+  - dialog [ref=e645]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=e647]
+    - generic [ref=e649]:
+      - generic [ref=e651]:
+        - generic [ref=e652]:
+          - generic [ref=e653]:
+            - generic [ref=e654]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=e661]: 閾濆悎瀵间綋
+        - generic [ref=e667]:
+          - generic [ref=e668]:
+            - generic [ref=e669]: "*"
+            - text: 浜х嚎
+          - generic [ref=e675]:
+            - combobox "* 浜х嚎" [expanded] [active] [ref=e677]:
+              - listbox:
+                - option "1"
+                - option "2"
+            - generic: 璇烽�夋嫨浜х嚎
+        - generic [ref=e678]:
+          - generic [ref=e679]:
+            - generic [ref=e680]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=e686]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=e687]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=e688]:
+          - generic [ref=e689]: 璁″垝鏁伴噺
+          - generic [ref=e694]:
+            - generic [ref=e695]:
+              - button "Increase Value" [ref=e696] [cursor=pointer]:
+                - img "up" [ref=e697]
+              - button "Decrease Value" [ref=e700] [cursor=pointer]:
+                - img "down" [ref=e701]
+            - spinbutton "璁″垝鏁伴噺" [ref=e705]
+        - generic [ref=e706]:
+          - generic [ref=e707]:
+            - generic [ref=e708]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=e715]
+        - generic [ref=e721]:
+          - generic [ref=e722]: 澶囨敞
+          - textbox "澶囨敞" [ref=e727]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=e728]:
+        - generic [ref=e729]:
+          - generic [ref=e730]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=e731] [cursor=pointer]
+        - generic [ref=e743]:
+          - table [ref=e747]:
+            - rowgroup [ref=e753]:
+              - row [ref=e754]:
+                - columnheader "鐢熶骇浜哄憳" [ref=e755]
+                - columnheader "宀椾綅绫诲瀷" [ref=e760]
+                - columnheader "澶囨敞" [ref=e765]
+                - columnheader "鎿嶄綔" [ref=e770]
+          - table [ref=e806]:
+            - rowgroup [ref=e812]:
+              - row [ref=e1624]:
+                - cell [ref=e1604]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=e819]: "222"
+                - cell "缁勯暱" [ref=e1625]:
+                  - generic [ref=e829] [cursor=pointer]:
+                    - combobox [ref=e831]
+                    - generic "缁勯暱" [ref=e1623]
+                - cell [ref=e832]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=e835]
+                - cell [ref=e836]:
+                  - button "鍒犻櫎" [ref=e842] [cursor=pointer]
+    - button [ref=e786] [cursor=pointer]
+    - generic [ref=e796]:
+      - button "纭� 璁�" [ref=e797] [cursor=pointer]
+      - button "鍙� 娑�" [ref=e800] [cursor=pointer]
+    - button [ref=e802] [cursor=pointer]
+  - generic [ref=e2063]:
+    - generic [ref=e2066] [cursor=pointer]:
+      - generic [ref=e2067]: 浜х嚎涓�
+      - generic [ref=e2068]: one
+    - generic [ref=e2071] [cursor=pointer]:
+      - generic [ref=e2072]: 浜х嚎浜�
+      - generic [ref=e2073]: two
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-11-46-362Z.yml b/.playwright-mcp/page-2026-08-18T08-11-46-362Z.yml
new file mode 100644
index 0000000..7c641c9
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-11-46-362Z.yml
@@ -0,0 +1,277 @@
+- generic [ref=e4]:
+  - generic [ref=e7]:
+    - complementary [ref=e8]:
+      - generic [ref=e9]:
+        - generic [ref=e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+          - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e22]:
+          - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+          - listitem [ref=e30]:
+            - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e39]:
+            - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=e46]:
+            - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=e53]:
+            - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=e61]:
+            - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=e70]:
+            - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=e78]:
+            - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+          - listitem [ref=e111]:
+            - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=e118]:
+            - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=e125]:
+            - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=e132]:
+            - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=e139]:
+            - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=e146]:
+            - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=e153]:
+            - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=e160]:
+            - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=e169] [cursor=pointer]
+    - generic [ref=e174]:
+      - generic [ref=e175]:
+        - banner [ref=e176]:
+          - button [ref=e177] [cursor=pointer]
+          - button [ref=e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e185]:
+            - list [ref=e186]:
+              - listitem [ref=e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=e192]
+              - listitem [ref=e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+          - generic [ref=e201]:
+            - generic [ref=e203] [cursor=pointer]:
+              - generic [ref=e207]: 鎼滅储
+              - generic [ref=e208]: Ctrl K
+            - button [ref=e210] [cursor=pointer]
+            - button "dark" [ref=e215] [cursor=pointer]
+            - button [ref=e224] [cursor=pointer]
+            - button [ref=e230] [cursor=pointer]
+            - button [ref=e233] [cursor=pointer]
+            - button [ref=e239] [cursor=pointer]:
+              - button [ref=e241]
+            - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=e250] [cursor=pointer]
+        - generic [ref=e257]:
+          - generic [ref=e262]:
+            - generic [ref=e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=e298]:
+            - button [ref=e299] [cursor=pointer]
+            - generic [ref=e306] [cursor=pointer]
+            - generic [ref=e310] [cursor=pointer]
+      - main [ref=e317]:
+        - generic [ref=e322]:
+          - generic [ref=e327]:
+            - generic [ref=e328]:
+              - generic [ref=e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=e337]:
+              - generic [ref=e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+            - generic [ref=e351]:
+              - generic [ref=e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=e360]:
+              - generic [ref=e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=e369]:
+              - generic [ref=e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+            - generic [ref=e383]:
+              - generic [ref=e384]: 鎵规鐘舵��
+              - generic [ref=e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=e393]:
+              - generic [ref=e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e403]:
+                  - img "swap-right" [ref=e404]
+                - textbox "缁撴潫鏃堕棿" [ref=e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e409]:
+              - generic [ref=e410]: 鍒涘缓鏃堕棿
+              - generic [ref=e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e419]:
+                  - img "swap-right" [ref=e420]
+                - textbox "缁撴潫鏃堕棿" [ref=e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e425]:
+              - button "閲� 缃�" [ref=e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+              - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=e437]:
+            - generic [ref=e439]:
+              - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=e444]:
+                - generic [ref=e446]:
+                  - button "鏂板鎵规" [ref=e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+                - button "顫�" [ref=e459] [cursor=pointer]
+              - generic [ref=e461]:
+                - button "瞟�" [ref=e462] [cursor=pointer]
+                - button "顪�" [ref=e464] [cursor=pointer]
+                - button "顦�" [ref=e466] [cursor=pointer]
+            - generic [ref=e470]:
+              - generic [ref=e473]:
+                - generic [ref=e474]:
+                  - table [ref=e478]:
+                    - rowgroup [ref=e493]:
+                      - row [ref=e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=e520]
+                        - columnheader "璐d换浜�" [ref=e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                        - columnheader "鎵规鐘舵��" [ref=e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+                  - generic [ref=e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=e553]:
+                    - table [ref=e556]:
+                      - rowgroup [ref=e571]:
+                        - row [ref=e572]:
+                          - columnheader "鎵规鍙�" [ref=e573]
+                    - generic [ref=e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=e580]:
+                    - table [ref=e583]:
+                      - rowgroup [ref=e598]:
+                        - row [ref=e599]:
+                          - columnheader "鎿嶄綔" [ref=e600]
+                    - generic [ref=e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=e621]:
+              - generic [ref=e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=e625]:
+                  - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+                - generic [ref=e627]: 睿�
+              - button "飱�" [ref=e630]
+              - button "顧�" [ref=e632]
+              - button "顫�" [ref=e634]
+              - button "1" [ref=e637] [cursor=pointer]
+              - button "顫�" [ref=e638]
+              - button "顧�" [ref=e640]
+              - button "顦�" [ref=e642]
+  - dialog [ref=e645]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=e647]
+    - generic [ref=e649]:
+      - generic [ref=e651]:
+        - generic [ref=e652]:
+          - generic [ref=e653]:
+            - generic [ref=e654]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=e661]: 閾濆悎瀵间綋
+        - generic [ref=e667]:
+          - generic [ref=e668]:
+            - generic [ref=e669]: "*"
+            - text: 浜х嚎
+          - generic [ref=e675]:
+            - combobox "* 浜х嚎" [expanded] [active] [ref=e677]:
+              - listbox:
+                - option "1"
+                - option "2"
+            - generic: 璇烽�夋嫨浜х嚎
+        - generic [ref=e678]:
+          - generic [ref=e679]:
+            - generic [ref=e680]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=e686]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=e687]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=e688]:
+          - generic [ref=e689]: 璁″垝鏁伴噺
+          - generic [ref=e694]:
+            - generic [ref=e695]:
+              - button "Increase Value" [ref=e696] [cursor=pointer]:
+                - img "up" [ref=e697]
+              - button "Decrease Value" [ref=e700] [cursor=pointer]:
+                - img "down" [ref=e701]
+            - spinbutton "璁″垝鏁伴噺" [ref=e705]
+        - generic [ref=e706]:
+          - generic [ref=e707]:
+            - generic [ref=e708]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=e715]
+        - generic [ref=e721]:
+          - generic [ref=e722]: 澶囨敞
+          - textbox "澶囨敞" [ref=e727]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=e728]:
+        - generic [ref=e729]:
+          - generic [ref=e730]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=e731] [cursor=pointer]
+        - generic [ref=e743]:
+          - table [ref=e747]:
+            - rowgroup [ref=e753]:
+              - row [ref=e754]:
+                - columnheader "鐢熶骇浜哄憳" [ref=e755]
+                - columnheader "宀椾綅绫诲瀷" [ref=e760]
+                - columnheader "澶囨敞" [ref=e765]
+                - columnheader "鎿嶄綔" [ref=e770]
+          - table [ref=e806]:
+            - rowgroup [ref=e812]:
+              - row [ref=e1624]:
+                - cell [ref=e1604]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=e819]: "222"
+                - cell "缁勯暱" [ref=e1625]:
+                  - generic [ref=e829] [cursor=pointer]:
+                    - combobox [ref=e831]
+                    - generic "缁勯暱" [ref=e1623]
+                - cell [ref=e832]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=e835]
+                - cell [ref=e836]:
+                  - button "鍒犻櫎" [ref=e842] [cursor=pointer]
+    - button [ref=e786] [cursor=pointer]
+    - generic [ref=e796]:
+      - button "纭� 璁�" [ref=e797] [cursor=pointer]
+      - button "鍙� 娑�" [ref=e800] [cursor=pointer]
+    - button [ref=e802] [cursor=pointer]
+  - generic [ref=e2063]:
+    - generic [ref=e2066] [cursor=pointer]:
+      - generic [ref=e2067]: 浜х嚎涓�
+      - generic [ref=e2068]: one
+    - generic [ref=e2071] [cursor=pointer]:
+      - generic [ref=e2072]: 浜х嚎浜�
+      - generic [ref=e2073]: two
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-12-10-057Z.yml b/.playwright-mcp/page-2026-08-18T08-12-10-057Z.yml
new file mode 100644
index 0000000..7c641c9
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-12-10-057Z.yml
@@ -0,0 +1,277 @@
+- generic [ref=e4]:
+  - generic [ref=e7]:
+    - complementary [ref=e8]:
+      - generic [ref=e9]:
+        - generic [ref=e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+          - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e22]:
+          - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+          - listitem [ref=e30]:
+            - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e39]:
+            - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=e46]:
+            - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=e53]:
+            - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=e61]:
+            - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=e70]:
+            - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=e78]:
+            - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+          - listitem [ref=e111]:
+            - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=e118]:
+            - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=e125]:
+            - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=e132]:
+            - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=e139]:
+            - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=e146]:
+            - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=e153]:
+            - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=e160]:
+            - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=e169] [cursor=pointer]
+    - generic [ref=e174]:
+      - generic [ref=e175]:
+        - banner [ref=e176]:
+          - button [ref=e177] [cursor=pointer]
+          - button [ref=e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e185]:
+            - list [ref=e186]:
+              - listitem [ref=e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=e192]
+              - listitem [ref=e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+          - generic [ref=e201]:
+            - generic [ref=e203] [cursor=pointer]:
+              - generic [ref=e207]: 鎼滅储
+              - generic [ref=e208]: Ctrl K
+            - button [ref=e210] [cursor=pointer]
+            - button "dark" [ref=e215] [cursor=pointer]
+            - button [ref=e224] [cursor=pointer]
+            - button [ref=e230] [cursor=pointer]
+            - button [ref=e233] [cursor=pointer]
+            - button [ref=e239] [cursor=pointer]:
+              - button [ref=e241]
+            - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=e250] [cursor=pointer]
+        - generic [ref=e257]:
+          - generic [ref=e262]:
+            - generic [ref=e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=e298]:
+            - button [ref=e299] [cursor=pointer]
+            - generic [ref=e306] [cursor=pointer]
+            - generic [ref=e310] [cursor=pointer]
+      - main [ref=e317]:
+        - generic [ref=e322]:
+          - generic [ref=e327]:
+            - generic [ref=e328]:
+              - generic [ref=e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=e337]:
+              - generic [ref=e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+            - generic [ref=e351]:
+              - generic [ref=e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=e360]:
+              - generic [ref=e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=e369]:
+              - generic [ref=e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+            - generic [ref=e383]:
+              - generic [ref=e384]: 鎵规鐘舵��
+              - generic [ref=e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=e393]:
+              - generic [ref=e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e403]:
+                  - img "swap-right" [ref=e404]
+                - textbox "缁撴潫鏃堕棿" [ref=e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e409]:
+              - generic [ref=e410]: 鍒涘缓鏃堕棿
+              - generic [ref=e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e419]:
+                  - img "swap-right" [ref=e420]
+                - textbox "缁撴潫鏃堕棿" [ref=e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e425]:
+              - button "閲� 缃�" [ref=e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+              - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=e437]:
+            - generic [ref=e439]:
+              - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=e444]:
+                - generic [ref=e446]:
+                  - button "鏂板鎵规" [ref=e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+                - button "顫�" [ref=e459] [cursor=pointer]
+              - generic [ref=e461]:
+                - button "瞟�" [ref=e462] [cursor=pointer]
+                - button "顪�" [ref=e464] [cursor=pointer]
+                - button "顦�" [ref=e466] [cursor=pointer]
+            - generic [ref=e470]:
+              - generic [ref=e473]:
+                - generic [ref=e474]:
+                  - table [ref=e478]:
+                    - rowgroup [ref=e493]:
+                      - row [ref=e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=e520]
+                        - columnheader "璐d换浜�" [ref=e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                        - columnheader "鎵规鐘舵��" [ref=e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+                  - generic [ref=e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=e553]:
+                    - table [ref=e556]:
+                      - rowgroup [ref=e571]:
+                        - row [ref=e572]:
+                          - columnheader "鎵规鍙�" [ref=e573]
+                    - generic [ref=e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=e580]:
+                    - table [ref=e583]:
+                      - rowgroup [ref=e598]:
+                        - row [ref=e599]:
+                          - columnheader "鎿嶄綔" [ref=e600]
+                    - generic [ref=e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=e621]:
+              - generic [ref=e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=e625]:
+                  - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+                - generic [ref=e627]: 睿�
+              - button "飱�" [ref=e630]
+              - button "顧�" [ref=e632]
+              - button "顫�" [ref=e634]
+              - button "1" [ref=e637] [cursor=pointer]
+              - button "顫�" [ref=e638]
+              - button "顧�" [ref=e640]
+              - button "顦�" [ref=e642]
+  - dialog [ref=e645]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=e647]
+    - generic [ref=e649]:
+      - generic [ref=e651]:
+        - generic [ref=e652]:
+          - generic [ref=e653]:
+            - generic [ref=e654]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=e661]: 閾濆悎瀵间綋
+        - generic [ref=e667]:
+          - generic [ref=e668]:
+            - generic [ref=e669]: "*"
+            - text: 浜х嚎
+          - generic [ref=e675]:
+            - combobox "* 浜х嚎" [expanded] [active] [ref=e677]:
+              - listbox:
+                - option "1"
+                - option "2"
+            - generic: 璇烽�夋嫨浜х嚎
+        - generic [ref=e678]:
+          - generic [ref=e679]:
+            - generic [ref=e680]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=e686]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=e687]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=e688]:
+          - generic [ref=e689]: 璁″垝鏁伴噺
+          - generic [ref=e694]:
+            - generic [ref=e695]:
+              - button "Increase Value" [ref=e696] [cursor=pointer]:
+                - img "up" [ref=e697]
+              - button "Decrease Value" [ref=e700] [cursor=pointer]:
+                - img "down" [ref=e701]
+            - spinbutton "璁″垝鏁伴噺" [ref=e705]
+        - generic [ref=e706]:
+          - generic [ref=e707]:
+            - generic [ref=e708]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=e715]
+        - generic [ref=e721]:
+          - generic [ref=e722]: 澶囨敞
+          - textbox "澶囨敞" [ref=e727]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=e728]:
+        - generic [ref=e729]:
+          - generic [ref=e730]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=e731] [cursor=pointer]
+        - generic [ref=e743]:
+          - table [ref=e747]:
+            - rowgroup [ref=e753]:
+              - row [ref=e754]:
+                - columnheader "鐢熶骇浜哄憳" [ref=e755]
+                - columnheader "宀椾綅绫诲瀷" [ref=e760]
+                - columnheader "澶囨敞" [ref=e765]
+                - columnheader "鎿嶄綔" [ref=e770]
+          - table [ref=e806]:
+            - rowgroup [ref=e812]:
+              - row [ref=e1624]:
+                - cell [ref=e1604]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=e819]: "222"
+                - cell "缁勯暱" [ref=e1625]:
+                  - generic [ref=e829] [cursor=pointer]:
+                    - combobox [ref=e831]
+                    - generic "缁勯暱" [ref=e1623]
+                - cell [ref=e832]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=e835]
+                - cell [ref=e836]:
+                  - button "鍒犻櫎" [ref=e842] [cursor=pointer]
+    - button [ref=e786] [cursor=pointer]
+    - generic [ref=e796]:
+      - button "纭� 璁�" [ref=e797] [cursor=pointer]
+      - button "鍙� 娑�" [ref=e800] [cursor=pointer]
+    - button [ref=e802] [cursor=pointer]
+  - generic [ref=e2063]:
+    - generic [ref=e2066] [cursor=pointer]:
+      - generic [ref=e2067]: 浜х嚎涓�
+      - generic [ref=e2068]: one
+    - generic [ref=e2071] [cursor=pointer]:
+      - generic [ref=e2072]: 浜х嚎浜�
+      - generic [ref=e2073]: two
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-12-24-644Z.yml b/.playwright-mcp/page-2026-08-18T08-12-24-644Z.yml
new file mode 100644
index 0000000..8667530
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-12-24-644Z.yml
@@ -0,0 +1,271 @@
+- generic [ref=e4]:
+  - generic [ref=e7]:
+    - complementary [ref=e8]:
+      - generic [ref=e9]:
+        - generic [ref=e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+          - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e22]:
+          - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+          - listitem [ref=e30]:
+            - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e39]:
+            - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=e46]:
+            - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=e53]:
+            - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=e61]:
+            - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=e70]:
+            - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=e78]:
+            - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+          - listitem [ref=e111]:
+            - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=e118]:
+            - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=e125]:
+            - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=e132]:
+            - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=e139]:
+            - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=e146]:
+            - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=e153]:
+            - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=e160]:
+            - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=e169] [cursor=pointer]
+    - generic [ref=e174]:
+      - generic [ref=e175]:
+        - banner [ref=e176]:
+          - button [ref=e177] [cursor=pointer]
+          - button [ref=e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e185]:
+            - list [ref=e186]:
+              - listitem [ref=e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=e192]
+              - listitem [ref=e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+          - generic [ref=e201]:
+            - generic [ref=e203] [cursor=pointer]:
+              - generic [ref=e207]: 鎼滅储
+              - generic [ref=e208]: Ctrl K
+            - button [ref=e210] [cursor=pointer]
+            - button "dark" [ref=e215] [cursor=pointer]
+            - button [ref=e224] [cursor=pointer]
+            - button [ref=e230] [cursor=pointer]
+            - button [ref=e233] [cursor=pointer]
+            - button [ref=e239] [cursor=pointer]:
+              - button [ref=e241]
+            - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=e250] [cursor=pointer]
+        - generic [ref=e257]:
+          - generic [ref=e262]:
+            - generic [ref=e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=e298]:
+            - button [ref=e299] [cursor=pointer]
+            - generic [ref=e306] [cursor=pointer]
+            - generic [ref=e310] [cursor=pointer]
+      - main [ref=e317]:
+        - generic [ref=e322]:
+          - generic [ref=e327]:
+            - generic [ref=e328]:
+              - generic [ref=e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=e337]:
+              - generic [ref=e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+            - generic [ref=e351]:
+              - generic [ref=e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=e360]:
+              - generic [ref=e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=e369]:
+              - generic [ref=e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+            - generic [ref=e383]:
+              - generic [ref=e384]: 鎵规鐘舵��
+              - generic [ref=e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=e393]:
+              - generic [ref=e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e403]:
+                  - img "swap-right" [ref=e404]
+                - textbox "缁撴潫鏃堕棿" [ref=e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e409]:
+              - generic [ref=e410]: 鍒涘缓鏃堕棿
+              - generic [ref=e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e419]:
+                  - img "swap-right" [ref=e420]
+                - textbox "缁撴潫鏃堕棿" [ref=e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e425]:
+              - button "閲� 缃�" [ref=e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+              - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=e437]:
+            - generic [ref=e439]:
+              - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=e444]:
+                - generic [ref=e446]:
+                  - button "鏂板鎵规" [ref=e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+                - button "顫�" [ref=e459] [cursor=pointer]
+              - generic [ref=e461]:
+                - button "瞟�" [ref=e462] [cursor=pointer]
+                - button "顪�" [ref=e464] [cursor=pointer]
+                - button "顦�" [ref=e466] [cursor=pointer]
+            - generic [ref=e470]:
+              - generic [ref=e473]:
+                - generic [ref=e474]:
+                  - table [ref=e478]:
+                    - rowgroup [ref=e493]:
+                      - row [ref=e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=e520]
+                        - columnheader "璐d换浜�" [ref=e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                        - columnheader "鎵规鐘舵��" [ref=e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+                  - generic [ref=e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=e553]:
+                    - table [ref=e556]:
+                      - rowgroup [ref=e571]:
+                        - row [ref=e572]:
+                          - columnheader "鎵规鍙�" [ref=e573]
+                    - generic [ref=e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=e580]:
+                    - table [ref=e583]:
+                      - rowgroup [ref=e598]:
+                        - row [ref=e599]:
+                          - columnheader "鎿嶄綔" [ref=e600]
+                    - generic [ref=e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=e621]:
+              - generic [ref=e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=e625]:
+                  - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+                - generic [ref=e627]: 睿�
+              - button "飱�" [ref=e630]
+              - button "顧�" [ref=e632]
+              - button "顫�" [ref=e634]
+              - button "1" [ref=e637] [cursor=pointer]
+              - button "顫�" [ref=e638]
+              - button "顧�" [ref=e640]
+              - button "顦�" [ref=e642]
+  - dialog [ref=e645]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=e647]
+    - generic [ref=e649]:
+      - generic [ref=e651]:
+        - generic [ref=e652]:
+          - generic [ref=e653]:
+            - generic [ref=e654]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=e661]: 閾濆悎瀵间綋
+        - generic [ref=e667]:
+          - generic [ref=e668]:
+            - generic [ref=e669]: "*"
+            - text: 浜х嚎
+          - generic [ref=e674] [cursor=pointer]:
+            - generic: "2"
+            - generic [ref=e675]:
+              - combobox "* 浜х嚎" [active] [ref=e677]
+              - generic [ref=e2075]:
+                - generic [ref=e2076]: 浜х嚎浜�
+                - generic [ref=e2077]: two
+        - generic [ref=e678]:
+          - generic [ref=e679]:
+            - generic [ref=e680]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=e686]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=e687]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=e688]:
+          - generic [ref=e689]: 璁″垝鏁伴噺
+          - generic [ref=e694]:
+            - generic [ref=e695]:
+              - button "Increase Value" [ref=e696] [cursor=pointer]:
+                - img "up" [ref=e697]
+              - button "Decrease Value" [ref=e700] [cursor=pointer]:
+                - img "down" [ref=e701]
+            - spinbutton "璁″垝鏁伴噺" [ref=e705]
+        - generic [ref=e706]:
+          - generic [ref=e707]:
+            - generic [ref=e708]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=e715]
+        - generic [ref=e721]:
+          - generic [ref=e722]: 澶囨敞
+          - textbox "澶囨敞" [ref=e727]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=e728]:
+        - generic [ref=e729]:
+          - generic [ref=e730]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=e731] [cursor=pointer]
+        - generic [ref=e743]:
+          - table [ref=e747]:
+            - rowgroup [ref=e753]:
+              - row [ref=e754]:
+                - columnheader "鐢熶骇浜哄憳" [ref=e755]
+                - columnheader "宀椾綅绫诲瀷" [ref=e760]
+                - columnheader "澶囨敞" [ref=e765]
+                - columnheader "鎿嶄綔" [ref=e770]
+          - table [ref=e806]:
+            - rowgroup [ref=e812]:
+              - row [ref=e1624]:
+                - cell [ref=e1604]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=e819]: "222"
+                - cell "缁勯暱" [ref=e1625]:
+                  - generic [ref=e829] [cursor=pointer]:
+                    - combobox [ref=e831]
+                    - generic "缁勯暱" [ref=e1623]
+                - cell [ref=e832]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=e835]
+                - cell [ref=e836]:
+                  - button "鍒犻櫎" [ref=e842] [cursor=pointer]
+    - button [ref=e786] [cursor=pointer]
+    - generic [ref=e796]:
+      - button "纭� 璁�" [ref=e797] [cursor=pointer]
+      - button "鍙� 娑�" [ref=e800] [cursor=pointer]
+    - button [ref=e802] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-13-07-718Z.yml b/.playwright-mcp/page-2026-08-18T08-13-07-718Z.yml
new file mode 100644
index 0000000..adf8d6b
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-13-07-718Z.yml
@@ -0,0 +1,272 @@
+- generic [ref=e4]:
+  - generic [ref=e7]:
+    - complementary [ref=e8]:
+      - generic [ref=e9]:
+        - generic [ref=e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+          - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e22]:
+          - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+          - listitem [ref=e30]:
+            - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e39]:
+            - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=e46]:
+            - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=e53]:
+            - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=e61]:
+            - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=e70]:
+            - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=e78]:
+            - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+          - listitem [ref=e111]:
+            - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=e118]:
+            - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=e125]:
+            - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=e132]:
+            - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=e139]:
+            - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=e146]:
+            - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=e153]:
+            - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=e160]:
+            - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=e169] [cursor=pointer]
+    - generic [ref=e174]:
+      - generic [ref=e175]:
+        - banner [ref=e176]:
+          - button [ref=e177] [cursor=pointer]
+          - button [ref=e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e185]:
+            - list [ref=e186]:
+              - listitem [ref=e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=e192]
+              - listitem [ref=e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+          - generic [ref=e201]:
+            - generic [ref=e203] [cursor=pointer]:
+              - generic [ref=e207]: 鎼滅储
+              - generic [ref=e208]: Ctrl K
+            - button [ref=e210] [cursor=pointer]
+            - button "dark" [ref=e215] [cursor=pointer]
+            - button [ref=e224] [cursor=pointer]
+            - button [ref=e230] [cursor=pointer]
+            - button [ref=e233] [cursor=pointer]
+            - button [ref=e239] [cursor=pointer]:
+              - button [ref=e241]
+            - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=e250] [cursor=pointer]
+        - generic [ref=e257]:
+          - generic [ref=e262]:
+            - generic [ref=e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=e298]:
+            - button [ref=e299] [cursor=pointer]
+            - generic [ref=e306] [cursor=pointer]
+            - generic [ref=e310] [cursor=pointer]
+      - main [ref=e317]:
+        - generic [ref=e322]:
+          - generic [ref=e327]:
+            - generic [ref=e328]:
+              - generic [ref=e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=e337]:
+              - generic [ref=e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+            - generic [ref=e351]:
+              - generic [ref=e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=e360]:
+              - generic [ref=e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=e369]:
+              - generic [ref=e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+            - generic [ref=e383]:
+              - generic [ref=e384]: 鎵规鐘舵��
+              - generic [ref=e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=e393]:
+              - generic [ref=e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e403]:
+                  - img "swap-right" [ref=e404]
+                - textbox "缁撴潫鏃堕棿" [ref=e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e409]:
+              - generic [ref=e410]: 鍒涘缓鏃堕棿
+              - generic [ref=e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e419]:
+                  - img "swap-right" [ref=e420]
+                - textbox "缁撴潫鏃堕棿" [ref=e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e425]:
+              - button "閲� 缃�" [ref=e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+              - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=e437]:
+            - generic [ref=e439]:
+              - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=e444]:
+                - generic [ref=e446]:
+                  - button "鏂板鎵规" [ref=e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+                - button "顫�" [ref=e459] [cursor=pointer]
+              - generic [ref=e461]:
+                - button "瞟�" [ref=e462] [cursor=pointer]
+                - button "顪�" [ref=e464] [cursor=pointer]
+                - button "顦�" [ref=e466] [cursor=pointer]
+            - generic [ref=e470]:
+              - generic [ref=e473]:
+                - generic [ref=e474]:
+                  - table [ref=e478]:
+                    - rowgroup [ref=e493]:
+                      - row [ref=e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=e520]
+                        - columnheader "璐d换浜�" [ref=e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                        - columnheader "鎵规鐘舵��" [ref=e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+                  - generic [ref=e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=e553]:
+                    - table [ref=e556]:
+                      - rowgroup [ref=e571]:
+                        - row [ref=e572]:
+                          - columnheader "鎵规鍙�" [ref=e573]
+                    - generic [ref=e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=e580]:
+                    - table [ref=e583]:
+                      - rowgroup [ref=e598]:
+                        - row [ref=e599]:
+                          - columnheader "鎿嶄綔" [ref=e600]
+                    - generic [ref=e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=e621]:
+              - generic [ref=e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=e625]:
+                  - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+                - generic [ref=e627]: 睿�
+              - button "飱�" [ref=e630]
+              - button "顧�" [ref=e632]
+              - button "顫�" [ref=e634]
+              - button "1" [ref=e637] [cursor=pointer]
+              - button "顫�" [ref=e638]
+              - button "顧�" [ref=e640]
+              - button "顦�" [ref=e642]
+  - dialog [ref=e645]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=e647]
+    - generic [ref=e649]:
+      - generic [ref=e651]:
+        - generic [ref=e652]:
+          - generic [ref=e653]:
+            - generic [ref=e654]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=e661]: 閾濆悎瀵间綋
+        - generic [ref=e667]:
+          - generic [ref=e668]:
+            - generic [ref=e669]: "*"
+            - text: 浜х嚎
+          - generic [ref=e675]:
+            - combobox "* 浜х嚎" [ref=e677]
+            - generic [ref=e2075]:
+              - generic [ref=e2076]: 浜х嚎浜�
+              - generic [ref=e2077]: two
+        - generic [ref=e678]:
+          - generic [ref=e679]:
+            - generic [ref=e680]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=e686]:
+            - textbox "* 鐢熶骇鏃ユ湡" [active] [ref=e687]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+              - text: 2026-08-18 08:00:00
+            - generic:
+              - img "calendar"
+            - button [ref=e2082] [cursor=pointer]:
+              - img "close-circle" [ref=e2083]
+        - generic [ref=e688]:
+          - generic [ref=e689]: 璁″垝鏁伴噺
+          - generic [ref=e694]:
+            - generic [ref=e695]:
+              - button "Increase Value" [ref=e696] [cursor=pointer]:
+                - img "up" [ref=e697]
+              - button "Decrease Value" [ref=e700] [cursor=pointer]:
+                - img "down" [ref=e701]
+            - spinbutton "璁″垝鏁伴噺" [ref=e705]
+        - generic [ref=e706]:
+          - generic [ref=e707]:
+            - generic [ref=e708]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=e715]
+        - generic [ref=e721]:
+          - generic [ref=e722]: 澶囨敞
+          - textbox "澶囨敞" [ref=e727]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=e728]:
+        - generic [ref=e729]:
+          - generic [ref=e730]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=e731] [cursor=pointer]
+        - generic [ref=e743]:
+          - table [ref=e747]:
+            - rowgroup [ref=e753]:
+              - row [ref=e754]:
+                - columnheader "鐢熶骇浜哄憳" [ref=e755]
+                - columnheader "宀椾綅绫诲瀷" [ref=e760]
+                - columnheader "澶囨敞" [ref=e765]
+                - columnheader "鎿嶄綔" [ref=e770]
+          - table [ref=e806]:
+            - rowgroup [ref=e812]:
+              - row [ref=e1624]:
+                - cell [ref=e1604]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=e819]: "222"
+                - cell "缁勯暱" [ref=e1625]:
+                  - generic [ref=e829] [cursor=pointer]:
+                    - combobox [ref=e831]
+                    - generic "缁勯暱" [ref=e1623]
+                - cell [ref=e832]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=e835]
+                - cell [ref=e836]:
+                  - button "鍒犻櫎" [ref=e842] [cursor=pointer]
+    - button [ref=e786] [cursor=pointer]
+    - generic [ref=e796]:
+      - button "纭� 璁�" [ref=e797] [cursor=pointer]
+      - button "鍙� 娑�" [ref=e800] [cursor=pointer]
+    - button [ref=e802] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-13-18-864Z.yml b/.playwright-mcp/page-2026-08-18T08-13-18-864Z.yml
new file mode 100644
index 0000000..9a46f89
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-13-18-864Z.yml
@@ -0,0 +1,497 @@
+- generic [ref=e4]:
+  - generic [ref=e7]:
+    - complementary [ref=e8]:
+      - generic [ref=e9]:
+        - generic [ref=e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+          - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e22]:
+          - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+          - listitem [ref=e30]:
+            - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e39]:
+            - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=e46]:
+            - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=e53]:
+            - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=e61]:
+            - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=e70]:
+            - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=e78]:
+            - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+          - listitem [ref=e111]:
+            - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=e118]:
+            - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=e125]:
+            - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=e132]:
+            - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=e139]:
+            - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=e146]:
+            - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=e153]:
+            - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=e160]:
+            - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=e169] [cursor=pointer]
+    - generic [ref=e174]:
+      - generic [ref=e175]:
+        - banner [ref=e176]:
+          - button [ref=e177] [cursor=pointer]
+          - button [ref=e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e185]:
+            - list [ref=e186]:
+              - listitem [ref=e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=e192]
+              - listitem [ref=e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+          - generic [ref=e201]:
+            - generic [ref=e203] [cursor=pointer]:
+              - generic [ref=e207]: 鎼滅储
+              - generic [ref=e208]: Ctrl K
+            - button [ref=e210] [cursor=pointer]
+            - button "dark" [ref=e215] [cursor=pointer]
+            - button [ref=e224] [cursor=pointer]
+            - button [ref=e230] [cursor=pointer]
+            - button [ref=e233] [cursor=pointer]
+            - button [ref=e239] [cursor=pointer]:
+              - button [ref=e241]
+            - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=e250] [cursor=pointer]
+        - generic [ref=e257]:
+          - generic [ref=e262]:
+            - generic [ref=e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=e298]:
+            - button [ref=e299] [cursor=pointer]
+            - generic [ref=e306] [cursor=pointer]
+            - generic [ref=e310] [cursor=pointer]
+      - main [ref=e317]:
+        - generic [ref=e322]:
+          - generic [ref=e327]:
+            - generic [ref=e328]:
+              - generic [ref=e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=e337]:
+              - generic [ref=e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+            - generic [ref=e351]:
+              - generic [ref=e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=e360]:
+              - generic [ref=e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=e369]:
+              - generic [ref=e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+            - generic [ref=e383]:
+              - generic [ref=e384]: 鎵规鐘舵��
+              - generic [ref=e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=e393]:
+              - generic [ref=e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e403]:
+                  - img "swap-right" [ref=e404]
+                - textbox "缁撴潫鏃堕棿" [ref=e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e409]:
+              - generic [ref=e410]: 鍒涘缓鏃堕棿
+              - generic [ref=e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e419]:
+                  - img "swap-right" [ref=e420]
+                - textbox "缁撴潫鏃堕棿" [ref=e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e425]:
+              - button "閲� 缃�" [ref=e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+              - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=e437]:
+            - generic [ref=e439]:
+              - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=e444]:
+                - generic [ref=e446]:
+                  - button "鏂板鎵规" [ref=e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+                - button "顫�" [ref=e459] [cursor=pointer]
+              - generic [ref=e461]:
+                - button "瞟�" [ref=e462] [cursor=pointer]
+                - button "顪�" [ref=e464] [cursor=pointer]
+                - button "顦�" [ref=e466] [cursor=pointer]
+            - generic [ref=e470]:
+              - generic [ref=e473]:
+                - generic [ref=e474]:
+                  - table [ref=e478]:
+                    - rowgroup [ref=e493]:
+                      - row [ref=e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=e520]
+                        - columnheader "璐d换浜�" [ref=e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                        - columnheader "鎵规鐘舵��" [ref=e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+                  - generic [ref=e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=e553]:
+                    - table [ref=e556]:
+                      - rowgroup [ref=e571]:
+                        - row [ref=e572]:
+                          - columnheader "鎵规鍙�" [ref=e573]
+                    - generic [ref=e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=e580]:
+                    - table [ref=e583]:
+                      - rowgroup [ref=e598]:
+                        - row [ref=e599]:
+                          - columnheader "鎿嶄綔" [ref=e600]
+                    - generic [ref=e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=e621]:
+              - generic [ref=e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=e625]:
+                  - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+                - generic [ref=e627]: 睿�
+              - button "飱�" [ref=e630]
+              - button "顧�" [ref=e632]
+              - button "顫�" [ref=e634]
+              - button "1" [ref=e637] [cursor=pointer]
+              - button "顫�" [ref=e638]
+              - button "顧�" [ref=e640]
+              - button "顦�" [ref=e642]
+  - dialog [ref=e645]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=e647]
+    - generic [ref=e649]:
+      - generic [ref=e651]:
+        - generic [ref=e652]:
+          - generic [ref=e653]:
+            - generic [ref=e654]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=e661]: 閾濆悎瀵间綋
+        - generic [ref=e667]:
+          - generic [ref=e668]:
+            - generic [ref=e669]: "*"
+            - text: 浜х嚎
+          - generic [ref=e675]:
+            - combobox "* 浜х嚎" [ref=e677]
+            - generic [ref=e2075]:
+              - generic [ref=e2076]: 浜х嚎浜�
+              - generic [ref=e2077]: two
+        - generic [ref=e678]:
+          - generic [ref=e679]:
+            - generic [ref=e680]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=e686]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=e687]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+              - text: 2026-08-18 08:00:00
+            - generic:
+              - img "calendar"
+            - button [ref=e2082] [cursor=pointer]:
+              - img "close-circle" [ref=e2083]
+        - generic [ref=e688]:
+          - generic [ref=e689]: 璁″垝鏁伴噺
+          - generic [ref=e694]:
+            - generic [ref=e695]:
+              - button "Increase Value" [ref=e696] [cursor=pointer]:
+                - img "up" [ref=e697]
+              - button "Decrease Value" [ref=e700] [cursor=pointer]:
+                - img "down" [ref=e701]
+            - spinbutton "璁″垝鏁伴噺" [ref=e705]: "100.00"
+        - generic [ref=e706]:
+          - generic [ref=e707]:
+            - generic [ref=e708]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=e715]: 瓒呯骇绠$悊鍛�
+        - generic [ref=e721]:
+          - generic [ref=e722]: 澶囨敞
+          - textbox "澶囨敞" [ref=e727]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=e728]:
+        - generic [ref=e729]:
+          - generic [ref=e730]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=e731] [cursor=pointer]
+        - generic [ref=e743]:
+          - table [ref=e747]:
+            - rowgroup [ref=e753]:
+              - row [ref=e754]:
+                - columnheader "鐢熶骇浜哄憳" [ref=e755]
+                - columnheader "宀椾綅绫诲瀷" [ref=e760]
+                - columnheader "澶囨敞" [ref=e765]
+                - columnheader "鎿嶄綔" [ref=e770]
+          - table [ref=e806]:
+            - rowgroup [ref=e812]:
+              - row [ref=e1624]:
+                - cell [ref=e1604]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=e819]: "222"
+                - cell "缁勯暱" [ref=e1625]:
+                  - generic [ref=e829] [cursor=pointer]:
+                    - combobox [ref=e831]
+                    - generic "缁勯暱" [ref=e1623]
+                - cell [ref=e832]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=e835]
+                - cell [ref=e836]:
+                  - button "鍒犻櫎" [ref=e842] [cursor=pointer]
+    - button [ref=e786] [cursor=pointer]
+    - generic [ref=e796]:
+      - button "纭� 璁�" [ref=e797] [cursor=pointer]
+      - button "鍙� 娑�" [ref=e800] [cursor=pointer]
+    - button [ref=e802] [cursor=pointer]
+  - dialog "浜哄憳閫夋嫨" [ref=e2090]:
+    - document:
+      - generic [ref=e2091]:
+        - button "Close" [ref=e2092] [cursor=pointer]:
+          - img "close" [ref=e2094]
+        - generic [ref=e2097]: 浜哄憳閫夋嫨
+        - generic [ref=e2100]:
+          - generic [ref=e2102]:
+            - textbox "鎼滅储閮ㄩ棬" [ref=e2109]
+            - tree [ref=e2113]:
+              - generic:
+                - textbox "for screen reader"
+              - generic [ref=e2117]:
+                - generic [ref=e2118]:
+                  - img "caret-down" [ref=e2120] [cursor=pointer]
+                  - generic "鎬诲叕鍙�" [ref=e2123] [cursor=pointer]
+                - generic [ref=e2124]:
+                  - img "caret-down" [ref=e2127] [cursor=pointer]
+                  - generic "娣卞湷鎬诲叕鍙�" [ref=e2130] [cursor=pointer]
+                - generic "鐮斿彂閮ㄩ棬" [ref=e2134] [cursor=pointer]
+                - generic "甯傚満閮ㄩ棬" [ref=e2138] [cursor=pointer]
+                - generic "娴嬭瘯閮ㄩ棬" [ref=e2142] [cursor=pointer]
+                - generic "璐㈠姟閮ㄩ棬" [ref=e2146] [cursor=pointer]
+                - generic "杩愮淮閮ㄩ棬" [ref=e2150] [cursor=pointer]
+                - generic [ref=e2151]:
+                  - img "caret-down" [ref=e2154] [cursor=pointer]
+                  - generic "闀挎矙鍒嗗叕鍙�" [ref=e2157] [cursor=pointer]
+                - generic "甯傚満閮ㄩ棬" [ref=e2161] [cursor=pointer]
+                - generic "璐㈠姟閮ㄩ棬" [ref=e2165] [cursor=pointer]
+                - generic "鏂伴儴闂�" [ref=e2168] [cursor=pointer]
+                - generic "椤剁骇閮ㄩ棬" [ref=e2171] [cursor=pointer]
+                - generic "鏌愪釜瀛愰儴闂�" [ref=e2174] [cursor=pointer]
+                - generic "鏌愪釜瀛愰儴闂� 2" [ref=e2177] [cursor=pointer]
+          - generic [ref=e2180]:
+            - generic [ref=e2185]:
+              - generic [ref=e2186]:
+                - generic [ref=e2187]: 鐢ㄦ埛鍚嶇О
+                - textbox "鐢ㄦ埛鍚嶇О" [ref=e2193]:
+                  - /placeholder: 璇疯緭鍏ョ敤鎴峰悕绉�
+              - generic [ref=e2195]:
+                - generic [ref=e2196]: 鐢ㄦ埛鏄电О
+                - textbox "鐢ㄦ埛鏄电О" [ref=e2202]:
+                  - /placeholder: 璇疯緭鍏ョ敤鎴锋樀绉�
+              - generic [ref=e2204]:
+                - generic [ref=e2205]: 鎵嬫満鍙风爜
+                - textbox "鎵嬫満鍙风爜" [ref=e2211]:
+                  - /placeholder: 璇疯緭鍏ユ墜鏈哄彿鐮�
+              - generic [ref=e2213]:
+                - generic [ref=e2214]: 鐘舵��
+                - generic [ref=e2220] [cursor=pointer]:
+                  - combobox "鐘舵��" [ref=e2222]
+                  - generic "寮�鍚�" [ref=e2223]
+              - generic [ref=e2228]:
+                - button "閲� 缃�" [ref=e2229] [cursor=pointer]
+                - button "鎼� 绱�" [ref=e2231] [cursor=pointer]
+                - generic [ref=e2233] [cursor=pointer]: 鏀惰捣
+            - generic [ref=e2240]:
+              - generic [ref=e2242]:
+                - generic [ref=e2243]: 鐢ㄦ埛鍒楄〃
+                - button "顫�" [ref=e2248] [cursor=pointer]
+                - generic [ref=e2250]:
+                  - button "瞟�" [ref=e2251] [cursor=pointer]
+                  - button "顪�" [ref=e2253] [cursor=pointer]
+                  - button "顦�" [ref=e2255] [cursor=pointer]
+              - generic [ref=e2263]:
+                - table [ref=e2267]:
+                  - rowgroup [ref=e2275]:
+                    - row "鐢ㄦ埛缂栧彿 鐢ㄦ埛鍚嶇О 鐢ㄦ埛鏄电О 鎵嬫満鍙风爜 鐘舵��" [ref=e2276]:
+                      - columnheader [ref=e2277]
+                      - columnheader "鐢ㄦ埛缂栧彿" [ref=e2280]
+                      - columnheader "鐢ㄦ埛鍚嶇О" [ref=e2285]
+                      - columnheader "鐢ㄦ埛鏄电О" [ref=e2290]
+                      - columnheader "鎵嬫満鍙风爜" [ref=e2295]
+                      - columnheader "鐘舵��" [ref=e2300]
+                - table [ref=e2308]:
+                  - rowgroup [ref=e2316]:
+                    - row [ref=e2317]:
+                      - cell "顭�" [ref=e2318]
+                      - cell "230" [ref=e2323]
+                      - cell "18333333333" [ref=e2327]
+                      - cell "222" [ref=e2331]
+                      - cell "18333333333" [ref=e2335]
+                      - cell "寮�鍚�" [ref=e2339]
+                    - row [ref=e2343]:
+                      - cell "顭�" [ref=e2344]
+                      - cell "229" [ref=e2349]
+                      - cell "15822054764" [ref=e2353]
+                      - cell "鏀惧亣" [ref=e2357]
+                      - cell "15822054764" [ref=e2361]
+                      - cell "寮�鍚�" [ref=e2365]
+                    - row [ref=e2369]:
+                      - cell "顭�" [ref=e2370]
+                      - cell "228" [ref=e2375]
+                      - cell "15822054766" [ref=e2379]
+                      - cell "涓嶆兂涓婄彮" [ref=e2383]
+                      - cell "15822054766" [ref=e2387]
+                      - cell "寮�鍚�" [ref=e2391]
+                    - row [ref=e2395]:
+                      - cell "顭�" [ref=e2396]
+                      - cell "227" [ref=e2401]
+                      - cell "15822054767" [ref=e2405]
+                      - cell "澶ф槑鏄�" [ref=e2409]
+                      - cell "15822054767" [ref=e2413]
+                      - cell "寮�鍚�" [ref=e2417]
+                    - row [ref=e2421]:
+                      - cell "顭�" [ref=e2422]
+                      - cell "226" [ref=e2427]
+                      - cell "15822054763" [ref=e2431]
+                      - cell "鍗冨厠" [ref=e2435]
+                      - cell "15822054763" [ref=e2439]
+                      - cell "寮�鍚�" [ref=e2443]
+                    - row [ref=e2447]:
+                      - cell "顭�" [ref=e2448]
+                      - cell "225" [ref=e2453]
+                      - cell "15822054762" [ref=e2457]
+                      - cell "鍗楃摐瀛�" [ref=e2461]
+                      - cell "15822054762" [ref=e2465]
+                      - cell "寮�鍚�" [ref=e2469]
+                    - row "顭� 144 aoteman001 aoteman00112 鍏抽棴" [ref=e2473]:
+                      - cell "顭�" [ref=e2474]
+                      - cell "144" [ref=e2479]
+                      - cell "aoteman001" [ref=e2483]
+                      - cell "aoteman00112" [ref=e2487]
+                      - cell [ref=e2491]
+                      - cell "鍏抽棴" [ref=e2495]
+                    - row "顭� 143 a00001 a00001 寮�鍚�" [ref=e2499]:
+                      - cell "顭�" [ref=e2500]
+                      - cell "143" [ref=e2505]
+                      - cell "a00001" [ref=e2509]
+                      - cell "a00001" [ref=e2513]
+                      - cell [ref=e2517]
+                      - cell "寮�鍚�" [ref=e2521]
+                    - row [ref=e2525]:
+                      - cell "顭�" [ref=e2526]
+                      - cell "142" [ref=e2531]
+                      - cell "test01" [ref=e2535]
+                      - cell "test01" [ref=e2539]
+                      - cell "19021719925" [ref=e2543]
+                      - cell "寮�鍚�" [ref=e2547]
+                    - row "顭� 141 admin1 鏂扮敤鎴� 寮�鍚�" [ref=e2551]:
+                      - cell "顭�" [ref=e2552]
+                      - cell "141" [ref=e2557]
+                      - cell "admin1" [ref=e2561]
+                      - cell "鏂扮敤鎴�" [ref=e2565]
+                      - cell [ref=e2569]
+                      - cell "寮�鍚�" [ref=e2573]
+                    - row "顭� 139 wwbwwb 灏忕澶� 寮�鍚�" [ref=e2577]:
+                      - cell "顭�" [ref=e2578]
+                      - cell "139" [ref=e2583]
+                      - cell "wwbwwb" [ref=e2587]
+                      - cell "灏忕澶�" [ref=e2591]
+                      - cell [ref=e2595]
+                      - cell "寮�鍚�" [ref=e2599]
+                    - row [ref=e2603]:
+                      - cell "顭�" [ref=e2604]
+                      - cell "118" [ref=e2609]
+                      - cell "goudan" [ref=e2613]
+                      - cell "鐙楄泲" [ref=e2617]
+                      - cell "15601691239" [ref=e2621]
+                      - cell "寮�鍚�" [ref=e2625]
+                    - row [ref=e2629]:
+                      - cell "顭�" [ref=e2630]
+                      - cell "117" [ref=e2635]
+                      - cell "admin123" [ref=e2639]
+                      - cell "娴嬭瘯鍙�02" [ref=e2643]
+                      - cell "15601691234" [ref=e2647]
+                      - cell "寮�鍚�" [ref=e2651]
+                    - row [ref=e2655]:
+                      - cell "顭�" [ref=e2656]
+                      - cell "115" [ref=e2661]
+                      - cell "aotemane" [ref=e2665]
+                      - cell "闃垮憜" [ref=e2669]
+                      - cell "15601691229" [ref=e2673]
+                      - cell "寮�鍚�" [ref=e2677]
+                    - row [ref=e2681]:
+                      - cell "顭�" [ref=e2682]
+                      - cell "114" [ref=e2687]
+                      - cell "hrmgr" [ref=e2691]
+                      - cell "hr 灏忓濮�" [ref=e2695]
+                      - cell "15601691236" [ref=e2699]
+                      - cell "寮�鍚�" [ref=e2703]
+                    - row [ref=e2707]:
+                      - cell "顭�" [ref=e2708]
+                      - cell "113" [ref=e2713]
+                      - cell "aoteman" [ref=e2717]
+                      - cell "绠$悊鍛�1" [ref=e2721]
+                      - cell "15601691300" [ref=e2725]
+                      - cell "寮�鍚�" [ref=e2729]
+                    - row [ref=e2733]:
+                      - cell "顭�" [ref=e2734]
+                      - cell "112" [ref=e2739]
+                      - cell "newobject" [ref=e2743]
+                      - cell "鏂板璞�" [ref=e2747]
+                      - cell "15601691235" [ref=e2751]
+                      - cell "寮�鍚�" [ref=e2755]
+                    - row "顭� 111 test 娴嬭瘯鐢ㄦ埛 寮�鍚�" [ref=e2759]:
+                      - cell "顭�" [ref=e2760]
+                      - cell "111" [ref=e2765]
+                      - cell "test" [ref=e2769]
+                      - cell "娴嬭瘯鐢ㄦ埛" [ref=e2773]
+                      - cell [ref=e2777]
+                      - cell "寮�鍚�" [ref=e2781]
+                    - row [ref=e2785]:
+                      - cell "顭�" [ref=e2786]
+                      - cell "1" [ref=e2791]
+                      - cell "admin" [ref=e2795]
+                      - cell "瓒呯骇绠$悊鍛�" [ref=e2799]
+                      - cell "18818260272" [ref=e2803]
+                      - cell "寮�鍚�" [ref=e2807]
+              - generic [ref=e2818]:
+                - generic [ref=e2819]: 鍏� 19 鏉¤褰�
+                - generic [ref=e2821] [cursor=pointer]:
+                  - generic "20鏉�/椤�" [ref=e2822]:
+                    - textbox "璇烽�夋嫨" [ref=e2823]: 20鏉�/椤�
+                  - generic [ref=e2824]: 睿�
+                - button "飱�" [ref=e2827]
+                - button "顧�" [ref=e2829]
+                - button "顫�" [ref=e2831]
+                - button "1" [ref=e2834] [cursor=pointer]
+                - button "顫�" [ref=e2835]
+                - button "顧�" [ref=e2837]
+                - button "顦�" [ref=e2839]
+        - generic [ref=e2841]:
+          - button "鍙� 娑�" [ref=e2842] [cursor=pointer]
+          - button "纭� 瀹�" [ref=e2844] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-13-38-423Z.yml b/.playwright-mcp/page-2026-08-18T08-13-38-423Z.yml
new file mode 100644
index 0000000..b266bc3
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-13-38-423Z.yml
@@ -0,0 +1,275 @@
+- generic [ref=e4]:
+  - generic [ref=e7]:
+    - complementary [ref=e8]:
+      - generic [ref=e9]:
+        - generic [ref=e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+          - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e22]:
+          - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+          - listitem [ref=e30]:
+            - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e39]:
+            - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=e46]:
+            - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=e53]:
+            - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=e61]:
+            - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=e70]:
+            - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=e78]:
+            - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+          - listitem [ref=e111]:
+            - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=e118]:
+            - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=e125]:
+            - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=e132]:
+            - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=e139]:
+            - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=e146]:
+            - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=e153]:
+            - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=e160]:
+            - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=e169] [cursor=pointer]
+    - generic [ref=e174]:
+      - generic [ref=e175]:
+        - banner [ref=e176]:
+          - button [ref=e177] [cursor=pointer]
+          - button [ref=e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e185]:
+            - list [ref=e186]:
+              - listitem [ref=e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=e192]
+              - listitem [ref=e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+          - generic [ref=e201]:
+            - generic [ref=e203] [cursor=pointer]:
+              - generic [ref=e207]: 鎼滅储
+              - generic [ref=e208]: Ctrl K
+            - button [ref=e210] [cursor=pointer]
+            - button "dark" [ref=e215] [cursor=pointer]
+            - button [ref=e224] [cursor=pointer]
+            - button [ref=e230] [cursor=pointer]
+            - button [ref=e233] [cursor=pointer]
+            - button [ref=e239] [cursor=pointer]:
+              - button [ref=e241]
+            - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=e250] [cursor=pointer]
+        - generic [ref=e257]:
+          - generic [ref=e262]:
+            - generic [ref=e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=e298]:
+            - button [ref=e299] [cursor=pointer]
+            - generic [ref=e306] [cursor=pointer]
+            - generic [ref=e310] [cursor=pointer]
+      - main [ref=e317]:
+        - generic [ref=e322]:
+          - generic [ref=e327]:
+            - generic [ref=e328]:
+              - generic [ref=e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=e337]:
+              - generic [ref=e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+            - generic [ref=e351]:
+              - generic [ref=e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=e360]:
+              - generic [ref=e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=e369]:
+              - generic [ref=e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+            - generic [ref=e383]:
+              - generic [ref=e384]: 鎵规鐘舵��
+              - generic [ref=e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=e393]:
+              - generic [ref=e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e403]:
+                  - img "swap-right" [ref=e404]
+                - textbox "缁撴潫鏃堕棿" [ref=e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e409]:
+              - generic [ref=e410]: 鍒涘缓鏃堕棿
+              - generic [ref=e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e419]:
+                  - img "swap-right" [ref=e420]
+                - textbox "缁撴潫鏃堕棿" [ref=e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e425]:
+              - button "閲� 缃�" [ref=e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+              - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=e437]:
+            - generic [ref=e439]:
+              - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=e444]:
+                - generic [ref=e446]:
+                  - button "鏂板鎵规" [ref=e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+                - button "顫�" [ref=e459] [cursor=pointer]
+              - generic [ref=e461]:
+                - button "瞟�" [ref=e462] [cursor=pointer]
+                - button "顪�" [ref=e464] [cursor=pointer]
+                - button "顦�" [ref=e466] [cursor=pointer]
+            - generic [ref=e470]:
+              - generic [ref=e473]:
+                - generic [ref=e474]:
+                  - table [ref=e478]:
+                    - rowgroup [ref=e493]:
+                      - row [ref=e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=e520]
+                        - columnheader "璐d换浜�" [ref=e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                        - columnheader "鎵规鐘舵��" [ref=e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+                  - generic [ref=e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=e553]:
+                    - table [ref=e556]:
+                      - rowgroup [ref=e571]:
+                        - row [ref=e572]:
+                          - columnheader "鎵规鍙�" [ref=e573]
+                    - generic [ref=e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=e580]:
+                    - table [ref=e583]:
+                      - rowgroup [ref=e598]:
+                        - row [ref=e599]:
+                          - columnheader "鎿嶄綔" [ref=e600]
+                    - generic [ref=e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=e621]:
+              - generic [ref=e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=e625]:
+                  - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+                - generic [ref=e627]: 睿�
+              - button "飱�" [ref=e630]
+              - button "顧�" [ref=e632]
+              - button "顫�" [ref=e634]
+              - button "1" [ref=e637] [cursor=pointer]
+              - button "顫�" [ref=e638]
+              - button "顧�" [ref=e640]
+              - button "顦�" [ref=e642]
+  - generic [ref=e2847]:
+    - img "exclamation-circle" [ref=e2848]
+    - text: 璇疯嚦灏戦厤缃竴鍚嶇敓浜т汉鍛�
+  - dialog [ref=e645]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=e647]
+    - generic [ref=e649]:
+      - generic [ref=e651]:
+        - generic [ref=e652]:
+          - generic [ref=e653]:
+            - generic [ref=e654]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=e661]: 閾濆悎瀵间綋
+        - generic [ref=e667]:
+          - generic [ref=e668]:
+            - generic [ref=e669]: "*"
+            - text: 浜х嚎
+          - generic [ref=e675]:
+            - combobox "* 浜х嚎" [ref=e677]
+            - generic [ref=e2075]:
+              - generic [ref=e2076]: 浜х嚎浜�
+              - generic [ref=e2077]: two
+        - generic [ref=e678]:
+          - generic [ref=e679]:
+            - generic [ref=e680]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=e686]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=e687]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+              - text: 2026-08-18 08:00:00
+            - generic:
+              - img "calendar"
+            - button [ref=e2082] [cursor=pointer]:
+              - img "close-circle" [ref=e2083]
+        - generic [ref=e688]:
+          - generic [ref=e689]: 璁″垝鏁伴噺
+          - generic [ref=e694]:
+            - generic [ref=e695]:
+              - button "Increase Value" [ref=e696] [cursor=pointer]:
+                - img "up" [ref=e697]
+              - button "Decrease Value" [ref=e700] [cursor=pointer]:
+                - img "down" [ref=e701]
+            - spinbutton "璁″垝鏁伴噺" [ref=e705]: "100.00"
+        - generic [ref=e706]:
+          - generic [ref=e707]:
+            - generic [ref=e708]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=e715]: 瓒呯骇绠$悊鍛�
+        - generic [ref=e721]:
+          - generic [ref=e722]: 澶囨敞
+          - textbox "澶囨敞" [ref=e727]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=e728]:
+        - generic [ref=e729]:
+          - generic [ref=e730]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=e731] [cursor=pointer]
+        - generic [ref=e743]:
+          - table [ref=e747]:
+            - rowgroup [ref=e753]:
+              - row [ref=e754]:
+                - columnheader "鐢熶骇浜哄憳" [ref=e755]
+                - columnheader "宀椾綅绫诲瀷" [ref=e760]
+                - columnheader "澶囨敞" [ref=e765]
+                - columnheader "鎿嶄綔" [ref=e770]
+          - table [ref=e806]:
+            - rowgroup [ref=e812]:
+              - row [ref=e1624]:
+                - cell [ref=e1604]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=e819]: "222"
+                - cell "缁勯暱" [ref=e1625]:
+                  - generic [ref=e829] [cursor=pointer]:
+                    - combobox [ref=e831]
+                    - generic "缁勯暱" [ref=e1623]
+                - cell [ref=e832]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=e835]
+                - cell [ref=e836]:
+                  - button "鍒犻櫎" [ref=e842] [cursor=pointer]
+    - button [ref=e786] [cursor=pointer]
+    - generic [ref=e796]:
+      - button "纭� 璁�" [active] [ref=e797] [cursor=pointer]
+      - button "鍙� 娑�" [ref=e800] [cursor=pointer]
+    - button [ref=e802] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-19-51-138Z.yml b/.playwright-mcp/page-2026-08-18T08-19-51-138Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-19-51-138Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-21-00-151Z.yml b/.playwright-mcp/page-2026-08-18T08-21-00-151Z.yml
new file mode 100644
index 0000000..575f5f5
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-21-00-151Z.yml
@@ -0,0 +1,197 @@
+- generic [ref=f1e4]:
+  - generic [ref=f1e7]:
+    - complementary [ref=f1e8]:
+      - generic [ref=f1e9]:
+        - generic [ref=f1e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e18]
+          - generic [ref=f1e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f1e22]:
+          - menuitem "棣栭〉" [ref=f1e23] [cursor=pointer]
+          - listitem [ref=f1e30]:
+            - generic [ref=f1e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f1e39]:
+            - generic [ref=f1e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=f1e46]:
+            - generic [ref=f1e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=f1e53]:
+            - generic [ref=f1e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=f1e61]:
+            - generic [ref=f1e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f1e70]:
+            - generic [ref=f1e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=f1e78]:
+            - generic [ref=f1e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f1e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f1e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f1e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f1e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f1e104] [cursor=pointer]
+          - listitem [ref=f1e111]:
+            - generic [ref=f1e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f1e118]:
+            - generic [ref=f1e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=f1e125]:
+            - generic [ref=f1e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=f1e132]:
+            - generic [ref=f1e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=f1e139]:
+            - generic [ref=f1e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=f1e146]:
+            - generic [ref=f1e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=f1e153]:
+            - generic [ref=f1e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=f1e160]:
+            - generic [ref=f1e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=f1e169] [cursor=pointer]
+    - generic [ref=f1e174]:
+      - generic [ref=f1e175]:
+        - banner [ref=f1e176]:
+          - button [ref=f1e177] [cursor=pointer]
+          - button [ref=f1e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f1e185]:
+            - list [ref=f1e186]:
+              - listitem [ref=f1e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f1e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f1e192]
+              - listitem [ref=f1e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f1e196]
+          - generic [ref=f1e201]:
+            - generic [ref=f1e203] [cursor=pointer]:
+              - generic [ref=f1e207]: 鎼滅储
+              - generic [ref=f1e208]: Ctrl K
+            - button [ref=f1e210] [cursor=pointer]
+            - button "dark" [ref=f1e215] [cursor=pointer]
+            - button [ref=f1e224] [cursor=pointer]
+            - button [ref=f1e230] [cursor=pointer]
+            - button [ref=f1e233] [cursor=pointer]
+            - button [ref=f1e239] [cursor=pointer]:
+              - button [ref=f1e241]
+            - button "宸ヤ綔鍙�" [ref=f1e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f1e250] [cursor=pointer]
+        - generic [ref=f1e257]:
+          - generic [ref=f1e262]:
+            - generic [ref=f1e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=f1e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f1e298]:
+            - button [ref=f1e299] [cursor=pointer]
+            - generic [ref=f1e306] [cursor=pointer]
+            - generic [ref=f1e310] [cursor=pointer]
+      - main [ref=f1e317]:
+        - generic [ref=f1e322]:
+          - generic [ref=f1e327]:
+            - generic [ref=f1e328]:
+              - generic [ref=f1e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f1e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f1e337]:
+              - generic [ref=f1e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f1e345]
+            - generic [ref=f1e351]:
+              - generic [ref=f1e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f1e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f1e360]:
+              - generic [ref=f1e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f1e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f1e369]:
+              - generic [ref=f1e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e377]
+            - generic [ref=f1e383]:
+              - generic [ref=f1e384]: 鎵规鐘舵��
+              - generic [ref=f1e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f1e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f1e393]:
+              - generic [ref=f1e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=f1e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f1e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e403]:
+                  - img "swap-right" [ref=f1e404]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e409]:
+              - generic [ref=f1e410]: 鍒涘缓鏃堕棿
+              - generic [ref=f1e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f1e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e419]:
+                  - img "swap-right" [ref=f1e420]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e425]:
+              - button "閲� 缃�" [ref=f1e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f1e428] [cursor=pointer]
+              - generic [ref=f1e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f1e437]:
+            - generic [ref=f1e439]:
+              - generic [ref=f1e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f1e444]:
+                - generic [ref=f1e446]:
+                  - button "鏂板鎵规" [active] [ref=f1e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f1e453] [cursor=pointer]
+                - button "顫�" [ref=f1e459] [cursor=pointer]
+              - generic [ref=f1e461]:
+                - button "瞟�" [ref=f1e462] [cursor=pointer]
+                - button "顪�" [ref=f1e464] [cursor=pointer]
+                - button "顦�" [ref=f1e466] [cursor=pointer]
+            - generic [ref=f1e470]:
+              - generic [ref=f1e473]:
+                - generic [ref=f1e474]:
+                  - table [ref=f1e478]:
+                    - rowgroup [ref=f1e493]:
+                      - row [ref=f1e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=f1e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=f1e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=f1e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=f1e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=f1e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=f1e520]
+                        - columnheader "璐d换浜�" [ref=f1e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=f1e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=f1e535]
+                        - columnheader "鎵规鐘舵��" [ref=f1e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=f1e545]
+                  - generic [ref=f1e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=f1e553]:
+                    - table [ref=f1e556]:
+                      - rowgroup [ref=f1e571]:
+                        - row [ref=f1e572]:
+                          - columnheader "鎵规鍙�" [ref=f1e573]
+                    - generic [ref=f1e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=f1e580]:
+                    - table [ref=f1e583]:
+                      - rowgroup [ref=f1e598]:
+                        - row [ref=f1e599]:
+                          - columnheader "鎿嶄綔" [ref=f1e600]
+                    - generic [ref=f1e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=f1e621]:
+              - generic [ref=f1e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=f1e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f1e625]:
+                  - textbox "璇烽�夋嫨" [ref=f1e626]: 20鏉�/椤�
+                - generic [ref=f1e627]: 睿�
+              - button "飱�" [ref=f1e630]
+              - button "顧�" [ref=f1e632]
+              - button "顫�" [ref=f1e634]
+              - button "1" [ref=f1e637] [cursor=pointer]
+              - button "顫�" [ref=f1e638]
+              - button "顧�" [ref=f1e640]
+              - button "顦�" [ref=f1e642]
+  - generic [ref=f1e885]:
+    - img "exclamation-circle" [ref=f1e886]
+    - text: 璇疯嚦灏戦厤缃竴鍚嶇敓浜т汉鍛�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-21-47-467Z.yml b/.playwright-mcp/page-2026-08-18T08-21-47-467Z.yml
new file mode 100644
index 0000000..46e6ac0
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-21-47-467Z.yml
@@ -0,0 +1,267 @@
+- generic [ref=f1e4]:
+  - generic [ref=f1e7]:
+    - complementary [ref=f1e8]:
+      - generic [ref=f1e9]:
+        - generic [ref=f1e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e18]
+          - generic [ref=f1e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f1e22]:
+          - menuitem "棣栭〉" [ref=f1e23] [cursor=pointer]
+          - listitem [ref=f1e30]:
+            - generic [ref=f1e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f1e39]:
+            - generic [ref=f1e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=f1e46]:
+            - generic [ref=f1e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=f1e53]:
+            - generic [ref=f1e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=f1e61]:
+            - generic [ref=f1e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f1e70]:
+            - generic [ref=f1e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=f1e78]:
+            - generic [ref=f1e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f1e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f1e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f1e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f1e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f1e104] [cursor=pointer]
+          - listitem [ref=f1e111]:
+            - generic [ref=f1e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f1e118]:
+            - generic [ref=f1e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=f1e125]:
+            - generic [ref=f1e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=f1e132]:
+            - generic [ref=f1e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=f1e139]:
+            - generic [ref=f1e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=f1e146]:
+            - generic [ref=f1e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=f1e153]:
+            - generic [ref=f1e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=f1e160]:
+            - generic [ref=f1e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=f1e169] [cursor=pointer]
+    - generic [ref=f1e174]:
+      - generic [ref=f1e175]:
+        - banner [ref=f1e176]:
+          - button [ref=f1e177] [cursor=pointer]
+          - button [ref=f1e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f1e185]:
+            - list [ref=f1e186]:
+              - listitem [ref=f1e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f1e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f1e192]
+              - listitem [ref=f1e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f1e196]
+          - generic [ref=f1e201]:
+            - generic [ref=f1e203] [cursor=pointer]:
+              - generic [ref=f1e207]: 鎼滅储
+              - generic [ref=f1e208]: Ctrl K
+            - button [ref=f1e210] [cursor=pointer]
+            - button "dark" [ref=f1e215] [cursor=pointer]
+            - button [ref=f1e224] [cursor=pointer]
+            - button [ref=f1e230] [cursor=pointer]
+            - button [ref=f1e233] [cursor=pointer]
+            - button [ref=f1e239] [cursor=pointer]:
+              - button [ref=f1e241]
+            - button "宸ヤ綔鍙�" [ref=f1e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f1e250] [cursor=pointer]
+        - generic [ref=f1e257]:
+          - generic [ref=f1e262]:
+            - generic [ref=f1e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=f1e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f1e298]:
+            - button [ref=f1e299] [cursor=pointer]
+            - generic [ref=f1e306] [cursor=pointer]
+            - generic [ref=f1e310] [cursor=pointer]
+      - main [ref=f1e317]:
+        - generic [ref=f1e322]:
+          - generic [ref=f1e327]:
+            - generic [ref=f1e328]:
+              - generic [ref=f1e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f1e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f1e337]:
+              - generic [ref=f1e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f1e345]
+            - generic [ref=f1e351]:
+              - generic [ref=f1e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f1e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f1e360]:
+              - generic [ref=f1e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f1e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f1e369]:
+              - generic [ref=f1e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e377]
+            - generic [ref=f1e383]:
+              - generic [ref=f1e384]: 鎵规鐘舵��
+              - generic [ref=f1e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f1e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f1e393]:
+              - generic [ref=f1e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=f1e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f1e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e403]:
+                  - img "swap-right" [ref=f1e404]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e409]:
+              - generic [ref=f1e410]: 鍒涘缓鏃堕棿
+              - generic [ref=f1e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f1e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e419]:
+                  - img "swap-right" [ref=f1e420]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e425]:
+              - button "閲� 缃�" [ref=f1e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f1e428] [cursor=pointer]
+              - generic [ref=f1e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f1e437]:
+            - generic [ref=f1e439]:
+              - generic [ref=f1e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f1e444]:
+                - generic [ref=f1e446]:
+                  - button "鏂板鎵规" [ref=f1e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f1e453] [cursor=pointer]
+                - button "顫�" [ref=f1e459] [cursor=pointer]
+              - generic [ref=f1e461]:
+                - button "瞟�" [ref=f1e462] [cursor=pointer]
+                - button "顪�" [ref=f1e464] [cursor=pointer]
+                - button "顦�" [ref=f1e466] [cursor=pointer]
+            - generic [ref=f1e470]:
+              - generic [ref=f1e473]:
+                - generic [ref=f1e474]:
+                  - table [ref=f1e478]:
+                    - rowgroup [ref=f1e493]:
+                      - row [ref=f1e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=f1e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=f1e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=f1e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=f1e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=f1e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=f1e520]
+                        - columnheader "璐d换浜�" [ref=f1e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=f1e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=f1e535]
+                        - columnheader "鎵规鐘舵��" [ref=f1e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=f1e545]
+                  - generic [ref=f1e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=f1e553]:
+                    - table [ref=f1e556]:
+                      - rowgroup [ref=f1e571]:
+                        - row [ref=f1e572]:
+                          - columnheader "鎵规鍙�" [ref=f1e573]
+                    - generic [ref=f1e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=f1e580]:
+                    - table [ref=f1e583]:
+                      - rowgroup [ref=f1e598]:
+                        - row [ref=f1e599]:
+                          - columnheader "鎿嶄綔" [ref=f1e600]
+                    - generic [ref=f1e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=f1e621]:
+              - generic [ref=f1e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=f1e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f1e625]:
+                  - textbox "璇烽�夋嫨" [ref=f1e626]: 20鏉�/椤�
+                - generic [ref=f1e627]: 睿�
+              - button "飱�" [ref=f1e630]
+              - button "顧�" [ref=f1e632]
+              - button "顫�" [ref=f1e634]
+              - button "1" [ref=f1e637] [cursor=pointer]
+              - button "顫�" [ref=f1e638]
+              - button "顧�" [ref=f1e640]
+              - button "顦�" [ref=f1e642]
+  - dialog [ref=f1e890]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=f1e892]
+    - generic [ref=f1e894]:
+      - generic [ref=f1e896]:
+        - generic [ref=f1e897]:
+          - generic [ref=f1e898]:
+            - generic [ref=f1e899]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=f1e906]
+        - generic [ref=f1e912]:
+          - generic [ref=f1e913]:
+            - generic [ref=f1e914]: "*"
+            - text: 浜х嚎
+          - generic [ref=f1e920]:
+            - combobox "* 浜х嚎" [ref=f1e922]
+            - generic: 璇烽�夋嫨浜х嚎
+        - generic [ref=f1e923]:
+          - generic [ref=f1e924]:
+            - generic [ref=f1e925]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=f1e931]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=f1e932]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=f1e933]:
+          - generic [ref=f1e934]: 璁″垝鏁伴噺
+          - generic [ref=f1e939]:
+            - generic [ref=f1e940]:
+              - button "Increase Value" [ref=f1e941] [cursor=pointer]:
+                - img "up" [ref=f1e942]
+              - button "Decrease Value" [ref=f1e945] [cursor=pointer]:
+                - img "down" [ref=f1e946]
+            - spinbutton "璁″垝鏁伴噺" [ref=f1e950]
+        - generic [ref=f1e951]:
+          - generic [ref=f1e952]:
+            - generic [ref=f1e953]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e960]
+        - generic [ref=f1e966]:
+          - generic [ref=f1e967]: 澶囨敞
+          - textbox "澶囨敞" [ref=f1e972]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=f1e973]:
+        - generic [ref=f1e974]:
+          - generic [ref=f1e975]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [active] [ref=f1e976] [cursor=pointer]
+        - generic [ref=f1e988]:
+          - table [ref=f1e992]:
+            - rowgroup [ref=f1e998]:
+              - row [ref=f1e999]:
+                - columnheader "鐢熶骇浜哄憳" [ref=f1e1000]
+                - columnheader "宀椾綅绫诲瀷" [ref=f1e1005]
+                - columnheader "澶囨敞" [ref=f1e1010]
+                - columnheader "鎿嶄綔" [ref=f1e1015]
+          - table [ref=f1e1051]:
+            - rowgroup [ref=f1e1057]:
+              - row [ref=f1e1058]:
+                - cell [ref=f1e1059]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=f1e1064]
+                - cell [ref=f1e1070]:
+                  - generic [ref=f1e1074] [cursor=pointer]:
+                    - combobox [ref=f1e1076]
+                    - generic: 璇烽�夋嫨宀椾綅绫诲瀷
+                - cell [ref=f1e1077]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=f1e1080]
+                - cell [ref=f1e1081]:
+                  - button "鍒犻櫎" [ref=f1e1087] [cursor=pointer]
+    - button [ref=f1e1031] [cursor=pointer]
+    - generic [ref=f1e1041]:
+      - button "纭� 璁�" [ref=f1e1042] [cursor=pointer]
+      - button "鍙� 娑�" [ref=f1e1045] [cursor=pointer]
+    - button [ref=f1e1047] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-22-01-568Z.yml b/.playwright-mcp/page-2026-08-18T08-22-01-568Z.yml
new file mode 100644
index 0000000..0753b92
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-22-01-568Z.yml
@@ -0,0 +1,399 @@
+- generic [ref=f1e4]:
+  - generic [ref=f1e7]:
+    - complementary [ref=f1e8]:
+      - generic [ref=f1e9]:
+        - generic [ref=f1e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e18]
+          - generic [ref=f1e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f1e22]:
+          - menuitem "棣栭〉" [ref=f1e23] [cursor=pointer]
+          - listitem [ref=f1e30]:
+            - generic [ref=f1e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f1e39]:
+            - generic [ref=f1e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=f1e46]:
+            - generic [ref=f1e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=f1e53]:
+            - generic [ref=f1e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=f1e61]:
+            - generic [ref=f1e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f1e70]:
+            - generic [ref=f1e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=f1e78]:
+            - generic [ref=f1e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f1e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f1e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f1e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f1e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f1e104] [cursor=pointer]
+          - listitem [ref=f1e111]:
+            - generic [ref=f1e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f1e118]:
+            - generic [ref=f1e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=f1e125]:
+            - generic [ref=f1e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=f1e132]:
+            - generic [ref=f1e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=f1e139]:
+            - generic [ref=f1e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=f1e146]:
+            - generic [ref=f1e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=f1e153]:
+            - generic [ref=f1e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=f1e160]:
+            - generic [ref=f1e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=f1e169] [cursor=pointer]
+    - generic [ref=f1e174]:
+      - generic [ref=f1e175]:
+        - banner [ref=f1e176]:
+          - button [ref=f1e177] [cursor=pointer]
+          - button [ref=f1e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f1e185]:
+            - list [ref=f1e186]:
+              - listitem [ref=f1e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f1e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f1e192]
+              - listitem [ref=f1e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f1e196]
+          - generic [ref=f1e201]:
+            - generic [ref=f1e203] [cursor=pointer]:
+              - generic [ref=f1e207]: 鎼滅储
+              - generic [ref=f1e208]: Ctrl K
+            - button [ref=f1e210] [cursor=pointer]
+            - button "dark" [ref=f1e215] [cursor=pointer]
+            - button [ref=f1e224] [cursor=pointer]
+            - button [ref=f1e230] [cursor=pointer]
+            - button [ref=f1e233] [cursor=pointer]
+            - button [ref=f1e239] [cursor=pointer]:
+              - button [ref=f1e241]
+            - button "宸ヤ綔鍙�" [ref=f1e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f1e250] [cursor=pointer]
+        - generic [ref=f1e257]:
+          - generic [ref=f1e262]:
+            - generic [ref=f1e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=f1e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f1e298]:
+            - button [ref=f1e299] [cursor=pointer]
+            - generic [ref=f1e306] [cursor=pointer]
+            - generic [ref=f1e310] [cursor=pointer]
+      - main [ref=f1e317]:
+        - generic [ref=f1e322]:
+          - generic [ref=f1e327]:
+            - generic [ref=f1e328]:
+              - generic [ref=f1e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f1e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f1e337]:
+              - generic [ref=f1e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f1e345]
+            - generic [ref=f1e351]:
+              - generic [ref=f1e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f1e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f1e360]:
+              - generic [ref=f1e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f1e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f1e369]:
+              - generic [ref=f1e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e377]
+            - generic [ref=f1e383]:
+              - generic [ref=f1e384]: 鎵规鐘舵��
+              - generic [ref=f1e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f1e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f1e393]:
+              - generic [ref=f1e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=f1e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f1e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e403]:
+                  - img "swap-right" [ref=f1e404]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e409]:
+              - generic [ref=f1e410]: 鍒涘缓鏃堕棿
+              - generic [ref=f1e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f1e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e419]:
+                  - img "swap-right" [ref=f1e420]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e425]:
+              - button "閲� 缃�" [ref=f1e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f1e428] [cursor=pointer]
+              - generic [ref=f1e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f1e437]:
+            - generic [ref=f1e439]:
+              - generic [ref=f1e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f1e444]:
+                - generic [ref=f1e446]:
+                  - button "鏂板鎵规" [ref=f1e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f1e453] [cursor=pointer]
+                - button "顫�" [ref=f1e459] [cursor=pointer]
+              - generic [ref=f1e461]:
+                - button "瞟�" [ref=f1e462] [cursor=pointer]
+                - button "顪�" [ref=f1e464] [cursor=pointer]
+                - button "顦�" [ref=f1e466] [cursor=pointer]
+            - generic [ref=f1e470]:
+              - generic [ref=f1e473]:
+                - generic [ref=f1e474]:
+                  - table [ref=f1e478]:
+                    - rowgroup [ref=f1e493]:
+                      - row [ref=f1e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=f1e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=f1e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=f1e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=f1e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=f1e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=f1e520]
+                        - columnheader "璐d换浜�" [ref=f1e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=f1e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=f1e535]
+                        - columnheader "鎵规鐘舵��" [ref=f1e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=f1e545]
+                  - generic [ref=f1e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=f1e553]:
+                    - table [ref=f1e556]:
+                      - rowgroup [ref=f1e571]:
+                        - row [ref=f1e572]:
+                          - columnheader "鎵规鍙�" [ref=f1e573]
+                    - generic [ref=f1e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=f1e580]:
+                    - table [ref=f1e583]:
+                      - rowgroup [ref=f1e598]:
+                        - row [ref=f1e599]:
+                          - columnheader "鎿嶄綔" [ref=f1e600]
+                    - generic [ref=f1e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=f1e621]:
+              - generic [ref=f1e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=f1e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f1e625]:
+                  - textbox "璇烽�夋嫨" [ref=f1e626]: 20鏉�/椤�
+                - generic [ref=f1e627]: 睿�
+              - button "飱�" [ref=f1e630]
+              - button "顧�" [ref=f1e632]
+              - button "顫�" [ref=f1e634]
+              - button "1" [ref=f1e637] [cursor=pointer]
+              - button "顫�" [ref=f1e638]
+              - button "顧�" [ref=f1e640]
+              - button "顦�" [ref=f1e642]
+  - dialog [ref=f1e890]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=f1e892]
+    - generic [ref=f1e894]:
+      - generic [ref=f1e896]:
+        - generic [ref=f1e897]:
+          - generic [ref=f1e898]:
+            - generic [ref=f1e899]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [active] [ref=f1e906]
+        - generic [ref=f1e912]:
+          - generic [ref=f1e913]:
+            - generic [ref=f1e914]: "*"
+            - text: 浜х嚎
+          - generic [ref=f1e920]:
+            - combobox "* 浜х嚎" [ref=f1e922]
+            - generic: 璇烽�夋嫨浜х嚎
+        - generic [ref=f1e923]:
+          - generic [ref=f1e924]:
+            - generic [ref=f1e925]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=f1e931]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=f1e932]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=f1e933]:
+          - generic [ref=f1e934]: 璁″垝鏁伴噺
+          - generic [ref=f1e939]:
+            - generic [ref=f1e940]:
+              - button "Increase Value" [ref=f1e941] [cursor=pointer]:
+                - img "up" [ref=f1e942]
+              - button "Decrease Value" [ref=f1e945] [cursor=pointer]:
+                - img "down" [ref=f1e946]
+            - spinbutton "璁″垝鏁伴噺" [ref=f1e950]
+        - generic [ref=f1e951]:
+          - generic [ref=f1e952]:
+            - generic [ref=f1e953]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e960]
+        - generic [ref=f1e966]:
+          - generic [ref=f1e967]: 澶囨敞
+          - textbox "澶囨敞" [ref=f1e972]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=f1e973]:
+        - generic [ref=f1e974]:
+          - generic [ref=f1e975]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=f1e976] [cursor=pointer]
+        - generic [ref=f1e988]:
+          - table [ref=f1e992]:
+            - rowgroup [ref=f1e998]:
+              - row [ref=f1e999]:
+                - columnheader "鐢熶骇浜哄憳" [ref=f1e1000]
+                - columnheader "宀椾綅绫诲瀷" [ref=f1e1005]
+                - columnheader "澶囨敞" [ref=f1e1010]
+                - columnheader "鎿嶄綔" [ref=f1e1015]
+          - table [ref=f1e1051]:
+            - rowgroup [ref=f1e1057]:
+              - row [ref=f1e1058]:
+                - cell [ref=f1e1059]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=f1e1064]
+                - cell [ref=f1e1070]:
+                  - generic [ref=f1e1074] [cursor=pointer]:
+                    - combobox [ref=f1e1076]
+                    - generic: 璇烽�夋嫨宀椾綅绫诲瀷
+                - cell [ref=f1e1077]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=f1e1080]
+                - cell [ref=f1e1081]:
+                  - button "鍒犻櫎" [ref=f1e1087] [cursor=pointer]
+    - button [ref=f1e1031] [cursor=pointer]
+    - generic [ref=f1e1041]:
+      - button "纭� 璁�" [ref=f1e1042] [cursor=pointer]
+      - button "鍙� 娑�" [ref=f1e1045] [cursor=pointer]
+    - button [ref=f1e1047] [cursor=pointer]
+  - dialog "鐗╂枡浜у搧閫夋嫨" [ref=f1e1090]:
+    - document:
+      - generic [ref=f1e1091]:
+        - button "Close" [ref=f1e1092] [cursor=pointer]:
+          - img "close" [ref=f1e1094]
+        - generic [ref=f1e1097]: 鐗╂枡浜у搧閫夋嫨
+        - generic [ref=f1e1100]:
+          - generic [ref=f1e1103]:
+            - textbox "鎼滅储鍒嗙被" [ref=f1e1110]
+            - tree [ref=f1e1114]:
+              - generic:
+                - textbox "for screen reader"
+              - generic [ref=f1e1118]:
+                - generic "鍘熸潗鏂�" [ref=f1e1121] [cursor=pointer]
+                - generic "鍗婃垚鍝�" [ref=f1e1124] [cursor=pointer]
+                - generic [ref=f1e1125]:
+                  - img "caret-down" [ref=f1e1127] [cursor=pointer]
+                  - generic "鎴愬搧" [ref=f1e1130] [cursor=pointer]
+                - generic [ref=f1e1131]:
+                  - img "caret-down" [ref=f1e1134] [cursor=pointer]
+                  - generic "1" [ref=f1e1137] [cursor=pointer]
+                - generic [ref=f1e1138]:
+                  - img "caret-down" [ref=f1e1141] [cursor=pointer]
+                  - generic "2" [ref=f1e1144] [cursor=pointer]
+                - generic "33" [ref=f1e1148] [cursor=pointer]
+                - generic "杈呮枡" [ref=f1e1151] [cursor=pointer]
+          - generic [ref=f1e1154]:
+            - generic [ref=f1e1159]:
+              - generic [ref=f1e1160]:
+                - generic [ref=f1e1161]: 鐗╂枡缂栫爜
+                - textbox "鐗╂枡缂栫爜" [ref=f1e1167]:
+                  - /placeholder: 璇疯緭鍏ョ墿鏂欑紪鐮�
+              - generic [ref=f1e1169]:
+                - generic [ref=f1e1170]: 鐗╂枡鍚嶇О
+                - textbox "鐗╂枡鍚嶇О" [ref=f1e1176]:
+                  - /placeholder: 璇疯緭鍏ョ墿鏂欏悕绉�
+              - generic [ref=f1e1178]:
+                - button "閲� 缃�" [ref=f1e1179] [cursor=pointer]
+                - button "鎼� 绱�" [ref=f1e1181] [cursor=pointer]
+                - generic [ref=f1e1183] [cursor=pointer]: 鏀惰捣
+            - generic [ref=f1e1190]:
+              - generic [ref=f1e1192]:
+                - generic [ref=f1e1193]: 鐗╂枡浜у搧鍒楄〃
+                - button "顫�" [ref=f1e1198] [cursor=pointer]
+                - generic [ref=f1e1200]:
+                  - button "瞟�" [ref=f1e1201] [cursor=pointer]
+                  - button "顪�" [ref=f1e1203] [cursor=pointer]
+                  - button "顦�" [ref=f1e1205] [cursor=pointer]
+              - generic [ref=f1e1213]:
+                - table [ref=f1e1217]:
+                  - rowgroup [ref=f1e1227]:
+                    - row "鐗╂枡缂栫爜 鐗╂枡鍚嶇О 瑙勬牸鍨嬪彿 鍗曚綅 鐗╂枡/浜у搧 鎵�灞炲垎绫� 鍒涘缓鏃堕棿" [ref=f1e1228]:
+                      - columnheader [ref=f1e1229]
+                      - columnheader "鐗╂枡缂栫爜" [ref=f1e1232]
+                      - columnheader "鐗╂枡鍚嶇О" [ref=f1e1237]
+                      - columnheader "瑙勬牸鍨嬪彿" [ref=f1e1242]
+                      - columnheader "鍗曚綅" [ref=f1e1247]
+                      - columnheader "鐗╂枡/浜у搧" [ref=f1e1252]
+                      - columnheader "鎵�灞炲垎绫�" [ref=f1e1257]
+                      - columnheader "鍒涘缓鏃堕棿" [ref=f1e1262]
+                - table [ref=f1e1270]:
+                  - rowgroup [ref=f1e1280]:
+                    - row [ref=f1e1281]:
+                      - cell "顭�" [ref=f1e1282]
+                      - cell "ITEM_20260729001" [ref=f1e1287]
+                      - cell "閾濆悎瀵间綋" [ref=f1e1291]
+                      - cell "LH8030JY-10" [ref=f1e1295]
+                      - cell "鍗冪背" [ref=f1e1299]
+                      - cell "鐗╂枡" [ref=f1e1303]
+                      - cell "33" [ref=f1e1307]
+                      - cell "2026-07-29 14:19:03" [ref=f1e1311]
+                    - row [ref=f1e1315]:
+                      - cell "顭�" [ref=f1e1316]
+                      - cell "ITEM_20260720001" [ref=f1e1321]
+                      - cell "闇�瑕佺敓浜х殑鎴愬搧11" [ref=f1e1325]
+                      - cell "涓�" [ref=f1e1329]
+                      - cell "鍗冨厠" [ref=f1e1333]
+                      - cell "浜у搧" [ref=f1e1337]
+                      - cell "鎴愬搧" [ref=f1e1341]
+                      - cell "2026-07-20 09:17:13" [ref=f1e1345]
+                    - row [ref=f1e1349]:
+                      - cell "顭�" [ref=f1e1350]
+                      - cell "ITEM_20260716008" [ref=f1e1355]
+                      - cell "闀�閿岄挗绾�" [ref=f1e1359]
+                      - cell "JG3A-1*1.5" [ref=f1e1363]
+                      - cell "鍗冨厠" [ref=f1e1367]
+                      - cell "鐗╂枡" [ref=f1e1371]
+                      - cell "鍘熸潗鏂�" [ref=f1e1375]
+                      - cell "2026-07-16 16:51:57" [ref=f1e1379]
+                    - row [ref=f1e1383]:
+                      - cell "顭�" [ref=f1e1384]
+                      - cell "ITEM_20260716006" [ref=f1e1389]
+                      - cell "閽㈣姱閾濈粸绾�" [ref=f1e1393]
+                      - cell "JL/L1-40/10-6/1" [ref=f1e1397]
+                      - cell "鍗冨厠" [ref=f1e1401]
+                      - cell "浜у搧" [ref=f1e1405]
+                      - cell "鎴愬搧" [ref=f1e1409]
+                      - cell "2026-07-16 16:48:49" [ref=f1e1413]
+                    - row [ref=f1e1417]:
+                      - cell "顭�" [ref=f1e1418]
+                      - cell "ITEM_20260716005" [ref=f1e1423]
+                      - cell "閾濆崟绾�" [ref=f1e1427]
+                      - cell "L-1.72" [ref=f1e1431]
+                      - cell "鍗冨厠" [ref=f1e1435]
+                      - cell "鐗╂枡" [ref=f1e1439]
+                      - cell "鍗婃垚鍝�" [ref=f1e1443]
+                      - cell "2026-07-16 16:48:03" [ref=f1e1447]
+                    - row [ref=f1e1451]:
+                      - cell "顭�" [ref=f1e1452]
+                      - cell "ITEM_20260716004" [ref=f1e1457]
+                      - cell "閾濇潌" [ref=f1e1461]
+                      - cell "1A60" [ref=f1e1465]
+                      - cell "鍗冨厠" [ref=f1e1469]
+                      - cell "鐗╂枡" [ref=f1e1473]
+                      - cell "鍘熸潗鏂�" [ref=f1e1477]
+                      - cell "2026-07-16 16:45:13" [ref=f1e1481]
+              - generic [ref=f1e1491]:
+                - generic [ref=f1e1492]: 鍏� 6 鏉¤褰�
+                - generic [ref=f1e1494] [cursor=pointer]:
+                  - generic "20鏉�/椤�" [ref=f1e1495]:
+                    - textbox "璇烽�夋嫨" [ref=f1e1496]: 20鏉�/椤�
+                  - generic [ref=f1e1497]: 睿�
+                - button "飱�" [ref=f1e1500]
+                - button "顧�" [ref=f1e1502]
+                - button "顫�" [ref=f1e1504]
+                - button "1" [ref=f1e1507] [cursor=pointer]
+                - button "顫�" [ref=f1e1508]
+                - button "顧�" [ref=f1e1510]
+                - button "顦�" [ref=f1e1512]
+        - generic [ref=f1e1514]:
+          - button "鍙� 娑�" [ref=f1e1515] [cursor=pointer]
+          - button "纭� 瀹�" [ref=f1e1517] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-23-09-413Z.yml b/.playwright-mcp/page-2026-08-18T08-23-09-413Z.yml
new file mode 100644
index 0000000..0cbd147
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-23-09-413Z.yml
@@ -0,0 +1,399 @@
+- generic [ref=f1e4]:
+  - generic [ref=f1e7]:
+    - complementary [ref=f1e8]:
+      - generic [ref=f1e9]:
+        - generic [ref=f1e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e18]
+          - generic [ref=f1e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f1e22]:
+          - menuitem "棣栭〉" [ref=f1e23] [cursor=pointer]
+          - listitem [ref=f1e30]:
+            - generic [ref=f1e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f1e39]:
+            - generic [ref=f1e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=f1e46]:
+            - generic [ref=f1e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=f1e53]:
+            - generic [ref=f1e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=f1e61]:
+            - generic [ref=f1e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f1e70]:
+            - generic [ref=f1e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=f1e78]:
+            - generic [ref=f1e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f1e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f1e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f1e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f1e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f1e104] [cursor=pointer]
+          - listitem [ref=f1e111]:
+            - generic [ref=f1e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f1e118]:
+            - generic [ref=f1e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=f1e125]:
+            - generic [ref=f1e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=f1e132]:
+            - generic [ref=f1e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=f1e139]:
+            - generic [ref=f1e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=f1e146]:
+            - generic [ref=f1e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=f1e153]:
+            - generic [ref=f1e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=f1e160]:
+            - generic [ref=f1e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=f1e169] [cursor=pointer]
+    - generic [ref=f1e174]:
+      - generic [ref=f1e175]:
+        - banner [ref=f1e176]:
+          - button [ref=f1e177] [cursor=pointer]
+          - button [ref=f1e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f1e185]:
+            - list [ref=f1e186]:
+              - listitem [ref=f1e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f1e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f1e192]
+              - listitem [ref=f1e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f1e196]
+          - generic [ref=f1e201]:
+            - generic [ref=f1e203] [cursor=pointer]:
+              - generic [ref=f1e207]: 鎼滅储
+              - generic [ref=f1e208]: Ctrl K
+            - button [ref=f1e210] [cursor=pointer]
+            - button "dark" [ref=f1e215] [cursor=pointer]
+            - button [ref=f1e224] [cursor=pointer]
+            - button [ref=f1e230] [cursor=pointer]
+            - button [ref=f1e233] [cursor=pointer]
+            - button [ref=f1e239] [cursor=pointer]:
+              - button [ref=f1e241]
+            - button "宸ヤ綔鍙�" [ref=f1e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f1e250] [cursor=pointer]
+        - generic [ref=f1e257]:
+          - generic [ref=f1e262]:
+            - generic [ref=f1e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=f1e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f1e298]:
+            - button [ref=f1e299] [cursor=pointer]
+            - generic [ref=f1e306] [cursor=pointer]
+            - generic [ref=f1e310] [cursor=pointer]
+      - main [ref=f1e317]:
+        - generic [ref=f1e322]:
+          - generic [ref=f1e327]:
+            - generic [ref=f1e328]:
+              - generic [ref=f1e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f1e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f1e337]:
+              - generic [ref=f1e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f1e345]
+            - generic [ref=f1e351]:
+              - generic [ref=f1e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f1e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f1e360]:
+              - generic [ref=f1e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f1e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f1e369]:
+              - generic [ref=f1e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e377]
+            - generic [ref=f1e383]:
+              - generic [ref=f1e384]: 鎵规鐘舵��
+              - generic [ref=f1e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f1e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f1e393]:
+              - generic [ref=f1e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=f1e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f1e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e403]:
+                  - img "swap-right" [ref=f1e404]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e409]:
+              - generic [ref=f1e410]: 鍒涘缓鏃堕棿
+              - generic [ref=f1e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f1e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e419]:
+                  - img "swap-right" [ref=f1e420]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e425]:
+              - button "閲� 缃�" [ref=f1e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f1e428] [cursor=pointer]
+              - generic [ref=f1e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f1e437]:
+            - generic [ref=f1e439]:
+              - generic [ref=f1e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f1e444]:
+                - generic [ref=f1e446]:
+                  - button "鏂板鎵规" [ref=f1e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f1e453] [cursor=pointer]
+                - button "顫�" [ref=f1e459] [cursor=pointer]
+              - generic [ref=f1e461]:
+                - button "瞟�" [ref=f1e462] [cursor=pointer]
+                - button "顪�" [ref=f1e464] [cursor=pointer]
+                - button "顦�" [ref=f1e466] [cursor=pointer]
+            - generic [ref=f1e470]:
+              - generic [ref=f1e473]:
+                - generic [ref=f1e474]:
+                  - table [ref=f1e478]:
+                    - rowgroup [ref=f1e493]:
+                      - row [ref=f1e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=f1e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=f1e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=f1e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=f1e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=f1e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=f1e520]
+                        - columnheader "璐d换浜�" [ref=f1e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=f1e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=f1e535]
+                        - columnheader "鎵规鐘舵��" [ref=f1e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=f1e545]
+                  - generic [ref=f1e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=f1e553]:
+                    - table [ref=f1e556]:
+                      - rowgroup [ref=f1e571]:
+                        - row [ref=f1e572]:
+                          - columnheader "鎵规鍙�" [ref=f1e573]
+                    - generic [ref=f1e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=f1e580]:
+                    - table [ref=f1e583]:
+                      - rowgroup [ref=f1e598]:
+                        - row [ref=f1e599]:
+                          - columnheader "鎿嶄綔" [ref=f1e600]
+                    - generic [ref=f1e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=f1e621]:
+              - generic [ref=f1e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=f1e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f1e625]:
+                  - textbox "璇烽�夋嫨" [ref=f1e626]: 20鏉�/椤�
+                - generic [ref=f1e627]: 睿�
+              - button "飱�" [ref=f1e630]
+              - button "顧�" [ref=f1e632]
+              - button "顫�" [ref=f1e634]
+              - button "1" [ref=f1e637] [cursor=pointer]
+              - button "顫�" [ref=f1e638]
+              - button "顧�" [ref=f1e640]
+              - button "顦�" [ref=f1e642]
+  - dialog [ref=f1e890]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=f1e892]
+    - generic [ref=f1e894]:
+      - generic [ref=f1e896]:
+        - generic [ref=f1e897]:
+          - generic [ref=f1e898]:
+            - generic [ref=f1e899]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=f1e906]
+        - generic [ref=f1e912]:
+          - generic [ref=f1e913]:
+            - generic [ref=f1e914]: "*"
+            - text: 浜х嚎
+          - generic [ref=f1e920]:
+            - combobox "* 浜х嚎" [ref=f1e922]
+            - generic: 璇烽�夋嫨浜х嚎
+        - generic [ref=f1e923]:
+          - generic [ref=f1e924]:
+            - generic [ref=f1e925]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=f1e931]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=f1e932]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=f1e933]:
+          - generic [ref=f1e934]: 璁″垝鏁伴噺
+          - generic [ref=f1e939]:
+            - generic [ref=f1e940]:
+              - button "Increase Value" [ref=f1e941] [cursor=pointer]:
+                - img "up" [ref=f1e942]
+              - button "Decrease Value" [ref=f1e945] [cursor=pointer]:
+                - img "down" [ref=f1e946]
+            - spinbutton "璁″垝鏁伴噺" [ref=f1e950]
+        - generic [ref=f1e951]:
+          - generic [ref=f1e952]:
+            - generic [ref=f1e953]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e960]
+        - generic [ref=f1e966]:
+          - generic [ref=f1e967]: 澶囨敞
+          - textbox "澶囨敞" [ref=f1e972]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=f1e973]:
+        - generic [ref=f1e974]:
+          - generic [ref=f1e975]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=f1e976] [cursor=pointer]
+        - generic [ref=f1e988]:
+          - table [ref=f1e992]:
+            - rowgroup [ref=f1e998]:
+              - row [ref=f1e999]:
+                - columnheader "鐢熶骇浜哄憳" [ref=f1e1000]
+                - columnheader "宀椾綅绫诲瀷" [ref=f1e1005]
+                - columnheader "澶囨敞" [ref=f1e1010]
+                - columnheader "鎿嶄綔" [ref=f1e1015]
+          - table [ref=f1e1051]:
+            - rowgroup [ref=f1e1057]:
+              - row [ref=f1e1058]:
+                - cell [ref=f1e1059]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=f1e1064]
+                - cell [ref=f1e1070]:
+                  - generic [ref=f1e1074] [cursor=pointer]:
+                    - combobox [ref=f1e1076]
+                    - generic: 璇烽�夋嫨宀椾綅绫诲瀷
+                - cell [ref=f1e1077]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=f1e1080]
+                - cell [ref=f1e1081]:
+                  - button "鍒犻櫎" [ref=f1e1087] [cursor=pointer]
+    - button [ref=f1e1031] [cursor=pointer]
+    - generic [ref=f1e1041]:
+      - button "纭� 璁�" [ref=f1e1042] [cursor=pointer]
+      - button "鍙� 娑�" [ref=f1e1045] [cursor=pointer]
+    - button [ref=f1e1047] [cursor=pointer]
+  - dialog "鐗╂枡浜у搧閫夋嫨" [ref=f1e1090]:
+    - document:
+      - generic [ref=f1e1091]:
+        - button "Close" [ref=f1e1092] [cursor=pointer]:
+          - img "close" [ref=f1e1094]
+        - generic [ref=f1e1097]: 鐗╂枡浜у搧閫夋嫨
+        - generic [ref=f1e1100]:
+          - generic [ref=f1e1103]:
+            - textbox "鎼滅储鍒嗙被" [ref=f1e1110]
+            - tree [ref=f1e1114]:
+              - generic:
+                - textbox "for screen reader"
+              - generic [ref=f1e1118]:
+                - generic "鍘熸潗鏂�" [ref=f1e1121] [cursor=pointer]
+                - generic "鍗婃垚鍝�" [ref=f1e1124] [cursor=pointer]
+                - generic [ref=f1e1125]:
+                  - img "caret-down" [ref=f1e1127] [cursor=pointer]
+                  - generic "鎴愬搧" [ref=f1e1130] [cursor=pointer]
+                - generic [ref=f1e1131]:
+                  - img "caret-down" [ref=f1e1134] [cursor=pointer]
+                  - generic "1" [ref=f1e1137] [cursor=pointer]
+                - generic [ref=f1e1138]:
+                  - img "caret-down" [ref=f1e1141] [cursor=pointer]
+                  - generic "2" [ref=f1e1144] [cursor=pointer]
+                - generic "33" [ref=f1e1148] [cursor=pointer]
+                - generic "杈呮枡" [ref=f1e1151] [cursor=pointer]
+          - generic [ref=f1e1154]:
+            - generic [ref=f1e1159]:
+              - generic [ref=f1e1160]:
+                - generic [ref=f1e1161]: 鐗╂枡缂栫爜
+                - textbox "鐗╂枡缂栫爜" [ref=f1e1167]:
+                  - /placeholder: 璇疯緭鍏ョ墿鏂欑紪鐮�
+              - generic [ref=f1e1169]:
+                - generic [ref=f1e1170]: 鐗╂枡鍚嶇О
+                - textbox "鐗╂枡鍚嶇О" [ref=f1e1176]:
+                  - /placeholder: 璇疯緭鍏ョ墿鏂欏悕绉�
+              - generic [ref=f1e1178]:
+                - button "閲� 缃�" [ref=f1e1179] [cursor=pointer]
+                - button "鎼� 绱�" [ref=f1e1181] [cursor=pointer]
+                - generic [ref=f1e1183] [cursor=pointer]: 鏀惰捣
+            - generic [ref=f1e1190]:
+              - generic [ref=f1e1192]:
+                - generic [ref=f1e1193]: 鐗╂枡浜у搧鍒楄〃
+                - button "顫�" [ref=f1e1198] [cursor=pointer]
+                - generic [ref=f1e1200]:
+                  - button "瞟�" [ref=f1e1201] [cursor=pointer]
+                  - button "顪�" [ref=f1e1203] [cursor=pointer]
+                  - button "顦�" [ref=f1e1205] [cursor=pointer]
+              - generic [ref=f1e1213]:
+                - table [ref=f1e1217]:
+                  - rowgroup [ref=f1e1227]:
+                    - row "鐗╂枡缂栫爜 鐗╂枡鍚嶇О 瑙勬牸鍨嬪彿 鍗曚綅 鐗╂枡/浜у搧 鎵�灞炲垎绫� 鍒涘缓鏃堕棿" [ref=f1e1228]:
+                      - columnheader [ref=f1e1229]
+                      - columnheader "鐗╂枡缂栫爜" [ref=f1e1232]
+                      - columnheader "鐗╂枡鍚嶇О" [ref=f1e1237]
+                      - columnheader "瑙勬牸鍨嬪彿" [ref=f1e1242]
+                      - columnheader "鍗曚綅" [ref=f1e1247]
+                      - columnheader "鐗╂枡/浜у搧" [ref=f1e1252]
+                      - columnheader "鎵�灞炲垎绫�" [ref=f1e1257]
+                      - columnheader "鍒涘缓鏃堕棿" [ref=f1e1262]
+                - table [ref=f1e1270]:
+                  - rowgroup [ref=f1e1280]:
+                    - row [ref=f1e1281]:
+                      - cell "顭�" [ref=f1e1282]
+                      - cell "ITEM_20260729001" [ref=f1e1287]
+                      - cell "閾濆悎瀵间綋" [ref=f1e1291]
+                      - cell "LH8030JY-10" [ref=f1e1295]
+                      - cell "鍗冪背" [ref=f1e1299]
+                      - cell "鐗╂枡" [ref=f1e1303]
+                      - cell "33" [ref=f1e1307]
+                      - cell "2026-07-29 14:19:03" [ref=f1e1311]
+                    - row [ref=f1e1315]:
+                      - cell "顭�" [ref=f1e1316]
+                      - cell "ITEM_20260720001" [ref=f1e1321]
+                      - cell "闇�瑕佺敓浜х殑鎴愬搧11" [ref=f1e1325]
+                      - cell "涓�" [ref=f1e1329]
+                      - cell "鍗冨厠" [ref=f1e1333]
+                      - cell "浜у搧" [ref=f1e1337]
+                      - cell "鎴愬搧" [ref=f1e1341]
+                      - cell "2026-07-20 09:17:13" [ref=f1e1345]
+                    - row [ref=f1e1349]:
+                      - cell "顭�" [ref=f1e1350]
+                      - cell "ITEM_20260716008" [ref=f1e1355]
+                      - cell "闀�閿岄挗绾�" [ref=f1e1359]
+                      - cell "JG3A-1*1.5" [ref=f1e1363]
+                      - cell "鍗冨厠" [ref=f1e1367]
+                      - cell "鐗╂枡" [ref=f1e1371]
+                      - cell "鍘熸潗鏂�" [ref=f1e1375]
+                      - cell "2026-07-16 16:51:57" [ref=f1e1379]
+                    - row [ref=f1e1519]:
+                      - cell "顫�" [ref=f1e1520]
+                      - cell "ITEM_20260716006" [ref=f1e1389]
+                      - cell "閽㈣姱閾濈粸绾�" [ref=f1e1393]
+                      - cell "JL/L1-40/10-6/1" [ref=f1e1397]
+                      - cell "鍗冨厠" [ref=f1e1401]
+                      - cell "浜у搧" [ref=f1e1405]
+                      - cell "鎴愬搧" [ref=f1e1409]
+                      - cell "2026-07-16 16:48:49" [ref=f1e1413]
+                    - row [ref=f1e1417]:
+                      - cell "顭�" [ref=f1e1418]
+                      - cell "ITEM_20260716005" [ref=f1e1423]
+                      - cell "閾濆崟绾�" [ref=f1e1427]
+                      - cell "L-1.72" [ref=f1e1431]
+                      - cell "鍗冨厠" [ref=f1e1435]
+                      - cell "鐗╂枡" [ref=f1e1439]
+                      - cell "鍗婃垚鍝�" [ref=f1e1443]
+                      - cell "2026-07-16 16:48:03" [ref=f1e1447]
+                    - row [ref=f1e1451]:
+                      - cell "顭�" [ref=f1e1452]
+                      - cell "ITEM_20260716004" [ref=f1e1457]
+                      - cell "閾濇潌" [ref=f1e1461]
+                      - cell "1A60" [ref=f1e1465]
+                      - cell "鍗冨厠" [ref=f1e1469]
+                      - cell "鐗╂枡" [ref=f1e1473]
+                      - cell "鍘熸潗鏂�" [ref=f1e1477]
+                      - cell "2026-07-16 16:45:13" [ref=f1e1481]
+              - generic [ref=f1e1491]:
+                - generic [ref=f1e1492]: 鍏� 6 鏉¤褰�
+                - generic [ref=f1e1494] [cursor=pointer]:
+                  - generic "20鏉�/椤�" [ref=f1e1495]:
+                    - textbox "璇烽�夋嫨" [ref=f1e1496]: 20鏉�/椤�
+                  - generic [ref=f1e1497]: 睿�
+                - button "飱�" [ref=f1e1500]
+                - button "顧�" [ref=f1e1502]
+                - button "顫�" [ref=f1e1504]
+                - button "1" [ref=f1e1507] [cursor=pointer]
+                - button "顫�" [ref=f1e1508]
+                - button "顧�" [ref=f1e1510]
+                - button "顦�" [ref=f1e1512]
+        - generic [ref=f1e1514]:
+          - button "鍙� 娑�" [ref=f1e1515] [cursor=pointer]
+          - button "纭� 瀹�" [ref=f1e1517] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-23-20-161Z.yml b/.playwright-mcp/page-2026-08-18T08-23-20-161Z.yml
new file mode 100644
index 0000000..68e5fbb
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-23-20-161Z.yml
@@ -0,0 +1,451 @@
+- generic [ref=f1e4]:
+  - generic [ref=f1e7]:
+    - complementary [ref=f1e8]:
+      - generic [ref=f1e9]:
+        - generic [ref=f1e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e18]
+          - generic [ref=f1e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f1e22]:
+          - menuitem "棣栭〉" [ref=f1e23] [cursor=pointer]
+          - listitem [ref=f1e30]:
+            - generic [ref=f1e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f1e39]:
+            - generic [ref=f1e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=f1e46]:
+            - generic [ref=f1e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=f1e53]:
+            - generic [ref=f1e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=f1e61]:
+            - generic [ref=f1e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f1e70]:
+            - generic [ref=f1e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=f1e78]:
+            - generic [ref=f1e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f1e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f1e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f1e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f1e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f1e104] [cursor=pointer]
+          - listitem [ref=f1e111]:
+            - generic [ref=f1e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f1e118]:
+            - generic [ref=f1e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=f1e125]:
+            - generic [ref=f1e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=f1e132]:
+            - generic [ref=f1e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=f1e139]:
+            - generic [ref=f1e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=f1e146]:
+            - generic [ref=f1e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=f1e153]:
+            - generic [ref=f1e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=f1e160]:
+            - generic [ref=f1e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=f1e169] [cursor=pointer]
+    - generic [ref=f1e174]:
+      - generic [ref=f1e175]:
+        - banner [ref=f1e176]:
+          - button [ref=f1e177] [cursor=pointer]
+          - button [ref=f1e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f1e185]:
+            - list [ref=f1e186]:
+              - listitem [ref=f1e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f1e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f1e192]
+              - listitem [ref=f1e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f1e196]
+          - generic [ref=f1e201]:
+            - generic [ref=f1e203] [cursor=pointer]:
+              - generic [ref=f1e207]: 鎼滅储
+              - generic [ref=f1e208]: Ctrl K
+            - button [ref=f1e210] [cursor=pointer]
+            - button "dark" [ref=f1e215] [cursor=pointer]
+            - button [ref=f1e224] [cursor=pointer]
+            - button [ref=f1e230] [cursor=pointer]
+            - button [ref=f1e233] [cursor=pointer]
+            - button [ref=f1e239] [cursor=pointer]:
+              - button [ref=f1e241]
+            - button "宸ヤ綔鍙�" [ref=f1e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f1e250] [cursor=pointer]
+        - generic [ref=f1e257]:
+          - generic [ref=f1e262]:
+            - generic [ref=f1e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=f1e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f1e298]:
+            - button [ref=f1e299] [cursor=pointer]
+            - generic [ref=f1e306] [cursor=pointer]
+            - generic [ref=f1e310] [cursor=pointer]
+      - main [ref=f1e317]:
+        - generic [ref=f1e322]:
+          - generic [ref=f1e327]:
+            - generic [ref=f1e328]:
+              - generic [ref=f1e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f1e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f1e337]:
+              - generic [ref=f1e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f1e345]
+            - generic [ref=f1e351]:
+              - generic [ref=f1e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f1e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f1e360]:
+              - generic [ref=f1e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f1e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f1e369]:
+              - generic [ref=f1e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e377]
+            - generic [ref=f1e383]:
+              - generic [ref=f1e384]: 鎵规鐘舵��
+              - generic [ref=f1e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f1e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f1e393]:
+              - generic [ref=f1e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=f1e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f1e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e403]:
+                  - img "swap-right" [ref=f1e404]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e409]:
+              - generic [ref=f1e410]: 鍒涘缓鏃堕棿
+              - generic [ref=f1e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f1e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e419]:
+                  - img "swap-right" [ref=f1e420]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e425]:
+              - button "閲� 缃�" [ref=f1e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f1e428] [cursor=pointer]
+              - generic [ref=f1e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f1e437]:
+            - generic [ref=f1e439]:
+              - generic [ref=f1e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f1e444]:
+                - generic [ref=f1e446]:
+                  - button "鏂板鎵规" [ref=f1e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f1e453] [cursor=pointer]
+                - button "顫�" [ref=f1e459] [cursor=pointer]
+              - generic [ref=f1e461]:
+                - button "瞟�" [ref=f1e462] [cursor=pointer]
+                - button "顪�" [ref=f1e464] [cursor=pointer]
+                - button "顦�" [ref=f1e466] [cursor=pointer]
+            - generic [ref=f1e470]:
+              - generic [ref=f1e473]:
+                - generic [ref=f1e474]:
+                  - table [ref=f1e478]:
+                    - rowgroup [ref=f1e493]:
+                      - row [ref=f1e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=f1e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=f1e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=f1e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=f1e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=f1e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=f1e520]
+                        - columnheader "璐d换浜�" [ref=f1e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=f1e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=f1e535]
+                        - columnheader "鎵规鐘舵��" [ref=f1e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=f1e545]
+                  - generic [ref=f1e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=f1e553]:
+                    - table [ref=f1e556]:
+                      - rowgroup [ref=f1e571]:
+                        - row [ref=f1e572]:
+                          - columnheader "鎵规鍙�" [ref=f1e573]
+                    - generic [ref=f1e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=f1e580]:
+                    - table [ref=f1e583]:
+                      - rowgroup [ref=f1e598]:
+                        - row [ref=f1e599]:
+                          - columnheader "鎿嶄綔" [ref=f1e600]
+                    - generic [ref=f1e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=f1e621]:
+              - generic [ref=f1e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=f1e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f1e625]:
+                  - textbox "璇烽�夋嫨" [ref=f1e626]: 20鏉�/椤�
+                - generic [ref=f1e627]: 睿�
+              - button "飱�" [ref=f1e630]
+              - button "顧�" [ref=f1e632]
+              - button "顫�" [ref=f1e634]
+              - button "1" [ref=f1e637] [cursor=pointer]
+              - button "顫�" [ref=f1e638]
+              - button "顧�" [ref=f1e640]
+              - button "顦�" [ref=f1e642]
+  - dialog [ref=f1e890]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=f1e892]
+    - generic [ref=f1e894]:
+      - generic [ref=f1e896]:
+        - generic [ref=f1e897]:
+          - generic [ref=f1e898]:
+            - generic [ref=f1e899]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=f1e906]: 閽㈣姱閾濈粸绾�
+        - generic [ref=f1e912]:
+          - generic [ref=f1e913]:
+            - generic [ref=f1e914]: "*"
+            - text: 浜х嚎
+          - generic [ref=f1e920]:
+            - combobox "* 浜х嚎" [ref=f1e922]
+            - generic: 璇烽�夋嫨浜х嚎
+        - generic [ref=f1e923]:
+          - generic [ref=f1e924]:
+            - generic [ref=f1e925]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=f1e931]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=f1e932]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=f1e933]:
+          - generic [ref=f1e934]: 璁″垝鏁伴噺
+          - generic [ref=f1e939]:
+            - generic [ref=f1e940]:
+              - button "Increase Value" [ref=f1e941] [cursor=pointer]:
+                - img "up" [ref=f1e942]
+              - button "Decrease Value" [ref=f1e945] [cursor=pointer]:
+                - img "down" [ref=f1e946]
+            - spinbutton "璁″垝鏁伴噺" [ref=f1e950]
+        - generic [ref=f1e951]:
+          - generic [ref=f1e952]:
+            - generic [ref=f1e953]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e960]
+        - generic [ref=f1e966]:
+          - generic [ref=f1e967]: 澶囨敞
+          - textbox "澶囨敞" [ref=f1e972]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=f1e973]:
+        - generic [ref=f1e974]:
+          - generic [ref=f1e975]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=f1e976] [cursor=pointer]
+        - generic [ref=f1e988]:
+          - table [ref=f1e992]:
+            - rowgroup [ref=f1e998]:
+              - row [ref=f1e999]:
+                - columnheader "鐢熶骇浜哄憳" [ref=f1e1000]
+                - columnheader "宀椾綅绫诲瀷" [ref=f1e1005]
+                - columnheader "澶囨敞" [ref=f1e1010]
+                - columnheader "鎿嶄綔" [ref=f1e1015]
+          - table [ref=f1e1051]:
+            - rowgroup [ref=f1e1057]:
+              - row [ref=f1e1058]:
+                - cell [ref=f1e1059]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=f1e1064]
+                - cell [ref=f1e1070]:
+                  - generic [ref=f1e1074] [cursor=pointer]:
+                    - combobox [ref=f1e1076]
+                    - generic: 璇烽�夋嫨宀椾綅绫诲瀷
+                - cell [ref=f1e1077]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=f1e1080]
+                - cell [ref=f1e1081]:
+                  - button "鍒犻櫎" [ref=f1e1087] [cursor=pointer]
+    - button [ref=f1e1031] [cursor=pointer]
+    - generic [ref=f1e1041]:
+      - button "纭� 璁�" [ref=f1e1042] [cursor=pointer]
+      - button "鍙� 娑�" [ref=f1e1045] [cursor=pointer]
+    - button [ref=f1e1047] [cursor=pointer]
+  - dialog "鐗╂枡浜у搧閫夋嫨" [ref=f1e1090]:
+    - document:
+      - generic:
+        - generic:
+          - button "Close":
+            - generic:
+              - img "close"
+          - generic: 鐗╂枡浜у搧閫夋嫨
+          - generic:
+            - generic:
+              - generic:
+                - generic:
+                  - generic:
+                    - generic:
+                      - textbox "鎼滅储鍒嗙被"
+                    - generic:
+                      - generic:
+                        - tree:
+                          - generic:
+                            - textbox "for screen reader"
+                          - generic:
+                            - generic:
+                              - generic:
+                                - generic:
+                                  - generic:
+                                    - generic "鍘熸潗鏂�"
+                                  - generic:
+                                    - generic "鍗婃垚鍝�"
+                                  - generic:
+                                    - generic:
+                                      - img "caret-down"
+                                    - generic "鎴愬搧"
+                                  - generic:
+                                    - generic:
+                                      - img "caret-down"
+                                    - generic "1"
+                                  - generic:
+                                    - generic:
+                                      - img "caret-down"
+                                    - generic "2"
+                                  - generic:
+                                    - generic "33"
+                                  - generic:
+                                    - generic "杈呮枡"
+              - generic:
+                - generic:
+                  - generic:
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic:
+                                - generic: 鐗╂枡缂栫爜
+                                - generic:
+                                  - generic:
+                                    - generic:
+                                      - generic:
+                                        - generic:
+                                          - textbox "鐗╂枡缂栫爜":
+                                            - /placeholder: 璇疯緭鍏ョ墿鏂欑紪鐮�
+                              - generic:
+                                - generic: 鐗╂枡鍚嶇О
+                                - generic:
+                                  - generic:
+                                    - generic:
+                                      - generic:
+                                        - generic:
+                                          - textbox "鐗╂枡鍚嶇О":
+                                            - /placeholder: 璇疯緭鍏ョ墿鏂欏悕绉�
+                              - generic:
+                                - button "閲� 缃�"
+                                - button "鎼� 绱�"
+                                - generic: 鏀惰捣
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic: 鐗╂枡浜у搧鍒楄〃
+                            - generic:
+                              - generic:
+                                - button "顫�"
+                            - generic:
+                              - button "瞟�"
+                              - button "顪�"
+                              - button "顦�"
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic:
+                                - generic:
+                                  - generic:
+                                    - generic:
+                                      - generic:
+                                        - generic:
+                                          - table:
+                                            - rowgroup:
+                                              - row "鐗╂枡缂栫爜 鐗╂枡鍚嶇О 瑙勬牸鍨嬪彿 鍗曚綅 鐗╂枡/浜у搧 鎵�灞炲垎绫� 鍒涘缓鏃堕棿":
+                                                - columnheader
+                                                - columnheader "鐗╂枡缂栫爜"
+                                                - columnheader "鐗╂枡鍚嶇О"
+                                                - columnheader "瑙勬牸鍨嬪彿"
+                                                - columnheader "鍗曚綅"
+                                                - columnheader "鐗╂枡/浜у搧"
+                                                - columnheader "鎵�灞炲垎绫�"
+                                                - columnheader "鍒涘缓鏃堕棿"
+                                      - generic:
+                                        - generic:
+                                          - table:
+                                            - rowgroup:
+                                              - row "顭� ITEM_20260729001 閾濆悎瀵间綋 LH8030JY-10 鍗冪背 鐗╂枡 33 2026-07-29 14:19:03":
+                                                - cell "顭�"
+                                                - cell "ITEM_20260729001"
+                                                - cell "閾濆悎瀵间綋"
+                                                - cell "LH8030JY-10"
+                                                - cell "鍗冪背"
+                                                - cell "鐗╂枡"
+                                                - cell "33"
+                                                - cell "2026-07-29 14:19:03"
+                                              - row "顭� ITEM_20260720001 闇�瑕佺敓浜х殑鎴愬搧11 涓� 鍗冨厠 浜у搧 鎴愬搧 2026-07-20 09:17:13":
+                                                - cell "顭�"
+                                                - cell "ITEM_20260720001"
+                                                - cell "闇�瑕佺敓浜х殑鎴愬搧11"
+                                                - cell "涓�"
+                                                - cell "鍗冨厠"
+                                                - cell "浜у搧"
+                                                - cell "鎴愬搧"
+                                                - cell "2026-07-20 09:17:13"
+                                              - row "顭� ITEM_20260716008 闀�閿岄挗绾� JG3A-1*1.5 鍗冨厠 鐗╂枡 鍘熸潗鏂� 2026-07-16 16:51:57":
+                                                - cell "顭�"
+                                                - cell "ITEM_20260716008"
+                                                - cell "闀�閿岄挗绾�"
+                                                - cell "JG3A-1*1.5"
+                                                - cell "鍗冨厠"
+                                                - cell "鐗╂枡"
+                                                - cell "鍘熸潗鏂�"
+                                                - cell "2026-07-16 16:51:57"
+                                              - row "顫� ITEM_20260716006 閽㈣姱閾濈粸绾� JL/L1-40/10-6/1 鍗冨厠 浜у搧 鎴愬搧 2026-07-16 16:48:49":
+                                                - cell "顫�"
+                                                - cell "ITEM_20260716006"
+                                                - cell "閽㈣姱閾濈粸绾�"
+                                                - cell "JL/L1-40/10-6/1"
+                                                - cell "鍗冨厠"
+                                                - cell "浜у搧"
+                                                - cell "鎴愬搧"
+                                                - cell "2026-07-16 16:48:49"
+                                              - row "顭� ITEM_20260716005 閾濆崟绾� L-1.72 鍗冨厠 鐗╂枡 鍗婃垚鍝� 2026-07-16 16:48:03":
+                                                - cell "顭�"
+                                                - cell "ITEM_20260716005"
+                                                - cell "閾濆崟绾�"
+                                                - cell "L-1.72"
+                                                - cell "鍗冨厠"
+                                                - cell "鐗╂枡"
+                                                - cell "鍗婃垚鍝�"
+                                                - cell "2026-07-16 16:48:03"
+                                              - row "顭� ITEM_20260716004 閾濇潌 1A60 鍗冨厠 鐗╂枡 鍘熸潗鏂� 2026-07-16 16:45:13":
+                                                - cell "顭�"
+                                                - cell "ITEM_20260716004"
+                                                - cell "閾濇潌"
+                                                - cell "1A60"
+                                                - cell "鍗冨厠"
+                                                - cell "鐗╂枡"
+                                                - cell "鍘熸潗鏂�"
+                                                - cell "2026-07-16 16:45:13"
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic: 鍏� 6 鏉¤褰�
+                              - generic:
+                                - generic:
+                                  - generic "20鏉�/椤�":
+                                    - textbox "璇烽�夋嫨": 20鏉�/椤�
+                                  - generic: 睿�
+                              - button "飱�"
+                              - button "顧�"
+                              - button "顫�"
+                              - generic:
+                                - button "1"
+                              - button "顫�"
+                              - button "顧�"
+                              - button "顦�"
+          - generic:
+            - button "鍙� 娑�"
+            - button "纭� 瀹�" [active]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-23-34-308Z.yml b/.playwright-mcp/page-2026-08-18T08-23-34-308Z.yml
new file mode 100644
index 0000000..c6db8d7
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-23-34-308Z.yml
@@ -0,0 +1,288 @@
+- generic [ref=f1e4]:
+  - generic [ref=f1e7]:
+    - complementary [ref=f1e8]:
+      - generic [ref=f1e9]:
+        - generic [ref=f1e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e18]
+          - generic [ref=f1e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f1e22]:
+          - menuitem "棣栭〉" [ref=f1e23] [cursor=pointer]
+          - listitem [ref=f1e30]:
+            - generic [ref=f1e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f1e39]:
+            - generic [ref=f1e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=f1e46]:
+            - generic [ref=f1e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=f1e53]:
+            - generic [ref=f1e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=f1e61]:
+            - generic [ref=f1e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f1e70]:
+            - generic [ref=f1e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=f1e78]:
+            - generic [ref=f1e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f1e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f1e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f1e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f1e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f1e104] [cursor=pointer]
+          - listitem [ref=f1e111]:
+            - generic [ref=f1e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f1e118]:
+            - generic [ref=f1e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=f1e125]:
+            - generic [ref=f1e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=f1e132]:
+            - generic [ref=f1e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=f1e139]:
+            - generic [ref=f1e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=f1e146]:
+            - generic [ref=f1e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=f1e153]:
+            - generic [ref=f1e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=f1e160]:
+            - generic [ref=f1e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=f1e169] [cursor=pointer]
+    - generic [ref=f1e174]:
+      - generic [ref=f1e175]:
+        - banner [ref=f1e176]:
+          - button [ref=f1e177] [cursor=pointer]
+          - button [ref=f1e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f1e185]:
+            - list [ref=f1e186]:
+              - listitem [ref=f1e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f1e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f1e192]
+              - listitem [ref=f1e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f1e196]
+          - generic [ref=f1e201]:
+            - generic [ref=f1e203] [cursor=pointer]:
+              - generic [ref=f1e207]: 鎼滅储
+              - generic [ref=f1e208]: Ctrl K
+            - button [ref=f1e210] [cursor=pointer]
+            - button "dark" [ref=f1e215] [cursor=pointer]
+            - button [ref=f1e224] [cursor=pointer]
+            - button [ref=f1e230] [cursor=pointer]
+            - button [ref=f1e233] [cursor=pointer]
+            - button [ref=f1e239] [cursor=pointer]:
+              - button [ref=f1e241]
+            - button "宸ヤ綔鍙�" [ref=f1e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f1e250] [cursor=pointer]
+        - generic [ref=f1e257]:
+          - generic [ref=f1e262]:
+            - generic [ref=f1e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=f1e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f1e298]:
+            - button [ref=f1e299] [cursor=pointer]
+            - generic [ref=f1e306] [cursor=pointer]
+            - generic [ref=f1e310] [cursor=pointer]
+      - main [ref=f1e317]:
+        - generic [ref=f1e322]:
+          - generic [ref=f1e327]:
+            - generic [ref=f1e328]:
+              - generic [ref=f1e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f1e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f1e337]:
+              - generic [ref=f1e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f1e345]
+            - generic [ref=f1e351]:
+              - generic [ref=f1e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f1e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f1e360]:
+              - generic [ref=f1e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f1e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f1e369]:
+              - generic [ref=f1e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e377]
+            - generic [ref=f1e383]:
+              - generic [ref=f1e384]: 鎵规鐘舵��
+              - generic [ref=f1e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f1e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f1e393]:
+              - generic [ref=f1e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=f1e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f1e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e403]:
+                  - img "swap-right" [ref=f1e404]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e409]:
+              - generic [ref=f1e410]: 鍒涘缓鏃堕棿
+              - generic [ref=f1e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f1e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e419]:
+                  - img "swap-right" [ref=f1e420]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e425]:
+              - button "閲� 缃�" [ref=f1e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f1e428] [cursor=pointer]
+              - generic [ref=f1e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f1e437]:
+            - generic [ref=f1e439]:
+              - generic [ref=f1e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f1e444]:
+                - generic [ref=f1e446]:
+                  - button "鏂板鎵规" [ref=f1e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f1e453] [cursor=pointer]
+                - button "顫�" [ref=f1e459] [cursor=pointer]
+              - generic [ref=f1e461]:
+                - button "瞟�" [ref=f1e462] [cursor=pointer]
+                - button "顪�" [ref=f1e464] [cursor=pointer]
+                - button "顦�" [ref=f1e466] [cursor=pointer]
+            - generic [ref=f1e470]:
+              - generic [ref=f1e473]:
+                - generic [ref=f1e474]:
+                  - table [ref=f1e478]:
+                    - rowgroup [ref=f1e493]:
+                      - row [ref=f1e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=f1e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=f1e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=f1e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=f1e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=f1e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=f1e520]
+                        - columnheader "璐d换浜�" [ref=f1e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=f1e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=f1e535]
+                        - columnheader "鎵规鐘舵��" [ref=f1e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=f1e545]
+                  - generic [ref=f1e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=f1e553]:
+                    - table [ref=f1e556]:
+                      - rowgroup [ref=f1e571]:
+                        - row [ref=f1e572]:
+                          - columnheader "鎵规鍙�" [ref=f1e573]
+                    - generic [ref=f1e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=f1e580]:
+                    - table [ref=f1e583]:
+                      - rowgroup [ref=f1e598]:
+                        - row [ref=f1e599]:
+                          - columnheader "鎿嶄綔" [ref=f1e600]
+                    - generic [ref=f1e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=f1e621]:
+              - generic [ref=f1e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=f1e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f1e625]:
+                  - textbox "璇烽�夋嫨" [ref=f1e626]: 20鏉�/椤�
+                - generic [ref=f1e627]: 睿�
+              - button "飱�" [ref=f1e630]
+              - button "顧�" [ref=f1e632]
+              - button "顫�" [ref=f1e634]
+              - button "1" [ref=f1e637] [cursor=pointer]
+              - button "顫�" [ref=f1e638]
+              - button "顧�" [ref=f1e640]
+              - button "顦�" [ref=f1e642]
+  - dialog [ref=f1e890]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=f1e892]
+    - generic [ref=f1e894]:
+      - generic [ref=f1e896]:
+        - generic [ref=f1e897]:
+          - generic [ref=f1e898]:
+            - generic [ref=f1e899]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=f1e906]: 閽㈣姱閾濈粸绾�
+        - generic [ref=f1e912]:
+          - generic [ref=f1e913]:
+            - generic [ref=f1e914]: "*"
+            - text: 浜х嚎
+          - generic [ref=f1e920]:
+            - combobox "* 浜х嚎" [expanded] [active] [ref=f1e922]:
+              - listbox:
+                - option "1"
+                - option "2"
+            - generic: 璇烽�夋嫨浜х嚎
+        - generic [ref=f1e923]:
+          - generic [ref=f1e924]:
+            - generic [ref=f1e925]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=f1e931]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=f1e932]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=f1e933]:
+          - generic [ref=f1e934]: 璁″垝鏁伴噺
+          - generic [ref=f1e939]:
+            - generic [ref=f1e940]:
+              - button "Increase Value" [ref=f1e941] [cursor=pointer]:
+                - img "up" [ref=f1e942]
+              - button "Decrease Value" [ref=f1e945] [cursor=pointer]:
+                - img "down" [ref=f1e946]
+            - spinbutton "璁″垝鏁伴噺" [ref=f1e950]
+        - generic [ref=f1e951]:
+          - generic [ref=f1e952]:
+            - generic [ref=f1e953]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e960]
+        - generic [ref=f1e966]:
+          - generic [ref=f1e967]: 澶囨敞
+          - textbox "澶囨敞" [ref=f1e972]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=f1e973]:
+        - generic [ref=f1e974]:
+          - generic [ref=f1e975]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=f1e976] [cursor=pointer]
+        - generic [ref=f1e988]:
+          - table [ref=f1e992]:
+            - rowgroup [ref=f1e998]:
+              - row [ref=f1e999]:
+                - columnheader "鐢熶骇浜哄憳" [ref=f1e1000]
+                - columnheader "宀椾綅绫诲瀷" [ref=f1e1005]
+                - columnheader "澶囨敞" [ref=f1e1010]
+                - columnheader "鎿嶄綔" [ref=f1e1015]
+          - table [ref=f1e1051]:
+            - rowgroup [ref=f1e1057]:
+              - row [ref=f1e1058]:
+                - cell [ref=f1e1059]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=f1e1064]
+                - cell [ref=f1e1070]:
+                  - generic [ref=f1e1074] [cursor=pointer]:
+                    - combobox [ref=f1e1076]
+                    - generic: 璇烽�夋嫨宀椾綅绫诲瀷
+                - cell [ref=f1e1077]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=f1e1080]
+                - cell [ref=f1e1081]:
+                  - button "鍒犻櫎" [ref=f1e1087] [cursor=pointer]
+    - button [ref=f1e1031] [cursor=pointer]
+    - generic [ref=f1e1041]:
+      - button "纭� 璁�" [ref=f1e1042] [cursor=pointer]
+      - button "鍙� 娑�" [ref=f1e1045] [cursor=pointer]
+    - button [ref=f1e1047] [cursor=pointer]
+  - generic:
+    - generic:
+      - generic:
+        - generic:
+          - generic:
+            - generic:
+              - generic:
+                - generic:
+                  - generic:
+                    - generic:
+                      - generic:
+                        - generic: 浜х嚎涓�
+                        - generic: one
+                  - generic:
+                    - generic:
+                      - generic:
+                        - generic: 浜х嚎浜�
+                        - generic: two
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-23-42-579Z.yml b/.playwright-mcp/page-2026-08-18T08-23-42-579Z.yml
new file mode 100644
index 0000000..65817e8
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-23-42-579Z.yml
@@ -0,0 +1,292 @@
+- generic [ref=f1e4]:
+  - generic [ref=f1e7]:
+    - complementary [ref=f1e8]:
+      - generic [ref=f1e9]:
+        - generic [ref=f1e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e18]
+          - generic [ref=f1e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f1e22]:
+          - menuitem "棣栭〉" [ref=f1e23] [cursor=pointer]
+          - listitem [ref=f1e30]:
+            - generic [ref=f1e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f1e39]:
+            - generic [ref=f1e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=f1e46]:
+            - generic [ref=f1e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=f1e53]:
+            - generic [ref=f1e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=f1e61]:
+            - generic [ref=f1e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f1e70]:
+            - generic [ref=f1e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=f1e78]:
+            - generic [ref=f1e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f1e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f1e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f1e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f1e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f1e104] [cursor=pointer]
+          - listitem [ref=f1e111]:
+            - generic [ref=f1e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f1e118]:
+            - generic [ref=f1e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=f1e125]:
+            - generic [ref=f1e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=f1e132]:
+            - generic [ref=f1e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=f1e139]:
+            - generic [ref=f1e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=f1e146]:
+            - generic [ref=f1e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=f1e153]:
+            - generic [ref=f1e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=f1e160]:
+            - generic [ref=f1e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=f1e169] [cursor=pointer]
+    - generic [ref=f1e174]:
+      - generic [ref=f1e175]:
+        - banner [ref=f1e176]:
+          - button [ref=f1e177] [cursor=pointer]
+          - button [ref=f1e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f1e185]:
+            - list [ref=f1e186]:
+              - listitem [ref=f1e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f1e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f1e192]
+              - listitem [ref=f1e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f1e196]
+          - generic [ref=f1e201]:
+            - generic [ref=f1e203] [cursor=pointer]:
+              - generic [ref=f1e207]: 鎼滅储
+              - generic [ref=f1e208]: Ctrl K
+            - button [ref=f1e210] [cursor=pointer]
+            - button "dark" [ref=f1e215] [cursor=pointer]
+            - button [ref=f1e224] [cursor=pointer]
+            - button [ref=f1e230] [cursor=pointer]
+            - button [ref=f1e233] [cursor=pointer]
+            - button [ref=f1e239] [cursor=pointer]:
+              - button [ref=f1e241]
+            - button "宸ヤ綔鍙�" [ref=f1e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f1e250] [cursor=pointer]
+        - generic [ref=f1e257]:
+          - generic [ref=f1e262]:
+            - generic [ref=f1e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=f1e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f1e298]:
+            - button [ref=f1e299] [cursor=pointer]
+            - generic [ref=f1e306] [cursor=pointer]
+            - generic [ref=f1e310] [cursor=pointer]
+      - main [ref=f1e317]:
+        - generic [ref=f1e322]:
+          - generic [ref=f1e327]:
+            - generic [ref=f1e328]:
+              - generic [ref=f1e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f1e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f1e337]:
+              - generic [ref=f1e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f1e345]
+            - generic [ref=f1e351]:
+              - generic [ref=f1e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f1e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f1e360]:
+              - generic [ref=f1e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f1e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f1e369]:
+              - generic [ref=f1e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e377]
+            - generic [ref=f1e383]:
+              - generic [ref=f1e384]: 鎵规鐘舵��
+              - generic [ref=f1e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f1e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f1e393]:
+              - generic [ref=f1e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=f1e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f1e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e403]:
+                  - img "swap-right" [ref=f1e404]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e409]:
+              - generic [ref=f1e410]: 鍒涘缓鏃堕棿
+              - generic [ref=f1e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f1e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e419]:
+                  - img "swap-right" [ref=f1e420]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e425]:
+              - button "閲� 缃�" [ref=f1e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f1e428] [cursor=pointer]
+              - generic [ref=f1e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f1e437]:
+            - generic [ref=f1e439]:
+              - generic [ref=f1e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f1e444]:
+                - generic [ref=f1e446]:
+                  - button "鏂板鎵规" [ref=f1e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f1e453] [cursor=pointer]
+                - button "顫�" [ref=f1e459] [cursor=pointer]
+              - generic [ref=f1e461]:
+                - button "瞟�" [ref=f1e462] [cursor=pointer]
+                - button "顪�" [ref=f1e464] [cursor=pointer]
+                - button "顦�" [ref=f1e466] [cursor=pointer]
+            - generic [ref=f1e470]:
+              - generic [ref=f1e473]:
+                - generic [ref=f1e474]:
+                  - table [ref=f1e478]:
+                    - rowgroup [ref=f1e493]:
+                      - row [ref=f1e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=f1e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=f1e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=f1e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=f1e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=f1e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=f1e520]
+                        - columnheader "璐d换浜�" [ref=f1e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=f1e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=f1e535]
+                        - columnheader "鎵规鐘舵��" [ref=f1e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=f1e545]
+                  - generic [ref=f1e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=f1e553]:
+                    - table [ref=f1e556]:
+                      - rowgroup [ref=f1e571]:
+                        - row [ref=f1e572]:
+                          - columnheader "鎵规鍙�" [ref=f1e573]
+                    - generic [ref=f1e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=f1e580]:
+                    - table [ref=f1e583]:
+                      - rowgroup [ref=f1e598]:
+                        - row [ref=f1e599]:
+                          - columnheader "鎿嶄綔" [ref=f1e600]
+                    - generic [ref=f1e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=f1e621]:
+              - generic [ref=f1e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=f1e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f1e625]:
+                  - textbox "璇烽�夋嫨" [ref=f1e626]: 20鏉�/椤�
+                - generic [ref=f1e627]: 睿�
+              - button "飱�" [ref=f1e630]
+              - button "顧�" [ref=f1e632]
+              - button "顫�" [ref=f1e634]
+              - button "1" [ref=f1e637] [cursor=pointer]
+              - button "顫�" [ref=f1e638]
+              - button "顧�" [ref=f1e640]
+              - button "顦�" [ref=f1e642]
+  - dialog [ref=f1e890]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=f1e892]
+    - generic [ref=f1e894]:
+      - generic [ref=f1e896]:
+        - generic [ref=f1e897]:
+          - generic [ref=f1e898]:
+            - generic [ref=f1e899]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=f1e906]: 閽㈣姱閾濈粸绾�
+        - generic [ref=f1e912]:
+          - generic [ref=f1e913]:
+            - generic [ref=f1e914]: "*"
+            - text: 浜х嚎
+          - generic [ref=f1e919] [cursor=pointer]:
+            - generic: "2"
+            - generic [ref=f1e920]:
+              - combobox "* 浜х嚎" [active] [ref=f1e922]:
+                - listbox:
+                  - option "1"
+                  - option "2" [selected]
+              - generic [ref=f1e1522]:
+                - generic [ref=f1e1523]: 浜х嚎浜�
+                - generic [ref=f1e1524]: two
+        - generic [ref=f1e923]:
+          - generic [ref=f1e924]:
+            - generic [ref=f1e925]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=f1e931]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=f1e932]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=f1e933]:
+          - generic [ref=f1e934]: 璁″垝鏁伴噺
+          - generic [ref=f1e939]:
+            - generic [ref=f1e940]:
+              - button "Increase Value" [ref=f1e941] [cursor=pointer]:
+                - img "up" [ref=f1e942]
+              - button "Decrease Value" [ref=f1e945] [cursor=pointer]:
+                - img "down" [ref=f1e946]
+            - spinbutton "璁″垝鏁伴噺" [ref=f1e950]
+        - generic [ref=f1e951]:
+          - generic [ref=f1e952]:
+            - generic [ref=f1e953]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e960]
+        - generic [ref=f1e966]:
+          - generic [ref=f1e967]: 澶囨敞
+          - textbox "澶囨敞" [ref=f1e972]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=f1e973]:
+        - generic [ref=f1e974]:
+          - generic [ref=f1e975]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=f1e976] [cursor=pointer]
+        - generic [ref=f1e988]:
+          - table [ref=f1e992]:
+            - rowgroup [ref=f1e998]:
+              - row [ref=f1e999]:
+                - columnheader "鐢熶骇浜哄憳" [ref=f1e1000]
+                - columnheader "宀椾綅绫诲瀷" [ref=f1e1005]
+                - columnheader "澶囨敞" [ref=f1e1010]
+                - columnheader "鎿嶄綔" [ref=f1e1015]
+          - table [ref=f1e1051]:
+            - rowgroup [ref=f1e1057]:
+              - row [ref=f1e1058]:
+                - cell [ref=f1e1059]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=f1e1064]
+                - cell [ref=f1e1070]:
+                  - generic [ref=f1e1074] [cursor=pointer]:
+                    - combobox [ref=f1e1076]
+                    - generic: 璇烽�夋嫨宀椾綅绫诲瀷
+                - cell [ref=f1e1077]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=f1e1080]
+                - cell [ref=f1e1081]:
+                  - button "鍒犻櫎" [ref=f1e1087] [cursor=pointer]
+    - button [ref=f1e1031] [cursor=pointer]
+    - generic [ref=f1e1041]:
+      - button "纭� 璁�" [ref=f1e1042] [cursor=pointer]
+      - button "鍙� 娑�" [ref=f1e1045] [cursor=pointer]
+    - button [ref=f1e1047] [cursor=pointer]
+  - generic:
+    - generic:
+      - generic:
+        - generic:
+          - generic:
+            - generic:
+              - generic:
+                - generic:
+                  - generic:
+                    - generic:
+                      - generic:
+                        - generic: 浜х嚎涓�
+                        - generic: one
+                  - generic:
+                    - generic:
+                      - generic:
+                        - generic: 浜х嚎浜�
+                        - generic: two
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-23-57-412Z.yml b/.playwright-mcp/page-2026-08-18T08-23-57-412Z.yml
new file mode 100644
index 0000000..5598bd6
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-23-57-412Z.yml
@@ -0,0 +1,643 @@
+- generic [ref=f1e4]:
+  - generic [ref=f1e7]:
+    - complementary [ref=f1e8]:
+      - generic [ref=f1e9]:
+        - generic [ref=f1e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e18]
+          - generic [ref=f1e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f1e22]:
+          - menuitem "棣栭〉" [ref=f1e23] [cursor=pointer]
+          - listitem [ref=f1e30]:
+            - generic [ref=f1e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f1e39]:
+            - generic [ref=f1e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=f1e46]:
+            - generic [ref=f1e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=f1e53]:
+            - generic [ref=f1e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=f1e61]:
+            - generic [ref=f1e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f1e70]:
+            - generic [ref=f1e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=f1e78]:
+            - generic [ref=f1e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f1e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f1e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f1e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f1e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f1e104] [cursor=pointer]
+          - listitem [ref=f1e111]:
+            - generic [ref=f1e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f1e118]:
+            - generic [ref=f1e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=f1e125]:
+            - generic [ref=f1e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=f1e132]:
+            - generic [ref=f1e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=f1e139]:
+            - generic [ref=f1e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=f1e146]:
+            - generic [ref=f1e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=f1e153]:
+            - generic [ref=f1e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=f1e160]:
+            - generic [ref=f1e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=f1e169] [cursor=pointer]
+    - generic [ref=f1e174]:
+      - generic [ref=f1e175]:
+        - banner [ref=f1e176]:
+          - button [ref=f1e177] [cursor=pointer]
+          - button [ref=f1e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f1e185]:
+            - list [ref=f1e186]:
+              - listitem [ref=f1e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f1e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f1e192]
+              - listitem [ref=f1e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f1e196]
+          - generic [ref=f1e201]:
+            - generic [ref=f1e203] [cursor=pointer]:
+              - generic [ref=f1e207]: 鎼滅储
+              - generic [ref=f1e208]: Ctrl K
+            - button [ref=f1e210] [cursor=pointer]
+            - button "dark" [ref=f1e215] [cursor=pointer]
+            - button [ref=f1e224] [cursor=pointer]
+            - button [ref=f1e230] [cursor=pointer]
+            - button [ref=f1e233] [cursor=pointer]
+            - button [ref=f1e239] [cursor=pointer]:
+              - button [ref=f1e241]
+            - button "宸ヤ綔鍙�" [ref=f1e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f1e250] [cursor=pointer]
+        - generic [ref=f1e257]:
+          - generic [ref=f1e262]:
+            - generic [ref=f1e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=f1e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f1e298]:
+            - button [ref=f1e299] [cursor=pointer]
+            - generic [ref=f1e306] [cursor=pointer]
+            - generic [ref=f1e310] [cursor=pointer]
+      - main [ref=f1e317]:
+        - generic [ref=f1e322]:
+          - generic [ref=f1e327]:
+            - generic [ref=f1e328]:
+              - generic [ref=f1e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f1e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f1e337]:
+              - generic [ref=f1e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f1e345]
+            - generic [ref=f1e351]:
+              - generic [ref=f1e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f1e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f1e360]:
+              - generic [ref=f1e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f1e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f1e369]:
+              - generic [ref=f1e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e377]
+            - generic [ref=f1e383]:
+              - generic [ref=f1e384]: 鎵规鐘舵��
+              - generic [ref=f1e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f1e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f1e393]:
+              - generic [ref=f1e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=f1e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f1e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e403]:
+                  - img "swap-right" [ref=f1e404]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e409]:
+              - generic [ref=f1e410]: 鍒涘缓鏃堕棿
+              - generic [ref=f1e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f1e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e419]:
+                  - img "swap-right" [ref=f1e420]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e425]:
+              - button "閲� 缃�" [ref=f1e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f1e428] [cursor=pointer]
+              - generic [ref=f1e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f1e437]:
+            - generic [ref=f1e439]:
+              - generic [ref=f1e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f1e444]:
+                - generic [ref=f1e446]:
+                  - button "鏂板鎵规" [ref=f1e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f1e453] [cursor=pointer]
+                - button "顫�" [ref=f1e459] [cursor=pointer]
+              - generic [ref=f1e461]:
+                - button "瞟�" [ref=f1e462] [cursor=pointer]
+                - button "顪�" [ref=f1e464] [cursor=pointer]
+                - button "顦�" [ref=f1e466] [cursor=pointer]
+            - generic [ref=f1e470]:
+              - generic [ref=f1e473]:
+                - generic [ref=f1e474]:
+                  - table [ref=f1e478]:
+                    - rowgroup [ref=f1e493]:
+                      - row [ref=f1e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=f1e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=f1e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=f1e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=f1e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=f1e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=f1e520]
+                        - columnheader "璐d换浜�" [ref=f1e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=f1e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=f1e535]
+                        - columnheader "鎵规鐘舵��" [ref=f1e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=f1e545]
+                  - generic [ref=f1e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=f1e553]:
+                    - table [ref=f1e556]:
+                      - rowgroup [ref=f1e571]:
+                        - row [ref=f1e572]:
+                          - columnheader "鎵规鍙�" [ref=f1e573]
+                    - generic [ref=f1e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=f1e580]:
+                    - table [ref=f1e583]:
+                      - rowgroup [ref=f1e598]:
+                        - row [ref=f1e599]:
+                          - columnheader "鎿嶄綔" [ref=f1e600]
+                    - generic [ref=f1e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=f1e621]:
+              - generic [ref=f1e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=f1e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f1e625]:
+                  - textbox "璇烽�夋嫨" [ref=f1e626]: 20鏉�/椤�
+                - generic [ref=f1e627]: 睿�
+              - button "飱�" [ref=f1e630]
+              - button "顧�" [ref=f1e632]
+              - button "顫�" [ref=f1e634]
+              - button "1" [ref=f1e637] [cursor=pointer]
+              - button "顫�" [ref=f1e638]
+              - button "顧�" [ref=f1e640]
+              - button "顦�" [ref=f1e642]
+  - dialog [ref=f1e890]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=f1e892]
+    - generic [ref=f1e894]:
+      - generic [ref=f1e896]:
+        - generic [ref=f1e897]:
+          - generic [ref=f1e898]:
+            - generic [ref=f1e899]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=f1e906]: 閽㈣姱閾濈粸绾�
+        - generic [ref=f1e912]:
+          - generic [ref=f1e913]:
+            - generic [ref=f1e914]: "*"
+            - text: 浜х嚎
+          - generic [ref=f1e920]:
+            - combobox "* 浜х嚎" [ref=f1e922]
+            - generic [ref=f1e1522]:
+              - generic [ref=f1e1523]: 浜х嚎浜�
+              - generic [ref=f1e1524]: two
+        - generic [ref=f1e923]:
+          - generic [ref=f1e924]:
+            - generic [ref=f1e925]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=f1e931]:
+            - textbox "* 鐢熶骇鏃ユ湡" [active] [ref=f1e932]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+            - generic:
+              - img "calendar"
+        - generic [ref=f1e933]:
+          - generic [ref=f1e934]: 璁″垝鏁伴噺
+          - generic [ref=f1e939]:
+            - generic [ref=f1e940]:
+              - button "Increase Value" [ref=f1e941] [cursor=pointer]:
+                - img "up" [ref=f1e942]
+              - button "Decrease Value" [ref=f1e945] [cursor=pointer]:
+                - img "down" [ref=f1e946]
+            - spinbutton "璁″垝鏁伴噺" [ref=f1e950]
+        - generic [ref=f1e951]:
+          - generic [ref=f1e952]:
+            - generic [ref=f1e953]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e960]
+        - generic [ref=f1e966]:
+          - generic [ref=f1e967]: 澶囨敞
+          - textbox "澶囨敞" [ref=f1e972]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=f1e973]:
+        - generic [ref=f1e974]:
+          - generic [ref=f1e975]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=f1e976] [cursor=pointer]
+        - generic [ref=f1e988]:
+          - table [ref=f1e992]:
+            - rowgroup [ref=f1e998]:
+              - row [ref=f1e999]:
+                - columnheader "鐢熶骇浜哄憳" [ref=f1e1000]
+                - columnheader "宀椾綅绫诲瀷" [ref=f1e1005]
+                - columnheader "澶囨敞" [ref=f1e1010]
+                - columnheader "鎿嶄綔" [ref=f1e1015]
+          - table [ref=f1e1051]:
+            - rowgroup [ref=f1e1057]:
+              - row [ref=f1e1058]:
+                - cell [ref=f1e1059]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=f1e1064]
+                - cell [ref=f1e1070]:
+                  - generic [ref=f1e1074] [cursor=pointer]:
+                    - combobox [ref=f1e1076]
+                    - generic: 璇烽�夋嫨宀椾綅绫诲瀷
+                - cell [ref=f1e1077]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=f1e1080]
+                - cell [ref=f1e1081]:
+                  - button "鍒犻櫎" [ref=f1e1087] [cursor=pointer]
+    - button [ref=f1e1031] [cursor=pointer]
+    - generic [ref=f1e1041]:
+      - button "纭� 璁�" [ref=f1e1042] [cursor=pointer]
+      - button "鍙� 娑�" [ref=f1e1045] [cursor=pointer]
+    - button [ref=f1e1047] [cursor=pointer]
+  - generic:
+    - generic:
+      - generic:
+        - generic:
+          - generic:
+            - generic:
+              - generic:
+                - generic:
+                  - generic:
+                    - button
+                    - button
+                    - generic:
+                      - button "2026骞�"
+                      - button "8鏈�"
+                    - button
+                    - button
+                  - generic:
+                    - table:
+                      - rowgroup:
+                        - row "涓� 浜� 涓� 鍥� 浜� 鍏� 鏃�":
+                          - columnheader "涓�"
+                          - columnheader "浜�"
+                          - columnheader "涓�"
+                          - columnheader "鍥�"
+                          - columnheader "浜�"
+                          - columnheader "鍏�"
+                          - columnheader "鏃�"
+                      - rowgroup:
+                        - row "27 28 29 30 31 1 2":
+                          - cell "27"
+                          - cell "28"
+                          - cell "29"
+                          - cell "30"
+                          - cell "31"
+                          - cell "1"
+                          - cell "2"
+                        - row "3 4 5 6 7 8 9":
+                          - cell "3"
+                          - cell "4"
+                          - cell "5"
+                          - cell "6"
+                          - cell "7"
+                          - cell "8"
+                          - cell "9"
+                        - row "10 11 12 13 14 15 16":
+                          - cell "10"
+                          - cell "11"
+                          - cell "12"
+                          - cell "13"
+                          - cell "14"
+                          - cell "15"
+                          - cell "16"
+                        - row "17 18 19 20 21 22 23":
+                          - cell "17"
+                          - cell "18"
+                          - cell "19"
+                          - cell "20"
+                          - cell "21"
+                          - cell "22"
+                          - cell "23"
+                        - row "24 25 26 27 28 29 30":
+                          - cell "24"
+                          - cell "25"
+                          - cell "26"
+                          - cell "27"
+                          - cell "28"
+                          - cell "29"
+                          - cell "30"
+                        - row "31 1 2 3 4 5 6":
+                          - cell "31"
+                          - cell "1"
+                          - cell "2"
+                          - cell "3"
+                          - cell "4"
+                          - cell "5"
+                          - cell "6"
+                - generic:
+                  - generic:
+                    - list:
+                      - listitem:
+                        - generic: "00"
+                      - listitem:
+                        - generic: "01"
+                      - listitem:
+                        - generic: "02"
+                      - listitem:
+                        - generic: "03"
+                      - listitem:
+                        - generic: "04"
+                      - listitem:
+                        - generic: "05"
+                      - listitem:
+                        - generic: "06"
+                      - listitem:
+                        - generic: "07"
+                      - listitem:
+                        - generic: "08"
+                      - listitem:
+                        - generic: "09"
+                      - listitem:
+                        - generic: "10"
+                      - listitem:
+                        - generic: "11"
+                      - listitem:
+                        - generic: "12"
+                      - listitem:
+                        - generic: "13"
+                      - listitem:
+                        - generic: "14"
+                      - listitem:
+                        - generic: "15"
+                      - listitem:
+                        - generic: "16"
+                      - listitem:
+                        - generic: "17"
+                      - listitem:
+                        - generic: "18"
+                      - listitem:
+                        - generic: "19"
+                      - listitem:
+                        - generic: "20"
+                      - listitem:
+                        - generic: "21"
+                      - listitem:
+                        - generic: "22"
+                      - listitem:
+                        - generic: "23"
+                    - list:
+                      - listitem:
+                        - generic: "00"
+                      - listitem:
+                        - generic: "01"
+                      - listitem:
+                        - generic: "02"
+                      - listitem:
+                        - generic: "03"
+                      - listitem:
+                        - generic: "04"
+                      - listitem:
+                        - generic: "05"
+                      - listitem:
+                        - generic: "06"
+                      - listitem:
+                        - generic: "07"
+                      - listitem:
+                        - generic: "08"
+                      - listitem:
+                        - generic: "09"
+                      - listitem:
+                        - generic: "10"
+                      - listitem:
+                        - generic: "11"
+                      - listitem:
+                        - generic: "12"
+                      - listitem:
+                        - generic: "13"
+                      - listitem:
+                        - generic: "14"
+                      - listitem:
+                        - generic: "15"
+                      - listitem:
+                        - generic: "16"
+                      - listitem:
+                        - generic: "17"
+                      - listitem:
+                        - generic: "18"
+                      - listitem:
+                        - generic: "19"
+                      - listitem:
+                        - generic: "20"
+                      - listitem:
+                        - generic: "21"
+                      - listitem:
+                        - generic: "22"
+                      - listitem:
+                        - generic: "23"
+                      - listitem:
+                        - generic: "24"
+                      - listitem:
+                        - generic: "25"
+                      - listitem:
+                        - generic: "26"
+                      - listitem:
+                        - generic: "27"
+                      - listitem:
+                        - generic: "28"
+                      - listitem:
+                        - generic: "29"
+                      - listitem:
+                        - generic: "30"
+                      - listitem:
+                        - generic: "31"
+                      - listitem:
+                        - generic: "32"
+                      - listitem:
+                        - generic: "33"
+                      - listitem:
+                        - generic: "34"
+                      - listitem:
+                        - generic: "35"
+                      - listitem:
+                        - generic: "36"
+                      - listitem:
+                        - generic: "37"
+                      - listitem:
+                        - generic: "38"
+                      - listitem:
+                        - generic: "39"
+                      - listitem:
+                        - generic: "40"
+                      - listitem:
+                        - generic: "41"
+                      - listitem:
+                        - generic: "42"
+                      - listitem:
+                        - generic: "43"
+                      - listitem:
+                        - generic: "44"
+                      - listitem:
+                        - generic: "45"
+                      - listitem:
+                        - generic: "46"
+                      - listitem:
+                        - generic: "47"
+                      - listitem:
+                        - generic: "48"
+                      - listitem:
+                        - generic: "49"
+                      - listitem:
+                        - generic: "50"
+                      - listitem:
+                        - generic: "51"
+                      - listitem:
+                        - generic: "52"
+                      - listitem:
+                        - generic: "53"
+                      - listitem:
+                        - generic: "54"
+                      - listitem:
+                        - generic: "55"
+                      - listitem:
+                        - generic: "56"
+                      - listitem:
+                        - generic: "57"
+                      - listitem:
+                        - generic: "58"
+                      - listitem:
+                        - generic: "59"
+                    - list:
+                      - listitem:
+                        - generic: "00"
+                      - listitem:
+                        - generic: "01"
+                      - listitem:
+                        - generic: "02"
+                      - listitem:
+                        - generic: "03"
+                      - listitem:
+                        - generic: "04"
+                      - listitem:
+                        - generic: "05"
+                      - listitem:
+                        - generic: "06"
+                      - listitem:
+                        - generic: "07"
+                      - listitem:
+                        - generic: "08"
+                      - listitem:
+                        - generic: "09"
+                      - listitem:
+                        - generic: "10"
+                      - listitem:
+                        - generic: "11"
+                      - listitem:
+                        - generic: "12"
+                      - listitem:
+                        - generic: "13"
+                      - listitem:
+                        - generic: "14"
+                      - listitem:
+                        - generic: "15"
+                      - listitem:
+                        - generic: "16"
+                      - listitem:
+                        - generic: "17"
+                      - listitem:
+                        - generic: "18"
+                      - listitem:
+                        - generic: "19"
+                      - listitem:
+                        - generic: "20"
+                      - listitem:
+                        - generic: "21"
+                      - listitem:
+                        - generic: "22"
+                      - listitem:
+                        - generic: "23"
+                      - listitem:
+                        - generic: "24"
+                      - listitem:
+                        - generic: "25"
+                      - listitem:
+                        - generic: "26"
+                      - listitem:
+                        - generic: "27"
+                      - listitem:
+                        - generic: "28"
+                      - listitem:
+                        - generic: "29"
+                      - listitem:
+                        - generic: "30"
+                      - listitem:
+                        - generic: "31"
+                      - listitem:
+                        - generic: "32"
+                      - listitem:
+                        - generic: "33"
+                      - listitem:
+                        - generic: "34"
+                      - listitem:
+                        - generic: "35"
+                      - listitem:
+                        - generic: "36"
+                      - listitem:
+                        - generic: "37"
+                      - listitem:
+                        - generic: "38"
+                      - listitem:
+                        - generic: "39"
+                      - listitem:
+                        - generic: "40"
+                      - listitem:
+                        - generic: "41"
+                      - listitem:
+                        - generic: "42"
+                      - listitem:
+                        - generic: "43"
+                      - listitem:
+                        - generic: "44"
+                      - listitem:
+                        - generic: "45"
+                      - listitem:
+                        - generic: "46"
+                      - listitem:
+                        - generic: "47"
+                      - listitem:
+                        - generic: "48"
+                      - listitem:
+                        - generic: "49"
+                      - listitem:
+                        - generic: "50"
+                      - listitem:
+                        - generic: "51"
+                      - listitem:
+                        - generic: "52"
+                      - listitem:
+                        - generic: "53"
+                      - listitem:
+                        - generic: "54"
+                      - listitem:
+                        - generic: "55"
+                      - listitem:
+                        - generic: "56"
+                      - listitem:
+                        - generic: "57"
+                      - listitem:
+                        - generic: "58"
+                      - listitem:
+                        - generic: "59"
+              - generic:
+                - list:
+                  - listitem: 姝ゅ埢
+                  - listitem:
+                    - button "纭� 瀹�" [disabled]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-24-05-557Z.yml b/.playwright-mcp/page-2026-08-18T08-24-05-557Z.yml
new file mode 100644
index 0000000..bf1f170
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-24-05-557Z.yml
@@ -0,0 +1,647 @@
+- generic [ref=f1e4]:
+  - generic [ref=f1e7]:
+    - complementary [ref=f1e8]:
+      - generic [ref=f1e9]:
+        - generic [ref=f1e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e18]
+          - generic [ref=f1e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f1e22]:
+          - menuitem "棣栭〉" [ref=f1e23] [cursor=pointer]
+          - listitem [ref=f1e30]:
+            - generic [ref=f1e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f1e39]:
+            - generic [ref=f1e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=f1e46]:
+            - generic [ref=f1e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=f1e53]:
+            - generic [ref=f1e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=f1e61]:
+            - generic [ref=f1e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f1e70]:
+            - generic [ref=f1e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=f1e78]:
+            - generic [ref=f1e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f1e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f1e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f1e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f1e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f1e104] [cursor=pointer]
+          - listitem [ref=f1e111]:
+            - generic [ref=f1e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f1e118]:
+            - generic [ref=f1e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=f1e125]:
+            - generic [ref=f1e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=f1e132]:
+            - generic [ref=f1e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=f1e139]:
+            - generic [ref=f1e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=f1e146]:
+            - generic [ref=f1e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=f1e153]:
+            - generic [ref=f1e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=f1e160]:
+            - generic [ref=f1e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=f1e169] [cursor=pointer]
+    - generic [ref=f1e174]:
+      - generic [ref=f1e175]:
+        - banner [ref=f1e176]:
+          - button [ref=f1e177] [cursor=pointer]
+          - button [ref=f1e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f1e185]:
+            - list [ref=f1e186]:
+              - listitem [ref=f1e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f1e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f1e192]
+              - listitem [ref=f1e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f1e196]
+          - generic [ref=f1e201]:
+            - generic [ref=f1e203] [cursor=pointer]:
+              - generic [ref=f1e207]: 鎼滅储
+              - generic [ref=f1e208]: Ctrl K
+            - button [ref=f1e210] [cursor=pointer]
+            - button "dark" [ref=f1e215] [cursor=pointer]
+            - button [ref=f1e224] [cursor=pointer]
+            - button [ref=f1e230] [cursor=pointer]
+            - button [ref=f1e233] [cursor=pointer]
+            - button [ref=f1e239] [cursor=pointer]:
+              - button [ref=f1e241]
+            - button "宸ヤ綔鍙�" [ref=f1e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f1e250] [cursor=pointer]
+        - generic [ref=f1e257]:
+          - generic [ref=f1e262]:
+            - generic [ref=f1e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=f1e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f1e298]:
+            - button [ref=f1e299] [cursor=pointer]
+            - generic [ref=f1e306] [cursor=pointer]
+            - generic [ref=f1e310] [cursor=pointer]
+      - main [ref=f1e317]:
+        - generic [ref=f1e322]:
+          - generic [ref=f1e327]:
+            - generic [ref=f1e328]:
+              - generic [ref=f1e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f1e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f1e337]:
+              - generic [ref=f1e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f1e345]
+            - generic [ref=f1e351]:
+              - generic [ref=f1e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f1e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f1e360]:
+              - generic [ref=f1e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f1e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f1e369]:
+              - generic [ref=f1e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e377]
+            - generic [ref=f1e383]:
+              - generic [ref=f1e384]: 鎵规鐘舵��
+              - generic [ref=f1e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f1e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f1e393]:
+              - generic [ref=f1e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=f1e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f1e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e403]:
+                  - img "swap-right" [ref=f1e404]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e409]:
+              - generic [ref=f1e410]: 鍒涘缓鏃堕棿
+              - generic [ref=f1e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f1e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e419]:
+                  - img "swap-right" [ref=f1e420]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e425]:
+              - button "閲� 缃�" [ref=f1e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f1e428] [cursor=pointer]
+              - generic [ref=f1e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f1e437]:
+            - generic [ref=f1e439]:
+              - generic [ref=f1e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f1e444]:
+                - generic [ref=f1e446]:
+                  - button "鏂板鎵规" [ref=f1e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f1e453] [cursor=pointer]
+                - button "顫�" [ref=f1e459] [cursor=pointer]
+              - generic [ref=f1e461]:
+                - button "瞟�" [ref=f1e462] [cursor=pointer]
+                - button "顪�" [ref=f1e464] [cursor=pointer]
+                - button "顦�" [ref=f1e466] [cursor=pointer]
+            - generic [ref=f1e470]:
+              - generic [ref=f1e473]:
+                - generic [ref=f1e474]:
+                  - table [ref=f1e478]:
+                    - rowgroup [ref=f1e493]:
+                      - row [ref=f1e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=f1e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=f1e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=f1e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=f1e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=f1e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=f1e520]
+                        - columnheader "璐d换浜�" [ref=f1e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=f1e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=f1e535]
+                        - columnheader "鎵规鐘舵��" [ref=f1e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=f1e545]
+                  - generic [ref=f1e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=f1e553]:
+                    - table [ref=f1e556]:
+                      - rowgroup [ref=f1e571]:
+                        - row [ref=f1e572]:
+                          - columnheader "鎵规鍙�" [ref=f1e573]
+                    - generic [ref=f1e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=f1e580]:
+                    - table [ref=f1e583]:
+                      - rowgroup [ref=f1e598]:
+                        - row [ref=f1e599]:
+                          - columnheader "鎿嶄綔" [ref=f1e600]
+                    - generic [ref=f1e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=f1e621]:
+              - generic [ref=f1e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=f1e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f1e625]:
+                  - textbox "璇烽�夋嫨" [ref=f1e626]: 20鏉�/椤�
+                - generic [ref=f1e627]: 睿�
+              - button "飱�" [ref=f1e630]
+              - button "顧�" [ref=f1e632]
+              - button "顫�" [ref=f1e634]
+              - button "1" [ref=f1e637] [cursor=pointer]
+              - button "顫�" [ref=f1e638]
+              - button "顧�" [ref=f1e640]
+              - button "顦�" [ref=f1e642]
+  - dialog [ref=f1e890]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=f1e892]
+    - generic [ref=f1e894]:
+      - generic [ref=f1e896]:
+        - generic [ref=f1e897]:
+          - generic [ref=f1e898]:
+            - generic [ref=f1e899]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=f1e906]: 閽㈣姱閾濈粸绾�
+        - generic [ref=f1e912]:
+          - generic [ref=f1e913]:
+            - generic [ref=f1e914]: "*"
+            - text: 浜х嚎
+          - generic [ref=f1e920]:
+            - combobox "* 浜х嚎" [ref=f1e922]
+            - generic [ref=f1e1522]:
+              - generic [ref=f1e1523]: 浜х嚎浜�
+              - generic [ref=f1e1524]: two
+        - generic [ref=f1e923]:
+          - generic [ref=f1e924]:
+            - generic [ref=f1e925]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=f1e931]:
+            - textbox "* 鐢熶骇鏃ユ湡" [active] [ref=f1e932]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+              - text: 2026-08-18 08:00:00
+            - generic:
+              - img "calendar"
+            - button [ref=f1e1529] [cursor=pointer]:
+              - img "close-circle" [ref=f1e1530]
+        - generic [ref=f1e933]:
+          - generic [ref=f1e934]: 璁″垝鏁伴噺
+          - generic [ref=f1e939]:
+            - generic [ref=f1e940]:
+              - button "Increase Value" [ref=f1e941] [cursor=pointer]:
+                - img "up" [ref=f1e942]
+              - button "Decrease Value" [ref=f1e945] [cursor=pointer]:
+                - img "down" [ref=f1e946]
+            - spinbutton "璁″垝鏁伴噺" [ref=f1e950]
+        - generic [ref=f1e951]:
+          - generic [ref=f1e952]:
+            - generic [ref=f1e953]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e960]
+        - generic [ref=f1e966]:
+          - generic [ref=f1e967]: 澶囨敞
+          - textbox "澶囨敞" [ref=f1e972]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=f1e973]:
+        - generic [ref=f1e974]:
+          - generic [ref=f1e975]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=f1e976] [cursor=pointer]
+        - generic [ref=f1e988]:
+          - table [ref=f1e992]:
+            - rowgroup [ref=f1e998]:
+              - row [ref=f1e999]:
+                - columnheader "鐢熶骇浜哄憳" [ref=f1e1000]
+                - columnheader "宀椾綅绫诲瀷" [ref=f1e1005]
+                - columnheader "澶囨敞" [ref=f1e1010]
+                - columnheader "鎿嶄綔" [ref=f1e1015]
+          - table [ref=f1e1051]:
+            - rowgroup [ref=f1e1057]:
+              - row [ref=f1e1058]:
+                - cell [ref=f1e1059]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=f1e1064]
+                - cell [ref=f1e1070]:
+                  - generic [ref=f1e1074] [cursor=pointer]:
+                    - combobox [ref=f1e1076]
+                    - generic: 璇烽�夋嫨宀椾綅绫诲瀷
+                - cell [ref=f1e1077]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=f1e1080]
+                - cell [ref=f1e1081]:
+                  - button "鍒犻櫎" [ref=f1e1087] [cursor=pointer]
+    - button [ref=f1e1031] [cursor=pointer]
+    - generic [ref=f1e1041]:
+      - button "纭� 璁�" [ref=f1e1042] [cursor=pointer]
+      - button "鍙� 娑�" [ref=f1e1045] [cursor=pointer]
+    - button [ref=f1e1047] [cursor=pointer]
+  - generic:
+    - generic:
+      - generic:
+        - generic:
+          - generic:
+            - generic:
+              - generic:
+                - generic:
+                  - generic:
+                    - button
+                    - button
+                    - generic:
+                      - button "2026骞�"
+                      - button "8鏈�"
+                    - button
+                    - button
+                  - generic:
+                    - table:
+                      - rowgroup:
+                        - row "涓� 浜� 涓� 鍥� 浜� 鍏� 鏃�":
+                          - columnheader "涓�"
+                          - columnheader "浜�"
+                          - columnheader "涓�"
+                          - columnheader "鍥�"
+                          - columnheader "浜�"
+                          - columnheader "鍏�"
+                          - columnheader "鏃�"
+                      - rowgroup:
+                        - row "27 28 29 30 31 1 2":
+                          - cell "27"
+                          - cell "28"
+                          - cell "29"
+                          - cell "30"
+                          - cell "31"
+                          - cell "1"
+                          - cell "2"
+                        - row "3 4 5 6 7 8 9":
+                          - cell "3"
+                          - cell "4"
+                          - cell "5"
+                          - cell "6"
+                          - cell "7"
+                          - cell "8"
+                          - cell "9"
+                        - row "10 11 12 13 14 15 16":
+                          - cell "10"
+                          - cell "11"
+                          - cell "12"
+                          - cell "13"
+                          - cell "14"
+                          - cell "15"
+                          - cell "16"
+                        - row "17 18 19 20 21 22 23":
+                          - cell "17"
+                          - cell "18"
+                          - cell "19"
+                          - cell "20"
+                          - cell "21"
+                          - cell "22"
+                          - cell "23"
+                        - row "24 25 26 27 28 29 30":
+                          - cell "24"
+                          - cell "25"
+                          - cell "26"
+                          - cell "27"
+                          - cell "28"
+                          - cell "29"
+                          - cell "30"
+                        - row "31 1 2 3 4 5 6":
+                          - cell "31"
+                          - cell "1"
+                          - cell "2"
+                          - cell "3"
+                          - cell "4"
+                          - cell "5"
+                          - cell "6"
+                - generic:
+                  - generic: 2026-08-18 08:00:00
+                  - generic:
+                    - list:
+                      - listitem:
+                        - generic: "00"
+                      - listitem:
+                        - generic: "01"
+                      - listitem:
+                        - generic: "02"
+                      - listitem:
+                        - generic: "03"
+                      - listitem:
+                        - generic: "04"
+                      - listitem:
+                        - generic: "05"
+                      - listitem:
+                        - generic: "06"
+                      - listitem:
+                        - generic: "07"
+                      - listitem:
+                        - generic: "08"
+                      - listitem:
+                        - generic: "09"
+                      - listitem:
+                        - generic: "10"
+                      - listitem:
+                        - generic: "11"
+                      - listitem:
+                        - generic: "12"
+                      - listitem:
+                        - generic: "13"
+                      - listitem:
+                        - generic: "14"
+                      - listitem:
+                        - generic: "15"
+                      - listitem:
+                        - generic: "16"
+                      - listitem:
+                        - generic: "17"
+                      - listitem:
+                        - generic: "18"
+                      - listitem:
+                        - generic: "19"
+                      - listitem:
+                        - generic: "20"
+                      - listitem:
+                        - generic: "21"
+                      - listitem:
+                        - generic: "22"
+                      - listitem:
+                        - generic: "23"
+                    - list:
+                      - listitem:
+                        - generic: "00"
+                      - listitem:
+                        - generic: "01"
+                      - listitem:
+                        - generic: "02"
+                      - listitem:
+                        - generic: "03"
+                      - listitem:
+                        - generic: "04"
+                      - listitem:
+                        - generic: "05"
+                      - listitem:
+                        - generic: "06"
+                      - listitem:
+                        - generic: "07"
+                      - listitem:
+                        - generic: "08"
+                      - listitem:
+                        - generic: "09"
+                      - listitem:
+                        - generic: "10"
+                      - listitem:
+                        - generic: "11"
+                      - listitem:
+                        - generic: "12"
+                      - listitem:
+                        - generic: "13"
+                      - listitem:
+                        - generic: "14"
+                      - listitem:
+                        - generic: "15"
+                      - listitem:
+                        - generic: "16"
+                      - listitem:
+                        - generic: "17"
+                      - listitem:
+                        - generic: "18"
+                      - listitem:
+                        - generic: "19"
+                      - listitem:
+                        - generic: "20"
+                      - listitem:
+                        - generic: "21"
+                      - listitem:
+                        - generic: "22"
+                      - listitem:
+                        - generic: "23"
+                      - listitem:
+                        - generic: "24"
+                      - listitem:
+                        - generic: "25"
+                      - listitem:
+                        - generic: "26"
+                      - listitem:
+                        - generic: "27"
+                      - listitem:
+                        - generic: "28"
+                      - listitem:
+                        - generic: "29"
+                      - listitem:
+                        - generic: "30"
+                      - listitem:
+                        - generic: "31"
+                      - listitem:
+                        - generic: "32"
+                      - listitem:
+                        - generic: "33"
+                      - listitem:
+                        - generic: "34"
+                      - listitem:
+                        - generic: "35"
+                      - listitem:
+                        - generic: "36"
+                      - listitem:
+                        - generic: "37"
+                      - listitem:
+                        - generic: "38"
+                      - listitem:
+                        - generic: "39"
+                      - listitem:
+                        - generic: "40"
+                      - listitem:
+                        - generic: "41"
+                      - listitem:
+                        - generic: "42"
+                      - listitem:
+                        - generic: "43"
+                      - listitem:
+                        - generic: "44"
+                      - listitem:
+                        - generic: "45"
+                      - listitem:
+                        - generic: "46"
+                      - listitem:
+                        - generic: "47"
+                      - listitem:
+                        - generic: "48"
+                      - listitem:
+                        - generic: "49"
+                      - listitem:
+                        - generic: "50"
+                      - listitem:
+                        - generic: "51"
+                      - listitem:
+                        - generic: "52"
+                      - listitem:
+                        - generic: "53"
+                      - listitem:
+                        - generic: "54"
+                      - listitem:
+                        - generic: "55"
+                      - listitem:
+                        - generic: "56"
+                      - listitem:
+                        - generic: "57"
+                      - listitem:
+                        - generic: "58"
+                      - listitem:
+                        - generic: "59"
+                    - list:
+                      - listitem:
+                        - generic: "00"
+                      - listitem:
+                        - generic: "01"
+                      - listitem:
+                        - generic: "02"
+                      - listitem:
+                        - generic: "03"
+                      - listitem:
+                        - generic: "04"
+                      - listitem:
+                        - generic: "05"
+                      - listitem:
+                        - generic: "06"
+                      - listitem:
+                        - generic: "07"
+                      - listitem:
+                        - generic: "08"
+                      - listitem:
+                        - generic: "09"
+                      - listitem:
+                        - generic: "10"
+                      - listitem:
+                        - generic: "11"
+                      - listitem:
+                        - generic: "12"
+                      - listitem:
+                        - generic: "13"
+                      - listitem:
+                        - generic: "14"
+                      - listitem:
+                        - generic: "15"
+                      - listitem:
+                        - generic: "16"
+                      - listitem:
+                        - generic: "17"
+                      - listitem:
+                        - generic: "18"
+                      - listitem:
+                        - generic: "19"
+                      - listitem:
+                        - generic: "20"
+                      - listitem:
+                        - generic: "21"
+                      - listitem:
+                        - generic: "22"
+                      - listitem:
+                        - generic: "23"
+                      - listitem:
+                        - generic: "24"
+                      - listitem:
+                        - generic: "25"
+                      - listitem:
+                        - generic: "26"
+                      - listitem:
+                        - generic: "27"
+                      - listitem:
+                        - generic: "28"
+                      - listitem:
+                        - generic: "29"
+                      - listitem:
+                        - generic: "30"
+                      - listitem:
+                        - generic: "31"
+                      - listitem:
+                        - generic: "32"
+                      - listitem:
+                        - generic: "33"
+                      - listitem:
+                        - generic: "34"
+                      - listitem:
+                        - generic: "35"
+                      - listitem:
+                        - generic: "36"
+                      - listitem:
+                        - generic: "37"
+                      - listitem:
+                        - generic: "38"
+                      - listitem:
+                        - generic: "39"
+                      - listitem:
+                        - generic: "40"
+                      - listitem:
+                        - generic: "41"
+                      - listitem:
+                        - generic: "42"
+                      - listitem:
+                        - generic: "43"
+                      - listitem:
+                        - generic: "44"
+                      - listitem:
+                        - generic: "45"
+                      - listitem:
+                        - generic: "46"
+                      - listitem:
+                        - generic: "47"
+                      - listitem:
+                        - generic: "48"
+                      - listitem:
+                        - generic: "49"
+                      - listitem:
+                        - generic: "50"
+                      - listitem:
+                        - generic: "51"
+                      - listitem:
+                        - generic: "52"
+                      - listitem:
+                        - generic: "53"
+                      - listitem:
+                        - generic: "54"
+                      - listitem:
+                        - generic: "55"
+                      - listitem:
+                        - generic: "56"
+                      - listitem:
+                        - generic: "57"
+                      - listitem:
+                        - generic: "58"
+                      - listitem:
+                        - generic: "59"
+              - generic:
+                - list:
+                  - listitem: 姝ゅ埢
+                  - listitem:
+                    - button "纭� 瀹�"
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-24-41-010Z.yml b/.playwright-mcp/page-2026-08-18T08-24-41-010Z.yml
new file mode 100644
index 0000000..7a1ddfe
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-24-41-010Z.yml
@@ -0,0 +1,497 @@
+- generic [ref=f1e4]:
+  - generic [ref=f1e7]:
+    - complementary [ref=f1e8]:
+      - generic [ref=f1e9]:
+        - generic [ref=f1e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e18]
+          - generic [ref=f1e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f1e22]:
+          - menuitem "棣栭〉" [ref=f1e23] [cursor=pointer]
+          - listitem [ref=f1e30]:
+            - generic [ref=f1e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f1e39]:
+            - generic [ref=f1e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=f1e46]:
+            - generic [ref=f1e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=f1e53]:
+            - generic [ref=f1e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=f1e61]:
+            - generic [ref=f1e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f1e70]:
+            - generic [ref=f1e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=f1e78]:
+            - generic [ref=f1e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f1e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f1e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f1e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f1e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f1e104] [cursor=pointer]
+          - listitem [ref=f1e111]:
+            - generic [ref=f1e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f1e118]:
+            - generic [ref=f1e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=f1e125]:
+            - generic [ref=f1e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=f1e132]:
+            - generic [ref=f1e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=f1e139]:
+            - generic [ref=f1e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=f1e146]:
+            - generic [ref=f1e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=f1e153]:
+            - generic [ref=f1e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=f1e160]:
+            - generic [ref=f1e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=f1e169] [cursor=pointer]
+    - generic [ref=f1e174]:
+      - generic [ref=f1e175]:
+        - banner [ref=f1e176]:
+          - button [ref=f1e177] [cursor=pointer]
+          - button [ref=f1e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f1e185]:
+            - list [ref=f1e186]:
+              - listitem [ref=f1e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f1e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f1e192]
+              - listitem [ref=f1e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f1e196]
+          - generic [ref=f1e201]:
+            - generic [ref=f1e203] [cursor=pointer]:
+              - generic [ref=f1e207]: 鎼滅储
+              - generic [ref=f1e208]: Ctrl K
+            - button [ref=f1e210] [cursor=pointer]
+            - button "dark" [ref=f1e215] [cursor=pointer]
+            - button [ref=f1e224] [cursor=pointer]
+            - button [ref=f1e230] [cursor=pointer]
+            - button [ref=f1e233] [cursor=pointer]
+            - button [ref=f1e239] [cursor=pointer]:
+              - button [ref=f1e241]
+            - button "宸ヤ綔鍙�" [ref=f1e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f1e250] [cursor=pointer]
+        - generic [ref=f1e257]:
+          - generic [ref=f1e262]:
+            - generic [ref=f1e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=f1e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f1e298]:
+            - button [ref=f1e299] [cursor=pointer]
+            - generic [ref=f1e306] [cursor=pointer]
+            - generic [ref=f1e310] [cursor=pointer]
+      - main [ref=f1e317]:
+        - generic [ref=f1e322]:
+          - generic [ref=f1e327]:
+            - generic [ref=f1e328]:
+              - generic [ref=f1e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f1e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f1e337]:
+              - generic [ref=f1e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f1e345]
+            - generic [ref=f1e351]:
+              - generic [ref=f1e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f1e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f1e360]:
+              - generic [ref=f1e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f1e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f1e369]:
+              - generic [ref=f1e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e377]
+            - generic [ref=f1e383]:
+              - generic [ref=f1e384]: 鎵规鐘舵��
+              - generic [ref=f1e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f1e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f1e393]:
+              - generic [ref=f1e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=f1e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f1e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e403]:
+                  - img "swap-right" [ref=f1e404]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e409]:
+              - generic [ref=f1e410]: 鍒涘缓鏃堕棿
+              - generic [ref=f1e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f1e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e419]:
+                  - img "swap-right" [ref=f1e420]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e425]:
+              - button "閲� 缃�" [ref=f1e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f1e428] [cursor=pointer]
+              - generic [ref=f1e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f1e437]:
+            - generic [ref=f1e439]:
+              - generic [ref=f1e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f1e444]:
+                - generic [ref=f1e446]:
+                  - button "鏂板鎵规" [ref=f1e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f1e453] [cursor=pointer]
+                - button "顫�" [ref=f1e459] [cursor=pointer]
+              - generic [ref=f1e461]:
+                - button "瞟�" [ref=f1e462] [cursor=pointer]
+                - button "顪�" [ref=f1e464] [cursor=pointer]
+                - button "顦�" [ref=f1e466] [cursor=pointer]
+            - generic [ref=f1e470]:
+              - generic [ref=f1e473]:
+                - generic [ref=f1e474]:
+                  - table [ref=f1e478]:
+                    - rowgroup [ref=f1e493]:
+                      - row [ref=f1e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=f1e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=f1e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=f1e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=f1e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=f1e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=f1e520]
+                        - columnheader "璐d换浜�" [ref=f1e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=f1e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=f1e535]
+                        - columnheader "鎵规鐘舵��" [ref=f1e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=f1e545]
+                  - generic [ref=f1e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=f1e553]:
+                    - table [ref=f1e556]:
+                      - rowgroup [ref=f1e571]:
+                        - row [ref=f1e572]:
+                          - columnheader "鎵规鍙�" [ref=f1e573]
+                    - generic [ref=f1e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=f1e580]:
+                    - table [ref=f1e583]:
+                      - rowgroup [ref=f1e598]:
+                        - row [ref=f1e599]:
+                          - columnheader "鎿嶄綔" [ref=f1e600]
+                    - generic [ref=f1e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=f1e621]:
+              - generic [ref=f1e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=f1e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f1e625]:
+                  - textbox "璇烽�夋嫨" [ref=f1e626]: 20鏉�/椤�
+                - generic [ref=f1e627]: 睿�
+              - button "飱�" [ref=f1e630]
+              - button "顧�" [ref=f1e632]
+              - button "顫�" [ref=f1e634]
+              - button "1" [ref=f1e637] [cursor=pointer]
+              - button "顫�" [ref=f1e638]
+              - button "顧�" [ref=f1e640]
+              - button "顦�" [ref=f1e642]
+  - dialog [ref=f1e890]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=f1e892]
+    - generic [ref=f1e894]:
+      - generic [ref=f1e896]:
+        - generic [ref=f1e897]:
+          - generic [ref=f1e898]:
+            - generic [ref=f1e899]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=f1e906]: 閽㈣姱閾濈粸绾�
+        - generic [ref=f1e912]:
+          - generic [ref=f1e913]:
+            - generic [ref=f1e914]: "*"
+            - text: 浜х嚎
+          - generic [ref=f1e920]:
+            - combobox "* 浜х嚎" [ref=f1e922]
+            - generic [ref=f1e1522]:
+              - generic [ref=f1e1523]: 浜х嚎浜�
+              - generic [ref=f1e1524]: two
+        - generic [ref=f1e923]:
+          - generic [ref=f1e924]:
+            - generic [ref=f1e925]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=f1e931]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=f1e932]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+              - text: 2026-08-18 08:00:00
+            - generic:
+              - img "calendar"
+            - button [ref=f1e1529] [cursor=pointer]:
+              - img "close-circle" [ref=f1e1530]
+        - generic [ref=f1e933]:
+          - generic [ref=f1e934]: 璁″垝鏁伴噺
+          - generic [ref=f1e939]:
+            - generic [ref=f1e940]:
+              - button "Increase Value" [ref=f1e941] [cursor=pointer]:
+                - img "up" [ref=f1e942]
+              - button "Decrease Value" [ref=f1e945] [cursor=pointer]:
+                - img "down" [ref=f1e946]
+            - spinbutton "璁″垝鏁伴噺" [ref=f1e950]
+        - generic [ref=f1e951]:
+          - generic [ref=f1e952]:
+            - generic [ref=f1e953]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e960]
+        - generic [ref=f1e966]:
+          - generic [ref=f1e967]: 澶囨敞
+          - textbox "澶囨敞" [ref=f1e972]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=f1e973]:
+        - generic [ref=f1e974]:
+          - generic [ref=f1e975]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=f1e976] [cursor=pointer]
+        - generic [ref=f1e988]:
+          - table [ref=f1e992]:
+            - rowgroup [ref=f1e998]:
+              - row [ref=f1e999]:
+                - columnheader "鐢熶骇浜哄憳" [ref=f1e1000]
+                - columnheader "宀椾綅绫诲瀷" [ref=f1e1005]
+                - columnheader "澶囨敞" [ref=f1e1010]
+                - columnheader "鎿嶄綔" [ref=f1e1015]
+          - table [ref=f1e1051]:
+            - rowgroup [ref=f1e1057]:
+              - row [ref=f1e1058]:
+                - cell [ref=f1e1059]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=f1e1064]
+                - cell [ref=f1e1070]:
+                  - generic [ref=f1e1074] [cursor=pointer]:
+                    - combobox [ref=f1e1076]
+                    - generic: 璇烽�夋嫨宀椾綅绫诲瀷
+                - cell [ref=f1e1077]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=f1e1080]
+                - cell [ref=f1e1081]:
+                  - button "鍒犻櫎" [ref=f1e1087] [cursor=pointer]
+    - button [ref=f1e1031] [cursor=pointer]
+    - generic [ref=f1e1041]:
+      - button "纭� 璁�" [ref=f1e1042] [cursor=pointer]
+      - button "鍙� 娑�" [ref=f1e1045] [cursor=pointer]
+    - button [ref=f1e1047] [cursor=pointer]
+  - dialog "浜哄憳閫夋嫨" [ref=f1e1534]:
+    - document:
+      - generic [ref=f1e1535]:
+        - button "Close" [ref=f1e1536] [cursor=pointer]:
+          - img "close" [ref=f1e1538]
+        - generic [ref=f1e1541]: 浜哄憳閫夋嫨
+        - generic [ref=f1e1544]:
+          - generic [ref=f1e1546]:
+            - textbox "鎼滅储閮ㄩ棬" [ref=f1e1553]
+            - tree [ref=f1e1557]:
+              - generic:
+                - textbox "for screen reader"
+              - generic [ref=f1e1561]:
+                - generic [ref=f1e1562]:
+                  - img "caret-down" [ref=f1e1564] [cursor=pointer]
+                  - generic "鎬诲叕鍙�" [ref=f1e1567] [cursor=pointer]
+                - generic [ref=f1e1568]:
+                  - img "caret-down" [ref=f1e1571] [cursor=pointer]
+                  - generic "娣卞湷鎬诲叕鍙�" [ref=f1e1574] [cursor=pointer]
+                - generic "鐮斿彂閮ㄩ棬" [ref=f1e1578] [cursor=pointer]
+                - generic "甯傚満閮ㄩ棬" [ref=f1e1582] [cursor=pointer]
+                - generic "娴嬭瘯閮ㄩ棬" [ref=f1e1586] [cursor=pointer]
+                - generic "璐㈠姟閮ㄩ棬" [ref=f1e1590] [cursor=pointer]
+                - generic "杩愮淮閮ㄩ棬" [ref=f1e1594] [cursor=pointer]
+                - generic [ref=f1e1595]:
+                  - img "caret-down" [ref=f1e1598] [cursor=pointer]
+                  - generic "闀挎矙鍒嗗叕鍙�" [ref=f1e1601] [cursor=pointer]
+                - generic "甯傚満閮ㄩ棬" [ref=f1e1605] [cursor=pointer]
+                - generic "璐㈠姟閮ㄩ棬" [ref=f1e1609] [cursor=pointer]
+                - generic "鏂伴儴闂�" [ref=f1e1612] [cursor=pointer]
+                - generic "椤剁骇閮ㄩ棬" [ref=f1e1615] [cursor=pointer]
+                - generic "鏌愪釜瀛愰儴闂�" [ref=f1e1618] [cursor=pointer]
+                - generic "鏌愪釜瀛愰儴闂� 2" [ref=f1e1621] [cursor=pointer]
+          - generic [ref=f1e1624]:
+            - generic [ref=f1e1629]:
+              - generic [ref=f1e1630]:
+                - generic [ref=f1e1631]: 鐢ㄦ埛鍚嶇О
+                - textbox "鐢ㄦ埛鍚嶇О" [ref=f1e1637]:
+                  - /placeholder: 璇疯緭鍏ョ敤鎴峰悕绉�
+              - generic [ref=f1e1639]:
+                - generic [ref=f1e1640]: 鐢ㄦ埛鏄电О
+                - textbox "鐢ㄦ埛鏄电О" [ref=f1e1646]:
+                  - /placeholder: 璇疯緭鍏ョ敤鎴锋樀绉�
+              - generic [ref=f1e1648]:
+                - generic [ref=f1e1649]: 鎵嬫満鍙风爜
+                - textbox "鎵嬫満鍙风爜" [ref=f1e1655]:
+                  - /placeholder: 璇疯緭鍏ユ墜鏈哄彿鐮�
+              - generic [ref=f1e1657]:
+                - generic [ref=f1e1658]: 鐘舵��
+                - generic [ref=f1e1664] [cursor=pointer]:
+                  - combobox "鐘舵��" [ref=f1e1666]
+                  - generic "寮�鍚�" [ref=f1e1667]
+              - generic [ref=f1e1672]:
+                - button "閲� 缃�" [ref=f1e1673] [cursor=pointer]
+                - button "鎼� 绱�" [ref=f1e1675] [cursor=pointer]
+                - generic [ref=f1e1677] [cursor=pointer]: 鏀惰捣
+            - generic [ref=f1e1684]:
+              - generic [ref=f1e1686]:
+                - generic [ref=f1e1687]: 鐢ㄦ埛鍒楄〃
+                - button "顫�" [ref=f1e1692] [cursor=pointer]
+                - generic [ref=f1e1694]:
+                  - button "瞟�" [ref=f1e1695] [cursor=pointer]
+                  - button "顪�" [ref=f1e1697] [cursor=pointer]
+                  - button "顦�" [ref=f1e1699] [cursor=pointer]
+              - generic [ref=f1e1707]:
+                - table [ref=f1e1711]:
+                  - rowgroup [ref=f1e1719]:
+                    - row "鐢ㄦ埛缂栧彿 鐢ㄦ埛鍚嶇О 鐢ㄦ埛鏄电О 鎵嬫満鍙风爜 鐘舵��" [ref=f1e1720]:
+                      - columnheader [ref=f1e1721]
+                      - columnheader "鐢ㄦ埛缂栧彿" [ref=f1e1724]
+                      - columnheader "鐢ㄦ埛鍚嶇О" [ref=f1e1729]
+                      - columnheader "鐢ㄦ埛鏄电О" [ref=f1e1734]
+                      - columnheader "鎵嬫満鍙风爜" [ref=f1e1739]
+                      - columnheader "鐘舵��" [ref=f1e1744]
+                - table [ref=f1e1752]:
+                  - rowgroup [ref=f1e1760]:
+                    - row [ref=f1e1761]:
+                      - cell "顭�" [ref=f1e1762]
+                      - cell "230" [ref=f1e1767]
+                      - cell "18333333333" [ref=f1e1771]
+                      - cell "222" [ref=f1e1775]
+                      - cell "18333333333" [ref=f1e1779]
+                      - cell "寮�鍚�" [ref=f1e1783]
+                    - row [ref=f1e1787]:
+                      - cell "顭�" [ref=f1e1788]
+                      - cell "229" [ref=f1e1793]
+                      - cell "15822054764" [ref=f1e1797]
+                      - cell "鏀惧亣" [ref=f1e1801]
+                      - cell "15822054764" [ref=f1e1805]
+                      - cell "寮�鍚�" [ref=f1e1809]
+                    - row [ref=f1e1813]:
+                      - cell "顭�" [ref=f1e1814]
+                      - cell "228" [ref=f1e1819]
+                      - cell "15822054766" [ref=f1e1823]
+                      - cell "涓嶆兂涓婄彮" [ref=f1e1827]
+                      - cell "15822054766" [ref=f1e1831]
+                      - cell "寮�鍚�" [ref=f1e1835]
+                    - row [ref=f1e1839]:
+                      - cell "顭�" [ref=f1e1840]
+                      - cell "227" [ref=f1e1845]
+                      - cell "15822054767" [ref=f1e1849]
+                      - cell "澶ф槑鏄�" [ref=f1e1853]
+                      - cell "15822054767" [ref=f1e1857]
+                      - cell "寮�鍚�" [ref=f1e1861]
+                    - row [ref=f1e1865]:
+                      - cell "顭�" [ref=f1e1866]
+                      - cell "226" [ref=f1e1871]
+                      - cell "15822054763" [ref=f1e1875]
+                      - cell "鍗冨厠" [ref=f1e1879]
+                      - cell "15822054763" [ref=f1e1883]
+                      - cell "寮�鍚�" [ref=f1e1887]
+                    - row [ref=f1e1891]:
+                      - cell "顭�" [ref=f1e1892]
+                      - cell "225" [ref=f1e1897]
+                      - cell "15822054762" [ref=f1e1901]
+                      - cell "鍗楃摐瀛�" [ref=f1e1905]
+                      - cell "15822054762" [ref=f1e1909]
+                      - cell "寮�鍚�" [ref=f1e1913]
+                    - row "顭� 144 aoteman001 aoteman00112 鍏抽棴" [ref=f1e1917]:
+                      - cell "顭�" [ref=f1e1918]
+                      - cell "144" [ref=f1e1923]
+                      - cell "aoteman001" [ref=f1e1927]
+                      - cell "aoteman00112" [ref=f1e1931]
+                      - cell [ref=f1e1935]
+                      - cell "鍏抽棴" [ref=f1e1939]
+                    - row "顭� 143 a00001 a00001 寮�鍚�" [ref=f1e1943]:
+                      - cell "顭�" [ref=f1e1944]
+                      - cell "143" [ref=f1e1949]
+                      - cell "a00001" [ref=f1e1953]
+                      - cell "a00001" [ref=f1e1957]
+                      - cell [ref=f1e1961]
+                      - cell "寮�鍚�" [ref=f1e1965]
+                    - row [ref=f1e1969]:
+                      - cell "顭�" [ref=f1e1970]
+                      - cell "142" [ref=f1e1975]
+                      - cell "test01" [ref=f1e1979]
+                      - cell "test01" [ref=f1e1983]
+                      - cell "19021719925" [ref=f1e1987]
+                      - cell "寮�鍚�" [ref=f1e1991]
+                    - row "顭� 141 admin1 鏂扮敤鎴� 寮�鍚�" [ref=f1e1995]:
+                      - cell "顭�" [ref=f1e1996]
+                      - cell "141" [ref=f1e2001]
+                      - cell "admin1" [ref=f1e2005]
+                      - cell "鏂扮敤鎴�" [ref=f1e2009]
+                      - cell [ref=f1e2013]
+                      - cell "寮�鍚�" [ref=f1e2017]
+                    - row "顭� 139 wwbwwb 灏忕澶� 寮�鍚�" [ref=f1e2021]:
+                      - cell "顭�" [ref=f1e2022]
+                      - cell "139" [ref=f1e2027]
+                      - cell "wwbwwb" [ref=f1e2031]
+                      - cell "灏忕澶�" [ref=f1e2035]
+                      - cell [ref=f1e2039]
+                      - cell "寮�鍚�" [ref=f1e2043]
+                    - row [ref=f1e2047]:
+                      - cell "顭�" [ref=f1e2048]
+                      - cell "118" [ref=f1e2053]
+                      - cell "goudan" [ref=f1e2057]
+                      - cell "鐙楄泲" [ref=f1e2061]
+                      - cell "15601691239" [ref=f1e2065]
+                      - cell "寮�鍚�" [ref=f1e2069]
+                    - row [ref=f1e2073]:
+                      - cell "顭�" [ref=f1e2074]
+                      - cell "117" [ref=f1e2079]
+                      - cell "admin123" [ref=f1e2083]
+                      - cell "娴嬭瘯鍙�02" [ref=f1e2087]
+                      - cell "15601691234" [ref=f1e2091]
+                      - cell "寮�鍚�" [ref=f1e2095]
+                    - row [ref=f1e2099]:
+                      - cell "顭�" [ref=f1e2100]
+                      - cell "115" [ref=f1e2105]
+                      - cell "aotemane" [ref=f1e2109]
+                      - cell "闃垮憜" [ref=f1e2113]
+                      - cell "15601691229" [ref=f1e2117]
+                      - cell "寮�鍚�" [ref=f1e2121]
+                    - row [ref=f1e2125]:
+                      - cell "顭�" [ref=f1e2126]
+                      - cell "114" [ref=f1e2131]
+                      - cell "hrmgr" [ref=f1e2135]
+                      - cell "hr 灏忓濮�" [ref=f1e2139]
+                      - cell "15601691236" [ref=f1e2143]
+                      - cell "寮�鍚�" [ref=f1e2147]
+                    - row [ref=f1e2151]:
+                      - cell "顭�" [ref=f1e2152]
+                      - cell "113" [ref=f1e2157]
+                      - cell "aoteman" [ref=f1e2161]
+                      - cell "绠$悊鍛�1" [ref=f1e2165]
+                      - cell "15601691300" [ref=f1e2169]
+                      - cell "寮�鍚�" [ref=f1e2173]
+                    - row [ref=f1e2177]:
+                      - cell "顭�" [ref=f1e2178]
+                      - cell "112" [ref=f1e2183]
+                      - cell "newobject" [ref=f1e2187]
+                      - cell "鏂板璞�" [ref=f1e2191]
+                      - cell "15601691235" [ref=f1e2195]
+                      - cell "寮�鍚�" [ref=f1e2199]
+                    - row "顭� 111 test 娴嬭瘯鐢ㄦ埛 寮�鍚�" [ref=f1e2203]:
+                      - cell "顭�" [ref=f1e2204]
+                      - cell "111" [ref=f1e2209]
+                      - cell "test" [ref=f1e2213]
+                      - cell "娴嬭瘯鐢ㄦ埛" [ref=f1e2217]
+                      - cell [ref=f1e2221]
+                      - cell "寮�鍚�" [ref=f1e2225]
+                    - row [ref=f1e2290]:
+                      - cell "顫�" [ref=f1e2291]
+                      - cell "1" [ref=f1e2235]
+                      - cell "admin" [ref=f1e2239]
+                      - cell "瓒呯骇绠$悊鍛�" [ref=f1e2243]
+                      - cell "18818260272" [ref=f1e2247]
+                      - cell "寮�鍚�" [ref=f1e2251]
+              - generic [ref=f1e2262]:
+                - generic [ref=f1e2263]: 鍏� 19 鏉¤褰�
+                - generic [ref=f1e2265] [cursor=pointer]:
+                  - generic "20鏉�/椤�" [ref=f1e2266]:
+                    - textbox "璇烽�夋嫨" [ref=f1e2267]: 20鏉�/椤�
+                  - generic [ref=f1e2268]: 睿�
+                - button "飱�" [ref=f1e2271]
+                - button "顧�" [ref=f1e2273]
+                - button "顫�" [ref=f1e2275]
+                - button "1" [ref=f1e2278] [cursor=pointer]
+                - button "顫�" [ref=f1e2279]
+                - button "顧�" [ref=f1e2281]
+                - button "顦�" [ref=f1e2283]
+        - generic [ref=f1e2285]:
+          - button "鍙� 娑�" [ref=f1e2286] [cursor=pointer]
+          - button "纭� 瀹�" [ref=f1e2288] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-24-47-027Z.yml b/.playwright-mcp/page-2026-08-18T08-24-47-027Z.yml
new file mode 100644
index 0000000..f447251
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-24-47-027Z.yml
@@ -0,0 +1,566 @@
+- generic [ref=f1e4]:
+  - generic [ref=f1e7]:
+    - complementary [ref=f1e8]:
+      - generic [ref=f1e9]:
+        - generic [ref=f1e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e18]
+          - generic [ref=f1e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f1e22]:
+          - menuitem "棣栭〉" [ref=f1e23] [cursor=pointer]
+          - listitem [ref=f1e30]:
+            - generic [ref=f1e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f1e39]:
+            - generic [ref=f1e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=f1e46]:
+            - generic [ref=f1e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=f1e53]:
+            - generic [ref=f1e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=f1e61]:
+            - generic [ref=f1e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f1e70]:
+            - generic [ref=f1e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=f1e78]:
+            - generic [ref=f1e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f1e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f1e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f1e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f1e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f1e104] [cursor=pointer]
+          - listitem [ref=f1e111]:
+            - generic [ref=f1e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f1e118]:
+            - generic [ref=f1e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=f1e125]:
+            - generic [ref=f1e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=f1e132]:
+            - generic [ref=f1e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=f1e139]:
+            - generic [ref=f1e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=f1e146]:
+            - generic [ref=f1e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=f1e153]:
+            - generic [ref=f1e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=f1e160]:
+            - generic [ref=f1e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=f1e169] [cursor=pointer]
+    - generic [ref=f1e174]:
+      - generic [ref=f1e175]:
+        - banner [ref=f1e176]:
+          - button [ref=f1e177] [cursor=pointer]
+          - button [ref=f1e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f1e185]:
+            - list [ref=f1e186]:
+              - listitem [ref=f1e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f1e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f1e192]
+              - listitem [ref=f1e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f1e196]
+          - generic [ref=f1e201]:
+            - generic [ref=f1e203] [cursor=pointer]:
+              - generic [ref=f1e207]: 鎼滅储
+              - generic [ref=f1e208]: Ctrl K
+            - button [ref=f1e210] [cursor=pointer]
+            - button "dark" [ref=f1e215] [cursor=pointer]
+            - button [ref=f1e224] [cursor=pointer]
+            - button [ref=f1e230] [cursor=pointer]
+            - button [ref=f1e233] [cursor=pointer]
+            - button [ref=f1e239] [cursor=pointer]:
+              - button [ref=f1e241]
+            - button "宸ヤ綔鍙�" [ref=f1e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f1e250] [cursor=pointer]
+        - generic [ref=f1e257]:
+          - generic [ref=f1e262]:
+            - generic [ref=f1e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=f1e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f1e298]:
+            - button [ref=f1e299] [cursor=pointer]
+            - generic [ref=f1e306] [cursor=pointer]
+            - generic [ref=f1e310] [cursor=pointer]
+      - main [ref=f1e317]:
+        - generic [ref=f1e322]:
+          - generic [ref=f1e327]:
+            - generic [ref=f1e328]:
+              - generic [ref=f1e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f1e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f1e337]:
+              - generic [ref=f1e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f1e345]
+            - generic [ref=f1e351]:
+              - generic [ref=f1e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f1e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f1e360]:
+              - generic [ref=f1e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f1e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f1e369]:
+              - generic [ref=f1e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e377]: 瓒呯骇绠$悊鍛�
+            - generic [ref=f1e383]:
+              - generic [ref=f1e384]: 鎵规鐘舵��
+              - generic [ref=f1e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f1e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f1e393]:
+              - generic [ref=f1e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=f1e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f1e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e403]:
+                  - img "swap-right" [ref=f1e404]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e409]:
+              - generic [ref=f1e410]: 鍒涘缓鏃堕棿
+              - generic [ref=f1e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f1e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e419]:
+                  - img "swap-right" [ref=f1e420]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e425]:
+              - button "閲� 缃�" [ref=f1e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f1e428] [cursor=pointer]
+              - generic [ref=f1e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f1e437]:
+            - generic [ref=f1e439]:
+              - generic [ref=f1e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f1e444]:
+                - generic [ref=f1e446]:
+                  - button "鏂板鎵规" [ref=f1e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f1e453] [cursor=pointer]
+                - button "顫�" [ref=f1e459] [cursor=pointer]
+              - generic [ref=f1e461]:
+                - button "瞟�" [ref=f1e462] [cursor=pointer]
+                - button "顪�" [ref=f1e464] [cursor=pointer]
+                - button "顦�" [ref=f1e466] [cursor=pointer]
+            - generic [ref=f1e470]:
+              - generic [ref=f1e473]:
+                - generic [ref=f1e474]:
+                  - table [ref=f1e478]:
+                    - rowgroup [ref=f1e493]:
+                      - row [ref=f1e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=f1e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=f1e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=f1e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=f1e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=f1e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=f1e520]
+                        - columnheader "璐d换浜�" [ref=f1e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=f1e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=f1e535]
+                        - columnheader "鎵规鐘舵��" [ref=f1e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=f1e545]
+                  - generic [ref=f1e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=f1e553]:
+                    - table [ref=f1e556]:
+                      - rowgroup [ref=f1e571]:
+                        - row [ref=f1e572]:
+                          - columnheader "鎵规鍙�" [ref=f1e573]
+                    - generic [ref=f1e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=f1e580]:
+                    - table [ref=f1e583]:
+                      - rowgroup [ref=f1e598]:
+                        - row [ref=f1e599]:
+                          - columnheader "鎿嶄綔" [ref=f1e600]
+                    - generic [ref=f1e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=f1e621]:
+              - generic [ref=f1e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=f1e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f1e625]:
+                  - textbox "璇烽�夋嫨" [ref=f1e626]: 20鏉�/椤�
+                - generic [ref=f1e627]: 睿�
+              - button "飱�" [ref=f1e630]
+              - button "顧�" [ref=f1e632]
+              - button "顫�" [ref=f1e634]
+              - button "1" [ref=f1e637] [cursor=pointer]
+              - button "顫�" [ref=f1e638]
+              - button "顧�" [ref=f1e640]
+              - button "顦�" [ref=f1e642]
+  - dialog [ref=f1e890]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=f1e892]
+    - generic [ref=f1e894]:
+      - generic [ref=f1e896]:
+        - generic [ref=f1e897]:
+          - generic [ref=f1e898]:
+            - generic [ref=f1e899]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=f1e906]: 閽㈣姱閾濈粸绾�
+        - generic [ref=f1e912]:
+          - generic [ref=f1e913]:
+            - generic [ref=f1e914]: "*"
+            - text: 浜х嚎
+          - generic [ref=f1e920]:
+            - combobox "* 浜х嚎" [ref=f1e922]
+            - generic [ref=f1e1522]:
+              - generic [ref=f1e1523]: 浜х嚎浜�
+              - generic [ref=f1e1524]: two
+        - generic [ref=f1e923]:
+          - generic [ref=f1e924]:
+            - generic [ref=f1e925]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=f1e931]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=f1e932]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+              - text: 2026-08-18 08:00:00
+            - generic:
+              - img "calendar"
+            - button [ref=f1e1529] [cursor=pointer]:
+              - img "close-circle" [ref=f1e1530]
+        - generic [ref=f1e933]:
+          - generic [ref=f1e934]: 璁″垝鏁伴噺
+          - generic [ref=f1e939]:
+            - generic [ref=f1e940]:
+              - button "Increase Value" [ref=f1e941] [cursor=pointer]:
+                - img "up" [ref=f1e942]
+              - button "Decrease Value" [ref=f1e945] [cursor=pointer]:
+                - img "down" [ref=f1e946]
+            - spinbutton "璁″垝鏁伴噺" [ref=f1e950]
+        - generic [ref=f1e951]:
+          - generic [ref=f1e952]:
+            - generic [ref=f1e953]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e960]
+        - generic [ref=f1e966]:
+          - generic [ref=f1e967]: 澶囨敞
+          - textbox "澶囨敞" [ref=f1e972]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=f1e973]:
+        - generic [ref=f1e974]:
+          - generic [ref=f1e975]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=f1e976] [cursor=pointer]
+        - generic [ref=f1e988]:
+          - table [ref=f1e992]:
+            - rowgroup [ref=f1e998]:
+              - row [ref=f1e999]:
+                - columnheader "鐢熶骇浜哄憳" [ref=f1e1000]
+                - columnheader "宀椾綅绫诲瀷" [ref=f1e1005]
+                - columnheader "澶囨敞" [ref=f1e1010]
+                - columnheader "鎿嶄綔" [ref=f1e1015]
+          - table [ref=f1e1051]:
+            - rowgroup [ref=f1e1057]:
+              - row [ref=f1e1058]:
+                - cell [ref=f1e1059]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=f1e1064]
+                - cell [ref=f1e1070]:
+                  - generic [ref=f1e1074] [cursor=pointer]:
+                    - combobox [ref=f1e1076]
+                    - generic: 璇烽�夋嫨宀椾綅绫诲瀷
+                - cell [ref=f1e1077]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=f1e1080]
+                - cell [ref=f1e1081]:
+                  - button "鍒犻櫎" [ref=f1e1087] [cursor=pointer]
+    - button [ref=f1e1031] [cursor=pointer]
+    - generic [ref=f1e1041]:
+      - button "纭� 璁�" [ref=f1e1042] [cursor=pointer]
+      - button "鍙� 娑�" [ref=f1e1045] [cursor=pointer]
+    - button [ref=f1e1047] [cursor=pointer]
+  - dialog "浜哄憳閫夋嫨" [ref=f1e1534]:
+    - document:
+      - generic:
+        - generic:
+          - button "Close":
+            - generic:
+              - img "close"
+          - generic: 浜哄憳閫夋嫨
+          - generic:
+            - generic:
+              - generic:
+                - generic:
+                  - generic:
+                    - textbox "鎼滅储閮ㄩ棬"
+                  - generic:
+                    - generic:
+                      - tree:
+                        - generic:
+                          - textbox "for screen reader"
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic:
+                                - generic:
+                                  - generic:
+                                    - img "caret-down"
+                                  - generic "鎬诲叕鍙�"
+                                - generic:
+                                  - generic:
+                                    - img "caret-down"
+                                  - generic "娣卞湷鎬诲叕鍙�"
+                                - generic:
+                                  - generic "鐮斿彂閮ㄩ棬"
+                                - generic:
+                                  - generic "甯傚満閮ㄩ棬"
+                                - generic:
+                                  - generic "娴嬭瘯閮ㄩ棬"
+                                - generic:
+                                  - generic "璐㈠姟閮ㄩ棬"
+                                - generic:
+                                  - generic "杩愮淮閮ㄩ棬"
+                                - generic:
+                                  - generic:
+                                    - img "caret-down"
+                                  - generic "闀挎矙鍒嗗叕鍙�"
+                                - generic:
+                                  - generic "甯傚満閮ㄩ棬"
+                                - generic:
+                                  - generic "璐㈠姟閮ㄩ棬"
+                                - generic:
+                                  - generic "鏂伴儴闂�"
+                                - generic:
+                                  - generic "椤剁骇閮ㄩ棬"
+                                - generic:
+                                  - generic "鏌愪釜瀛愰儴闂�"
+                                - generic:
+                                  - generic "鏌愪釜瀛愰儴闂� 2"
+              - generic:
+                - generic:
+                  - generic:
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic:
+                                - generic: 鐢ㄦ埛鍚嶇О
+                                - generic:
+                                  - generic:
+                                    - generic:
+                                      - generic:
+                                        - generic:
+                                          - textbox "鐢ㄦ埛鍚嶇О":
+                                            - /placeholder: 璇疯緭鍏ョ敤鎴峰悕绉�
+                              - generic:
+                                - generic: 鐢ㄦ埛鏄电О
+                                - generic:
+                                  - generic:
+                                    - generic:
+                                      - generic:
+                                        - generic:
+                                          - textbox "鐢ㄦ埛鏄电О":
+                                            - /placeholder: 璇疯緭鍏ョ敤鎴锋樀绉�
+                              - generic:
+                                - generic: 鎵嬫満鍙风爜
+                                - generic:
+                                  - generic:
+                                    - generic:
+                                      - generic:
+                                        - generic:
+                                          - textbox "鎵嬫満鍙风爜":
+                                            - /placeholder: 璇疯緭鍏ユ墜鏈哄彿鐮�
+                              - generic:
+                                - generic: 鐘舵��
+                                - generic:
+                                  - generic:
+                                    - generic:
+                                      - generic:
+                                        - generic:
+                                          - generic:
+                                            - generic:
+                                              - combobox "鐘舵��"
+                                            - generic "寮�鍚�"
+                              - generic:
+                                - button "閲� 缃�"
+                                - button "鎼� 绱�"
+                                - generic: 鏀惰捣
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic: 鐢ㄦ埛鍒楄〃
+                            - generic:
+                              - generic:
+                                - button "顫�"
+                            - generic:
+                              - button "瞟�"
+                              - button "顪�"
+                              - button "顦�"
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic:
+                                - generic:
+                                  - generic:
+                                    - generic:
+                                      - generic:
+                                        - generic:
+                                          - table:
+                                            - rowgroup:
+                                              - row "鐢ㄦ埛缂栧彿 鐢ㄦ埛鍚嶇О 鐢ㄦ埛鏄电О 鎵嬫満鍙风爜 鐘舵��":
+                                                - columnheader
+                                                - columnheader "鐢ㄦ埛缂栧彿"
+                                                - columnheader "鐢ㄦ埛鍚嶇О"
+                                                - columnheader "鐢ㄦ埛鏄电О"
+                                                - columnheader "鎵嬫満鍙风爜"
+                                                - columnheader "鐘舵��"
+                                      - generic:
+                                        - generic:
+                                          - table:
+                                            - rowgroup:
+                                              - row "顭� 230 18333333333 222 18333333333 寮�鍚�":
+                                                - cell "顭�"
+                                                - cell "230"
+                                                - cell "18333333333"
+                                                - cell "222"
+                                                - cell "18333333333"
+                                                - cell "寮�鍚�"
+                                              - row "顭� 229 15822054764 鏀惧亣 15822054764 寮�鍚�":
+                                                - cell "顭�"
+                                                - cell "229"
+                                                - cell "15822054764"
+                                                - cell "鏀惧亣"
+                                                - cell "15822054764"
+                                                - cell "寮�鍚�"
+                                              - row "顭� 228 15822054766 涓嶆兂涓婄彮 15822054766 寮�鍚�":
+                                                - cell "顭�"
+                                                - cell "228"
+                                                - cell "15822054766"
+                                                - cell "涓嶆兂涓婄彮"
+                                                - cell "15822054766"
+                                                - cell "寮�鍚�"
+                                              - row "顭� 227 15822054767 澶ф槑鏄� 15822054767 寮�鍚�":
+                                                - cell "顭�"
+                                                - cell "227"
+                                                - cell "15822054767"
+                                                - cell "澶ф槑鏄�"
+                                                - cell "15822054767"
+                                                - cell "寮�鍚�"
+                                              - row "顭� 226 15822054763 鍗冨厠 15822054763 寮�鍚�":
+                                                - cell "顭�"
+                                                - cell "226"
+                                                - cell "15822054763"
+                                                - cell "鍗冨厠"
+                                                - cell "15822054763"
+                                                - cell "寮�鍚�"
+                                              - row "顭� 225 15822054762 鍗楃摐瀛� 15822054762 寮�鍚�":
+                                                - cell "顭�"
+                                                - cell "225"
+                                                - cell "15822054762"
+                                                - cell "鍗楃摐瀛�"
+                                                - cell "15822054762"
+                                                - cell "寮�鍚�"
+                                              - row "顭� 144 aoteman001 aoteman00112 鍏抽棴":
+                                                - cell "顭�"
+                                                - cell "144"
+                                                - cell "aoteman001"
+                                                - cell "aoteman00112"
+                                                - cell
+                                                - cell "鍏抽棴"
+                                              - row "顭� 143 a00001 a00001 寮�鍚�":
+                                                - cell "顭�"
+                                                - cell "143"
+                                                - cell "a00001"
+                                                - cell "a00001"
+                                                - cell
+                                                - cell "寮�鍚�"
+                                              - row "顭� 142 test01 test01 19021719925 寮�鍚�":
+                                                - cell "顭�"
+                                                - cell "142"
+                                                - cell "test01"
+                                                - cell "test01"
+                                                - cell "19021719925"
+                                                - cell "寮�鍚�"
+                                              - row "顭� 141 admin1 鏂扮敤鎴� 寮�鍚�":
+                                                - cell "顭�"
+                                                - cell "141"
+                                                - cell "admin1"
+                                                - cell "鏂扮敤鎴�"
+                                                - cell
+                                                - cell "寮�鍚�"
+                                              - row "顭� 139 wwbwwb 灏忕澶� 寮�鍚�":
+                                                - cell "顭�"
+                                                - cell "139"
+                                                - cell "wwbwwb"
+                                                - cell "灏忕澶�"
+                                                - cell
+                                                - cell "寮�鍚�"
+                                              - row "顭� 118 goudan 鐙楄泲 15601691239 寮�鍚�":
+                                                - cell "顭�"
+                                                - cell "118"
+                                                - cell "goudan"
+                                                - cell "鐙楄泲"
+                                                - cell "15601691239"
+                                                - cell "寮�鍚�"
+                                              - row "顭� 117 admin123 娴嬭瘯鍙�02 15601691234 寮�鍚�":
+                                                - cell "顭�"
+                                                - cell "117"
+                                                - cell "admin123"
+                                                - cell "娴嬭瘯鍙�02"
+                                                - cell "15601691234"
+                                                - cell "寮�鍚�"
+                                              - row "顭� 115 aotemane 闃垮憜 15601691229 寮�鍚�":
+                                                - cell "顭�"
+                                                - cell "115"
+                                                - cell "aotemane"
+                                                - cell "闃垮憜"
+                                                - cell "15601691229"
+                                                - cell "寮�鍚�"
+                                              - row "顭� 114 hrmgr hr 灏忓濮� 15601691236 寮�鍚�":
+                                                - cell "顭�"
+                                                - cell "114"
+                                                - cell "hrmgr"
+                                                - cell "hr 灏忓濮�"
+                                                - cell "15601691236"
+                                                - cell "寮�鍚�"
+                                              - row "顭� 113 aoteman 绠$悊鍛�1 15601691300 寮�鍚�":
+                                                - cell "顭�"
+                                                - cell "113"
+                                                - cell "aoteman"
+                                                - cell "绠$悊鍛�1"
+                                                - cell "15601691300"
+                                                - cell "寮�鍚�"
+                                              - row "顭� 112 newobject 鏂板璞� 15601691235 寮�鍚�":
+                                                - cell "顭�"
+                                                - cell "112"
+                                                - cell "newobject"
+                                                - cell "鏂板璞�"
+                                                - cell "15601691235"
+                                                - cell "寮�鍚�"
+                                              - row "顭� 111 test 娴嬭瘯鐢ㄦ埛 寮�鍚�":
+                                                - cell "顭�"
+                                                - cell "111"
+                                                - cell "test"
+                                                - cell "娴嬭瘯鐢ㄦ埛"
+                                                - cell
+                                                - cell "寮�鍚�"
+                                              - row "顫� 1 admin 瓒呯骇绠$悊鍛� 18818260272 寮�鍚�":
+                                                - cell "顫�"
+                                                - cell "1"
+                                                - cell "admin"
+                                                - cell "瓒呯骇绠$悊鍛�"
+                                                - cell "18818260272"
+                                                - cell "寮�鍚�"
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic: 鍏� 19 鏉¤褰�
+                              - generic:
+                                - generic:
+                                  - generic "20鏉�/椤�":
+                                    - textbox "璇烽�夋嫨": 20鏉�/椤�
+                                  - generic: 睿�
+                              - button "飱�"
+                              - button "顧�"
+                              - button "顫�"
+                              - generic:
+                                - button "1"
+                              - button "顫�"
+                              - button "顧�"
+                              - button "顦�"
+          - generic:
+            - button "鍙� 娑�"
+            - button "纭� 瀹�" [active]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-25-41-120Z.yml b/.playwright-mcp/page-2026-08-18T08-25-41-120Z.yml
new file mode 100644
index 0000000..c5ea970
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-25-41-120Z.yml
@@ -0,0 +1,497 @@
+- generic [ref=f1e4]:
+  - generic [ref=f1e7]:
+    - complementary [ref=f1e8]:
+      - generic [ref=f1e9]:
+        - generic [ref=f1e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e18]
+          - generic [ref=f1e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f1e22]:
+          - menuitem "棣栭〉" [ref=f1e23] [cursor=pointer]
+          - listitem [ref=f1e30]:
+            - generic [ref=f1e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f1e39]:
+            - generic [ref=f1e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=f1e46]:
+            - generic [ref=f1e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=f1e53]:
+            - generic [ref=f1e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=f1e61]:
+            - generic [ref=f1e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f1e70]:
+            - generic [ref=f1e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=f1e78]:
+            - generic [ref=f1e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f1e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f1e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f1e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f1e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f1e104] [cursor=pointer]
+          - listitem [ref=f1e111]:
+            - generic [ref=f1e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f1e118]:
+            - generic [ref=f1e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=f1e125]:
+            - generic [ref=f1e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=f1e132]:
+            - generic [ref=f1e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=f1e139]:
+            - generic [ref=f1e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=f1e146]:
+            - generic [ref=f1e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=f1e153]:
+            - generic [ref=f1e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=f1e160]:
+            - generic [ref=f1e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=f1e169] [cursor=pointer]
+    - generic [ref=f1e174]:
+      - generic [ref=f1e175]:
+        - banner [ref=f1e176]:
+          - button [ref=f1e177] [cursor=pointer]
+          - button [ref=f1e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f1e185]:
+            - list [ref=f1e186]:
+              - listitem [ref=f1e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f1e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f1e192]
+              - listitem [ref=f1e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f1e196]
+          - generic [ref=f1e201]:
+            - generic [ref=f1e203] [cursor=pointer]:
+              - generic [ref=f1e207]: 鎼滅储
+              - generic [ref=f1e208]: Ctrl K
+            - button [ref=f1e210] [cursor=pointer]
+            - button "dark" [ref=f1e215] [cursor=pointer]
+            - button [ref=f1e224] [cursor=pointer]
+            - button [ref=f1e230] [cursor=pointer]
+            - button [ref=f1e233] [cursor=pointer]
+            - button [ref=f1e239] [cursor=pointer]:
+              - button [ref=f1e241]
+            - button "宸ヤ綔鍙�" [ref=f1e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f1e250] [cursor=pointer]
+        - generic [ref=f1e257]:
+          - generic [ref=f1e262]:
+            - generic [ref=f1e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=f1e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f1e298]:
+            - button [ref=f1e299] [cursor=pointer]
+            - generic [ref=f1e306] [cursor=pointer]
+            - generic [ref=f1e310] [cursor=pointer]
+      - main [ref=f1e317]:
+        - generic [ref=f1e322]:
+          - generic [ref=f1e327]:
+            - generic [ref=f1e328]:
+              - generic [ref=f1e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f1e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f1e337]:
+              - generic [ref=f1e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f1e345]
+            - generic [ref=f1e351]:
+              - generic [ref=f1e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f1e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f1e360]:
+              - generic [ref=f1e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f1e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f1e369]:
+              - generic [ref=f1e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e377]: 瓒呯骇绠$悊鍛�
+            - generic [ref=f1e383]:
+              - generic [ref=f1e384]: 鎵规鐘舵��
+              - generic [ref=f1e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f1e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f1e393]:
+              - generic [ref=f1e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=f1e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f1e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e403]:
+                  - img "swap-right" [ref=f1e404]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e409]:
+              - generic [ref=f1e410]: 鍒涘缓鏃堕棿
+              - generic [ref=f1e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f1e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e419]:
+                  - img "swap-right" [ref=f1e420]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e425]:
+              - button "閲� 缃�" [ref=f1e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f1e428] [cursor=pointer]
+              - generic [ref=f1e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f1e437]:
+            - generic [ref=f1e439]:
+              - generic [ref=f1e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f1e444]:
+                - generic [ref=f1e446]:
+                  - button "鏂板鎵规" [ref=f1e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f1e453] [cursor=pointer]
+                - button "顫�" [ref=f1e459] [cursor=pointer]
+              - generic [ref=f1e461]:
+                - button "瞟�" [ref=f1e462] [cursor=pointer]
+                - button "顪�" [ref=f1e464] [cursor=pointer]
+                - button "顦�" [ref=f1e466] [cursor=pointer]
+            - generic [ref=f1e470]:
+              - generic [ref=f1e473]:
+                - generic [ref=f1e474]:
+                  - table [ref=f1e478]:
+                    - rowgroup [ref=f1e493]:
+                      - row [ref=f1e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=f1e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=f1e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=f1e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=f1e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=f1e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=f1e520]
+                        - columnheader "璐d换浜�" [ref=f1e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=f1e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=f1e535]
+                        - columnheader "鎵规鐘舵��" [ref=f1e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=f1e545]
+                  - generic [ref=f1e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=f1e553]:
+                    - table [ref=f1e556]:
+                      - rowgroup [ref=f1e571]:
+                        - row [ref=f1e572]:
+                          - columnheader "鎵规鍙�" [ref=f1e573]
+                    - generic [ref=f1e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=f1e580]:
+                    - table [ref=f1e583]:
+                      - rowgroup [ref=f1e598]:
+                        - row [ref=f1e599]:
+                          - columnheader "鎿嶄綔" [ref=f1e600]
+                    - generic [ref=f1e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=f1e621]:
+              - generic [ref=f1e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=f1e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f1e625]:
+                  - textbox "璇烽�夋嫨" [ref=f1e626]: 20鏉�/椤�
+                - generic [ref=f1e627]: 睿�
+              - button "飱�" [ref=f1e630]
+              - button "顧�" [ref=f1e632]
+              - button "顫�" [ref=f1e634]
+              - button "1" [ref=f1e637] [cursor=pointer]
+              - button "顫�" [ref=f1e638]
+              - button "顧�" [ref=f1e640]
+              - button "顦�" [ref=f1e642]
+  - dialog [ref=f1e890]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=f1e892]
+    - generic [ref=f1e894]:
+      - generic [ref=f1e896]:
+        - generic [ref=f1e897]:
+          - generic [ref=f1e898]:
+            - generic [ref=f1e899]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=f1e906]: 閽㈣姱閾濈粸绾�
+        - generic [ref=f1e912]:
+          - generic [ref=f1e913]:
+            - generic [ref=f1e914]: "*"
+            - text: 浜х嚎
+          - generic [ref=f1e920]:
+            - combobox "* 浜х嚎" [ref=f1e922]
+            - generic [ref=f1e1522]:
+              - generic [ref=f1e1523]: 浜х嚎浜�
+              - generic [ref=f1e1524]: two
+        - generic [ref=f1e923]:
+          - generic [ref=f1e924]:
+            - generic [ref=f1e925]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=f1e931]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=f1e932]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+              - text: 2026-08-18 08:00:00
+            - generic:
+              - img "calendar"
+            - button [ref=f1e1529] [cursor=pointer]:
+              - img "close-circle" [ref=f1e1530]
+        - generic [ref=f1e933]:
+          - generic [ref=f1e934]: 璁″垝鏁伴噺
+          - generic [ref=f1e939]:
+            - generic [ref=f1e940]:
+              - button "Increase Value" [ref=f1e941] [cursor=pointer]:
+                - img "up" [ref=f1e942]
+              - button "Decrease Value" [ref=f1e945] [cursor=pointer]:
+                - img "down" [ref=f1e946]
+            - spinbutton "璁″垝鏁伴噺" [ref=f1e950]
+        - generic [ref=f1e951]:
+          - generic [ref=f1e952]:
+            - generic [ref=f1e953]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e960]
+        - generic [ref=f1e966]:
+          - generic [ref=f1e967]: 澶囨敞
+          - textbox "澶囨敞" [ref=f1e972]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=f1e973]:
+        - generic [ref=f1e974]:
+          - generic [ref=f1e975]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=f1e976] [cursor=pointer]
+        - generic [ref=f1e988]:
+          - table [ref=f1e992]:
+            - rowgroup [ref=f1e998]:
+              - row [ref=f1e999]:
+                - columnheader "鐢熶骇浜哄憳" [ref=f1e1000]
+                - columnheader "宀椾綅绫诲瀷" [ref=f1e1005]
+                - columnheader "澶囨敞" [ref=f1e1010]
+                - columnheader "鎿嶄綔" [ref=f1e1015]
+          - table [ref=f1e1051]:
+            - rowgroup [ref=f1e1057]:
+              - row [ref=f1e1058]:
+                - cell [ref=f1e1059]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=f1e1064]
+                - cell [ref=f1e1070]:
+                  - generic [ref=f1e1074] [cursor=pointer]:
+                    - combobox [ref=f1e1076]
+                    - generic: 璇烽�夋嫨宀椾綅绫诲瀷
+                - cell [ref=f1e1077]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=f1e1080]
+                - cell [ref=f1e1081]:
+                  - button "鍒犻櫎" [ref=f1e1087] [cursor=pointer]
+    - button [ref=f1e1031] [cursor=pointer]
+    - generic [ref=f1e1041]:
+      - button "纭� 璁�" [ref=f1e1042] [cursor=pointer]
+      - button "鍙� 娑�" [ref=f1e1045] [cursor=pointer]
+    - button [ref=f1e1047] [cursor=pointer]
+  - dialog "浜哄憳閫夋嫨" [ref=f1e2293]:
+    - document:
+      - generic [ref=f1e2294]:
+        - button "Close" [ref=f1e2295] [cursor=pointer]:
+          - img "close" [ref=f1e2297]
+        - generic [ref=f1e2300]: 浜哄憳閫夋嫨
+        - generic [ref=f1e2303]:
+          - generic [ref=f1e2305]:
+            - textbox "鎼滅储閮ㄩ棬" [ref=f1e2312]
+            - tree [ref=f1e2316]:
+              - generic:
+                - textbox "for screen reader"
+              - generic [ref=f1e2320]:
+                - generic [ref=f1e2321]:
+                  - img "caret-down" [ref=f1e2323] [cursor=pointer]
+                  - generic "鎬诲叕鍙�" [ref=f1e2326] [cursor=pointer]
+                - generic [ref=f1e2327]:
+                  - img "caret-down" [ref=f1e2330] [cursor=pointer]
+                  - generic "娣卞湷鎬诲叕鍙�" [ref=f1e2333] [cursor=pointer]
+                - generic "鐮斿彂閮ㄩ棬" [ref=f1e2337] [cursor=pointer]
+                - generic "甯傚満閮ㄩ棬" [ref=f1e2341] [cursor=pointer]
+                - generic "娴嬭瘯閮ㄩ棬" [ref=f1e2345] [cursor=pointer]
+                - generic "璐㈠姟閮ㄩ棬" [ref=f1e2349] [cursor=pointer]
+                - generic "杩愮淮閮ㄩ棬" [ref=f1e2353] [cursor=pointer]
+                - generic [ref=f1e2354]:
+                  - img "caret-down" [ref=f1e2357] [cursor=pointer]
+                  - generic "闀挎矙鍒嗗叕鍙�" [ref=f1e2360] [cursor=pointer]
+                - generic "甯傚満閮ㄩ棬" [ref=f1e2364] [cursor=pointer]
+                - generic "璐㈠姟閮ㄩ棬" [ref=f1e2368] [cursor=pointer]
+                - generic "鏂伴儴闂�" [ref=f1e2371] [cursor=pointer]
+                - generic "椤剁骇閮ㄩ棬" [ref=f1e2374] [cursor=pointer]
+                - generic "鏌愪釜瀛愰儴闂�" [ref=f1e2377] [cursor=pointer]
+                - generic "鏌愪釜瀛愰儴闂� 2" [ref=f1e2380] [cursor=pointer]
+          - generic [ref=f1e2383]:
+            - generic [ref=f1e2388]:
+              - generic [ref=f1e2389]:
+                - generic [ref=f1e2390]: 鐢ㄦ埛鍚嶇О
+                - textbox "鐢ㄦ埛鍚嶇О" [ref=f1e2396]:
+                  - /placeholder: 璇疯緭鍏ョ敤鎴峰悕绉�
+              - generic [ref=f1e2398]:
+                - generic [ref=f1e2399]: 鐢ㄦ埛鏄电О
+                - textbox "鐢ㄦ埛鏄电О" [ref=f1e2405]:
+                  - /placeholder: 璇疯緭鍏ョ敤鎴锋樀绉�
+              - generic [ref=f1e2407]:
+                - generic [ref=f1e2408]: 鎵嬫満鍙风爜
+                - textbox "鎵嬫満鍙风爜" [ref=f1e2414]:
+                  - /placeholder: 璇疯緭鍏ユ墜鏈哄彿鐮�
+              - generic [ref=f1e2416]:
+                - generic [ref=f1e2417]: 鐘舵��
+                - generic [ref=f1e2423] [cursor=pointer]:
+                  - combobox "鐘舵��" [ref=f1e2425]
+                  - generic "寮�鍚�" [ref=f1e2426]
+              - generic [ref=f1e2431]:
+                - button "閲� 缃�" [ref=f1e2432] [cursor=pointer]
+                - button "鎼� 绱�" [ref=f1e2434] [cursor=pointer]
+                - generic [ref=f1e2436] [cursor=pointer]: 鏀惰捣
+            - generic [ref=f1e2443]:
+              - generic [ref=f1e2445]:
+                - generic [ref=f1e2446]: 鐢ㄦ埛鍒楄〃
+                - button "顫�" [ref=f1e2451] [cursor=pointer]
+                - generic [ref=f1e2453]:
+                  - button "瞟�" [ref=f1e2454] [cursor=pointer]
+                  - button "顪�" [ref=f1e2456] [cursor=pointer]
+                  - button "顦�" [ref=f1e2458] [cursor=pointer]
+              - generic [ref=f1e2466]:
+                - table [ref=f1e2470]:
+                  - rowgroup [ref=f1e2478]:
+                    - row "鐢ㄦ埛缂栧彿 鐢ㄦ埛鍚嶇О 鐢ㄦ埛鏄电О 鎵嬫満鍙风爜 鐘舵��" [ref=f1e2479]:
+                      - columnheader [ref=f1e2480]
+                      - columnheader "鐢ㄦ埛缂栧彿" [ref=f1e2483]
+                      - columnheader "鐢ㄦ埛鍚嶇О" [ref=f1e2488]
+                      - columnheader "鐢ㄦ埛鏄电О" [ref=f1e2493]
+                      - columnheader "鎵嬫満鍙风爜" [ref=f1e2498]
+                      - columnheader "鐘舵��" [ref=f1e2503]
+                - table [ref=f1e2511]:
+                  - rowgroup [ref=f1e2519]:
+                    - row [ref=f1e3049]:
+                      - cell "顫�" [ref=f1e3050]
+                      - cell "230" [ref=f1e2526]
+                      - cell "18333333333" [ref=f1e2530]
+                      - cell "222" [ref=f1e2534]
+                      - cell "18333333333" [ref=f1e2538]
+                      - cell "寮�鍚�" [ref=f1e2542]
+                    - row [ref=f1e2546]:
+                      - cell "顭�" [ref=f1e2547]
+                      - cell "229" [ref=f1e2552]
+                      - cell "15822054764" [ref=f1e2556]
+                      - cell "鏀惧亣" [ref=f1e2560]
+                      - cell "15822054764" [ref=f1e2564]
+                      - cell "寮�鍚�" [ref=f1e2568]
+                    - row [ref=f1e2572]:
+                      - cell "顭�" [ref=f1e2573]
+                      - cell "228" [ref=f1e2578]
+                      - cell "15822054766" [ref=f1e2582]
+                      - cell "涓嶆兂涓婄彮" [ref=f1e2586]
+                      - cell "15822054766" [ref=f1e2590]
+                      - cell "寮�鍚�" [ref=f1e2594]
+                    - row [ref=f1e2598]:
+                      - cell "顭�" [ref=f1e2599]
+                      - cell "227" [ref=f1e2604]
+                      - cell "15822054767" [ref=f1e2608]
+                      - cell "澶ф槑鏄�" [ref=f1e2612]
+                      - cell "15822054767" [ref=f1e2616]
+                      - cell "寮�鍚�" [ref=f1e2620]
+                    - row [ref=f1e2624]:
+                      - cell "顭�" [ref=f1e2625]
+                      - cell "226" [ref=f1e2630]
+                      - cell "15822054763" [ref=f1e2634]
+                      - cell "鍗冨厠" [ref=f1e2638]
+                      - cell "15822054763" [ref=f1e2642]
+                      - cell "寮�鍚�" [ref=f1e2646]
+                    - row [ref=f1e2650]:
+                      - cell "顭�" [ref=f1e2651]
+                      - cell "225" [ref=f1e2656]
+                      - cell "15822054762" [ref=f1e2660]
+                      - cell "鍗楃摐瀛�" [ref=f1e2664]
+                      - cell "15822054762" [ref=f1e2668]
+                      - cell "寮�鍚�" [ref=f1e2672]
+                    - row "顭� 144 aoteman001 aoteman00112 鍏抽棴" [ref=f1e2676]:
+                      - cell "顭�" [ref=f1e2677]
+                      - cell "144" [ref=f1e2682]
+                      - cell "aoteman001" [ref=f1e2686]
+                      - cell "aoteman00112" [ref=f1e2690]
+                      - cell [ref=f1e2694]
+                      - cell "鍏抽棴" [ref=f1e2698]
+                    - row "顭� 143 a00001 a00001 寮�鍚�" [ref=f1e2702]:
+                      - cell "顭�" [ref=f1e2703]
+                      - cell "143" [ref=f1e2708]
+                      - cell "a00001" [ref=f1e2712]
+                      - cell "a00001" [ref=f1e2716]
+                      - cell [ref=f1e2720]
+                      - cell "寮�鍚�" [ref=f1e2724]
+                    - row [ref=f1e2728]:
+                      - cell "顭�" [ref=f1e2729]
+                      - cell "142" [ref=f1e2734]
+                      - cell "test01" [ref=f1e2738]
+                      - cell "test01" [ref=f1e2742]
+                      - cell "19021719925" [ref=f1e2746]
+                      - cell "寮�鍚�" [ref=f1e2750]
+                    - row "顭� 141 admin1 鏂扮敤鎴� 寮�鍚�" [ref=f1e2754]:
+                      - cell "顭�" [ref=f1e2755]
+                      - cell "141" [ref=f1e2760]
+                      - cell "admin1" [ref=f1e2764]
+                      - cell "鏂扮敤鎴�" [ref=f1e2768]
+                      - cell [ref=f1e2772]
+                      - cell "寮�鍚�" [ref=f1e2776]
+                    - row "顭� 139 wwbwwb 灏忕澶� 寮�鍚�" [ref=f1e2780]:
+                      - cell "顭�" [ref=f1e2781]
+                      - cell "139" [ref=f1e2786]
+                      - cell "wwbwwb" [ref=f1e2790]
+                      - cell "灏忕澶�" [ref=f1e2794]
+                      - cell [ref=f1e2798]
+                      - cell "寮�鍚�" [ref=f1e2802]
+                    - row [ref=f1e2806]:
+                      - cell "顭�" [ref=f1e2807]
+                      - cell "118" [ref=f1e2812]
+                      - cell "goudan" [ref=f1e2816]
+                      - cell "鐙楄泲" [ref=f1e2820]
+                      - cell "15601691239" [ref=f1e2824]
+                      - cell "寮�鍚�" [ref=f1e2828]
+                    - row [ref=f1e2832]:
+                      - cell "顭�" [ref=f1e2833]
+                      - cell "117" [ref=f1e2838]
+                      - cell "admin123" [ref=f1e2842]
+                      - cell "娴嬭瘯鍙�02" [ref=f1e2846]
+                      - cell "15601691234" [ref=f1e2850]
+                      - cell "寮�鍚�" [ref=f1e2854]
+                    - row [ref=f1e2858]:
+                      - cell "顭�" [ref=f1e2859]
+                      - cell "115" [ref=f1e2864]
+                      - cell "aotemane" [ref=f1e2868]
+                      - cell "闃垮憜" [ref=f1e2872]
+                      - cell "15601691229" [ref=f1e2876]
+                      - cell "寮�鍚�" [ref=f1e2880]
+                    - row [ref=f1e2884]:
+                      - cell "顭�" [ref=f1e2885]
+                      - cell "114" [ref=f1e2890]
+                      - cell "hrmgr" [ref=f1e2894]
+                      - cell "hr 灏忓濮�" [ref=f1e2898]
+                      - cell "15601691236" [ref=f1e2902]
+                      - cell "寮�鍚�" [ref=f1e2906]
+                    - row [ref=f1e2910]:
+                      - cell "顭�" [ref=f1e2911]
+                      - cell "113" [ref=f1e2916]
+                      - cell "aoteman" [ref=f1e2920]
+                      - cell "绠$悊鍛�1" [ref=f1e2924]
+                      - cell "15601691300" [ref=f1e2928]
+                      - cell "寮�鍚�" [ref=f1e2932]
+                    - row [ref=f1e2936]:
+                      - cell "顭�" [ref=f1e2937]
+                      - cell "112" [ref=f1e2942]
+                      - cell "newobject" [ref=f1e2946]
+                      - cell "鏂板璞�" [ref=f1e2950]
+                      - cell "15601691235" [ref=f1e2954]
+                      - cell "寮�鍚�" [ref=f1e2958]
+                    - row "顭� 111 test 娴嬭瘯鐢ㄦ埛 寮�鍚�" [ref=f1e2962]:
+                      - cell "顭�" [ref=f1e2963]
+                      - cell "111" [ref=f1e2968]
+                      - cell "test" [ref=f1e2972]
+                      - cell "娴嬭瘯鐢ㄦ埛" [ref=f1e2976]
+                      - cell [ref=f1e2980]
+                      - cell "寮�鍚�" [ref=f1e2984]
+                    - row [ref=f1e2988]:
+                      - cell "顭�" [ref=f1e2989]
+                      - cell "1" [ref=f1e2994]
+                      - cell "admin" [ref=f1e2998]
+                      - cell "瓒呯骇绠$悊鍛�" [ref=f1e3002]
+                      - cell "18818260272" [ref=f1e3006]
+                      - cell "寮�鍚�" [ref=f1e3010]
+              - generic [ref=f1e3021]:
+                - generic [ref=f1e3022]: 鍏� 19 鏉¤褰�
+                - generic [ref=f1e3024] [cursor=pointer]:
+                  - generic "20鏉�/椤�" [ref=f1e3025]:
+                    - textbox "璇烽�夋嫨" [ref=f1e3026]: 20鏉�/椤�
+                  - generic [ref=f1e3027]: 睿�
+                - button "飱�" [ref=f1e3030]
+                - button "顧�" [ref=f1e3032]
+                - button "顫�" [ref=f1e3034]
+                - button "1" [ref=f1e3037] [cursor=pointer]
+                - button "顫�" [ref=f1e3038]
+                - button "顧�" [ref=f1e3040]
+                - button "顦�" [ref=f1e3042]
+        - generic [ref=f1e3044]:
+          - button "鍙� 娑�" [ref=f1e3045] [cursor=pointer]
+          - button "纭� 瀹�" [ref=f1e3047] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-25-58-788Z.yml b/.playwright-mcp/page-2026-08-18T08-25-58-788Z.yml
new file mode 100644
index 0000000..649886a
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-25-58-788Z.yml
@@ -0,0 +1,272 @@
+- generic [ref=f1e4]:
+  - generic [ref=f1e7]:
+    - complementary [ref=f1e8]:
+      - generic [ref=f1e9]:
+        - generic [ref=f1e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e18]
+          - generic [ref=f1e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f1e22]:
+          - menuitem "棣栭〉" [ref=f1e23] [cursor=pointer]
+          - listitem [ref=f1e30]:
+            - generic [ref=f1e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f1e39]:
+            - generic [ref=f1e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=f1e46]:
+            - generic [ref=f1e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=f1e53]:
+            - generic [ref=f1e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=f1e61]:
+            - generic [ref=f1e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f1e70]:
+            - generic [ref=f1e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=f1e78]:
+            - generic [ref=f1e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f1e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f1e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f1e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f1e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f1e104] [cursor=pointer]
+          - listitem [ref=f1e111]:
+            - generic [ref=f1e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f1e118]:
+            - generic [ref=f1e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=f1e125]:
+            - generic [ref=f1e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=f1e132]:
+            - generic [ref=f1e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=f1e139]:
+            - generic [ref=f1e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=f1e146]:
+            - generic [ref=f1e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=f1e153]:
+            - generic [ref=f1e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=f1e160]:
+            - generic [ref=f1e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=f1e169] [cursor=pointer]
+    - generic [ref=f1e174]:
+      - generic [ref=f1e175]:
+        - banner [ref=f1e176]:
+          - button [ref=f1e177] [cursor=pointer]
+          - button [ref=f1e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f1e185]:
+            - list [ref=f1e186]:
+              - listitem [ref=f1e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f1e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f1e192]
+              - listitem [ref=f1e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f1e196]
+          - generic [ref=f1e201]:
+            - generic [ref=f1e203] [cursor=pointer]:
+              - generic [ref=f1e207]: 鎼滅储
+              - generic [ref=f1e208]: Ctrl K
+            - button [ref=f1e210] [cursor=pointer]
+            - button "dark" [ref=f1e215] [cursor=pointer]
+            - button [ref=f1e224] [cursor=pointer]
+            - button [ref=f1e230] [cursor=pointer]
+            - button [ref=f1e233] [cursor=pointer]
+            - button [ref=f1e239] [cursor=pointer]:
+              - button [ref=f1e241]
+            - button "宸ヤ綔鍙�" [ref=f1e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f1e250] [cursor=pointer]
+        - generic [ref=f1e257]:
+          - generic [ref=f1e262]:
+            - generic [ref=f1e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=f1e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f1e298]:
+            - button [ref=f1e299] [cursor=pointer]
+            - generic [ref=f1e306] [cursor=pointer]
+            - generic [ref=f1e310] [cursor=pointer]
+      - main [ref=f1e317]:
+        - generic [ref=f1e322]:
+          - generic [ref=f1e327]:
+            - generic [ref=f1e328]:
+              - generic [ref=f1e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f1e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f1e337]:
+              - generic [ref=f1e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f1e345]
+            - generic [ref=f1e351]:
+              - generic [ref=f1e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f1e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f1e360]:
+              - generic [ref=f1e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f1e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f1e369]:
+              - generic [ref=f1e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e377]: 瓒呯骇绠$悊鍛�
+            - generic [ref=f1e383]:
+              - generic [ref=f1e384]: 鎵规鐘舵��
+              - generic [ref=f1e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f1e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f1e393]:
+              - generic [ref=f1e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=f1e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f1e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e403]:
+                  - img "swap-right" [ref=f1e404]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e409]:
+              - generic [ref=f1e410]: 鍒涘缓鏃堕棿
+              - generic [ref=f1e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f1e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e419]:
+                  - img "swap-right" [ref=f1e420]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e425]:
+              - button "閲� 缃�" [ref=f1e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f1e428] [cursor=pointer]
+              - generic [ref=f1e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f1e437]:
+            - generic [ref=f1e439]:
+              - generic [ref=f1e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f1e444]:
+                - generic [ref=f1e446]:
+                  - button "鏂板鎵规" [ref=f1e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f1e453] [cursor=pointer]
+                - button "顫�" [ref=f1e459] [cursor=pointer]
+              - generic [ref=f1e461]:
+                - button "瞟�" [ref=f1e462] [cursor=pointer]
+                - button "顪�" [ref=f1e464] [cursor=pointer]
+                - button "顦�" [ref=f1e466] [cursor=pointer]
+            - generic [ref=f1e470]:
+              - generic [ref=f1e473]:
+                - generic [ref=f1e474]:
+                  - table [ref=f1e478]:
+                    - rowgroup [ref=f1e493]:
+                      - row [ref=f1e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=f1e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=f1e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=f1e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=f1e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=f1e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=f1e520]
+                        - columnheader "璐d换浜�" [ref=f1e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=f1e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=f1e535]
+                        - columnheader "鎵规鐘舵��" [ref=f1e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=f1e545]
+                  - generic [ref=f1e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=f1e553]:
+                    - table [ref=f1e556]:
+                      - rowgroup [ref=f1e571]:
+                        - row [ref=f1e572]:
+                          - columnheader "鎵规鍙�" [ref=f1e573]
+                    - generic [ref=f1e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=f1e580]:
+                    - table [ref=f1e583]:
+                      - rowgroup [ref=f1e598]:
+                        - row [ref=f1e599]:
+                          - columnheader "鎿嶄綔" [ref=f1e600]
+                    - generic [ref=f1e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=f1e621]:
+              - generic [ref=f1e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=f1e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f1e625]:
+                  - textbox "璇烽�夋嫨" [ref=f1e626]: 20鏉�/椤�
+                - generic [ref=f1e627]: 睿�
+              - button "飱�" [ref=f1e630]
+              - button "顧�" [ref=f1e632]
+              - button "顫�" [ref=f1e634]
+              - button "1" [ref=f1e637] [cursor=pointer]
+              - button "顫�" [ref=f1e638]
+              - button "顧�" [ref=f1e640]
+              - button "顦�" [ref=f1e642]
+  - dialog [ref=f1e890]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=f1e892]
+    - generic [ref=f1e894]:
+      - generic [ref=f1e896]:
+        - generic [ref=f1e897]:
+          - generic [ref=f1e898]:
+            - generic [ref=f1e899]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=f1e906]: 閽㈣姱閾濈粸绾�
+        - generic [ref=f1e912]:
+          - generic [ref=f1e913]:
+            - generic [ref=f1e914]: "*"
+            - text: 浜х嚎
+          - generic [ref=f1e920]:
+            - combobox "* 浜х嚎" [ref=f1e922]
+            - generic [ref=f1e1522]:
+              - generic [ref=f1e1523]: 浜х嚎浜�
+              - generic [ref=f1e1524]: two
+        - generic [ref=f1e923]:
+          - generic [ref=f1e924]:
+            - generic [ref=f1e925]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=f1e931]:
+            - textbox "* 鐢熶骇鏃ユ湡" [active] [ref=f1e932]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+              - text: 2026-08-18 08:00:00
+            - generic:
+              - img "calendar"
+            - button [ref=f1e1529] [cursor=pointer]:
+              - img "close-circle" [ref=f1e1530]
+        - generic [ref=f1e933]:
+          - generic [ref=f1e934]: 璁″垝鏁伴噺
+          - generic [ref=f1e939]:
+            - generic [ref=f1e940]:
+              - button "Increase Value" [ref=f1e941] [cursor=pointer]:
+                - img "up" [ref=f1e942]
+              - button "Decrease Value" [ref=f1e945] [cursor=pointer]:
+                - img "down" [ref=f1e946]
+            - spinbutton "璁″垝鏁伴噺" [ref=f1e950]
+        - generic [ref=f1e951]:
+          - generic [ref=f1e952]:
+            - generic [ref=f1e953]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e960]
+        - generic [ref=f1e966]:
+          - generic [ref=f1e967]: 澶囨敞
+          - textbox "澶囨敞" [ref=f1e972]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=f1e973]:
+        - generic [ref=f1e974]:
+          - generic [ref=f1e975]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=f1e976] [cursor=pointer]
+        - generic [ref=f1e988]:
+          - table [ref=f1e992]:
+            - rowgroup [ref=f1e998]:
+              - row [ref=f1e999]:
+                - columnheader "鐢熶骇浜哄憳" [ref=f1e1000]
+                - columnheader "宀椾綅绫诲瀷" [ref=f1e1005]
+                - columnheader "澶囨敞" [ref=f1e1010]
+                - columnheader "鎿嶄綔" [ref=f1e1015]
+          - table [ref=f1e1051]:
+            - rowgroup [ref=f1e1057]:
+              - row [ref=f1e3051]:
+                - cell [ref=f1e3052]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=f1e1064]: "222"
+                - cell [ref=f1e1070]:
+                  - generic [ref=f1e1074] [cursor=pointer]:
+                    - combobox [ref=f1e1076]
+                    - generic: 璇烽�夋嫨宀椾綅绫诲瀷
+                - cell [ref=f1e1077]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=f1e1080]
+                - cell [ref=f1e1081]:
+                  - button "鍒犻櫎" [ref=f1e1087] [cursor=pointer]
+    - button [ref=f1e1031] [cursor=pointer]
+    - generic [ref=f1e1041]:
+      - button "纭� 璁�" [ref=f1e1042] [cursor=pointer]
+      - button "鍙� 娑�" [ref=f1e1045] [cursor=pointer]
+    - button [ref=f1e1047] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-26-27-866Z.yml b/.playwright-mcp/page-2026-08-18T08-26-27-866Z.yml
new file mode 100644
index 0000000..500b1a7
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-26-27-866Z.yml
@@ -0,0 +1,288 @@
+- generic [ref=f1e4]:
+  - generic [ref=f1e7]:
+    - complementary [ref=f1e8]:
+      - generic [ref=f1e9]:
+        - generic [ref=f1e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e18]
+          - generic [ref=f1e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f1e22]:
+          - menuitem "棣栭〉" [ref=f1e23] [cursor=pointer]
+          - listitem [ref=f1e30]:
+            - generic [ref=f1e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f1e39]:
+            - generic [ref=f1e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=f1e46]:
+            - generic [ref=f1e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=f1e53]:
+            - generic [ref=f1e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=f1e61]:
+            - generic [ref=f1e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f1e70]:
+            - generic [ref=f1e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=f1e78]:
+            - generic [ref=f1e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f1e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f1e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f1e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f1e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f1e104] [cursor=pointer]
+          - listitem [ref=f1e111]:
+            - generic [ref=f1e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f1e118]:
+            - generic [ref=f1e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=f1e125]:
+            - generic [ref=f1e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=f1e132]:
+            - generic [ref=f1e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=f1e139]:
+            - generic [ref=f1e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=f1e146]:
+            - generic [ref=f1e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=f1e153]:
+            - generic [ref=f1e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=f1e160]:
+            - generic [ref=f1e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=f1e169] [cursor=pointer]
+    - generic [ref=f1e174]:
+      - generic [ref=f1e175]:
+        - banner [ref=f1e176]:
+          - button [ref=f1e177] [cursor=pointer]
+          - button [ref=f1e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f1e185]:
+            - list [ref=f1e186]:
+              - listitem [ref=f1e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f1e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f1e192]
+              - listitem [ref=f1e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f1e196]
+          - generic [ref=f1e201]:
+            - generic [ref=f1e203] [cursor=pointer]:
+              - generic [ref=f1e207]: 鎼滅储
+              - generic [ref=f1e208]: Ctrl K
+            - button [ref=f1e210] [cursor=pointer]
+            - button "dark" [ref=f1e215] [cursor=pointer]
+            - button [ref=f1e224] [cursor=pointer]
+            - button [ref=f1e230] [cursor=pointer]
+            - button [ref=f1e233] [cursor=pointer]
+            - button [ref=f1e239] [cursor=pointer]:
+              - button [ref=f1e241]
+            - button "宸ヤ綔鍙�" [ref=f1e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f1e250] [cursor=pointer]
+        - generic [ref=f1e257]:
+          - generic [ref=f1e262]:
+            - generic [ref=f1e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=f1e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f1e298]:
+            - button [ref=f1e299] [cursor=pointer]
+            - generic [ref=f1e306] [cursor=pointer]
+            - generic [ref=f1e310] [cursor=pointer]
+      - main [ref=f1e317]:
+        - generic [ref=f1e322]:
+          - generic [ref=f1e327]:
+            - generic [ref=f1e328]:
+              - generic [ref=f1e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f1e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f1e337]:
+              - generic [ref=f1e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f1e345]
+            - generic [ref=f1e351]:
+              - generic [ref=f1e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f1e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f1e360]:
+              - generic [ref=f1e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f1e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f1e369]:
+              - generic [ref=f1e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e377]: 瓒呯骇绠$悊鍛�
+            - generic [ref=f1e383]:
+              - generic [ref=f1e384]: 鎵规鐘舵��
+              - generic [ref=f1e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f1e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f1e393]:
+              - generic [ref=f1e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=f1e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f1e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e403]:
+                  - img "swap-right" [ref=f1e404]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e409]:
+              - generic [ref=f1e410]: 鍒涘缓鏃堕棿
+              - generic [ref=f1e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f1e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e419]:
+                  - img "swap-right" [ref=f1e420]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e425]:
+              - button "閲� 缃�" [ref=f1e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f1e428] [cursor=pointer]
+              - generic [ref=f1e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f1e437]:
+            - generic [ref=f1e439]:
+              - generic [ref=f1e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f1e444]:
+                - generic [ref=f1e446]:
+                  - button "鏂板鎵规" [ref=f1e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f1e453] [cursor=pointer]
+                - button "顫�" [ref=f1e459] [cursor=pointer]
+              - generic [ref=f1e461]:
+                - button "瞟�" [ref=f1e462] [cursor=pointer]
+                - button "顪�" [ref=f1e464] [cursor=pointer]
+                - button "顦�" [ref=f1e466] [cursor=pointer]
+            - generic [ref=f1e470]:
+              - generic [ref=f1e473]:
+                - generic [ref=f1e474]:
+                  - table [ref=f1e478]:
+                    - rowgroup [ref=f1e493]:
+                      - row [ref=f1e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=f1e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=f1e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=f1e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=f1e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=f1e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=f1e520]
+                        - columnheader "璐d换浜�" [ref=f1e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=f1e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=f1e535]
+                        - columnheader "鎵规鐘舵��" [ref=f1e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=f1e545]
+                  - generic [ref=f1e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=f1e553]:
+                    - table [ref=f1e556]:
+                      - rowgroup [ref=f1e571]:
+                        - row [ref=f1e572]:
+                          - columnheader "鎵规鍙�" [ref=f1e573]
+                    - generic [ref=f1e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=f1e580]:
+                    - table [ref=f1e583]:
+                      - rowgroup [ref=f1e598]:
+                        - row [ref=f1e599]:
+                          - columnheader "鎿嶄綔" [ref=f1e600]
+                    - generic [ref=f1e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=f1e621]:
+              - generic [ref=f1e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=f1e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f1e625]:
+                  - textbox "璇烽�夋嫨" [ref=f1e626]: 20鏉�/椤�
+                - generic [ref=f1e627]: 睿�
+              - button "飱�" [ref=f1e630]
+              - button "顧�" [ref=f1e632]
+              - button "顫�" [ref=f1e634]
+              - button "1" [ref=f1e637] [cursor=pointer]
+              - button "顫�" [ref=f1e638]
+              - button "顧�" [ref=f1e640]
+              - button "顦�" [ref=f1e642]
+  - dialog [ref=f1e890]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=f1e892]
+    - generic [ref=f1e894]:
+      - generic [ref=f1e896]:
+        - generic [ref=f1e897]:
+          - generic [ref=f1e898]:
+            - generic [ref=f1e899]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=f1e906]: 閽㈣姱閾濈粸绾�
+        - generic [ref=f1e912]:
+          - generic [ref=f1e913]:
+            - generic [ref=f1e914]: "*"
+            - text: 浜х嚎
+          - generic [ref=f1e920]:
+            - combobox "* 浜х嚎" [ref=f1e922]
+            - generic [ref=f1e1522]:
+              - generic [ref=f1e1523]: 浜х嚎浜�
+              - generic [ref=f1e1524]: two
+        - generic [ref=f1e923]:
+          - generic [ref=f1e924]:
+            - generic [ref=f1e925]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=f1e931]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=f1e932]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+              - text: 2026-08-18 08:00:00
+            - generic:
+              - img "calendar"
+            - button [ref=f1e1529] [cursor=pointer]:
+              - img "close-circle" [ref=f1e1530]
+        - generic [ref=f1e933]:
+          - generic [ref=f1e934]: 璁″垝鏁伴噺
+          - generic [ref=f1e939]:
+            - generic [ref=f1e940]:
+              - button "Increase Value" [ref=f1e941] [cursor=pointer]:
+                - img "up" [ref=f1e942]
+              - button "Decrease Value" [ref=f1e945] [cursor=pointer]:
+                - img "down" [ref=f1e946]
+            - spinbutton "璁″垝鏁伴噺" [ref=f1e950]
+        - generic [ref=f1e951]:
+          - generic [ref=f1e952]:
+            - generic [ref=f1e953]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e960]
+        - generic [ref=f1e966]:
+          - generic [ref=f1e967]: 澶囨敞
+          - textbox "澶囨敞" [ref=f1e972]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=f1e973]:
+        - generic [ref=f1e974]:
+          - generic [ref=f1e975]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=f1e976] [cursor=pointer]
+        - generic [ref=f1e988]:
+          - table [ref=f1e992]:
+            - rowgroup [ref=f1e998]:
+              - row [ref=f1e999]:
+                - columnheader "鐢熶骇浜哄憳" [ref=f1e1000]
+                - columnheader "宀椾綅绫诲瀷" [ref=f1e1005]
+                - columnheader "澶囨敞" [ref=f1e1010]
+                - columnheader "鎿嶄綔" [ref=f1e1015]
+          - table [ref=f1e1051]:
+            - rowgroup [ref=f1e1057]:
+              - row [ref=f1e3051]:
+                - cell [ref=f1e3052]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=f1e1064]: "222"
+                - cell [ref=f1e1070]:
+                  - generic [ref=f1e1074] [cursor=pointer]:
+                    - combobox [expanded] [active] [ref=f1e1076]:
+                      - listbox:
+                        - option "缁勯暱": "10"
+                        - option "鎿嶄綔宸�": "20"
+                    - generic: 璇烽�夋嫨宀椾綅绫诲瀷
+                - cell [ref=f1e1077]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=f1e1080]
+                - cell [ref=f1e1081]:
+                  - button "鍒犻櫎" [ref=f1e1087] [cursor=pointer]
+    - button [ref=f1e1031] [cursor=pointer]
+    - generic [ref=f1e1041]:
+      - button "纭� 璁�" [ref=f1e1042] [cursor=pointer]
+      - button "鍙� 娑�" [ref=f1e1045] [cursor=pointer]
+    - button [ref=f1e1047] [cursor=pointer]
+  - generic:
+    - generic:
+      - generic:
+        - generic:
+          - generic:
+            - generic:
+              - generic:
+                - generic:
+                  - generic "缁勯暱"
+                  - generic "鎿嶄綔宸�"
+                  - generic "鍖呰宸�"
+                  - generic "璐ㄦ鍛�"
+                  - generic "鍏朵粬"
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-26-48-898Z.yml b/.playwright-mcp/page-2026-08-18T08-26-48-898Z.yml
new file mode 100644
index 0000000..78a5bd0
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-26-48-898Z.yml
@@ -0,0 +1,290 @@
+- generic [ref=f1e4]:
+  - generic [ref=f1e7]:
+    - complementary [ref=f1e8]:
+      - generic [ref=f1e9]:
+        - generic [ref=f1e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e18]
+          - generic [ref=f1e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f1e22]:
+          - menuitem "棣栭〉" [ref=f1e23] [cursor=pointer]
+          - listitem [ref=f1e30]:
+            - generic [ref=f1e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f1e39]:
+            - generic [ref=f1e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=f1e46]:
+            - generic [ref=f1e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=f1e53]:
+            - generic [ref=f1e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=f1e61]:
+            - generic [ref=f1e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f1e70]:
+            - generic [ref=f1e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=f1e78]:
+            - generic [ref=f1e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f1e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f1e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f1e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f1e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f1e104] [cursor=pointer]
+          - listitem [ref=f1e111]:
+            - generic [ref=f1e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f1e118]:
+            - generic [ref=f1e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=f1e125]:
+            - generic [ref=f1e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=f1e132]:
+            - generic [ref=f1e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=f1e139]:
+            - generic [ref=f1e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=f1e146]:
+            - generic [ref=f1e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=f1e153]:
+            - generic [ref=f1e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=f1e160]:
+            - generic [ref=f1e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=f1e169] [cursor=pointer]
+    - generic [ref=f1e174]:
+      - generic [ref=f1e175]:
+        - banner [ref=f1e176]:
+          - button [ref=f1e177] [cursor=pointer]
+          - button [ref=f1e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f1e185]:
+            - list [ref=f1e186]:
+              - listitem [ref=f1e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f1e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f1e192]
+              - listitem [ref=f1e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f1e196]
+          - generic [ref=f1e201]:
+            - generic [ref=f1e203] [cursor=pointer]:
+              - generic [ref=f1e207]: 鎼滅储
+              - generic [ref=f1e208]: Ctrl K
+            - button [ref=f1e210] [cursor=pointer]
+            - button "dark" [ref=f1e215] [cursor=pointer]
+            - button [ref=f1e224] [cursor=pointer]
+            - button [ref=f1e230] [cursor=pointer]
+            - button [ref=f1e233] [cursor=pointer]
+            - button [ref=f1e239] [cursor=pointer]:
+              - button [ref=f1e241]
+            - button "宸ヤ綔鍙�" [ref=f1e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f1e250] [cursor=pointer]
+        - generic [ref=f1e257]:
+          - generic [ref=f1e262]:
+            - generic [ref=f1e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=f1e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f1e298]:
+            - button [ref=f1e299] [cursor=pointer]
+            - generic [ref=f1e306] [cursor=pointer]
+            - generic [ref=f1e310] [cursor=pointer]
+      - main [ref=f1e317]:
+        - generic [ref=f1e322]:
+          - generic [ref=f1e327]:
+            - generic [ref=f1e328]:
+              - generic [ref=f1e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f1e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f1e337]:
+              - generic [ref=f1e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f1e345]
+            - generic [ref=f1e351]:
+              - generic [ref=f1e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f1e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f1e360]:
+              - generic [ref=f1e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f1e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f1e369]:
+              - generic [ref=f1e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e377]: 瓒呯骇绠$悊鍛�
+            - generic [ref=f1e383]:
+              - generic [ref=f1e384]: 鎵规鐘舵��
+              - generic [ref=f1e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f1e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f1e393]:
+              - generic [ref=f1e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=f1e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f1e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e403]:
+                  - img "swap-right" [ref=f1e404]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e409]:
+              - generic [ref=f1e410]: 鍒涘缓鏃堕棿
+              - generic [ref=f1e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f1e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e419]:
+                  - img "swap-right" [ref=f1e420]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e425]:
+              - button "閲� 缃�" [ref=f1e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f1e428] [cursor=pointer]
+              - generic [ref=f1e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f1e437]:
+            - generic [ref=f1e439]:
+              - generic [ref=f1e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f1e444]:
+                - generic [ref=f1e446]:
+                  - button "鏂板鎵规" [ref=f1e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f1e453] [cursor=pointer]
+                - button "顫�" [ref=f1e459] [cursor=pointer]
+              - generic [ref=f1e461]:
+                - button "瞟�" [ref=f1e462] [cursor=pointer]
+                - button "顪�" [ref=f1e464] [cursor=pointer]
+                - button "顦�" [ref=f1e466] [cursor=pointer]
+            - generic [ref=f1e470]:
+              - generic [ref=f1e473]:
+                - generic [ref=f1e474]:
+                  - table [ref=f1e478]:
+                    - rowgroup [ref=f1e493]:
+                      - row [ref=f1e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=f1e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=f1e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=f1e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=f1e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=f1e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=f1e520]
+                        - columnheader "璐d换浜�" [ref=f1e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=f1e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=f1e535]
+                        - columnheader "鎵规鐘舵��" [ref=f1e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=f1e545]
+                  - generic [ref=f1e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=f1e553]:
+                    - table [ref=f1e556]:
+                      - rowgroup [ref=f1e571]:
+                        - row [ref=f1e572]:
+                          - columnheader "鎵规鍙�" [ref=f1e573]
+                    - generic [ref=f1e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=f1e580]:
+                    - table [ref=f1e583]:
+                      - rowgroup [ref=f1e598]:
+                        - row [ref=f1e599]:
+                          - columnheader "鎿嶄綔" [ref=f1e600]
+                    - generic [ref=f1e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=f1e621]:
+              - generic [ref=f1e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=f1e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f1e625]:
+                  - textbox "璇烽�夋嫨" [ref=f1e626]: 20鏉�/椤�
+                - generic [ref=f1e627]: 睿�
+              - button "飱�" [ref=f1e630]
+              - button "顧�" [ref=f1e632]
+              - button "顫�" [ref=f1e634]
+              - button "1" [ref=f1e637] [cursor=pointer]
+              - button "顫�" [ref=f1e638]
+              - button "顧�" [ref=f1e640]
+              - button "顦�" [ref=f1e642]
+  - dialog [ref=f1e890]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=f1e892]
+    - generic [ref=f1e894]:
+      - generic [ref=f1e896]:
+        - generic [ref=f1e897]:
+          - generic [ref=f1e898]:
+            - generic [ref=f1e899]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=f1e906]: 閽㈣姱閾濈粸绾�
+        - generic [ref=f1e912]:
+          - generic [ref=f1e913]:
+            - generic [ref=f1e914]: "*"
+            - text: 浜х嚎
+          - generic [ref=f1e920]:
+            - combobox "* 浜х嚎" [ref=f1e922]
+            - generic [ref=f1e1522]:
+              - generic [ref=f1e1523]: 浜х嚎浜�
+              - generic [ref=f1e1524]: two
+        - generic [ref=f1e923]:
+          - generic [ref=f1e924]:
+            - generic [ref=f1e925]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=f1e931]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=f1e932]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+              - text: 2026-08-18 08:00:00
+            - generic:
+              - img "calendar"
+            - button [ref=f1e1529] [cursor=pointer]:
+              - img "close-circle" [ref=f1e1530]
+        - generic [ref=f1e933]:
+          - generic [ref=f1e934]: 璁″垝鏁伴噺
+          - generic [ref=f1e939]:
+            - generic [ref=f1e940]:
+              - button "Increase Value" [ref=f1e941] [cursor=pointer]:
+                - img "up" [ref=f1e942]
+              - button "Decrease Value" [ref=f1e945] [cursor=pointer]:
+                - img "down" [ref=f1e946]
+            - spinbutton "璁″垝鏁伴噺" [ref=f1e950]
+        - generic [ref=f1e951]:
+          - generic [ref=f1e952]:
+            - generic [ref=f1e953]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e960]
+        - generic [ref=f1e966]:
+          - generic [ref=f1e967]: 澶囨敞
+          - textbox "澶囨敞" [ref=f1e972]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=f1e973]:
+        - generic [ref=f1e974]:
+          - generic [ref=f1e975]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=f1e976] [cursor=pointer]
+        - generic [ref=f1e988]:
+          - table [ref=f1e992]:
+            - rowgroup [ref=f1e998]:
+              - row [ref=f1e999]:
+                - columnheader "鐢熶骇浜哄憳" [ref=f1e1000]
+                - columnheader "宀椾綅绫诲瀷" [ref=f1e1005]
+                - columnheader "澶囨敞" [ref=f1e1010]
+                - columnheader "鎿嶄綔" [ref=f1e1015]
+          - table [ref=f1e1051]:
+            - rowgroup [ref=f1e1057]:
+              - row [ref=f1e3069]:
+                - cell [ref=f1e3052]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=f1e1064]: "222"
+                - cell "缁勯暱 缁勯暱 缁勯暱" [ref=f1e3070]:
+                  - generic [ref=f1e1073] [cursor=pointer]:
+                    - generic: 缁勯暱
+                    - generic [ref=f1e1074]:
+                      - combobox [active] [ref=f1e1076]:
+                        - listbox:
+                          - option "缁勯暱" [selected]: "10"
+                          - option "鎿嶄綔宸�": "20"
+                      - generic "缁勯暱" [ref=f1e3071]
+                - cell [ref=f1e1077]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=f1e1080]
+                - cell [ref=f1e1081]:
+                  - button "鍒犻櫎" [ref=f1e1087] [cursor=pointer]
+    - button [ref=f1e1031] [cursor=pointer]
+    - generic [ref=f1e1041]:
+      - button "纭� 璁�" [ref=f1e1042] [cursor=pointer]
+      - button "鍙� 娑�" [ref=f1e1045] [cursor=pointer]
+    - button [ref=f1e1047] [cursor=pointer]
+  - generic:
+    - generic:
+      - generic:
+        - generic:
+          - generic:
+            - generic:
+              - generic:
+                - generic:
+                  - generic "缁勯暱"
+                  - generic "鎿嶄綔宸�"
+                  - generic "鍖呰宸�"
+                  - generic "璐ㄦ鍛�"
+                  - generic "鍏朵粬"
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-27-07-283Z.yml b/.playwright-mcp/page-2026-08-18T08-27-07-283Z.yml
new file mode 100644
index 0000000..73b3a70
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-27-07-283Z.yml
@@ -0,0 +1,274 @@
+- generic [ref=f1e4]:
+  - generic [ref=f1e7]:
+    - complementary [ref=f1e8]:
+      - generic [ref=f1e9]:
+        - generic [ref=f1e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f1e18]
+          - generic [ref=f1e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f1e22]:
+          - menuitem "棣栭〉" [ref=f1e23] [cursor=pointer]
+          - listitem [ref=f1e30]:
+            - generic [ref=f1e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f1e39]:
+            - generic [ref=f1e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=f1e46]:
+            - generic [ref=f1e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=f1e53]:
+            - generic [ref=f1e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=f1e61]:
+            - generic [ref=f1e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=f1e70]:
+            - generic [ref=f1e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=f1e78]:
+            - generic [ref=f1e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=f1e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=f1e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=f1e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=f1e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=f1e104] [cursor=pointer]
+          - listitem [ref=f1e111]:
+            - generic [ref=f1e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=f1e118]:
+            - generic [ref=f1e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=f1e125]:
+            - generic [ref=f1e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=f1e132]:
+            - generic [ref=f1e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=f1e139]:
+            - generic [ref=f1e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=f1e146]:
+            - generic [ref=f1e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=f1e153]:
+            - generic [ref=f1e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=f1e160]:
+            - generic [ref=f1e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=f1e169] [cursor=pointer]
+    - generic [ref=f1e174]:
+      - generic [ref=f1e175]:
+        - banner [ref=f1e176]:
+          - button [ref=f1e177] [cursor=pointer]
+          - button [ref=f1e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f1e185]:
+            - list [ref=f1e186]:
+              - listitem [ref=f1e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=f1e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=f1e192]
+              - listitem [ref=f1e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=f1e196]
+          - generic [ref=f1e201]:
+            - generic [ref=f1e203] [cursor=pointer]:
+              - generic [ref=f1e207]: 鎼滅储
+              - generic [ref=f1e208]: Ctrl K
+            - button [ref=f1e210] [cursor=pointer]
+            - button "dark" [ref=f1e215] [cursor=pointer]
+            - button [ref=f1e224] [cursor=pointer]
+            - button [ref=f1e230] [cursor=pointer]
+            - button [ref=f1e233] [cursor=pointer]
+            - button [ref=f1e239] [cursor=pointer]:
+              - button [ref=f1e241]
+            - button "宸ヤ綔鍙�" [ref=f1e246] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f1e250] [cursor=pointer]
+        - generic [ref=f1e257]:
+          - generic [ref=f1e262]:
+            - generic [ref=f1e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=f1e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=f1e298]:
+            - button [ref=f1e299] [cursor=pointer]
+            - generic [ref=f1e306] [cursor=pointer]
+            - generic [ref=f1e310] [cursor=pointer]
+      - main [ref=f1e317]:
+        - generic [ref=f1e322]:
+          - generic [ref=f1e327]:
+            - generic [ref=f1e328]:
+              - generic [ref=f1e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=f1e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=f1e337]:
+              - generic [ref=f1e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=f1e345]
+            - generic [ref=f1e351]:
+              - generic [ref=f1e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=f1e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=f1e360]:
+              - generic [ref=f1e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=f1e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=f1e369]:
+              - generic [ref=f1e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e377]: 瓒呯骇绠$悊鍛�
+            - generic [ref=f1e383]:
+              - generic [ref=f1e384]: 鎵规鐘舵��
+              - generic [ref=f1e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=f1e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=f1e393]:
+              - generic [ref=f1e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=f1e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=f1e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e403]:
+                  - img "swap-right" [ref=f1e404]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e409]:
+              - generic [ref=f1e410]: 鍒涘缓鏃堕棿
+              - generic [ref=f1e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=f1e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=f1e419]:
+                  - img "swap-right" [ref=f1e420]
+                - textbox "缁撴潫鏃堕棿" [ref=f1e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=f1e425]:
+              - button "閲� 缃�" [ref=f1e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=f1e428] [cursor=pointer]
+              - generic [ref=f1e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=f1e437]:
+            - generic [ref=f1e439]:
+              - generic [ref=f1e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=f1e444]:
+                - generic [ref=f1e446]:
+                  - button "鏂板鎵规" [ref=f1e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=f1e453] [cursor=pointer]
+                - button "顫�" [ref=f1e459] [cursor=pointer]
+              - generic [ref=f1e461]:
+                - button "瞟�" [ref=f1e462] [cursor=pointer]
+                - button "顪�" [ref=f1e464] [cursor=pointer]
+                - button "顦�" [ref=f1e466] [cursor=pointer]
+            - generic [ref=f1e470]:
+              - generic [ref=f1e473]:
+                - generic [ref=f1e474]:
+                  - table [ref=f1e478]:
+                    - rowgroup [ref=f1e493]:
+                      - row [ref=f1e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=f1e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=f1e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=f1e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=f1e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=f1e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=f1e520]
+                        - columnheader "璐d换浜�" [ref=f1e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=f1e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=f1e535]
+                        - columnheader "鎵规鐘舵��" [ref=f1e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=f1e545]
+                  - generic [ref=f1e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=f1e553]:
+                    - table [ref=f1e556]:
+                      - rowgroup [ref=f1e571]:
+                        - row [ref=f1e572]:
+                          - columnheader "鎵规鍙�" [ref=f1e573]
+                    - generic [ref=f1e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=f1e580]:
+                    - table [ref=f1e583]:
+                      - rowgroup [ref=f1e598]:
+                        - row [ref=f1e599]:
+                          - columnheader "鎿嶄綔" [ref=f1e600]
+                    - generic [ref=f1e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=f1e621]:
+              - generic [ref=f1e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=f1e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=f1e625]:
+                  - textbox "璇烽�夋嫨" [ref=f1e626]: 20鏉�/椤�
+                - generic [ref=f1e627]: 睿�
+              - button "飱�" [ref=f1e630]
+              - button "顧�" [ref=f1e632]
+              - button "顫�" [ref=f1e634]
+              - button "1" [ref=f1e637] [cursor=pointer]
+              - button "顫�" [ref=f1e638]
+              - button "顧�" [ref=f1e640]
+              - button "顦�" [ref=f1e642]
+  - dialog [ref=f1e890]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=f1e892]
+    - generic [ref=f1e894]:
+      - generic [ref=f1e896]:
+        - generic [ref=f1e897]:
+          - generic [ref=f1e898]:
+            - generic [ref=f1e899]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=f1e906]: 閽㈣姱閾濈粸绾�
+        - generic [ref=f1e912]:
+          - generic [ref=f1e913]:
+            - generic [ref=f1e914]: "*"
+            - text: 浜х嚎
+          - generic [ref=f1e920]:
+            - combobox "* 浜х嚎" [ref=f1e922]
+            - generic [ref=f1e1522]:
+              - generic [ref=f1e1523]: 浜х嚎浜�
+              - generic [ref=f1e1524]: two
+        - generic [ref=f1e923]:
+          - generic [ref=f1e924]:
+            - generic [ref=f1e925]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=f1e931]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=f1e932]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+              - text: 2026-08-18 08:00:00
+            - generic:
+              - img "calendar"
+            - button [ref=f1e1529] [cursor=pointer]:
+              - img "close-circle" [ref=f1e1530]
+        - generic [ref=f1e933]:
+          - generic [ref=f1e934]: 璁″垝鏁伴噺
+          - generic [ref=f1e939]:
+            - generic [ref=f1e940]:
+              - button "Increase Value" [ref=f1e941] [cursor=pointer]:
+                - img "up" [ref=f1e942]
+              - button "Decrease Value" [ref=f1e945] [cursor=pointer]:
+                - img "down" [ref=f1e946]
+            - spinbutton "璁″垝鏁伴噺" [ref=f1e950]
+        - generic [ref=f1e951]:
+          - generic [ref=f1e952]:
+            - generic [ref=f1e953]: "*"
+            - text: 璐d换浜�
+          - generic [ref=f1e954]:
+            - textbox "璇烽�夋嫨璐d换浜�" [ref=f1e960]
+            - alert [ref=f1e3074]: 璇烽�夋嫨璐d换浜�
+        - generic [ref=f1e966]:
+          - generic [ref=f1e967]: 澶囨敞
+          - textbox "澶囨敞" [ref=f1e972]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=f1e973]:
+        - generic [ref=f1e974]:
+          - generic [ref=f1e975]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=f1e976] [cursor=pointer]
+        - generic [ref=f1e988]:
+          - table [ref=f1e992]:
+            - rowgroup [ref=f1e998]:
+              - row [ref=f1e999]:
+                - columnheader "鐢熶骇浜哄憳" [ref=f1e1000]
+                - columnheader "宀椾綅绫诲瀷" [ref=f1e1005]
+                - columnheader "澶囨敞" [ref=f1e1010]
+                - columnheader "鎿嶄綔" [ref=f1e1015]
+          - table [ref=f1e1051]:
+            - rowgroup [ref=f1e1057]:
+              - row [ref=f1e3075]:
+                - cell [ref=f1e3052]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=f1e1064]: "222"
+                - cell "缁勯暱" [ref=f1e3076]:
+                  - generic [ref=f1e1074] [cursor=pointer]:
+                    - combobox [ref=f1e1076]
+                    - generic "缁勯暱" [ref=f1e3071]
+                - cell [ref=f1e1077]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=f1e1080]
+                - cell [ref=f1e1081]:
+                  - button "鍒犻櫎" [ref=f1e1087] [cursor=pointer]
+    - button [ref=f1e1031] [cursor=pointer]
+    - generic [ref=f1e1041]:
+      - button "纭� 璁�" [active] [ref=f1e1042] [cursor=pointer]
+      - button "鍙� 娑�" [ref=f1e1045] [cursor=pointer]
+    - button [ref=f1e1047] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-39-14-991Z.yml b/.playwright-mcp/page-2026-08-18T08-39-14-991Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-39-14-991Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-39-53-074Z.yml b/.playwright-mcp/page-2026-08-18T08-39-53-074Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-39-53-074Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-40-08-857Z.yml b/.playwright-mcp/page-2026-08-18T08-40-08-857Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-40-08-857Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-41-15-036Z.yml b/.playwright-mcp/page-2026-08-18T08-41-15-036Z.yml
new file mode 100644
index 0000000..024f241
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-41-15-036Z.yml
@@ -0,0 +1,284 @@
+- generic [ref=e4]:
+  - generic [ref=e7]:
+    - complementary [ref=e8]:
+      - generic [ref=e9]:
+        - generic [ref=e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+          - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e22]:
+          - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+          - listitem [ref=e30]:
+            - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e39]:
+            - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=e46]:
+            - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=e53]:
+            - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=e61]:
+            - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=e70]:
+            - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=e78]:
+            - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+          - listitem [ref=e111]:
+            - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=e118]:
+            - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=e125]:
+            - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=e132]:
+            - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=e139]:
+            - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=e146]:
+            - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=e153]:
+            - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=e160]:
+            - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=e169] [cursor=pointer]
+    - generic [ref=e174]:
+      - generic [ref=e175]:
+        - banner [ref=e176]:
+          - button [ref=e177] [cursor=pointer]
+          - button [ref=e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e185]:
+            - list [ref=e186]:
+              - listitem [ref=e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=e192]
+              - listitem [ref=e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+          - generic [ref=e201]:
+            - generic [ref=e203] [cursor=pointer]:
+              - generic [ref=e207]: 鎼滅储
+              - generic [ref=e208]: Ctrl K
+            - button [ref=e210] [cursor=pointer]
+            - button "dark" [ref=e215] [cursor=pointer]
+            - button [ref=e224] [cursor=pointer]
+            - button [ref=e230] [cursor=pointer]
+            - button [ref=e233] [cursor=pointer]
+            - button [ref=e239] [cursor=pointer]:
+              - button [ref=e241]
+            - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+            - button [ref=e250] [cursor=pointer]:
+              - img "瓒呯骇绠$悊鍛�" [ref=e255]
+        - generic [ref=e257]:
+          - generic [ref=e262]:
+            - generic [ref=e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=e298]:
+            - button [ref=e299] [cursor=pointer]
+            - generic [ref=e306] [cursor=pointer]
+            - generic [ref=e310] [cursor=pointer]
+      - main [ref=e317]:
+        - generic [ref=e322]:
+          - generic [ref=e327]:
+            - generic [ref=e328]:
+              - generic [ref=e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=e337]:
+              - generic [ref=e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+            - generic [ref=e351]:
+              - generic [ref=e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=e360]:
+              - generic [ref=e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=e369]:
+              - generic [ref=e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+            - generic [ref=e383]:
+              - generic [ref=e384]: 鎵规鐘舵��
+              - generic [ref=e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=e393]:
+              - generic [ref=e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e403]:
+                  - img "swap-right" [ref=e404]
+                - textbox "缁撴潫鏃堕棿" [ref=e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e409]:
+              - generic [ref=e410]: 鍒涘缓鏃堕棿
+              - generic [ref=e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e419]:
+                  - img "swap-right" [ref=e420]
+                - textbox "缁撴潫鏃堕棿" [ref=e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e425]:
+              - button "閲� 缃�" [ref=e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+              - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=e437]:
+            - generic [ref=e439]:
+              - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=e444]:
+                - generic [ref=e446]:
+                  - button "鏂板鎵规" [ref=e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+                - button "顫�" [ref=e459] [cursor=pointer]
+              - generic [ref=e461]:
+                - button "瞟�" [ref=e462] [cursor=pointer]
+                - button "顪�" [ref=e464] [cursor=pointer]
+                - button "顦�" [ref=e466] [cursor=pointer]
+            - generic [ref=e470]:
+              - generic [ref=e473]:
+                - generic [ref=e474]:
+                  - table [ref=e478]:
+                    - rowgroup [ref=e493]:
+                      - row [ref=e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=e520]
+                        - columnheader "璐d换浜�" [ref=e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                        - columnheader "鎵规鐘舵��" [ref=e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+                  - generic [ref=e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=e553]:
+                    - table [ref=e556]:
+                      - rowgroup [ref=e571]:
+                        - row [ref=e572]:
+                          - columnheader "鎵规鍙�" [ref=e573]
+                    - generic [ref=e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=e580]:
+                    - table [ref=e583]:
+                      - rowgroup [ref=e598]:
+                        - row [ref=e599]:
+                          - columnheader "鎿嶄綔" [ref=e600]
+                    - generic [ref=e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=e621]:
+              - generic [ref=e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=e625]:
+                  - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+                - generic [ref=e627]: 睿�
+              - button "飱�" [ref=e630]
+              - button "顧�" [ref=e632]
+              - button "顫�" [ref=e634]
+              - button "1" [ref=e637] [cursor=pointer]
+              - button "顫�" [ref=e638]
+              - button "顧�" [ref=e640]
+              - button "顦�" [ref=e642]
+  - dialog [ref=e645]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=e647]
+    - generic [ref=e649]:
+      - generic [ref=e651]:
+        - generic [ref=e652]:
+          - generic [ref=e653]:
+            - generic [ref=e654]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=e661]: 閽㈣姱閾濈粸绾�
+        - generic [ref=e667]:
+          - generic [ref=e668]:
+            - generic [ref=e669]: "*"
+            - text: 浜х嚎
+          - generic [ref=e675]:
+            - combobox "* 浜х嚎" [ref=e677]
+            - generic [ref=e679]:
+              - generic [ref=e680]: 浜х嚎涓�
+              - generic [ref=e681]: one
+        - generic [ref=e686]:
+          - generic [ref=e687]:
+            - generic [ref=e688]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=e694]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=e695]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+              - text: 2026-08-18 16:40:39
+            - generic:
+              - img "calendar"
+            - button [ref=e696] [cursor=pointer]:
+              - img "close-circle" [ref=e697]
+        - generic [ref=e700]:
+          - generic [ref=e701]: 璁″垝鏁伴噺
+          - generic [ref=e706]:
+            - generic [ref=e707]:
+              - button "Increase Value" [ref=e708] [cursor=pointer]:
+                - img "up" [ref=e709]
+              - button "Decrease Value" [ref=e712] [cursor=pointer]:
+                - img "down" [ref=e713]
+            - spinbutton "璁″垝鏁伴噺" [ref=e717]
+        - generic [ref=e718]:
+          - generic [ref=e719]:
+            - generic [ref=e720]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=e727]: 涓嶆兂涓婄彮
+        - generic [ref=e733]:
+          - generic [ref=e734]: 澶囨敞
+          - textbox "澶囨敞" [ref=e739]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=e740]:
+        - generic [ref=e741]:
+          - generic [ref=e742]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [active] [ref=e743] [cursor=pointer]
+        - generic [ref=e755]:
+          - table [ref=e759]:
+            - rowgroup [ref=e765]:
+              - row [ref=e766]:
+                - columnheader "鐢熶骇浜哄憳" [ref=e767]
+                - columnheader "宀椾綅绫诲瀷" [ref=e772]
+                - columnheader "澶囨敞" [ref=e777]
+                - columnheader "鎿嶄綔" [ref=e782]
+          - table [ref=e790]:
+            - rowgroup [ref=e796]:
+              - row [ref=e849]:
+                - cell [ref=e850]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=e803]
+                - cell [ref=e851]:
+                  - generic [ref=e813] [cursor=pointer]:
+                    - combobox [ref=e815]
+                    - generic: 璇烽�夋嫨宀椾綅绫诲瀷
+                - cell [ref=e817]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=e820]
+                - cell [ref=e821]:
+                  - button "鍒犻櫎" [ref=e827] [cursor=pointer]
+              - row [ref=e852]:
+                - cell [ref=e853]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=e858]: "222"
+                - cell "缁勯暱" [ref=e864]:
+                  - generic [ref=e868] [cursor=pointer]:
+                    - combobox [ref=e870]
+                    - generic "缁勯暱" [ref=e871]
+                - cell [ref=e872]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=e875]
+                - cell [ref=e876]:
+                  - button "鍒犻櫎" [ref=e882] [cursor=pointer]
+    - button [ref=e829] [cursor=pointer]
+    - generic [ref=e839]:
+      - button "纭� 璁�" [ref=e840] [cursor=pointer]
+      - button "鍙� 娑�" [ref=e843] [cursor=pointer]
+    - button [ref=e845] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-42-30-730Z.yml b/.playwright-mcp/page-2026-08-18T08-42-30-730Z.yml
new file mode 100644
index 0000000..34318c7
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-42-30-730Z.yml
@@ -0,0 +1,273 @@
+- generic [ref=e4]:
+  - generic [ref=e7]:
+    - complementary [ref=e8]:
+      - generic [ref=e9]:
+        - generic [ref=e10] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+          - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e22]:
+          - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+          - listitem [ref=e30]:
+            - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e39]:
+            - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+          - listitem [ref=e46]:
+            - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+          - listitem [ref=e53]:
+            - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+          - listitem [ref=e61]:
+            - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+          - listitem [ref=e70]:
+            - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+          - listitem [ref=e78]:
+            - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+            - list [ref=e85]:
+              - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+              - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+              - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+              - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+          - listitem [ref=e111]:
+            - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+          - listitem [ref=e118]:
+            - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+          - listitem [ref=e125]:
+            - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+          - listitem [ref=e132]:
+            - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+          - listitem [ref=e139]:
+            - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+          - listitem [ref=e146]:
+            - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+          - listitem [ref=e153]:
+            - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+          - listitem [ref=e160]:
+            - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+        - generic [ref=e169] [cursor=pointer]
+    - generic [ref=e174]:
+      - generic [ref=e175]:
+        - banner [ref=e176]:
+          - button [ref=e177] [cursor=pointer]
+          - button [ref=e180] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e185]:
+            - list [ref=e186]:
+              - listitem [ref=e187]:
+                - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                  - /url: javascript:void 0
+                - listitem [ref=e192]
+              - listitem [ref=e195]:
+                - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+          - generic [ref=e201]:
+            - generic [ref=e203] [cursor=pointer]:
+              - generic [ref=e207]: 鎼滅储
+              - generic [ref=e208]: Ctrl K
+            - button [ref=e210] [cursor=pointer]
+            - button "dark" [ref=e215] [cursor=pointer]
+            - button [ref=e224] [cursor=pointer]
+            - button [ref=e230] [cursor=pointer]
+            - button [ref=e233] [cursor=pointer]
+            - button [ref=e239] [cursor=pointer]:
+              - button [ref=e241]
+            - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+            - button [ref=e250] [cursor=pointer]:
+              - img "瓒呯骇绠$悊鍛�" [ref=e255]
+        - generic [ref=e257]:
+          - generic [ref=e262]:
+            - generic [ref=e263] [cursor=pointer]: 棣栭〉
+            - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+          - generic [ref=e298]:
+            - button [ref=e299] [cursor=pointer]
+            - generic [ref=e306] [cursor=pointer]
+            - generic [ref=e310] [cursor=pointer]
+      - main [ref=e317]:
+        - generic [ref=e322]:
+          - generic [ref=e327]:
+            - generic [ref=e328]:
+              - generic [ref=e329]: 鎵规鍙�
+              - textbox "鎵规鍙�" [ref=e335]:
+                - /placeholder: 璇疯緭鍏ユ壒娆″彿
+            - generic [ref=e337]:
+              - generic [ref=e338]: 鍝佺
+              - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+            - generic [ref=e351]:
+              - generic [ref=e352]: 浜х嚎缂栫爜
+              - textbox "浜х嚎缂栫爜" [ref=e358]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+            - generic [ref=e360]:
+              - generic [ref=e361]: 浜х嚎鍚嶇О
+              - textbox "浜х嚎鍚嶇О" [ref=e367]:
+                - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+            - generic [ref=e369]:
+              - generic [ref=e370]: 璐d换浜�
+              - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+            - generic [ref=e383]:
+              - generic [ref=e384]: 鎵规鐘舵��
+              - generic [ref=e390] [cursor=pointer]:
+                - combobox "鎵规鐘舵��" [ref=e392]
+                - generic: 璇烽�夋嫨鎵规鐘舵��
+            - generic [ref=e393]:
+              - generic [ref=e394]: 鐢熶骇鏃ユ湡
+              - generic [ref=e399]:
+                - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e403]:
+                  - img "swap-right" [ref=e404]
+                - textbox "缁撴潫鏃堕棿" [ref=e408]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e409]:
+              - generic [ref=e410]: 鍒涘缓鏃堕棿
+              - generic [ref=e415]:
+                - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                  - /placeholder: 寮�濮嬫椂闂�
+                - generic "to" [ref=e419]:
+                  - img "swap-right" [ref=e420]
+                - textbox "缁撴潫鏃堕棿" [ref=e424]
+                - generic:
+                  - img "calendar"
+            - generic [ref=e425]:
+              - button "閲� 缃�" [ref=e426] [cursor=pointer]
+              - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+              - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+          - generic [ref=e437]:
+            - generic [ref=e439]:
+              - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+              - generic [ref=e444]:
+                - generic [ref=e446]:
+                  - button "鏂板鎵规" [ref=e448] [cursor=pointer]
+                  - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+                - button "顫�" [ref=e459] [cursor=pointer]
+              - generic [ref=e461]:
+                - button "瞟�" [ref=e462] [cursor=pointer]
+                - button "顪�" [ref=e464] [cursor=pointer]
+                - button "顦�" [ref=e466] [cursor=pointer]
+            - generic [ref=e470]:
+              - generic [ref=e473]:
+                - generic [ref=e474]:
+                  - table [ref=e478]:
+                    - rowgroup [ref=e493]:
+                      - row [ref=e494]:
+                        - columnheader "鍝佺缂栫爜" [ref=e495]
+                        - columnheader "鍝佺鍚嶇О" [ref=e500]
+                        - columnheader "浜х嚎缂栫爜" [ref=e505]
+                        - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                        - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                        - columnheader "璁″垝鏁伴噺" [ref=e520]
+                        - columnheader "璐d换浜�" [ref=e525]
+                        - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                        - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                        - columnheader "鎵规鐘舵��" [ref=e540]
+                        - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+                  - generic [ref=e551]:
+                    - table:
+                      - rowgroup
+                - generic:
+                  - generic [ref=e553]:
+                    - table [ref=e556]:
+                      - rowgroup [ref=e571]:
+                        - row [ref=e572]:
+                          - columnheader "鎵规鍙�" [ref=e573]
+                    - generic [ref=e579]:
+                      - table:
+                        - rowgroup
+                  - generic [ref=e580]:
+                    - table [ref=e583]:
+                      - rowgroup [ref=e598]:
+                        - row [ref=e599]:
+                          - columnheader "鎿嶄綔" [ref=e600]
+                    - generic [ref=e606]:
+                      - table:
+                        - rowgroup
+              - generic: 鏆傛棤鏁版嵁
+            - generic [ref=e621]:
+              - generic [ref=e622]: 鍏� 0 鏉¤褰�
+              - generic [ref=e624] [cursor=pointer]:
+                - generic "20鏉�/椤�" [ref=e625]:
+                  - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+                - generic [ref=e627]: 睿�
+              - button "飱�" [ref=e630]
+              - button "顧�" [ref=e632]
+              - button "顫�" [ref=e634]
+              - button "1" [ref=e637] [cursor=pointer]
+              - button "顫�" [ref=e638]
+              - button "顧�" [ref=e640]
+              - button "顦�" [ref=e642]
+  - dialog [ref=e645]:
+    - heading "鏂板鐢熶骇鎵规" [level=2] [ref=e647]
+    - generic [ref=e649]:
+      - generic [ref=e651]:
+        - generic [ref=e652]:
+          - generic [ref=e653]:
+            - generic [ref=e654]: "*"
+            - text: 鍝佺
+          - textbox "璇烽�夋嫨鍝佺锛堜骇鍝佺墿鏂欙級" [ref=e661]: 閽㈣姱閾濈粸绾�
+        - generic [ref=e667]:
+          - generic [ref=e668]:
+            - generic [ref=e669]: "*"
+            - text: 浜х嚎
+          - generic [ref=e675]:
+            - combobox "* 浜х嚎" [ref=e677]
+            - generic [ref=e679]:
+              - generic [ref=e680]: 浜х嚎涓�
+              - generic [ref=e681]: one
+        - generic [ref=e686]:
+          - generic [ref=e687]:
+            - generic [ref=e688]: "*"
+            - text: 鐢熶骇鏃ユ湡
+          - generic [ref=e694]:
+            - textbox "* 鐢熶骇鏃ユ湡" [ref=e695]:
+              - /placeholder: 璇烽�夋嫨鐢熶骇鏃ユ湡
+              - text: 2026-08-18 16:40:39
+            - generic:
+              - img "calendar"
+            - button [ref=e696] [cursor=pointer]:
+              - img "close-circle" [ref=e697]
+        - generic [ref=e700]:
+          - generic [ref=e701]: 璁″垝鏁伴噺
+          - generic [ref=e706]:
+            - generic [ref=e707]:
+              - button "Increase Value" [ref=e708] [cursor=pointer]:
+                - img "up" [ref=e709]
+              - button "Decrease Value" [ref=e712] [cursor=pointer]:
+                - img "down" [ref=e713]
+            - spinbutton "璁″垝鏁伴噺" [ref=e717]
+        - generic [ref=e718]:
+          - generic [ref=e719]:
+            - generic [ref=e720]: "*"
+            - text: 璐d换浜�
+          - textbox "璇烽�夋嫨璐d换浜�" [ref=e727]: 涓嶆兂涓婄彮
+        - generic [ref=e733]:
+          - generic [ref=e734]: 澶囨敞
+          - textbox "澶囨敞" [ref=e739]:
+            - /placeholder: 璇疯緭鍏ュ娉�
+      - generic [ref=e740]:
+        - generic [ref=e741]:
+          - generic [ref=e742]: 鐢熶骇浜哄憳閰嶇疆
+          - button "娣诲姞浜哄憳" [ref=e743] [cursor=pointer]
+        - generic [ref=e755]:
+          - table [ref=e759]:
+            - rowgroup [ref=e765]:
+              - row [ref=e766]:
+                - columnheader "鐢熶骇浜哄憳" [ref=e767]
+                - columnheader "宀椾綅绫诲瀷" [ref=e772]
+                - columnheader "澶囨敞" [ref=e777]
+                - columnheader "鎿嶄綔" [ref=e782]
+          - table [ref=e790]:
+            - rowgroup [ref=e796]:
+              - row [ref=e884]:
+                - cell [ref=e885]:
+                  - textbox "璇烽�夋嫨鐢熶骇浜哄憳" [ref=e803]: "222"
+                - cell "缁勯暱" [ref=e886]:
+                  - generic [ref=e813] [cursor=pointer]:
+                    - combobox [ref=e815]
+                    - generic "缁勯暱" [ref=e816]
+                - cell [ref=e817]:
+                  - textbox "璇疯緭鍏ュ娉�" [ref=e820]
+                - cell [ref=e821]:
+                  - button "鍒犻櫎" [active] [ref=e827] [cursor=pointer]
+    - button [ref=e829] [cursor=pointer]
+    - generic [ref=e839]:
+      - button "纭� 璁�" [ref=e840] [cursor=pointer]
+      - button "鍙� 娑�" [ref=e843] [cursor=pointer]
+    - button [ref=e845] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-18T08-42-38-843Z.yml b/.playwright-mcp/page-2026-08-18T08-42-38-843Z.yml
new file mode 100644
index 0000000..5c0d900
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-18T08-42-38-843Z.yml
@@ -0,0 +1,211 @@
+- generic [ref=e7]:
+  - complementary [ref=e8]:
+    - generic [ref=e9]:
+      - generic [ref=e10] [cursor=pointer]
+      - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e15] [cursor=pointer]:
+        - /url: javascript:void 0
+        - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e18]
+        - generic [ref=e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+      - menu [ref=e22]:
+        - menuitem "棣栭〉" [ref=e23] [cursor=pointer]
+        - listitem [ref=e30]:
+          - generic [ref=e31] [cursor=pointer]: 鍩虹鏁版嵁
+        - listitem [ref=e39]:
+          - generic [ref=e40] [cursor=pointer]: 閲囪喘绠$悊
+        - listitem [ref=e46]:
+          - generic [ref=e47] [cursor=pointer]: 钀ラ攢绠$悊
+        - listitem [ref=e53]:
+          - generic [ref=e54] [cursor=pointer]: 璁惧绠$悊
+        - listitem [ref=e61]:
+          - generic [ref=e62] [cursor=pointer]: 浠撳偍鐗╂祦
+        - listitem [ref=e70]:
+          - generic [ref=e71] [cursor=pointer]: 鐢熶骇绠℃帶
+        - listitem [ref=e78]:
+          - generic [ref=e79] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+          - list [ref=e85]:
+            - menuitem "鎵规鐢熶骇绠$悊" [ref=e86] [cursor=pointer]
+            - menuitem "璧嬬爜绠$悊" [ref=e91] [cursor=pointer]
+            - menuitem "鎵樼洏鐮佺鐞�" [ref=e97] [cursor=pointer]
+            - menuitem "浜х嚎缁存姢" [ref=e104] [cursor=pointer]
+        - listitem [ref=e111]:
+          - generic [ref=e112] [cursor=pointer]: 璐ㄩ噺绠$悊
+        - listitem [ref=e118]:
+          - generic [ref=e119] [cursor=pointer]: 鍐崇瓥BI澶у睆
+        - listitem [ref=e125]:
+          - generic [ref=e126] [cursor=pointer]: 鍗忓悓鍔炲叕
+        - listitem [ref=e132]:
+          - generic [ref=e133] [cursor=pointer]: 浜哄姏璧勬簮
+        - listitem [ref=e139]:
+          - generic [ref=e140] [cursor=pointer]: 鍞悗绠$悊
+        - listitem [ref=e146]:
+          - generic [ref=e147] [cursor=pointer]: 鍩虹璁炬柦
+        - listitem [ref=e153]:
+          - generic [ref=e154] [cursor=pointer]: 绯荤粺绠$悊
+        - listitem [ref=e160]:
+          - generic [ref=e161] [cursor=pointer]: IM 鍗虫椂閫氳
+      - generic [ref=e169] [cursor=pointer]
+  - generic [ref=e174]:
+    - generic [ref=e175]:
+      - banner [ref=e176]:
+        - button [ref=e177] [cursor=pointer]
+        - button [ref=e180] [cursor=pointer]
+        - navigation "breadcrumb" [ref=e185]:
+          - list [ref=e186]:
+            - listitem [ref=e187]:
+              - link "涓�琚嬩竴鐮佺鐞�" [ref=e188] [cursor=pointer]:
+                - /url: javascript:void 0
+              - listitem [ref=e192]
+            - listitem [ref=e195]:
+              - link "鎵规鐢熶骇绠$悊" [disabled] [ref=e196]
+        - generic [ref=e201]:
+          - generic [ref=e203] [cursor=pointer]:
+            - generic [ref=e207]: 鎼滅储
+            - generic [ref=e208]: Ctrl K
+          - button [ref=e210] [cursor=pointer]
+          - button "dark" [ref=e215] [cursor=pointer]
+          - button [ref=e224] [cursor=pointer]
+          - button [ref=e230] [cursor=pointer]
+          - button [ref=e233] [cursor=pointer]
+          - button [ref=e239] [cursor=pointer]:
+            - button [ref=e241]
+          - button "宸ヤ綔鍙�" [ref=e246] [cursor=pointer]
+          - button [ref=e250] [cursor=pointer]:
+            - img "瓒呯骇绠$悊鍛�" [ref=e255]
+      - generic [ref=e257]:
+        - generic [ref=e262]:
+          - generic [ref=e263] [cursor=pointer]: 棣栭〉
+          - generic [ref=e281] [cursor=pointer]: 鎵规鐢熶骇绠$悊
+        - generic [ref=e298]:
+          - button [ref=e299] [cursor=pointer]
+          - generic [ref=e306] [cursor=pointer]
+          - generic [ref=e310] [cursor=pointer]
+    - main [ref=e317]:
+      - generic [ref=e322]:
+        - generic [ref=e327]:
+          - generic [ref=e328]:
+            - generic [ref=e329]: 鎵规鍙�
+            - textbox "鎵规鍙�" [ref=e335]:
+              - /placeholder: 璇疯緭鍏ユ壒娆″彿
+          - generic [ref=e337]:
+            - generic [ref=e338]: 鍝佺
+            - textbox "璇烽�夋嫨鍝佺" [ref=e345]
+          - generic [ref=e351]:
+            - generic [ref=e352]: 浜х嚎缂栫爜
+            - textbox "浜х嚎缂栫爜" [ref=e358]:
+              - /placeholder: 璇疯緭鍏ヤ骇绾跨紪鐮�
+          - generic [ref=e360]:
+            - generic [ref=e361]: 浜х嚎鍚嶇О
+            - textbox "浜х嚎鍚嶇О" [ref=e367]:
+              - /placeholder: 璇疯緭鍏ヤ骇绾垮悕绉�
+          - generic [ref=e369]:
+            - generic [ref=e370]: 璐d换浜�
+            - textbox "璇烽�夋嫨璐d换浜�" [ref=e377]
+          - generic [ref=e383]:
+            - generic [ref=e384]: 鎵规鐘舵��
+            - generic [ref=e390] [cursor=pointer]:
+              - combobox "鎵规鐘舵��" [ref=e392]
+              - generic: 璇烽�夋嫨鎵规鐘舵��
+          - generic [ref=e393]:
+            - generic [ref=e394]: 鐢熶骇鏃ユ湡
+            - generic [ref=e399]:
+              - textbox "鐢熶骇鏃ユ湡" [ref=e401]:
+                - /placeholder: 寮�濮嬫椂闂�
+              - generic "to" [ref=e403]:
+                - img "swap-right" [ref=e404]
+              - textbox "缁撴潫鏃堕棿" [ref=e408]
+              - generic:
+                - img "calendar"
+          - generic [ref=e409]:
+            - generic [ref=e410]: 鍒涘缓鏃堕棿
+            - generic [ref=e415]:
+              - textbox "鍒涘缓鏃堕棿" [ref=e417]:
+                - /placeholder: 寮�濮嬫椂闂�
+              - generic "to" [ref=e419]:
+                - img "swap-right" [ref=e420]
+              - textbox "缁撴潫鏃堕棿" [ref=e424]
+              - generic:
+                - img "calendar"
+          - generic [ref=e425]:
+            - button "閲� 缃�" [ref=e426] [cursor=pointer]
+            - button "鎼� 绱�" [ref=e428] [cursor=pointer]
+            - generic [ref=e430] [cursor=pointer]: 鏀惰捣
+        - generic [ref=e437]:
+          - generic [ref=e439]:
+            - generic [ref=e440]: 鐢熶骇鎵规鍒楄〃
+            - generic [ref=e444]:
+              - generic [ref=e446]:
+                - button "鏂板鎵规" [active] [ref=e448] [cursor=pointer]
+                - button "瀵煎嚭" [ref=e453] [cursor=pointer]
+              - button "顫�" [ref=e459] [cursor=pointer]
+            - generic [ref=e461]:
+              - button "瞟�" [ref=e462] [cursor=pointer]
+              - button "顪�" [ref=e464] [cursor=pointer]
+              - button "顦�" [ref=e466] [cursor=pointer]
+          - generic [ref=e473]:
+            - generic [ref=e474]:
+              - table [ref=e478]:
+                - rowgroup [ref=e493]:
+                  - row [ref=e494]:
+                    - columnheader "鍝佺缂栫爜" [ref=e495]
+                    - columnheader "鍝佺鍚嶇О" [ref=e500]
+                    - columnheader "浜х嚎缂栫爜" [ref=e505]
+                    - columnheader "浜х嚎鍚嶇О" [ref=e510]
+                    - columnheader "鐢熶骇鏃ユ湡" [ref=e515]
+                    - columnheader "璁″垝鏁伴噺" [ref=e520]
+                    - columnheader "璐d换浜�" [ref=e525]
+                    - columnheader "琚嬬爜鏁伴噺" [ref=e530]
+                    - columnheader "鎵樼洏鐮佹暟閲�" [ref=e535]
+                    - columnheader "鎵规鐘舵��" [ref=e540]
+                    - columnheader "鍒涘缓鏃堕棿" [ref=e545]
+              - table [ref=e887]:
+                - rowgroup [ref=e902]:
+                  - row "ITEM_20260716006 閽㈣姱閾濈粸绾� one 浜х嚎涓� 2026-08-18 16:40:39 涓嶆兂涓婄彮 0 0 鑽夌 2026-08-18 16:42:33" [ref=e903]:
+                    - cell "ITEM_20260716006" [ref=e904]
+                    - cell "閽㈣姱閾濈粸绾�" [ref=e908]
+                    - cell "one" [ref=e912]
+                    - cell "浜х嚎涓�" [ref=e916]
+                    - cell "2026-08-18 16:40:39" [ref=e920]
+                    - cell [ref=e924]
+                    - cell "涓嶆兂涓婄彮" [ref=e928]
+                    - cell "0" [ref=e932]
+                    - cell "0" [ref=e936]
+                    - cell "鑽夌" [ref=e940]
+                    - cell "2026-08-18 16:42:33" [ref=e944]
+            - generic:
+              - generic [ref=e553]:
+                - table [ref=e556]:
+                  - rowgroup [ref=e571]:
+                    - row [ref=e572]:
+                      - columnheader "鎵规鍙�" [ref=e573]
+                - table [ref=e948]:
+                  - rowgroup [ref=e951]:
+                    - row [ref=e952]:
+                      - cell [ref=e953]:
+                        - button "PC20260818oneITEM_002" [ref=e956] [cursor=pointer]
+              - generic [ref=e580]:
+                - table [ref=e583]:
+                  - rowgroup [ref=e598]:
+                    - row [ref=e599]:
+                      - columnheader "鎿嶄綔" [ref=e600]
+                - table [ref=e958]:
+                  - rowgroup [ref=e961]:
+                    - row [ref=e962]:
+                      - cell [ref=e963]:
+                        - generic [ref=e966]:
+                          - generic [ref=e967]:
+                            - button "淇敼" [ref=e969] [cursor=pointer]
+                            - button "鍒犻櫎" [ref=e976] [cursor=pointer]
+                          - button "鏇村" [ref=e980] [cursor=pointer]
+          - generic [ref=e621]:
+            - generic [ref=e622]: 鍏� 1 鏉¤褰�
+            - generic [ref=e624] [cursor=pointer]:
+              - generic "20鏉�/椤�" [ref=e625]:
+                - textbox "璇烽�夋嫨" [ref=e626]: 20鏉�/椤�
+              - generic [ref=e627]: 睿�
+            - button "飱�" [ref=e630]
+            - button "顧�" [ref=e632]
+            - button "顫�" [ref=e634]
+            - button "1" [ref=e637] [cursor=pointer]
+            - button "顫�" [ref=e638]
+            - button "顧�" [ref=e640]
+            - button "顦�" [ref=e642]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-17-17-019Z.yml b/.playwright-mcp/page-2026-08-19T02-17-17-019Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-17-17-019Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-17-32-337Z.yml b/.playwright-mcp/page-2026-08-19T02-17-32-337Z.yml
new file mode 100644
index 0000000..a8e824b
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-17-32-337Z.yml
@@ -0,0 +1,111 @@
+- generic [ref=e4]:
+  - generic [ref=e413]:
+    - complementary [ref=e414]:
+      - generic [ref=e415]:
+        - generic [ref=e416] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e421] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=e424]
+          - generic [ref=e425]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=e428]:
+          - menuitem "棣栭〉" [ref=e429] [cursor=pointer]
+          - menuitem "鍩虹鏁版嵁涓庝竴琚嬩竴鐮�" [active] [ref=e436] [cursor=pointer]
+          - listitem [ref=e441]:
+            - generic [ref=e442] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=e450]:
+            - generic [ref=e451] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+          - listitem [ref=e457]:
+            - generic [ref=e458] [cursor=pointer]: 绯荤粺绠$悊
+        - generic [ref=e465] [cursor=pointer]
+    - generic [ref=e470]:
+      - generic [ref=e471]:
+        - banner [ref=e472]:
+          - button [ref=e473] [cursor=pointer]
+          - button [ref=e476] [cursor=pointer]
+          - navigation "breadcrumb" [ref=e481]:
+            - list [ref=e482]:
+              - listitem [ref=e906]:
+                - link "鍩虹鏁版嵁涓庝竴琚嬩竴鐮�" [disabled] [ref=e907]
+          - generic [ref=e491]:
+            - generic [ref=e493] [cursor=pointer]:
+              - generic [ref=e497]: 鎼滅储
+              - generic [ref=e498]: Ctrl K
+            - button [ref=e500] [cursor=pointer]
+            - button "dark" [ref=e505] [cursor=pointer]
+            - button [ref=e514] [cursor=pointer]
+            - button [ref=e520] [cursor=pointer]
+            - button [ref=e523] [cursor=pointer]
+            - button [ref=e529] [cursor=pointer]:
+              - button [ref=e531]
+            - button "宸ヤ綔鍙�" [ref=e535] [cursor=pointer]
+            - button "鐞嗗憳" [ref=e539] [cursor=pointer]
+        - generic [ref=e546]:
+          - generic [ref=e551]:
+            - generic [ref=e552] [cursor=pointer]: 棣栭〉
+            - generic [ref=e913] [cursor=pointer]: 鍩虹鏁版嵁涓庝竴琚嬩竴鐮�
+          - generic [ref=e568]:
+            - button [ref=e569] [cursor=pointer]
+            - generic [ref=e576] [cursor=pointer]
+            - generic [ref=e580] [cursor=pointer]
+      - main [ref=e587]:
+        - generic [ref=e931]:
+          - generic [ref=e932]:
+            - generic [ref=e942] [cursor=pointer]:
+              - generic [ref=e943]: 鍝佺鎬绘暟
+              - generic [ref=e944]: "0"
+            - generic [ref=e955] [cursor=pointer]:
+              - generic [ref=e956]: MES 鍝佺
+              - generic [ref=e957]: "0"
+            - generic [ref=e968] [cursor=pointer]:
+              - generic [ref=e969]: 鍝佺鍒嗙被
+              - generic [ref=e970]: "0"
+            - generic [ref=e979] [cursor=pointer]:
+              - generic [ref=e980]: 璁¢噺鍗曚綅
+              - generic [ref=e981]: "0"
+          - generic [ref=e983]:
+            - generic [ref=e991] [cursor=pointer]:
+              - generic [ref=e992]: 浜х嚎
+              - generic [ref=e993]: "0"
+            - generic [ref=e1005] [cursor=pointer]:
+              - generic [ref=e1006]: 鐢熶骇鎵规
+              - generic [ref=e1007]: "0"
+            - generic [ref=e1016] [cursor=pointer]:
+              - generic [ref=e1017]: 琚嬬爜
+              - generic [ref=e1018]: "0"
+            - generic [ref=e1029] [cursor=pointer]:
+              - generic [ref=e1030]: 鎵樼洏鐮�
+              - generic [ref=e1031]: "0"
+          - generic [ref=e1033]:
+            - generic [ref=e1037]:
+              - generic [ref=e1038]: 琚嬬爜鐢熸垚瓒嬪娍
+              - generic [ref=e1040]:
+                - generic [ref=e1041] [cursor=pointer]:
+                  - generic [ref=e1042]:
+                    - radio "杩� 7 澶�" [checked]
+                  - generic [ref=e1043]: 杩� 7 澶�
+                - generic [ref=e1044] [cursor=pointer]:
+                  - generic [ref=e1045]:
+                    - radio "杩� 30 澶�"
+                  - generic [ref=e1046]: 杩� 30 澶�
+            - generic [ref=e1049]: 鎵规鐘舵�佸垎甯�
+            - generic [ref=e1056]: 琚嬬爜鐘舵�佸垎甯�
+          - generic [ref=e1063]:
+            - generic [ref=e1064]: 蹇嵎鍏ュ彛
+            - generic [ref=e1068]:
+              - generic [ref=e1069]: 鐗╂枡绠$悊
+              - generic [ref=e1077]: 鐢熶骇鐗╂枡
+              - generic [ref=e1085]: 鍝佺鍒嗙被
+              - generic [ref=e1093]: 璁¢噺鍗曚綅
+              - generic [ref=e1099]: 浜х嚎缁存姢
+              - generic [ref=e1105]: 鎵规鐢熶骇
+              - generic [ref=e1114]: 璧嬬爜绠$悊
+              - generic [ref=e1120]: 鎵樼洏鐮佺鐞�
+  - generic:
+    - generic:
+      - generic:
+        - generic [ref=e1129]:
+          - img "close-circle" [ref=e1130]
+          - text: 璇锋眰鍦板潃涓嶅瓨鍦�:admin-api/mes/bag-code-home-statistics/trend
+        - generic [ref=e1134]:
+          - img "close-circle" [ref=e1135]
+          - text: 璇锋眰鍦板潃涓嶅瓨鍦�:admin-api/mes/bag-code-home-statistics/summary
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-22-56-693Z.yml b/.playwright-mcp/page-2026-08-19T02-22-56-693Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-22-56-693Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-23-31-534Z.yml b/.playwright-mcp/page-2026-08-19T02-23-31-534Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-23-31-534Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-23-37-571Z.yml b/.playwright-mcp/page-2026-08-19T02-23-37-571Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-23-37-571Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-24-27-322Z.yml b/.playwright-mcp/page-2026-08-19T02-24-27-322Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-24-27-322Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-25-12-056Z.yml b/.playwright-mcp/page-2026-08-19T02-25-12-056Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-25-12-056Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-25-31-773Z.yml b/.playwright-mcp/page-2026-08-19T02-25-31-773Z.yml
new file mode 100644
index 0000000..7eb5342
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-25-31-773Z.yml
@@ -0,0 +1,155 @@
+- generic [ref=f5e7]:
+  - complementary [ref=f5e8]:
+    - generic [ref=f5e9]:
+      - generic [ref=f5e10] [cursor=pointer]
+      - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f5e15] [cursor=pointer]:
+        - /url: javascript:void 0
+        - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f5e18]
+        - generic [ref=f5e19]: 宸ヤ笟AI鏅洪�犲钩鍙�
+      - menu [ref=f5e22]:
+        - menuitem "棣栭〉" [ref=f5e23] [cursor=pointer]
+        - menuitem "鍩虹鏁版嵁涓庝竴琚嬩竴鐮�" [active] [ref=f5e30] [cursor=pointer]
+        - listitem [ref=f5e35]:
+          - generic [ref=f5e36] [cursor=pointer]: 鍩虹鏁版嵁
+        - listitem [ref=f5e44]:
+          - generic [ref=f5e45] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+        - listitem [ref=f5e51]:
+          - generic [ref=f5e52] [cursor=pointer]: 绯荤粺绠$悊
+      - generic [ref=f5e59] [cursor=pointer]
+  - generic [ref=f5e64]:
+    - generic [ref=f5e65]:
+      - banner [ref=f5e66]:
+        - button [ref=f5e67] [cursor=pointer]
+        - button [ref=f5e70] [cursor=pointer]
+        - navigation "breadcrumb" [ref=f5e75]:
+          - list [ref=f5e76]:
+            - listitem [ref=f5e500]:
+              - link "鍩虹鏁版嵁涓庝竴琚嬩竴鐮�" [disabled] [ref=f5e501]
+        - generic [ref=f5e85]:
+          - generic [ref=f5e87] [cursor=pointer]:
+            - generic [ref=f5e91]: 鎼滅储
+            - generic [ref=f5e92]: Ctrl K
+          - button [ref=f5e94] [cursor=pointer]
+          - button "dark" [ref=f5e99] [cursor=pointer]
+          - button [ref=f5e108] [cursor=pointer]
+          - button [ref=f5e114] [cursor=pointer]
+          - button [ref=f5e117] [cursor=pointer]
+          - button [ref=f5e123] [cursor=pointer]:
+            - button [ref=f5e125]
+          - button "宸ヤ綔鍙�" [ref=f5e129] [cursor=pointer]
+          - button "鐞嗗憳" [ref=f5e133] [cursor=pointer]
+      - generic [ref=f5e140]:
+        - generic [ref=f5e145]:
+          - generic [ref=f5e146] [cursor=pointer]: 棣栭〉
+          - generic [ref=f5e507] [cursor=pointer]: 鍩虹鏁版嵁涓庝竴琚嬩竴鐮�
+        - generic [ref=f5e162]:
+          - button [ref=f5e163] [cursor=pointer]
+          - generic [ref=f5e170] [cursor=pointer]
+          - generic [ref=f5e174] [cursor=pointer]
+    - main [ref=f5e181]:
+      - generic [ref=f5e184]:
+        - generic [ref=f5e185]:
+          - generic [ref=f5e186]:
+            - heading "涓婂崍濂斤紝娆㈣繋鍥炴潵" [level=1] [ref=f5e187]
+            - paragraph [ref=f5e188]: 2026骞�8鏈�19鏃� 鏄熸湡涓�
+          - generic [ref=f5e189]: 绯荤粺杩愯涓�
+        - generic [ref=f5e194]:
+          - generic [ref=f5e203] [cursor=pointer]:
+            - generic [ref=f5e204]: 鐢熶骇璁㈠崟
+            - generic [ref=f5e205]:
+              - generic [ref=f5e206]: "0"
+              - generic [ref=f5e208]: 杩涜涓�
+            - generic [ref=f5e209]:
+              - text: 寰呮帓浜� 0
+              - generic [ref=f5e211]: "|"
+              - text: 宸插畬鎴� 0
+          - generic [ref=f5e223] [cursor=pointer]:
+            - generic [ref=f5e224]: 浠婃棩浜ч噺
+            - generic [ref=f5e225]:
+              - generic [ref=f5e226]: "0"
+              - generic [ref=f5e228]: 浠�
+            - generic [ref=f5e229]: 鏄ㄦ棩 0 浠�
+          - generic [ref=f5e240] [cursor=pointer]:
+            - generic [ref=f5e241]: 璐ㄩ噺鍚堟牸鐜�
+            - generic [ref=f5e242]:
+              - generic [ref=f5e243]: "0.0"
+              - generic [ref=f5e245]: "%"
+            - generic [ref=f5e246]: 鍚堟牸 0 | 涓嶈壇 0
+          - generic [ref=f5e258] [cursor=pointer]:
+            - generic [ref=f5e259]: 璁惧杩愯鐜�
+            - generic [ref=f5e260]:
+              - generic [ref=f5e261]: "33.3"
+              - generic [ref=f5e263]: "%"
+            - generic [ref=f5e264]:
+              - generic [ref=f5e265]: 鍋滄満 1
+              - generic [ref=f5e266]: "|"
+              - generic [ref=f5e267]: 缁存姢 1
+        - generic [ref=f5e270]:
+          - generic [ref=f5e280] [cursor=pointer]:
+            - generic [ref=f5e281]: 閲囪喘璁㈠崟
+            - generic [ref=f5e282]:
+              - generic [ref=f5e283]: "0"
+              - generic [ref=f5e285]: 绗�
+            - generic [ref=f5e286]: ERP 閲囪喘绠$悊
+          - generic [ref=f5e297] [cursor=pointer]:
+            - generic [ref=f5e298]: 閿�鍞鍗�
+            - generic [ref=f5e299]:
+              - generic [ref=f5e300]: "0"
+              - generic [ref=f5e302]: 绗�
+            - generic [ref=f5e303]: ERP 閿�鍞鐞�
+          - generic [ref=f5e315] [cursor=pointer]:
+            - generic [ref=f5e316]: 鐗╂枡搴撳瓨
+            - generic [ref=f5e317]:
+              - generic [ref=f5e318]: "0"
+              - generic [ref=f5e320]: 鏉�
+            - generic [ref=f5e321]: MES 搴撳瓨鍙拌处
+          - generic [ref=f5e333] [cursor=pointer]:
+            - generic [ref=f5e334]: 鎴戠殑寰呭姙
+            - generic [ref=f5e335]:
+              - generic [ref=f5e336]: "0"
+              - generic [ref=f5e338]: 椤�
+            - generic [ref=f5e339]: BPM 寰呭鎵�
+        - generic [ref=f5e342]:
+          - generic [ref=f5e343]:
+            - heading "AI 鏅鸿兘鍒嗘瀽" [level=3] [ref=f5e344]
+            - generic [ref=f5e345]: 0 涓伐鍗曞彲鍒嗘瀽
+          - generic [ref=f5e346]:
+            - generic [ref=f5e354] [cursor=pointer]:
+              - generic [ref=f5e355]: AI 鐗╂枡棰勬祴
+              - generic [ref=f5e356]: 棰勬祴鐗╂枡闇�姹備笌鐭己椋庨櫓
+            - generic [ref=f5e365] [cursor=pointer]:
+              - generic [ref=f5e366]: AI 鏃堕暱棰勬祴
+              - generic [ref=f5e367]: 棰勬祴鍚勫伐搴忕敓浜ц�楁椂
+            - generic [ref=f5e374] [cursor=pointer]:
+              - generic [ref=f5e375]: AI 椋庨櫓棰勬祴
+              - generic [ref=f5e376]: 璇嗗埆娼滃湪鐢熶骇椋庨櫓骞剁粰鍑哄缓璁�
+            - generic [ref=f5e386] [cursor=pointer]:
+              - generic [ref=f5e387]: AI 浜や粯璇勪及
+              - generic [ref=f5e388]: 璇勪及璁㈠崟浜や粯鍑嗘椂鐜囦笌寤舵湡鍥犵礌
+        - generic [ref=f5e391]:
+          - heading "鐢熶骇瓒嬪娍锛堣繎7澶╋級" [level=3] [ref=f5e394]
+          - generic [ref=f5e399]:
+            - generic [ref=f5e400]:
+              - generic [ref=f5e406] [cursor=pointer]:
+                - generic [ref=f5e407]: 瀹夌伅鍛煎彨
+                - generic [ref=f5e408]:
+                  - generic [ref=f5e409]: "0"
+                  - generic [ref=f5e411]: 鏈缃�
+              - generic [ref=f5e417] [cursor=pointer]:
+                - generic [ref=f5e418]: 缁翠慨宸ュ崟
+                - generic [ref=f5e419]:
+                  - generic [ref=f5e420]: "0"
+                  - generic [ref=f5e422]: 寰呭鐞�
+            - heading "宸ュ崟鐘舵�佸垎甯�" [level=4] [ref=f5e424]
+        - generic [ref=f5e432]:
+          - heading "蹇嵎鎿嶄綔" [level=3] [ref=f5e433]
+          - generic [ref=f5e434]:
+            - generic [ref=f5e435] [cursor=pointer]: 鐢熶骇宸ュ崟
+            - generic [ref=f5e442] [cursor=pointer]: 鐢熶骇鎶ュ伐
+            - generic [ref=f5e449] [cursor=pointer]: 璐ㄦ绠$悊
+            - generic [ref=f5e457] [cursor=pointer]: 璁惧鐐规
+            - generic [ref=f5e464] [cursor=pointer]: 鐢熶骇鎺掔▼
+            - generic [ref=f5e471] [cursor=pointer]: 瀹夌伅鍛煎彨
+            - generic [ref=f5e476] [cursor=pointer]: 鐗╂枡搴撳瓨
+            - generic [ref=f5e484] [cursor=pointer]: 宸ヨ壓璺嚎
+            - generic [ref=f5e492] [cursor=pointer]: 鏁版嵁鎶ヨ〃
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-26-06-325Z.yml b/.playwright-mcp/page-2026-08-19T02-26-06-325Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-26-06-325Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-26-42-507Z.yml b/.playwright-mcp/page-2026-08-19T02-26-42-507Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-26-42-507Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-28-43-496Z.yml b/.playwright-mcp/page-2026-08-19T02-28-43-496Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-28-43-496Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-28-56-514Z.yml b/.playwright-mcp/page-2026-08-19T02-28-56-514Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-28-56-514Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-29-21-301Z.yml b/.playwright-mcp/page-2026-08-19T02-29-21-301Z.yml
new file mode 100644
index 0000000..43566c5
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-29-21-301Z.yml
@@ -0,0 +1,114 @@
+- generic [ref=f12e1]:
+  - generic [ref=f12e4]:
+    - complementary [ref=f12e6]:
+      - generic [ref=f12e7]:
+        - generic [ref=f12e8] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f12e13] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f12e16]
+          - generic [ref=f12e17]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f12e20]:
+          - menuitem "鍩虹鏁版嵁涓庝竴琚嬩竴鐮�" [ref=f12e21] [cursor=pointer]
+          - listitem [ref=f12e26]:
+            - generic [ref=f12e27] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f12e35]:
+            - generic [ref=f12e36] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+          - listitem [ref=f12e42]:
+            - generic [ref=f12e43] [cursor=pointer]: 绯荤粺绠$悊
+        - generic [ref=f12e50] [cursor=pointer]
+    - generic [ref=f12e55]:
+      - generic [ref=f12e56]:
+        - banner [ref=f12e57]:
+          - button [ref=f12e58] [cursor=pointer]
+          - button [ref=f12e61] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f12e66]:
+            - list [ref=f12e67]:
+              - listitem [ref=f12e68]:
+                - link "鍩虹鏁版嵁涓庝竴琚嬩竴鐮�" [disabled] [ref=f12e69]
+          - generic [ref=f12e74]:
+            - generic [ref=f12e76] [cursor=pointer]:
+              - generic [ref=f12e80]: 鎼滅储
+              - generic [ref=f12e81]: Ctrl K
+            - button [ref=f12e83] [cursor=pointer]
+            - button "dark" [ref=f12e88] [cursor=pointer]
+            - button [ref=f12e97] [cursor=pointer]
+            - button [ref=f12e103] [cursor=pointer]
+            - button [ref=f12e106] [cursor=pointer]
+            - button [ref=f12e112] [cursor=pointer]:
+              - button [ref=f12e114]
+            - button "宸ヤ綔鍙�" [ref=f12e118] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f12e122] [cursor=pointer]
+        - generic [ref=f12e129]:
+          - generic [ref=f12e134]:
+            - generic [ref=f12e135] [cursor=pointer]: 棣栭〉
+            - generic [ref=f12e153] [cursor=pointer]: 鍩虹鏁版嵁涓庝竴琚嬩竴鐮�
+          - generic [ref=f12e170]:
+            - button [expanded] [active] [ref=f12e171] [cursor=pointer]
+            - generic [ref=f12e178] [cursor=pointer]
+            - generic [ref=f12e182] [cursor=pointer]
+      - main [ref=f12e189]:
+        - generic [ref=f12e192]:
+          - generic [ref=f12e193]:
+            - generic [ref=f12e203] [cursor=pointer]:
+              - generic [ref=f12e204]: 鍝佺鎬绘暟
+              - generic [ref=f12e205]: "0"
+            - generic [ref=f12e216] [cursor=pointer]:
+              - generic [ref=f12e217]: MES 鍝佺
+              - generic [ref=f12e218]: "0"
+            - generic [ref=f12e229] [cursor=pointer]:
+              - generic [ref=f12e230]: 鍝佺鍒嗙被
+              - generic [ref=f12e231]: "0"
+            - generic [ref=f12e240] [cursor=pointer]:
+              - generic [ref=f12e241]: 璁¢噺鍗曚綅
+              - generic [ref=f12e242]: "0"
+          - generic [ref=f12e244]:
+            - generic [ref=f12e252] [cursor=pointer]:
+              - generic [ref=f12e253]: 浜х嚎
+              - generic [ref=f12e254]: "0"
+            - generic [ref=f12e266] [cursor=pointer]:
+              - generic [ref=f12e267]: 鐢熶骇鎵规
+              - generic [ref=f12e268]: "0"
+            - generic [ref=f12e277] [cursor=pointer]:
+              - generic [ref=f12e278]: 琚嬬爜
+              - generic [ref=f12e279]: "0"
+            - generic [ref=f12e290] [cursor=pointer]:
+              - generic [ref=f12e291]: 鎵樼洏鐮�
+              - generic [ref=f12e292]: "0"
+          - generic [ref=f12e294]:
+            - generic [ref=f12e298]:
+              - generic [ref=f12e299]: 琚嬬爜鐢熸垚瓒嬪娍
+              - generic [ref=f12e301]:
+                - generic [ref=f12e302] [cursor=pointer]:
+                  - generic [ref=f12e303]:
+                    - radio "杩� 7 澶�" [checked]
+                  - generic [ref=f12e304]: 杩� 7 澶�
+                - generic [ref=f12e305] [cursor=pointer]:
+                  - generic [ref=f12e306]:
+                    - radio "杩� 30 澶�"
+                  - generic [ref=f12e307]: 杩� 30 澶�
+            - generic [ref=f12e312]: 鎵规鐘舵�佸垎甯�
+            - generic [ref=f12e321]: 琚嬬爜鐘舵�佸垎甯�
+          - generic [ref=f12e330]:
+            - generic [ref=f12e331]: 蹇嵎鍏ュ彛
+            - generic [ref=f12e335]:
+              - generic [ref=f12e336]: 鐗╂枡绠$悊
+              - generic [ref=f12e344]: 鐢熶骇鐗╂枡
+              - generic [ref=f12e352]: 鍝佺鍒嗙被
+              - generic [ref=f12e360]: 璁¢噺鍗曚綅
+              - generic [ref=f12e366]: 浜х嚎缁存姢
+              - generic [ref=f12e372]: 鎵规鐢熶骇
+              - generic [ref=f12e381]: 璧嬬爜绠$悊
+              - generic [ref=f12e387]: 鎵樼洏鐮佺鐞�
+  - menu [ref=f12e396]:
+    - group [ref=f12e397]:
+      - menuitem "鍏抽棴" [ref=f12e398] [cursor=pointer]
+      - menuitem "鍥哄畾" [ref=f12e399] [cursor=pointer]
+      - menuitem "鏈�澶у寲" [ref=f12e400] [cursor=pointer]
+      - menuitem "閲嶆柊鍔犺浇" [ref=f12e401] [cursor=pointer]
+      - menuitem "鍦ㄦ柊绐楀彛鎵撳紑" [ref=f12e402] [cursor=pointer]
+      - separator [ref=f12e403]
+      - menuitem "鍏抽棴宸︿晶鏍囩椤�" [disabled]
+      - menuitem "鍏抽棴鍙充晶鏍囩椤�" [disabled]
+      - separator [ref=f12e404]
+      - menuitem "鍏抽棴鍏跺畠鏍囩椤�" [disabled]
+      - menuitem "鍏抽棴鍏ㄩ儴鏍囩椤�" [ref=f12e405] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-29-31-299Z.yml b/.playwright-mcp/page-2026-08-19T02-29-31-299Z.yml
new file mode 100644
index 0000000..323b7db
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-29-31-299Z.yml
@@ -0,0 +1,169 @@
+- generic:
+  - generic:
+    - generic:
+      - generic:
+        - complementary:
+          - generic:
+            - generic:
+              - generic:
+                - link:
+                  - /url: javascript:void 0
+                  - generic: 宸ヤ笟AI鏅洪�犲钩鍙�
+            - generic:
+              - generic:
+                - menu:
+                  - menuitem:
+                    - generic: 鍩虹鏁版嵁涓庝竴琚嬩竴鐮�
+                  - listitem:
+                    - generic: 鍩虹鏁版嵁
+                  - listitem:
+                    - generic: 涓�琚嬩竴鐮佺鐞�
+                  - listitem:
+                    - generic: 绯荤粺绠$悊
+        - generic:
+          - generic:
+            - banner:
+              - button
+              - button
+              - generic:
+                - navigation:
+                  - list:
+                    - listitem:
+                      - link [disabled]:
+                        - generic: 鍩虹鏁版嵁涓庝竴琚嬩竴鐮�
+              - generic:
+                - generic:
+                  - generic:
+                    - generic: 鎼滅储
+                    - generic: Ctrl K
+                - generic:
+                  - button
+                - generic:
+                  - button "dark"
+                - generic:
+                  - button
+                - generic:
+                  - button
+                - button
+                - button:
+                  - generic:
+                    - button
+                - button:
+                  - generic: 宸ヤ綔鍙�
+                - button [expanded] [active]:
+                  - generic: 鐞嗗憳
+            - generic:
+              - generic:
+                - generic:
+                  - generic:
+                    - generic:
+                      - generic:
+                        - generic: 棣栭〉
+                        - generic: 鍩虹鏁版嵁涓庝竴琚嬩竴鐮�
+              - generic:
+                - button
+          - main:
+            - generic:
+              - generic:
+                - generic:
+                  - generic:
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic: 鍝佺鎬绘暟
+                              - generic: "0"
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic: MES 鍝佺
+                              - generic: "0"
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic: 鍝佺鍒嗙被
+                              - generic: "0"
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic: 璁¢噺鍗曚綅
+                              - generic: "0"
+                  - generic:
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic: 浜х嚎
+                              - generic: "0"
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic: 鐢熶骇鎵规
+                              - generic: "0"
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic: 琚嬬爜
+                              - generic: "0"
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic: 鎵樼洏鐮�
+                              - generic: "0"
+                  - generic:
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic: 琚嬬爜鐢熸垚瓒嬪娍
+                            - generic:
+                              - generic:
+                                - generic: 杩� 7 澶�
+                                - generic: 杩� 30 澶�
+                    - generic: 鎵规鐘舵�佸垎甯�
+                    - generic: 琚嬬爜鐘舵�佸垎甯�
+                  - generic:
+                    - generic: 蹇嵎鍏ュ彛
+                    - generic:
+                      - generic:
+                        - generic: 鐗╂枡绠$悊
+                        - generic: 鐢熶骇鐗╂枡
+                        - generic: 鍝佺鍒嗙被
+                        - generic: 璁¢噺鍗曚綅
+                        - generic: 浜х嚎缁存姢
+                        - generic: 鎵规鐢熶骇
+                        - generic: 璧嬬爜绠$悊
+                        - generic: 鎵樼洏鐮佺鐞�
+  - menu "瓒呯骇绠$悊鍛� 鐞嗗憳" [ref=f12e406]:
+    - generic [ref=f12e407]:
+      - generic [ref=f12e408]:
+        - generic [ref=f12e409]: 鐞嗗憳
+        - generic [ref=f12e413]:
+          - generic [ref=f12e414]:
+            - text: 瓒呯骇绠$悊鍛�
+            - generic [ref=f12e415]: admin
+          - generic [ref=f12e416]: 13aoteman@126.com
+      - separator [ref=f12e417]
+      - menuitem "涓汉涓績" [ref=f12e418] [cursor=pointer]
+      - separator [ref=f12e419]
+      - menuitem "閿佸畾灞忓箷 Alt L" [ref=f12e420] [cursor=pointer]:
+        - text: 閿佸畾灞忓箷
+        - generic [ref=f12e421]: Alt L
+      - separator [ref=f12e422]
+      - menuitem "閫�鍑虹櫥褰� Alt Q" [ref=f12e423] [cursor=pointer]:
+        - text: 閫�鍑虹櫥褰�
+        - generic [ref=f12e424]: Alt Q
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-29-38-624Z.yml b/.playwright-mcp/page-2026-08-19T02-29-38-624Z.yml
new file mode 100644
index 0000000..ad117ee
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-29-38-624Z.yml
@@ -0,0 +1,124 @@
+- generic [ref=f12e1]:
+  - generic [ref=f12e4]:
+    - complementary [ref=f12e6]:
+      - generic [ref=f12e7]:
+        - generic [ref=f12e8] [cursor=pointer]
+        - link [ref=f12e425] [cursor=pointer]:
+          - /url: javascript:void 0
+          - generic [ref=f12e17]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f12e20]:
+          - menuitem [ref=f12e427] [cursor=pointer]:
+            - generic [ref=f12e22]: 鍩虹鏁版嵁涓庝竴琚嬩竴鐮�
+          - listitem [ref=f12e26]:
+            - generic [ref=f12e27] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f12e35]:
+            - generic [ref=f12e36] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+          - listitem [ref=f12e42]:
+            - generic [ref=f12e43] [cursor=pointer]: 绯荤粺绠$悊
+        - generic [ref=f12e50] [cursor=pointer]
+    - generic [ref=f12e55]:
+      - generic [ref=f12e56]:
+        - banner [ref=f12e57]:
+          - button [ref=f12e58] [cursor=pointer]
+          - button [ref=f12e61] [cursor=pointer]
+          - navigation [ref=f12e428]:
+            - list [ref=f12e67]:
+              - listitem [ref=f12e68]:
+                - link [disabled] [ref=f12e429]:
+                  - generic [ref=f12e70]: 鍩虹鏁版嵁涓庝竴琚嬩竴鐮�
+          - generic [ref=f12e74]:
+            - generic [ref=f12e76] [cursor=pointer]:
+              - generic [ref=f12e80]: 鎼滅储
+              - generic [ref=f12e81]: Ctrl K
+            - button [ref=f12e83] [cursor=pointer]
+            - button "dark" [ref=f12e88] [cursor=pointer]
+            - button [ref=f12e97] [cursor=pointer]
+            - button [ref=f12e103] [cursor=pointer]
+            - button [ref=f12e106] [cursor=pointer]
+            - button [ref=f12e112] [cursor=pointer]:
+              - button [ref=f12e114]
+            - button [ref=f12e430] [cursor=pointer]:
+              - generic [ref=f12e121]: 宸ヤ綔鍙�
+            - button [ref=f12e431] [cursor=pointer]:
+              - generic [ref=f12e123]: 鐞嗗憳
+        - generic [ref=f12e129]:
+          - generic [ref=f12e134]:
+            - generic [ref=f12e135] [cursor=pointer]: 棣栭〉
+            - generic [ref=f12e153] [cursor=pointer]: 鍩虹鏁版嵁涓庝竴琚嬩竴鐮�
+          - generic [ref=f12e170]:
+            - button [ref=f12e171] [cursor=pointer]
+            - generic [ref=f12e178] [cursor=pointer]
+            - generic [ref=f12e182] [cursor=pointer]
+      - main [ref=f12e189]:
+        - generic [ref=f12e192]:
+          - generic [ref=f12e193]:
+            - generic [ref=f12e203] [cursor=pointer]:
+              - generic [ref=f12e204]: 鍝佺鎬绘暟
+              - generic [ref=f12e205]: "0"
+            - generic [ref=f12e216] [cursor=pointer]:
+              - generic [ref=f12e217]: MES 鍝佺
+              - generic [ref=f12e218]: "0"
+            - generic [ref=f12e229] [cursor=pointer]:
+              - generic [ref=f12e230]: 鍝佺鍒嗙被
+              - generic [ref=f12e231]: "0"
+            - generic [ref=f12e240] [cursor=pointer]:
+              - generic [ref=f12e241]: 璁¢噺鍗曚綅
+              - generic [ref=f12e242]: "0"
+          - generic [ref=f12e244]:
+            - generic [ref=f12e252] [cursor=pointer]:
+              - generic [ref=f12e253]: 浜х嚎
+              - generic [ref=f12e254]: "0"
+            - generic [ref=f12e266] [cursor=pointer]:
+              - generic [ref=f12e267]: 鐢熶骇鎵规
+              - generic [ref=f12e268]: "0"
+            - generic [ref=f12e277] [cursor=pointer]:
+              - generic [ref=f12e278]: 琚嬬爜
+              - generic [ref=f12e279]: "0"
+            - generic [ref=f12e290] [cursor=pointer]:
+              - generic [ref=f12e291]: 鎵樼洏鐮�
+              - generic [ref=f12e292]: "0"
+          - generic [ref=f12e294]:
+            - generic [ref=f12e298]:
+              - generic [ref=f12e299]: 琚嬬爜鐢熸垚瓒嬪娍
+              - generic [ref=f12e301]:
+                - generic [ref=f12e302] [cursor=pointer]: 杩� 7 澶�
+                - generic [ref=f12e305] [cursor=pointer]: 杩� 30 澶�
+            - generic [ref=f12e312]: 鎵规鐘舵�佸垎甯�
+            - generic [ref=f12e321]: 琚嬬爜鐘舵�佸垎甯�
+          - generic [ref=f12e330]:
+            - generic [ref=f12e331]: 蹇嵎鍏ュ彛
+            - generic [ref=f12e335]:
+              - generic [ref=f12e336]: 鐗╂枡绠$悊
+              - generic [ref=f12e344]: 鐢熶骇鐗╂枡
+              - generic [ref=f12e352]: 鍝佺鍒嗙被
+              - generic [ref=f12e360]: 璁¢噺鍗曚綅
+              - generic [ref=f12e366]: 浜х嚎缁存姢
+              - generic [ref=f12e372]: 鎵规鐢熶骇
+              - generic [ref=f12e381]: 璧嬬爜绠$悊
+              - generic [ref=f12e387]: 鎵樼洏鐮佺鐞�
+  - dialog [ref=f12e433]:
+    - heading "鎻愮ず" [level=2] [ref=f12e435]
+    - generic [ref=f12e437]: 鏄惁閫�鍑虹櫥褰曪紵
+    - generic [ref=f12e438]:
+      - button "鍙� 娑�" [ref=f12e439] [cursor=pointer]
+      - button "纭� 璁�" [ref=f12e441] [cursor=pointer]
+    - button [ref=f12e443] [cursor=pointer]
+  - menu "瓒呯骇绠$悊鍛� 鐞嗗憳" [ref=f12e406]:
+    - generic [ref=f12e407]:
+      - generic [ref=f12e408]:
+        - generic [ref=f12e409]: 鐞嗗憳
+        - generic [ref=f12e413]:
+          - generic [ref=f12e414]:
+            - text: 瓒呯骇绠$悊鍛�
+            - generic [ref=f12e415]: admin
+          - generic [ref=f12e416]: 13aoteman@126.com
+      - separator [ref=f12e417]
+      - menuitem "涓汉涓績" [ref=f12e418] [cursor=pointer]
+      - separator [ref=f12e419]
+      - menuitem "閿佸畾灞忓箷 Alt L" [ref=f12e420] [cursor=pointer]:
+        - text: 閿佸畾灞忓箷
+        - generic [ref=f12e421]: Alt L
+      - separator [ref=f12e422]
+      - menuitem "閫�鍑虹櫥褰� Alt Q" [active] [ref=f12e423] [cursor=pointer]:
+        - text: 閫�鍑虹櫥褰�
+        - generic [ref=f12e424]: Alt Q
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-29-47-885Z.yml b/.playwright-mcp/page-2026-08-19T02-29-47-885Z.yml
new file mode 100644
index 0000000..8d49d71
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-29-47-885Z.yml
@@ -0,0 +1,42 @@
+- generic [ref=f12e455]:
+  - generic [ref=f12e456]:
+    - generic [ref=f12e457]:
+      - generic [ref=f12e458]:
+        - generic:
+          - button [ref=f12e459] [cursor=pointer]
+          - button [ref=f12e463] [cursor=pointer]
+          - button [ref=f12e465] [cursor=pointer]
+          - button [ref=f12e467] [cursor=pointer]
+          - button [ref=f12e469] [cursor=pointer]
+          - button [ref=f12e471] [cursor=pointer]
+          - button [ref=f12e473] [cursor=pointer]
+        - button [ref=f12e475] [cursor=pointer]
+      - button [ref=f12e482] [cursor=pointer]
+    - button [ref=f12e486] [cursor=pointer]
+    - button "dark" [ref=f12e492] [cursor=pointer]
+  - generic [ref=f12e501]:
+    - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f12e502]
+    - paragraph [ref=f12e503]: 宸ヤ笟AI鏅洪�犲钩鍙�
+  - generic [ref=f12e507]:
+    - img "87667-SVG8" [ref=f12e508]
+    - generic [ref=f12e812]: 寮�绠卞嵆鐢ㄧ殑澶у瀷涓悗鍙扮鐞嗙郴缁�
+    - generic [ref=f12e813]: 宸ョ▼鍖栥�侀珮鎬ц兘銆佽法缁勪欢搴撶殑鍓嶇妯$増
+  - generic [ref=f12e814]:
+    - generic [ref=f12e816]:
+      - generic [ref=f12e817]:
+        - heading "娆㈣繋鍥炴潵 馃憢馃徎" [level=2] [ref=f12e818]
+        - paragraph [ref=f12e819]:
+          - generic [ref=f12e820]: 璇疯緭鍏ユ偍鐨勮处鎴蜂俊鎭互寮�濮嬬鐞嗘偍鐨勯」鐩�
+      - generic [ref=f12e822]:
+        - textbox "璇疯緭鍏ョ敤鎴峰悕" [ref=f12e828]: admin
+        - generic [ref=f12e834]:
+          - textbox "璇疯緭鍏ュ瘑鐮�" [ref=f12e835]: admin123
+          - generic [ref=f12e836] [cursor=pointer]
+      - generic [ref=f12e844]:
+        - checkbox "璁颁綇璐﹀彿" [ref=f12e845] [cursor=pointer]
+        - generic [ref=f12e846] [cursor=pointer]: 璁颁綇璐﹀彿
+      - button "login" [ref=f12e847] [cursor=pointer]: 鐧诲綍
+    - generic [ref=f12e849]:
+      - text: Copyright 漏 2024
+      - link "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f12e850] [cursor=pointer]:
+        - /url: https://gitee.com/yudaocode/yudao-ui-admin-vben
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-31-28-342Z.yml b/.playwright-mcp/page-2026-08-19T02-31-28-342Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-31-28-342Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-31-43-280Z.yml b/.playwright-mcp/page-2026-08-19T02-31-43-280Z.yml
new file mode 100644
index 0000000..7123842
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-31-43-280Z.yml
@@ -0,0 +1,163 @@
+- generic:
+  - generic:
+    - generic:
+      - generic:
+        - complementary:
+          - generic:
+            - generic:
+              - generic:
+                - link:
+                  - /url: javascript:void 0
+                  - generic: 宸ヤ笟AI鏅洪�犲钩鍙�
+            - generic:
+              - generic:
+                - menu:
+                  - menuitem:
+                    - generic: 鍩虹鏁版嵁涓庝竴琚嬩竴鐮�
+                  - listitem:
+                    - generic: 鍩虹鏁版嵁
+                  - listitem:
+                    - generic: 涓�琚嬩竴鐮佺鐞�
+                  - listitem:
+                    - generic: 绯荤粺绠$悊
+        - generic:
+          - generic:
+            - banner:
+              - button
+              - button
+              - generic:
+                - navigation:
+                  - list:
+                    - listitem:
+                      - link [disabled]:
+                        - generic: 鍩虹鏁版嵁涓庝竴琚嬩竴鐮�
+              - generic:
+                - generic:
+                  - generic:
+                    - generic: 鎼滅储
+                    - generic: Ctrl K
+                - generic:
+                  - button
+                - generic:
+                  - button "dark"
+                - generic:
+                  - button
+                - generic:
+                  - button
+                - button
+                - button:
+                  - generic:
+                    - button
+                - button:
+                  - generic: 宸ヤ綔鍙�
+                - button [expanded] [active]:
+                  - generic: 鐞嗗憳
+            - generic:
+              - generic: 鍩虹鏁版嵁涓庝竴琚嬩竴鐮�
+              - generic:
+                - button
+          - main:
+            - generic:
+              - generic:
+                - generic:
+                  - generic:
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic: 鍝佺鎬绘暟
+                              - generic: "0"
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic: MES 鍝佺
+                              - generic: "0"
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic: 鍝佺鍒嗙被
+                              - generic: "0"
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic: 璁¢噺鍗曚綅
+                              - generic: "0"
+                  - generic:
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic: 浜х嚎
+                              - generic: "0"
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic: 鐢熶骇鎵规
+                              - generic: "0"
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic: 琚嬬爜
+                              - generic: "0"
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic:
+                              - generic: 鎵樼洏鐮�
+                              - generic: "0"
+                  - generic:
+                    - generic:
+                      - generic:
+                        - generic:
+                          - generic:
+                            - generic: 琚嬬爜鐢熸垚瓒嬪娍
+                            - generic:
+                              - generic:
+                                - generic: 杩� 7 澶�
+                                - generic: 杩� 30 澶�
+                    - generic: 鎵规鐘舵�佸垎甯�
+                    - generic: 琚嬬爜鐘舵�佸垎甯�
+                  - generic:
+                    - generic: 蹇嵎鍏ュ彛
+                    - generic:
+                      - generic:
+                        - generic: 鐗╂枡绠$悊
+                        - generic: 鐢熶骇鐗╂枡
+                        - generic: 鍝佺鍒嗙被
+                        - generic: 璁¢噺鍗曚綅
+                        - generic: 浜х嚎缁存姢
+                        - generic: 鎵规鐢熶骇
+                        - generic: 璧嬬爜绠$悊
+                        - generic: 鎵樼洏鐮佺鐞�
+  - menu "瓒呯骇绠$悊鍛� 鐞嗗憳" [ref=f14e377]:
+    - generic [ref=f14e378]:
+      - generic [ref=f14e379]:
+        - generic [ref=f14e380]: 鐞嗗憳
+        - generic [ref=f14e384]:
+          - generic [ref=f14e385]:
+            - text: 瓒呯骇绠$悊鍛�
+            - generic [ref=f14e386]: admin
+          - generic [ref=f14e387]: 13aoteman@126.com
+      - separator [ref=f14e388]
+      - menuitem "涓汉涓績" [ref=f14e389] [cursor=pointer]
+      - separator [ref=f14e390]
+      - menuitem "閿佸畾灞忓箷 Alt L" [ref=f14e391] [cursor=pointer]:
+        - text: 閿佸畾灞忓箷
+        - generic [ref=f14e392]: Alt L
+      - separator [ref=f14e393]
+      - menuitem "閫�鍑虹櫥褰� Alt Q" [ref=f14e394] [cursor=pointer]:
+        - text: 閫�鍑虹櫥褰�
+        - generic [ref=f14e395]: Alt Q
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-31-49-797Z.yml b/.playwright-mcp/page-2026-08-19T02-31-49-797Z.yml
new file mode 100644
index 0000000..417b55c
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-31-49-797Z.yml
@@ -0,0 +1,122 @@
+- generic [ref=f14e4]:
+  - generic [ref=f14e7]:
+    - complementary [ref=f14e9]:
+      - generic [ref=f14e10]:
+        - generic [ref=f14e11] [cursor=pointer]
+        - link [ref=f14e396] [cursor=pointer]:
+          - /url: javascript:void 0
+          - generic [ref=f14e20]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f14e23]:
+          - menuitem [ref=f14e398] [cursor=pointer]:
+            - generic [ref=f14e25]: 鍩虹鏁版嵁涓庝竴琚嬩竴鐮�
+          - listitem [ref=f14e29]:
+            - generic [ref=f14e30] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f14e38]:
+            - generic [ref=f14e39] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+          - listitem [ref=f14e45]:
+            - generic [ref=f14e46] [cursor=pointer]: 绯荤粺绠$悊
+        - generic [ref=f14e53] [cursor=pointer]
+    - generic [ref=f14e58]:
+      - generic [ref=f14e59]:
+        - banner [ref=f14e60]:
+          - button [ref=f14e61] [cursor=pointer]
+          - button [ref=f14e64] [cursor=pointer]
+          - navigation [ref=f14e399]:
+            - list [ref=f14e70]:
+              - listitem [ref=f14e71]:
+                - link [disabled] [ref=f14e400]:
+                  - generic [ref=f14e73]: 鍩虹鏁版嵁涓庝竴琚嬩竴鐮�
+          - generic [ref=f14e77]:
+            - generic [ref=f14e79] [cursor=pointer]:
+              - generic [ref=f14e83]: 鎼滅储
+              - generic [ref=f14e84]: Ctrl K
+            - button [ref=f14e86] [cursor=pointer]
+            - button "dark" [ref=f14e91] [cursor=pointer]
+            - button [ref=f14e100] [cursor=pointer]
+            - button [ref=f14e106] [cursor=pointer]
+            - button [ref=f14e109] [cursor=pointer]
+            - button [ref=f14e115] [cursor=pointer]:
+              - button [ref=f14e117]
+            - button [ref=f14e401] [cursor=pointer]:
+              - generic [ref=f14e124]: 宸ヤ綔鍙�
+            - button [ref=f14e402] [cursor=pointer]:
+              - generic [ref=f14e126]: 鐞嗗憳
+        - generic [ref=f14e132]:
+          - generic [ref=f14e133]: 鍩虹鏁版嵁涓庝竴琚嬩竴鐮�
+          - generic [ref=f14e152]:
+            - button [ref=f14e153] [cursor=pointer]
+            - generic [ref=f14e160] [cursor=pointer]
+            - generic [ref=f14e164] [cursor=pointer]
+      - main [ref=f14e171]:
+        - generic [ref=f14e174]:
+          - generic [ref=f14e175]:
+            - generic [ref=f14e185] [cursor=pointer]:
+              - generic [ref=f14e186]: 鍝佺鎬绘暟
+              - generic [ref=f14e187]: "0"
+            - generic [ref=f14e198] [cursor=pointer]:
+              - generic [ref=f14e199]: MES 鍝佺
+              - generic [ref=f14e200]: "0"
+            - generic [ref=f14e211] [cursor=pointer]:
+              - generic [ref=f14e212]: 鍝佺鍒嗙被
+              - generic [ref=f14e213]: "0"
+            - generic [ref=f14e222] [cursor=pointer]:
+              - generic [ref=f14e223]: 璁¢噺鍗曚綅
+              - generic [ref=f14e224]: "0"
+          - generic [ref=f14e226]:
+            - generic [ref=f14e234] [cursor=pointer]:
+              - generic [ref=f14e235]: 浜х嚎
+              - generic [ref=f14e236]: "0"
+            - generic [ref=f14e248] [cursor=pointer]:
+              - generic [ref=f14e249]: 鐢熶骇鎵规
+              - generic [ref=f14e250]: "0"
+            - generic [ref=f14e259] [cursor=pointer]:
+              - generic [ref=f14e260]: 琚嬬爜
+              - generic [ref=f14e261]: "0"
+            - generic [ref=f14e272] [cursor=pointer]:
+              - generic [ref=f14e273]: 鎵樼洏鐮�
+              - generic [ref=f14e274]: "0"
+          - generic [ref=f14e276]:
+            - generic [ref=f14e280]:
+              - generic [ref=f14e281]: 琚嬬爜鐢熸垚瓒嬪娍
+              - generic [ref=f14e283]:
+                - generic [ref=f14e284] [cursor=pointer]: 杩� 7 澶�
+                - generic [ref=f14e287] [cursor=pointer]: 杩� 30 澶�
+            - generic [ref=f14e294]: 鎵规鐘舵�佸垎甯�
+            - generic [ref=f14e303]: 琚嬬爜鐘舵�佸垎甯�
+          - generic [ref=f14e312]:
+            - generic [ref=f14e313]: 蹇嵎鍏ュ彛
+            - generic [ref=f14e317]:
+              - generic [ref=f14e318]: 鐗╂枡绠$悊
+              - generic [ref=f14e326]: 鐢熶骇鐗╂枡
+              - generic [ref=f14e334]: 鍝佺鍒嗙被
+              - generic [ref=f14e342]: 璁¢噺鍗曚綅
+              - generic [ref=f14e348]: 浜х嚎缁存姢
+              - generic [ref=f14e354]: 鎵规鐢熶骇
+              - generic [ref=f14e363]: 璧嬬爜绠$悊
+              - generic [ref=f14e369]: 鎵樼洏鐮佺鐞�
+  - dialog [ref=f14e404]:
+    - heading "鎻愮ず" [level=2] [ref=f14e406]
+    - generic [ref=f14e408]: 鏄惁閫�鍑虹櫥褰曪紵
+    - generic [ref=f14e409]:
+      - button "鍙� 娑�" [ref=f14e410] [cursor=pointer]
+      - button "纭� 璁�" [ref=f14e412] [cursor=pointer]
+    - button [ref=f14e414] [cursor=pointer]
+  - menu "瓒呯骇绠$悊鍛� 鐞嗗憳" [ref=f14e377]:
+    - generic [ref=f14e378]:
+      - generic [ref=f14e379]:
+        - generic [ref=f14e380]: 鐞嗗憳
+        - generic [ref=f14e384]:
+          - generic [ref=f14e385]:
+            - text: 瓒呯骇绠$悊鍛�
+            - generic [ref=f14e386]: admin
+          - generic [ref=f14e387]: 13aoteman@126.com
+      - separator [ref=f14e388]
+      - menuitem "涓汉涓績" [ref=f14e389] [cursor=pointer]
+      - separator [ref=f14e390]
+      - menuitem "閿佸畾灞忓箷 Alt L" [ref=f14e391] [cursor=pointer]:
+        - text: 閿佸畾灞忓箷
+        - generic [ref=f14e392]: Alt L
+      - separator [ref=f14e393]
+      - menuitem "閫�鍑虹櫥褰� Alt Q" [active] [ref=f14e394] [cursor=pointer]:
+        - text: 閫�鍑虹櫥褰�
+        - generic [ref=f14e395]: Alt Q
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-32-09-962Z.yml b/.playwright-mcp/page-2026-08-19T02-32-09-962Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-32-09-962Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-32-18-582Z.yml b/.playwright-mcp/page-2026-08-19T02-32-18-582Z.yml
new file mode 100644
index 0000000..474e8d8
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-32-18-582Z.yml
@@ -0,0 +1,105 @@
+- generic [active] [ref=f15e4]:
+  - generic [ref=f15e403]:
+    - complementary [ref=f15e405]:
+      - generic [ref=f15e406]:
+        - generic [ref=f15e407] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f15e412] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f15e415]
+          - generic [ref=f15e416]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f15e419]:
+          - menuitem "鍩虹鏁版嵁涓庝竴琚嬩竴鐮�" [ref=f15e420] [cursor=pointer]
+          - listitem [ref=f15e425]:
+            - generic [ref=f15e426] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f15e434]:
+            - generic [ref=f15e435] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+          - listitem [ref=f15e441]:
+            - generic [ref=f15e442] [cursor=pointer]: 绯荤粺绠$悊
+        - generic [ref=f15e449] [cursor=pointer]
+    - generic [ref=f15e454]:
+      - generic [ref=f15e455]:
+        - banner [ref=f15e456]:
+          - button [ref=f15e457] [cursor=pointer]
+          - button [ref=f15e460] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f15e465]:
+            - list [ref=f15e466]:
+              - listitem [ref=f15e467]:
+                - link "鍩虹鏁版嵁涓庝竴琚嬩竴鐮�" [disabled] [ref=f15e468]
+          - generic [ref=f15e473]:
+            - generic [ref=f15e475] [cursor=pointer]:
+              - generic [ref=f15e479]: 鎼滅储
+              - generic [ref=f15e480]: Ctrl K
+            - button [ref=f15e482] [cursor=pointer]
+            - button "dark" [ref=f15e487] [cursor=pointer]
+            - button [ref=f15e496] [cursor=pointer]
+            - button [ref=f15e502] [cursor=pointer]
+            - button [ref=f15e505] [cursor=pointer]
+            - button [ref=f15e511] [cursor=pointer]:
+              - button [ref=f15e513]
+            - button "宸ヤ綔鍙�" [ref=f15e517] [cursor=pointer]
+            - button "鐞嗗憳" [ref=f15e521] [cursor=pointer]
+        - generic [ref=f15e528]:
+          - generic [ref=f15e529]: 鍩虹鏁版嵁涓庝竴琚嬩竴鐮�
+          - generic [ref=f15e548]:
+            - button [ref=f15e549] [cursor=pointer]
+            - generic [ref=f15e556] [cursor=pointer]
+            - generic [ref=f15e560] [cursor=pointer]
+      - main [ref=f15e567]:
+        - generic [ref=f15e570]:
+          - generic [ref=f15e571]:
+            - generic [ref=f15e581] [cursor=pointer]:
+              - generic [ref=f15e582]: 鍝佺鎬绘暟
+              - generic [ref=f15e583]: "0"
+            - generic [ref=f15e594] [cursor=pointer]:
+              - generic [ref=f15e595]: MES 鍝佺
+              - generic [ref=f15e596]: "0"
+            - generic [ref=f15e607] [cursor=pointer]:
+              - generic [ref=f15e608]: 鍝佺鍒嗙被
+              - generic [ref=f15e609]: "0"
+            - generic [ref=f15e618] [cursor=pointer]:
+              - generic [ref=f15e619]: 璁¢噺鍗曚綅
+              - generic [ref=f15e620]: "0"
+          - generic [ref=f15e622]:
+            - generic [ref=f15e630] [cursor=pointer]:
+              - generic [ref=f15e631]: 浜х嚎
+              - generic [ref=f15e632]: "0"
+            - generic [ref=f15e644] [cursor=pointer]:
+              - generic [ref=f15e645]: 鐢熶骇鎵规
+              - generic [ref=f15e646]: "0"
+            - generic [ref=f15e655] [cursor=pointer]:
+              - generic [ref=f15e656]: 琚嬬爜
+              - generic [ref=f15e657]: "0"
+            - generic [ref=f15e668] [cursor=pointer]:
+              - generic [ref=f15e669]: 鎵樼洏鐮�
+              - generic [ref=f15e670]: "0"
+          - generic [ref=f15e672]:
+            - generic [ref=f15e676]:
+              - generic [ref=f15e677]: 琚嬬爜鐢熸垚瓒嬪娍
+              - generic [ref=f15e679]:
+                - generic [ref=f15e680] [cursor=pointer]:
+                  - generic [ref=f15e681]:
+                    - radio "杩� 7 澶�" [checked]
+                  - generic [ref=f15e682]: 杩� 7 澶�
+                - generic [ref=f15e683] [cursor=pointer]:
+                  - generic [ref=f15e684]:
+                    - radio "杩� 30 澶�"
+                  - generic [ref=f15e685]: 杩� 30 澶�
+            - generic [ref=f15e690]: 鎵规鐘舵�佸垎甯�
+            - generic [ref=f15e699]: 琚嬬爜鐘舵�佸垎甯�
+          - generic [ref=f15e708]:
+            - generic [ref=f15e709]: 蹇嵎鍏ュ彛
+            - generic [ref=f15e713]:
+              - generic [ref=f15e714]: 鐗╂枡绠$悊
+              - generic [ref=f15e722]: 鐢熶骇鐗╂枡
+              - generic [ref=f15e730]: 鍝佺鍒嗙被
+              - generic [ref=f15e738]: 璁¢噺鍗曚綅
+              - generic [ref=f15e744]: 浜х嚎缁存姢
+              - generic [ref=f15e750]: 鎵规鐢熶骇
+              - generic [ref=f15e759]: 璧嬬爜绠$悊
+              - generic [ref=f15e765]: 鎵樼洏鐮佺鐞�
+  - generic [ref=f15e775]:
+    - generic [ref=f15e777]:
+      - img "check-circle" [ref=f15e778]
+      - generic [ref=f15e782]: 鐧诲綍鎴愬姛
+      - generic [ref=f15e783]: 娆㈣繋鍥炴潵:瓒呯骇绠$悊鍛�
+    - img "close" [ref=f15e786] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-33-50-857Z.yml b/.playwright-mcp/page-2026-08-19T02-33-50-857Z.yml
new file mode 100644
index 0000000..6adf37e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-33-50-857Z.yml
@@ -0,0 +1 @@
+- generic [active]: 宸ヤ笟AI鏅洪�犲钩鍙�
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-33-58-475Z.yml b/.playwright-mcp/page-2026-08-19T02-33-58-475Z.yml
new file mode 100644
index 0000000..111449e
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-33-58-475Z.yml
@@ -0,0 +1,102 @@
+- generic [active] [ref=f16e4]:
+  - generic [ref=f16e413]:
+    - complementary [ref=f16e415]:
+      - generic [ref=f16e416]:
+        - generic [ref=f16e417] [cursor=pointer]
+        - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f16e422] [cursor=pointer]:
+          - /url: javascript:void 0
+          - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f16e425]
+          - generic [ref=f16e426]: 宸ヤ笟AI鏅洪�犲钩鍙�
+        - menu [ref=f16e429]:
+          - menuitem "鍩虹鏁版嵁涓庝竴琚嬩竴鐮�" [ref=f16e430] [cursor=pointer]
+          - listitem [ref=f16e434]:
+            - generic [ref=f16e435] [cursor=pointer]: 鍩虹鏁版嵁
+          - listitem [ref=f16e440]:
+            - generic [ref=f16e441] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+          - listitem [ref=f16e446]:
+            - generic [ref=f16e447] [cursor=pointer]: 绯荤粺绠$悊
+        - generic [ref=f16e453] [cursor=pointer]
+    - generic [ref=f16e458]:
+      - generic [ref=f16e459]:
+        - banner [ref=f16e460]:
+          - button [ref=f16e461] [cursor=pointer]
+          - button [ref=f16e463] [cursor=pointer]
+          - navigation "breadcrumb" [ref=f16e468]:
+            - list [ref=f16e469]:
+              - listitem [ref=f16e470]:
+                - link "鍩虹鏁版嵁涓庝竴琚嬩竴鐮�" [disabled] [ref=f16e471]
+          - generic [ref=f16e475]:
+            - generic [ref=f16e477] [cursor=pointer]:
+              - generic [ref=f16e481]: 鎼滅储
+              - generic [ref=f16e482]: Ctrl K
+            - button [ref=f16e484] [cursor=pointer]
+            - button "dark" [ref=f16e489] [cursor=pointer]
+            - button [ref=f16e498] [cursor=pointer]
+            - button [ref=f16e504] [cursor=pointer]
+            - button [ref=f16e507] [cursor=pointer]
+            - button [ref=f16e513] [cursor=pointer]:
+              - button [ref=f16e515]
+            - button "宸ヤ綔鍙�" [ref=f16e519] [cursor=pointer]
+            - button [ref=f16e522] [cursor=pointer]:
+              - img "瓒呯骇绠$悊鍛�" [ref=f16e527]
+        - generic [ref=f16e529]:
+          - generic [ref=f16e530]: 鍩虹鏁版嵁涓庝竴琚嬩竴鐮�
+          - generic [ref=f16e548]:
+            - button [ref=f16e549] [cursor=pointer]
+            - generic [ref=f16e556] [cursor=pointer]
+            - generic [ref=f16e560] [cursor=pointer]
+      - main [ref=f16e567]:
+        - generic [ref=f16e570]:
+          - generic [ref=f16e571]:
+            - generic [ref=f16e578] [cursor=pointer]:
+              - generic [ref=f16e579]: 鍝佺鎬绘暟
+              - generic [ref=f16e580]: "0"
+            - generic [ref=f16e588] [cursor=pointer]:
+              - generic [ref=f16e589]: MES 鍝佺
+              - generic [ref=f16e590]: "0"
+            - generic [ref=f16e598] [cursor=pointer]:
+              - generic [ref=f16e599]: 鍝佺鍒嗙被
+              - generic [ref=f16e600]: "0"
+            - generic [ref=f16e608] [cursor=pointer]:
+              - generic [ref=f16e609]: 璁¢噺鍗曚綅
+              - generic [ref=f16e610]: "0"
+          - generic [ref=f16e612]:
+            - generic [ref=f16e619] [cursor=pointer]:
+              - generic [ref=f16e620]: 浜х嚎
+              - generic [ref=f16e621]: "0"
+            - generic [ref=f16e629] [cursor=pointer]:
+              - generic [ref=f16e630]: 鐢熶骇鎵规
+              - generic [ref=f16e631]: "0"
+            - generic [ref=f16e639] [cursor=pointer]:
+              - generic [ref=f16e640]: 琚嬬爜
+              - generic [ref=f16e641]: "0"
+            - generic [ref=f16e649] [cursor=pointer]:
+              - generic [ref=f16e650]: 鎵樼洏鐮�
+              - generic [ref=f16e651]: "0"
+          - generic [ref=f16e653]:
+            - generic [ref=f16e657]:
+              - generic [ref=f16e658]: 琚嬬爜鐢熸垚瓒嬪娍
+              - generic [ref=f16e660]:
+                - generic [ref=f16e661] [cursor=pointer]:
+                  - generic [ref=f16e662]:
+                    - radio "杩� 7 澶�" [checked]
+                  - generic [ref=f16e663]: 杩� 7 澶�
+                - generic [ref=f16e664] [cursor=pointer]:
+                  - generic [ref=f16e665]:
+                    - radio "杩� 30 澶�"
+                  - generic [ref=f16e666]: 杩� 30 澶�
+            - generic [ref=f16e671]: 鎵规鐘舵�佸垎甯�
+            - generic [ref=f16e680]: 琚嬬爜鐘舵�佸垎甯�
+          - generic [ref=f16e689]:
+            - generic [ref=f16e690]: 蹇嵎鍏ュ彛
+            - generic [ref=f16e694]:
+              - generic [ref=f16e695]: 鍝佺绠$悊
+              - generic [ref=f16e700]: 鍝佺鍒嗙被
+              - generic [ref=f16e705]: 鎵规鐢熶骇
+              - generic [ref=f16e710]: 璧嬬爜绠$悊
+  - generic [ref=f16e717]:
+    - generic [ref=f16e719]:
+      - img "check-circle" [ref=f16e720]
+      - generic [ref=f16e724]: 鐧诲綍鎴愬姛
+      - generic [ref=f16e725]: 娆㈣繋鍥炴潵:瓒呯骇绠$悊鍛�
+    - img "close" [ref=f16e728] [cursor=pointer]
\ No newline at end of file
diff --git a/.playwright-mcp/page-2026-08-19T02-34-08-855Z.yml b/.playwright-mcp/page-2026-08-19T02-34-08-855Z.yml
new file mode 100644
index 0000000..fa1daf3
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-19T02-34-08-855Z.yml
@@ -0,0 +1,105 @@
+- generic [ref=f16e413]:
+  - complementary [ref=f16e415]:
+    - generic [ref=f16e416]:
+      - generic [ref=f16e417] [cursor=pointer]
+      - link "宸ヤ笟AI鏅洪�犲钩鍙� 宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f16e422] [cursor=pointer]:
+        - /url: javascript:void 0
+        - img "宸ヤ笟AI鏅洪�犲钩鍙�" [ref=f16e425]
+        - generic [ref=f16e426]: 宸ヤ笟AI鏅洪�犲钩鍙�
+      - menu [ref=f16e429]:
+        - menuitem "鍩虹鏁版嵁涓庝竴琚嬩竴鐮�" [ref=f16e430] [cursor=pointer]
+        - listitem [ref=f16e434]:
+          - generic [ref=f16e435] [cursor=pointer]: 鍩虹鏁版嵁
+          - list:
+            - menuitem "鍝佺绠$悊" [ref=f16e771] [cursor=pointer]
+            - menuitem "鍝佺鍒嗙被" [ref=f16e778] [cursor=pointer]
+            - menuitem "璁¢噺鍗曚綅" [ref=f16e783] [cursor=pointer]
+        - listitem [ref=f16e440]:
+          - generic [ref=f16e441] [cursor=pointer]: 涓�琚嬩竴鐮佺鐞�
+        - listitem [ref=f16e446]:
+          - generic [ref=f16e447] [cursor=pointer]: 绯荤粺绠$悊
+      - generic [ref=f16e453] [cursor=pointer]
+  - generic [ref=f16e458]:
+    - generic [ref=f16e459]:
+      - banner [ref=f16e460]:
+        - button [ref=f16e461] [cursor=pointer]
+        - button [ref=f16e463] [cursor=pointer]
+        - navigation "breadcrumb" [ref=f16e468]:
+          - list [ref=f16e469]:
+            - listitem [ref=f16e788]:
+              - link "鍩虹鏁版嵁" [ref=f16e789] [cursor=pointer]:
+                - /url: javascript:void 0
+              - listitem [ref=f16e795]
+            - listitem [ref=f16e798]:
+              - link "鍝佺绠$悊" [disabled] [ref=f16e799]
+        - generic [ref=f16e475]:
+          - generic [ref=f16e477] [cursor=pointer]:
+            - generic [ref=f16e481]: 鎼滅储
+            - generic [ref=f16e482]: Ctrl K
+          - button [ref=f16e484] [cursor=pointer]
+          - button "dark" [ref=f16e489] [cursor=pointer]
+          - button [ref=f16e498] [cursor=pointer]
+          - button [ref=f16e504] [cursor=pointer]
+          - button [ref=f16e507] [cursor=pointer]
+          - button [ref=f16e513] [cursor=pointer]:
+            - button [ref=f16e515]
+          - button "宸ヤ綔鍙�" [ref=f16e519] [cursor=pointer]
+          - button [ref=f16e522] [cursor=pointer]:
+            - img "瓒呯骇绠$悊鍛�" [ref=f16e527]
+      - generic [ref=f16e529]:
+        - generic [ref=f16e534]:
+          - generic [ref=f16e535] [cursor=pointer]: 鍩虹鏁版嵁涓庝竴琚嬩竴鐮�
+          - generic [ref=f16e808] [cursor=pointer]: 鍝佺绠$悊
+        - generic [ref=f16e548]:
+          - button [ref=f16e549] [cursor=pointer]
+          - generic [ref=f16e556] [cursor=pointer]
+          - generic [ref=f16e560] [cursor=pointer]
+    - main [ref=f16e567]:
+      - generic [ref=f16e570]:
+        - generic [ref=f16e571]:
+          - generic [ref=f16e578] [cursor=pointer]:
+            - generic [ref=f16e579]: 鍝佺鎬绘暟
+            - generic [ref=f16e580]: "0"
+          - generic [ref=f16e588] [cursor=pointer]:
+            - generic [ref=f16e589]: MES 鍝佺
+            - generic [ref=f16e590]: "0"
+          - generic [ref=f16e598] [cursor=pointer]:
+            - generic [ref=f16e599]: 鍝佺鍒嗙被
+            - generic [ref=f16e600]: "1"
+          - generic [ref=f16e608] [cursor=pointer]:
+            - generic [ref=f16e609]: 璁¢噺鍗曚綅
+            - generic [ref=f16e610]: "0"
+        - generic [ref=f16e612]:
+          - generic [ref=f16e619] [cursor=pointer]:
+            - generic [ref=f16e620]: 浜х嚎
+            - generic [ref=f16e621]: "0"
+          - generic [ref=f16e629] [cursor=pointer]:
+            - generic [ref=f16e630]: 鐢熶骇鎵规
+            - generic [ref=f16e631]: "0"
+          - generic [ref=f16e639] [cursor=pointer]:
+            - generic [ref=f16e640]: 琚嬬爜
+            - generic [ref=f16e641]: "0"
+          - generic [ref=f16e649] [cursor=pointer]:
+            - generic [ref=f16e650]: 鎵樼洏鐮�
+            - generic [ref=f16e651]: "0"
+        - generic [ref=f16e653]:
+          - generic [ref=f16e657]:
+            - generic [ref=f16e658]: 琚嬬爜鐢熸垚瓒嬪娍
+            - generic [ref=f16e660]:
+              - generic [ref=f16e661] [cursor=pointer]:
+                - generic [ref=f16e662]:
+                  - radio "杩� 7 澶�" [checked]
+                - generic [ref=f16e663]: 杩� 7 澶�
+              - generic [ref=f16e664] [cursor=pointer]:
+                - generic [ref=f16e665]:
+                  - radio "杩� 30 澶�"
+                - generic [ref=f16e666]: 杩� 30 澶�
+          - generic [ref=f16e671]: 鎵规鐘舵�佸垎甯�
+          - generic [ref=f16e680]: 琚嬬爜鐘舵�佸垎甯�
+        - generic [ref=f16e689]:
+          - generic [ref=f16e690]: 蹇嵎鍏ュ彛
+          - generic [ref=f16e694]:
+            - generic [ref=f16e695]: 鍝佺绠$悊
+            - generic [ref=f16e700]: 鍝佺鍒嗙被
+            - generic [ref=f16e705]: 鎵规鐢熶骇
+            - generic [ref=f16e710]: 璧嬬爜绠$悊
\ No newline at end of file
diff --git a/docs/mes_bag_code_module_decouple.md b/docs/mes_bag_code_module_decouple.md
new file mode 100644
index 0000000..b0b8984
--- /dev/null
+++ b/docs/mes_bag_code_module_decouple.md
@@ -0,0 +1,69 @@
+# 涓�琚嬩竴鐮佺鐞嗘ā鍧楃嫭绔嬶紙鎵规/璧嬬爜/鎵樼洏鍘诲叧鑱旓級 - 鍓嶇鑱旇皟鏂规
+
+> 鈿狅笍 **鏈枃妗i儴鍒嗚繃鏃�**锛氭壒娆″凡鎭㈠鍝佺锛圡DM 鐗╂枡锛夊叧鑱旓紝骞舵柊澧炰骇绾跨淮鎶ゆā鍧楋紝
+> 鎵规浜х嚎鐢辨墜濉敼涓轰笅鎷夐�夋嫨锛屾渶鏂版帴鍙d互 `mes_pro_line_and_item_restore.md` 涓哄噯銆�
+> 鏈枃妗d腑鍏充簬璧嬬爜绠$悊銆佹墭鐩樼爜绠$悊銆佽彍鍗曠粨鏋勩�佹壒娆″彿瑙勫垯浠ュ鐨勫唴瀹逛粛鐒舵湁鏁堛��
+
+> 鏈枃妗d负鍙樻洿璇存槑锛屽彇浠� `mes_pro_batch_bag_code_integration.md` 涓秹鍙婂搧绉嶃�佽澶囥�佸伐鍗曞叧鑱旂殑閮ㄥ垎銆�
+
+## 鍙樻洿鑳屾櫙
+
+灏�**鎵规鐢熶骇绠$悊銆佽祴鐮佺鐞嗐�佹墭鐩樼爜绠$悊**浠庛�岀敓浜х鎺� 鈫� 鐢熶骇绠$悊銆嶄腑鎻愬彇涓虹嫭绔嬬殑椤剁骇妯″潡鑿滃崟锛�
+妯″潡鍐�**闄ょ敓浜т汉鍛橈紙璐d换浜� + 鐢熶骇浜哄憳閰嶇疆锛夊锛屼笉鍐嶄笌鍏朵粬妯″潡锛堝搧绉嶇墿鏂欍�佺敓浜ц澶囥�佺敓浜у伐鍗曪級浜х敓浠讳綍鍏宠仈**銆�
+
+## 娑夊強椤甸潰
+
+- **涓�琚嬩竴鐮佺鐞嗭紙鏂板椤剁骇鑿滃崟锛�** 鈫� 鎵规鐢熶骇绠$悊
+- **涓�琚嬩竴鐮佺鐞�** 鈫� 璧嬬爜绠$悊
+- **涓�琚嬩竴鐮佺鐞�** 鈫� 鎵樼洏鐮佺鐞�
+
+鑿滃崟浣嶇疆鍙樺寲锛氫笁涓〉闈㈢敱銆岀敓浜х鎺� 鈫� 鐢熶骇绠$悊銆嶈縼绉昏嚦椤剁骇鐩綍銆屼竴琚嬩竴鐮佺鐞嗐�嶏紙璺敱 `/bagcode/batch`銆乣/bagcode/bag-code`銆乣/bagcode/pallet`锛夛紝缁勪欢璺緞涓庢潈闄愭爣璇嗗潎涓嶅彉銆�
+
+## 鍚庣绉婚櫎鐨勫瓧娈�
+
+### 鐢熶骇鎵规锛�/mes/pro/batch/*锛�
+
+| 浣嶇疆 | 绉婚櫎瀛楁 |
+|------|----------|
+| 鍒涘缓/鏇存柊璇锋眰锛圫aveReqVO锛� | itemId銆乵achineryId銆亀orkOrderId |
+| 鍝嶅簲锛圧espVO锛� | itemId銆乮temCode銆乮temName銆乮temSpecification銆乵achineryId銆乵achineryCode銆乵achineryName銆亀orkOrderId銆亀orkOrderCode |
+| 鍒嗛〉鏌ヨ鍙傛暟锛圥ageReqVO锛� | itemId銆乵achineryId銆亀orkOrderId |
+
+淇濈暀瀛楁锛歝ode銆乴ineCode銆乴ineName銆乸roduceDate銆乸lanQuantity銆乷wnerUserId锛�+ ownerUserName锛夈�乥agQuantity銆乸alletQuantity銆乻tatus銆乺emark銆亀orkers銆�
+
+### 琚嬬爜锛�/mes/pro/bag-code/*锛�
+
+| 浣嶇疆 | 绉婚櫎瀛楁 |
+|------|----------|
+| 琚嬬爜鍝嶅簲锛圧espVO锛� | itemId銆乮temCode銆乮temName銆乮temSpecification |
+| 鎵爜杩芥函鍝嶅簲锛圱raceRespVO锛� | itemId銆乮temCode銆乮temName銆乮temSpecification |
+
+### 鎵樼洏鐮侊紙/mes/pro/pallet/*锛�
+
+鏃犲瓧娈靛彉鍖栵紙鍘熸湰浠呭叧鑱旀壒娆★級銆�
+
+## 鎵规鍙风敓鎴愯鍒欒皟鏁�
+
+| 椤圭洰 | 鍙樻洿鍓� | 鍙樻洿鍚� |
+|------|--------|--------|
+| 缂栫爜缁撴瀯 | 鍓嶇紑 PC + 鏃ユ湡 + **浜х嚎缂栫爜+鍝佺缂栫爜** + 娴佹按鍙� | 鍓嶇紑 PC + 鏃ユ湡 + **浜х嚎缂栫爜** + 娴佹按鍙� |
+| 杈撳叆瀛楃鏉ユ簮 | lineCode + itemCode 鎷兼帴 | 浠� lineCode |
+| 閲嶆柊鐢熸垚瑙﹀彂鏉′欢 | 浜х嚎鎴栧搧绉嶅彉鍖� | 浠呬骇绾跨紪鐮佸彉鍖� |
+
+鎵规绀轰緥锛歚PC20260818L01001`锛涘搴旇鐮佺ず渚嬶細`PC20260818L01001-0001`銆�
+
+## 涓氬姟瑙勫垯璇存槑
+
+| 鍦烘櫙 | 瑙勫垯 |
+|------|------|
+| 鏂板鎵规 | 鎵嬪~浜х嚎缂栫爜/鍚嶇О 鈫� 閫夌敓浜ф棩鏈熴�佽矗浠讳汉 鈫� 閰嶇疆鐢熶骇浜哄憳锛堣嚦灏� 1 浜猴級锛屼繚瀛樺悗鑷姩鐢熸垚鎵规鍙� |
+| 鎵规涓嬫媺閫夐」 | 琚嬬爜/鎵樼洏鐢熸垚寮圭獥涓壒娆′笅鎷変粎鏄剧ず鎵规鍙凤紙涓嶅啀鎷兼帴鍝佺鍚嶇О锛� |
+| 鎵爜杩芥函 | 灞曠ず琚嬬爜銆佹壒娆°�佷骇绾裤�佽矗浠讳汉銆佹墭鐩樹俊鎭紝涓嶅啀灞曠ず鍝佺淇℃伅 |
+| 鏁版嵁鏉冮檺 | 璐d换浜轰笌鐢熶骇浜哄憳鍧囧叧鑱� system_users锛屾部鐢ㄥ師鏈夌敤鎴蜂綋绯� |
+
+## 娉ㄦ剰浜嬮」
+
+- 鏁版嵁搴撳凡鍒犻櫎 `mes_pro_batch.item_id / machinery_id / work_order_id`銆乣mes_pro_bag_code.item_id` 鍒楋紝鏃ф暟鎹棤锛堣〃涓虹┖锛夛紝鏃犻渶杩佺Щ銆�
+- 鍓嶇琛ㄥ崟銆佸垪琛ㄣ�佹悳绱€�佽鎯呬腑鐨勫搧绉�/璁惧/宸ュ崟瀛楁宸插叏閮ㄧЩ闄わ紝鎵规鍙疯緭鍏ュ瓧绗﹂暱搴︾害鏉熺敱銆屼骇绾�+鍝佺銆嶇缉鍑忎负銆屼骇绾裤�嶏紙寤鸿浜х嚎缂栫爜闀垮害 鈮� 8锛夈��
+- 鏉冮檺鏍囪瘑涓嶅彉锛歚mes:pro-batch:*`銆乣mes:pro-bag-code:*`銆乣mes:pro-pallet:*`銆�
+- 鎺ュ彛璺緞涓嶅彉锛屼粎璇锋眰/鍝嶅簲瀛楁缂╁噺锛屽墠绔凡瀹屾垚鍚屾鏀归�犲苟閫氳繃绫诲瀷妫�鏌ャ��
diff --git a/docs/mes_pro_batch_bag_code_integration.md b/docs/mes_pro_batch_bag_code_integration.md
new file mode 100644
index 0000000..0ee97b4
--- /dev/null
+++ b/docs/mes_pro_batch_bag_code_integration.md
@@ -0,0 +1,268 @@
+# 鐢熶骇鎵规涓庤祴鐮佺鐞嗭紙涓�琚嬩竴鐮侊級 - 鍓嶇鑱旇皟鏂规
+
+> 鈿狅笍 **鏈枃妗e凡杩囨椂**锛氫笁涓〉闈㈠凡鎻愬彇涓虹嫭绔嬮《绾фā鍧椼�屼竴琚嬩竴鐮佺鐞嗐�嶏紝骞剁Щ闄ゅ搧绉嶃�佽澶囥�佸伐鍗曞叧鑱旓紝
+> 鏈�鏂版帴鍙d互 `mes_bag_code_module_decouple.md` 涓哄噯銆�
+
+## 鍔熻兘姒傝堪
+
+1. **鎵规鐢熶骇绠$悊**锛氬綍鍏ョ敓浜ф壒娆★紙浜衡�旀満鈥旂鍏ㄧ幆鑺傛暟瀛楀寲瀵规帴锛夛紝閰嶇疆鐢熶骇浜哄憳锛堣矗浠昏惤瀹炲埌浜猴級锛屾壒娆″彿鑷姩鐢熸垚锛堢紪鐮佽鍒欙細鍓嶇紑 PC + 鏃ユ湡 + 浜х嚎 + 鍝佺 + 娴佹按鍙凤級銆�
+2. **璧嬬爜绠$悊锛堜竴琚嬩竴鐮侊級**锛氭牴鎹壒娆′俊鎭嚜鍔ㄧ敓鎴愬敮涓�浜岀淮鐮佹暟鎹寘锛堣鐮侊級锛屾敮鎸佹壒閲忓鍑轰氦浠樺嵃鍒凤紱浜岀淮鐮佸唴瀹逛负琚嬬爜瀛楃涓诧紝鎵爜鍚庡彲鍙嶆煡鎵规銆佸搧绉嶃�佷骇绾裤�佺敓浜ф棩鏈熴�佽矗浠讳汉銆�
+3. **鎵樼洏鐮佺鐞�**锛氭寜鎵规鎵归噺鐢熸垚鎵樼洏鐮侊紙鎵规鍙�-P+搴忓彿锛夛紝琚嬬爜鍙粦瀹�/瑙g粦鍒版墭鐩樸��
+
+## 娑夊強椤甸潰
+
+- 鐢熶骇绠℃帶 鈫� 鐢熶骇绠$悊 鈫� **鎵规鐢熶骇绠$悊**锛堟柊澧為〉闈細鍒楄〃 + 鏂板/缂栬緫琛ㄥ崟 + 璇︽儏锛�
+- 鐢熶骇绠℃帶 鈫� 鐢熶骇绠$悊 鈫� **璧嬬爜绠$悊**锛堟柊澧為〉闈細琚嬬爜鍒楄〃 + 鐢熸垚鏁版嵁鍖呭脊绐� + 鎵爜杩芥函锛�
+- 鐢熶骇绠℃帶 鈫� 鐢熶骇绠$悊 鈫� **鎵樼洏鐮佺鐞�**锛堟柊澧為〉闈細鎵樼洏鍒楄〃 + 鎵归噺鐢熸垚寮圭獥锛�
+
+## 涓氬姟娴佺▼涓庢暟鎹甫鍏�
+
+1. **鏂板鎵规**锛氶�夋嫨鍝佺锛堢墿鏂欙級鈫� 鎵嬪~浜х嚎缂栫爜/鍚嶇О 鈫� 鍙�夎澶囥�佸伐鍗� 鈫� 閫夌敓浜ф棩鏈熴�佽矗浠讳汉 鈫� 閰嶇疆鐢熶骇浜哄憳锛堣嚦灏� 1 浜猴級銆備繚瀛樺悗**鎵规鍙疯嚜鍔ㄧ敓鎴�**锛屾棤闇�濉啓銆�
+2. **鎵规 鈫� 琚嬬爜鐢熸垚**锛氱敓鎴愯鐮佹椂鍙渶浼犲叆 `batchId` 鍜岃鏁帮紝鎵规鍙枫�佸搧绉嶇瓑淇℃伅鐢卞悗绔嚜鍔ㄥ甫鍏ヨ鐮佽褰曘��
+3. **鎵规 鈫� 鎵樼洏鐮佺敓鎴�**锛氱敓鎴愭墭鐩樼爜鏃跺彧闇�浼犲叆 `batchId`銆佹暟閲忋�佸彲瑁呰鏁帮紝鎵规鍙疯嚜鍔ㄥ甫鍏ャ��
+4. **琚嬬爜 鈫� 鎵樼洏缁戝畾**锛氬厛閫夋壒娆″啀閫夋墭鐩橈紙鎵樼洏涓嬫媺鐢� `GET /mes/pro/pallet/simple-list?batchId=` 鑾峰彇锛屽彧灞曠ず璇ユ壒娆$殑鎵樼洏锛夛紝鍕鹃�夎鐮佸悗缁戝畾銆�
+5. **鎵爜杩芥函**锛氭壂鍑虹殑浜岀淮鐮佸唴瀹瑰嵆琚嬬爜瀛楃涓诧紝鐩存帴浣滀负 `code` 鍙傛暟璋� `GET /mes/pro/bag-code/get-by-code` 鍙嶆煡鍏ㄩ儴淇℃伅銆�
+
+## 鎵规鐘舵�佹祦杞�
+
+| 褰撳墠鐘舵�� | 鍙祦杞埌 | 璇存槑 |
+|----------|----------|------|
+| 10 鑽夌 | 20 鐢熶骇涓��40 宸蹭綔搴� | 鍒涘缓鍚庡垵濮嬩负鑽夌 |
+| 20 鐢熶骇涓� | 30 宸插畬鎴愩��40 宸蹭綔搴� | 鍙湁鐢熶骇涓墠鑳界敓鎴愯鐮�/鎵樼洏鐮� |
+| 30 宸插畬鎴� | 鈥� | 缁堟�� |
+| 40 宸蹭綔搴� | 鈥� | 缁堟�� |
+
+瀛楀吀绫诲瀷锛歚mes_pro_batch_status`銆�
+
+## API 涓�锛氱敓浜ф壒娆★紙鏉冮檺鍓嶇紑 `mes:pro-batch`锛�
+
+| 鏂规硶 | 璺緞 | 璇存槑 | 鏉冮檺 |
+|------|------|------|------|
+| POST | /mes/pro/batch/create | 鍒涘缓鎵规锛堣嚜鍔ㄧ敓鎴愭壒娆″彿锛� | mes:pro-batch:create |
+| PUT | /mes/pro/batch/update | 鏇存柊鎵规锛堝惈浜哄憳閰嶇疆閲嶅缓锛� | mes:pro-batch:update |
+| DELETE | /mes/pro/batch/delete | 鍒犻櫎鎵规 | mes:pro-batch:delete |
+| PUT | /mes/pro/batch/update-status | 鏇存柊鎵规鐘舵�� | mes:pro-batch:update |
+| GET | /mes/pro/batch/get | 鎵规璇︽儏锛堝惈浜哄憳閰嶇疆锛� | mes:pro-batch:query |
+| GET | /mes/pro/batch/page | 鎵规鍒嗛〉 | mes:pro-batch:query |
+| GET | /mes/pro/batch/simple-list | 鎵规绮剧畝鍒楄〃锛堜緵涓嬫媺閫夋嫨锛� | mes:pro-batch:query |
+| GET | /mes/pro/batch/export-excel | 瀵煎嚭鎵规 Excel | mes:pro-batch:export |
+
+### 鍒涘缓/鏇存柊璇锋眰鍙傛暟锛圥OST /create銆丳UT /update锛�
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| id | Long | 鏇存柊鏃跺繀濉� | 鎵规缂栧彿 |
+| itemId | Long | 鏄� | 鍝佺锛堜骇鍝佺墿鏂欙級缂栧彿锛屼笅鎷夐�夌墿鏂� |
+| lineCode | String | 鏄� | 浜х嚎缂栫爜锛堟墜濉紝鍙備笌鎵规鍙风敓鎴愶紝寤鸿闄愬埗闀垮害 鈮� 4锛� |
+| lineName | String | 鍚� | 浜х嚎鍚嶇О锛堟墜濉級 |
+| machineryId | Long | 鍚� | 鐢熶骇璁惧缂栧彿 |
+| workOrderId | Long | 鍚� | 鍏宠仈鐢熶骇宸ュ崟缂栧彿 |
+| produceDate | String | 鏄� | 鐢熶骇鏃ユ湡锛屾牸寮� yyyy-MM-dd HH:mm:ss |
+| planQuantity | Number | 鍚� | 璁″垝鏁伴噺 |
+| ownerUserId | Long | 鏄� | 璐d换浜虹敤鎴风紪鍙凤紙璐d换钀藉疄鍒颁汉锛� |
+| remark | String | 鍚� | 澶囨敞 |
+| workers | Array | 鏄� | 鐢熶骇浜哄憳閰嶇疆锛岃嚦灏� 1 鏉� |
+| workers[].userId | Long | 鏄� | 鐢熶骇浜哄憳鐢ㄦ埛缂栧彿 |
+| workers[].workerType | Integer | 鏄� | 宀椾綅绫诲瀷锛堝瓧鍏� mes_pro_batch_worker_type锛�10 缁勯暱/20 鎿嶄綔宸�/30 鍖呰宸�/40 璐ㄦ鍛�/50 鍏朵粬锛� |
+| workers[].remark | String | 鍚� | 澶囨敞 |
+
+### 鍒嗛〉鏌ヨ鍙傛暟锛圙ET /page锛�
+
+| 鍙傛暟 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| code | String | 鎵规鍙凤紙妯$硦锛� |
+| itemId | Long | 鍝佺缂栧彿 |
+| lineCode / lineName | String | 浜х嚎缂栫爜/鍚嶇О锛堟ā绯婏級 |
+| machineryId | Long | 璁惧缂栧彿 |
+| workOrderId | Long | 宸ュ崟缂栧彿 |
+| ownerUserId | Long | 璐d换浜虹紪鍙� |
+| status | Integer | 鎵规鐘舵�侊紙瀛楀吀 mes_pro_batch_status锛� |
+| produceDate | Array | 鐢熶骇鏃ユ湡鑼冨洿 [寮�濮�, 缁撴潫] |
+| createTime | Array | 鍒涘缓鏃堕棿鑼冨洿 |
+| pageNo / pageSize | Integer | 鍒嗛〉鍙傛暟 |
+
+### 鏇存柊鐘舵�佸弬鏁帮紙PUT /update-status锛�
+
+Query 鍙傛暟锛歚id`锛堟壒娆$紪鍙凤級銆乣status`锛堢洰鏍囩姸鎬侊級銆�
+
+### 鍝嶅簲瀛楁锛堝垪琛�/璇︽儏锛�
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| id | Long | 缂栧彿 |
+| code | String | 鎵规鍙凤紙鑷姩鐢熸垚锛屽 PC20260818L01NY001锛� |
+| itemId / itemCode / itemName / itemSpecification | 鈥� | 鍝佺缂栧彿/缂栫爜/鍚嶇О/瑙勬牸锛堝悗绔嫾鎺ワ級 |
+| lineCode / lineName | String | 浜х嚎缂栫爜/鍚嶇О |
+| machineryId / machineryCode / machineryName | 鈥� | 璁惧缂栧彿/缂栫爜/鍚嶇О锛堝悗绔嫾鎺ワ級 |
+| workOrderId / workOrderCode | 鈥� | 宸ュ崟缂栧彿/缂栫爜锛堝悗绔嫾鎺ワ級 |
+| produceDate | String | 鐢熶骇鏃ユ湡 |
+| planQuantity | Number | 璁″垝鏁伴噺 |
+| ownerUserId / ownerUserName | 鈥� | 璐d换浜虹紪鍙�/鏄电О锛堝悗绔嫾鎺ワ級 |
+| bagQuantity | Integer | 宸茬敓鎴愯鐮佹暟閲� |
+| palletQuantity | Integer | 宸茬敓鎴愭墭鐩樼爜鏁伴噺 |
+| status | Integer | 鎵规鐘舵�侊紙瀛楀吀 mes_pro_batch_status锛� |
+| remark | String | 澶囨敞 |
+| createTime | String | 鍒涘缓鏃堕棿 |
+| workers | Array | 浜哄憳閰嶇疆鍒楄〃锛堜粎 GET /get 璇︽儏杩斿洖锛� |
+| workers[].id / batchId / userId / userName / workerType / remark | 鈥� | 浜哄憳閰嶇疆鏄庣粏锛坲serName 鍚庣鎷兼帴锛� |
+
+## API 浜岋細琚嬬爜璧嬬爜锛堟潈闄愬墠缂� `mes:pro-bag-code`锛�
+
+| 鏂规硶 | 璺緞 | 璇存槑 | 鏉冮檺 |
+|------|------|------|------|
+| POST | /mes/pro/bag-code/generate | 鐢熸垚琚嬬爜鏁版嵁鍖� | mes:pro-bag-code:create |
+| DELETE | /mes/pro/bag-code/delete-by-uuid | 鍒犻櫎鐢熸垚缁勶紙鏁寸粍鍒犻櫎锛� | mes:pro-bag-code:delete |
+| PUT | /mes/pro/bag-code/bind-pallet | 琚嬬爜缁戝畾鎵樼洏 | mes:pro-bag-code:update |
+| PUT | /mes/pro/bag-code/unbind-pallet | 琚嬬爜瑙g粦鎵樼洏 | mes:pro-bag-code:update |
+| GET | /mes/pro/bag-code/get | 琚嬬爜璇︽儏 | mes:pro-bag-code:query |
+| GET | /mes/pro/bag-code/get-by-code | 鎵爜杩芥函锛堟寜琚嬬爜鍙嶆煡锛� | mes:pro-bag-code:query |
+| GET | /mes/pro/bag-code/page | 琚嬬爜鍒嗛〉 | mes:pro-bag-code:query |
+| GET | /mes/pro/bag-code/list-by-uuid | 鐢熸垚缁勭殑琚嬬爜鍒楄〃 | mes:pro-bag-code:query |
+| GET | /mes/pro/bag-code/export-excel | 鎵归噺瀵煎嚭锛堜氦浠樺嵃鍒凤級 | mes:pro-bag-code:export |
+
+### 鐢熸垚鏁版嵁鍖咃紙POST /generate锛�
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| batchId | Long | 鏄� | 鐢熶骇鎵规缂栧彿锛堟壒娆¢』涓�"鐢熶骇涓�"鐘舵�侊級 |
+| count | Integer | 鏄� | 鏈鐢熸垚琚嬫暟锛堟墜鍔ㄨ緭鍏ワ紝蹇呴』澶т簬 0锛� |
+| remark | String | 鍚� | 澶囨敞 |
+
+鍝嶅簲 `data` 涓虹敓鎴愮粍 UUID锛堝瓧绗︿覆锛夛紝鍚屼竴娆$敓鎴愮殑琚嬬爜鍏变韩璇� UUID銆�
+
+### 鍒犻櫎鐢熸垚缁勶紙DELETE /delete-by-uuid锛�
+
+Query 鍙傛暟锛歚uuid`銆備粎褰撶粍鍐呰鐮佸叏閮ㄤ负"宸茬敓鎴�"鐘舵�佷笖鏈粦瀹氭墭鐩樻椂鍏佽銆�
+
+### 缁戝畾/瑙g粦鎵樼洏锛圥UT /bind-pallet銆丳UT /unbind-pallet锛�
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| palletId | Long | 鏄� | 鎵樼洏缂栧彿 |
+| ids | Array<Long> | 鏄� | 琚嬬爜缂栧彿鍒楄〃 |
+
+### 鍒嗛〉鏌ヨ鍙傛暟锛圙ET /page锛�
+
+| 鍙傛暟 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| code | String | 琚嬬爜锛堟ā绯婏級 |
+| batchId | Long | 鎵规缂栧彿 |
+| batchCode | String | 鎵规鍙凤紙妯$硦锛� |
+| uuid | String | 鐢熸垚缁� UUID |
+| palletId | Long | 鎵樼洏缂栧彿 |
+| status | Integer | 琚嬬爜鐘舵�侊紙瀛楀吀 mes_pro_bag_code_status锛� |
+| createTime | Array | 鍒涘缓鏃堕棿鑼冨洿 |
+
+### 琚嬬爜鍝嶅簲瀛楁锛堝垪琛�/璇︽儏锛�
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| id | Long | 缂栧彿 |
+| uuid | String | 鐢熸垚缁� UUID |
+| code | String | 琚嬬爜锛堜簩缁寸爜鍐呭锛屽 PC20260818L01NY001-0001锛� |
+| bagNo | Integer | 鎵规鍐呰搴忓彿 |
+| batchId / batchCode | 鈥� | 鎵规缂栧彿/鎵规鍙� |
+| itemId / itemCode / itemName / itemSpecification | 鈥� | 鍝佺缂栧彿/缂栫爜/鍚嶇О/瑙勬牸锛堝悗绔嫾鎺ワ級 |
+| lineCode / lineName | String | 浜х嚎缂栫爜/鍚嶇О锛堝悗绔嫾鎺ワ級 |
+| palletId / palletCode | 鈥� | 缁戝畾鎵樼洏缂栧彿/鎵樼洏鐮侊紙鏈粦瀹氫负 null锛� |
+| status | Integer | 鐘舵�侊紙瀛楀吀 mes_pro_bag_code_status锛�10 宸茬敓鎴�/20 宸插鍑哄嵃鍒�/30 宸蹭綔搴燂級 |
+| printTime | String | 瀵煎嚭锛堜氦浠樺嵃鍒凤級鏃堕棿 |
+| createTime | String | 鍒涘缓鏃堕棿 |
+
+### 鎵爜杩芥函鍝嶅簲瀛楁锛圙ET /get-by-code锛�
+
+Query 鍙傛暟锛歚code`锛堣鐮佸瓧绗︿覆锛屽嵆浜岀淮鐮佹壂鍑虹殑鍐呭锛夈�備笉瀛樺湪鏃惰繑鍥為敊璇爜 1040752000銆�
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| id / code / bagNo / status / printTime | 鈥� | 琚嬬爜淇℃伅 |
+| batchId / batchCode / batchStatus / produceDate | 鈥� | 鎵规淇℃伅 |
+| lineCode / lineName | String | 浜х嚎 |
+| ownerUserId / ownerUserName | 鈥� | 璐d换浜� |
+| itemId / itemCode / itemName / itemSpecification | 鈥� | 鍝佺淇℃伅 |
+| palletId / palletCode | 鈥� | 缁戝畾鎵樼洏淇℃伅 |
+
+### 鎵归噺瀵煎嚭锛圙ET /export-excel锛�
+
+鍙傛暟鍚屽垎椤垫煡璇紙寤鸿鎸� `batchId` 鎴� `uuid` 杩囨护瀵煎嚭鎸囧畾鏁版嵁鍖咃級銆�**瀵煎嚭鍚庯紝鍚庣鑷姩灏嗗鍑虹殑"宸茬敓鎴�"鐘舵�佽鐮佹爣璁颁负"宸插鍑哄嵃鍒�"骞惰褰曞鍑烘椂闂�**锛屽墠绔鍑烘垚鍔熷悗搴斿埛鏂板垪琛ㄧ姸鎬併��
+
+## API 涓夛細鎵樼洏鐮侊紙鏉冮檺鍓嶇紑 `mes:pro-pallet`锛�
+
+| 鏂规硶 | 璺緞 | 璇存槑 | 鏉冮檺 |
+|------|------|------|------|
+| POST | /mes/pro/pallet/batch-create | 鎵归噺鐢熸垚鎵樼洏鐮� | mes:pro-pallet:create |
+| DELETE | /mes/pro/pallet/delete | 鍒犻櫎鎵樼洏鐮� | mes:pro-pallet:delete |
+| GET | /mes/pro/pallet/get | 鎵樼洏鐮佽鎯� | mes:pro-pallet:query |
+| GET | /mes/pro/pallet/page | 鎵樼洏鐮佸垎椤� | mes:pro-pallet:query |
+| GET | /mes/pro/pallet/simple-list | 鎵规鐨勬墭鐩樺垪琛紙渚涗笅鎷夐�夋嫨锛� | mes:pro-pallet:query |
+| GET | /mes/pro/pallet/export-excel | 瀵煎嚭鎵樼洏鐮� Excel | mes:pro-pallet:export |
+
+### 鎵归噺鐢熸垚锛圥OST /batch-create锛�
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| batchId | Long | 鏄� | 鐢熶骇鎵规缂栧彿锛堟壒娆¢』涓�"鐢熶骇涓�"鐘舵�侊級 |
+| count | Integer | 鏄� | 鐢熸垚鏁伴噺锛堝繀椤诲ぇ浜� 0锛� |
+| capacity | Integer | 鍚� | 鍙琚嬫暟锛堣/鎵樼洏锛夛紝鐢ㄤ簬缁戝畾鏃跺閲忔牎楠� |
+| remark | String | 鍚� | 澶囨敞 |
+
+鍝嶅簲 `data` 涓虹敓鎴愮殑鎵樼洏缂栧彿鍒楄〃銆�
+
+### 鍒嗛〉鏌ヨ鍙傛暟锛圙ET /page锛�
+
+code锛堟ā绯婏級銆乥atchId銆乥atchCode锛堟ā绯婏級銆乻tatus锛堝瓧鍏� mes_pro_pallet_status锛夈�乧reateTime[]銆�
+
+### 鎵樼洏鍝嶅簲瀛楁
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| id | Long | 缂栧彿 |
+| code | String | 鎵樼洏鐮侊紙濡� PC20260818L01NY001-P01锛� |
+| batchId / batchCode | 鈥� | 鎵规缂栧彿/鎵规鍙� |
+| palletNo | Integer | 鎵规鍐呮墭鐩樺簭鍙� |
+| capacity | Integer | 鍙琚嬫暟 |
+| bagCount | Integer | 宸茬粦瀹氳鐮佹暟閲� |
+| status | Integer | 鐘舵�侊紙瀛楀吀 mes_pro_pallet_status锛�10 鍚敤/20 浣滃簾锛� |
+| remark / createTime | 鈥� | 澶囨敞/鍒涘缓鏃堕棿 |
+
+## 瀛楁灞曠ず瑙勫垯
+
+| 瀛楁 | 灞曠ず浣嶇疆 | 璇存槑 |
+|------|----------|------|
+| 鎵规鍙� code | 鎵规鍒楄〃銆佽鎯呫�佽鐮佸垪琛ㄣ�佹墭鐩樺垪琛� | 鑷姩鐢熸垚锛屼笉鍙紪杈� |
+| 鍝佺锛堢紪鐮�+鍚嶇О+瑙勬牸锛� | 鎵规鍒楄〃銆佹壒娆¤鎯呫�佽鐮佸垪琛� | 涓嬫媺閫夋嫨鐗╂枡锛屽睍绀虹敤鍚庣鎷兼帴瀛楁 |
+| 浜х嚎缂栫爜/鍚嶇О | 鎵规琛ㄥ崟锛堟墜濉級銆佹壒娆″垪琛ㄣ�佽鐮佸垪琛� | 浜х嚎缂栫爜鍙備笌鎵规鍙风敓鎴� |
+| 璐d换浜� | 鎵规鍒楄〃銆佽鎯呫�佹壂鐮佽拷婧� | 鐢ㄦ埛閫夋嫨鍣� |
+| 鐢熶骇浜哄憳 workers | 鎵规鏂板/缂栬緫琛ㄥ崟锛堝瓙琛級銆佹壒娆¤鎯� | 宀椾綅绫诲瀷鐢ㄥ瓧鍏� mes_pro_batch_worker_type 涓嬫媺 |
+| 琚嬬爜鏁伴噺 bagQuantity / 鎵樼洏鐮佹暟閲� palletQuantity | 鎵规鍒楄〃 | 鍙锛岀敓鎴�/鍒犻櫎鐮佸悗鍚庣鑷姩缁存姢 |
+| 浜岀淮鐮佸唴瀹� code | 琚嬬爜鍒楄〃銆佸鍑� Excel | 琚嬬爜瀛楃涓插嵆浜岀淮鐮佸唴瀹� |
+| 鎵樼洏鐮� palletCode | 琚嬬爜鍒楄〃锛堢粦瀹氭椂灞曠ず锛夈�佹墭鐩樺垪琛� | 缁戝畾鍚庤嚜鍔ㄥ甫鍑� |
+
+## 涓氬姟瑙勫垯璇存槑
+
+| 鍦烘櫙 | 瑙勫垯 |
+|------|------|
+| 鎵规鍙风敓鎴愯鍒� | 鍓嶇紑 PC + 鏃ユ湡(yyyyMMdd) + 浜х嚎缂栫爜+鍝佺缂栫爜(鎴彇8浣�) + 娴佹按鍙�(3浣嶏紝鎸夋棩寰幆)锛屽叏鑷姩鐢熸垚 |
+| 琚嬬爜鐢熸垚瑙勫垯 | 琚嬬爜 = 鎵规鍙� + "-" + 4浣嶈搴忓彿锛堝 -0001锛夛紝搴忓彿鍙涓嶅噺锛屽叏灞�鍞竴 |
+| 鎵樼洏鐮佺敓鎴愯鍒� | 鎵樼洏鐮� = 鎵规鍙� + "-P" + 2浣嶆墭鐩樺簭鍙凤紝搴忓彿鍙涓嶅噺锛屽叏灞�鍞竴 |
+| 鐢熸垚鐮佸墠缃潯浠� | 鎵规蹇呴』涓�"鐢熶骇涓�(20)"鐘舵�� |
+| 鎵规淇敼 | 浠呰崏绋�/鐢熶骇涓彲淇敼锛涗慨鏀瑰搧绉嶆垨浜х嚎缂栫爜浼氳嚜鍔ㄩ噸鏂扮敓鎴愭壒娆″彿 |
+| 鎵规鍒犻櫎 | 浠呰崏绋�/宸蹭綔搴熷彲鍒犻櫎锛涘凡鐢熸垚琚嬬爜鎴栨墭鐩樼爜鐨勬壒娆′笉鍏佽鍒犻櫎 |
+| 鐢熸垚缁勫垹闄� | 浠呯粍鍐呰鐮佸叏閮ㄤ负"宸茬敓鎴�"涓旀湭缁戝畾鎵樼洏鏃跺厑璁革紱鍒犻櫎鍚庢壒娆¤鐮佹暟閲忚嚜鍔ㄥ洖鍑� |
+| 琚嬬爜缁戝畾鎵樼洏 | 琚嬬爜涓庢墭鐩樺繀椤诲睘浜庡悓涓�鎵规锛涜鐮佹湭缁戝畾杩囨墭鐩橈紱缁戝畾鍚庢�绘暟涓嶈秴杩囨墭鐩樺彲瑁呰鏁� |
+| 瀵煎嚭鍗冲嵃鍒� | 瀵煎嚭 Excel 鍚庯紝瀵煎嚭鐨�"宸茬敓鎴�"琚嬬爜鑷姩鍙樹负"宸插鍑哄嵃鍒�"骞惰褰曟椂闂� |
+| 浜岀淮鐮佸唴瀹� | 浜岀淮鐮佸唴瀹� = 琚嬬爜瀛楃涓诧紙濡� PC20260818L01NY001-0001锛夛紝鎵爜鍚庤皟 get-by-code 鍙嶆煡 |
+
+## 鑿滃崟涓庢潈闄�
+
+鑿滃崟宸插垵濮嬪寲锛氭壒娆$敓浜х鐞嗐�佽祴鐮佺鐞嗐�佹墭鐩樼爜绠$悊锛堟寕鍦ㄧ敓浜х鎺� 鈫� 鐢熶骇绠$悊涓嬶級锛屾寜閽潈闄愬垎鍒负 `mes:pro-batch:*`銆乣mes:pro-bag-code:*`銆乣mes:pro-pallet:*`銆�
+
+## 娉ㄦ剰浜嬮」
+
+- 鎵规鍙枫�佽鐮併�佹墭鐩樼爜鍧囩敱鍚庣鑷姩鐢熸垚锛�**鍓嶇琛ㄥ崟涓嶆彁渚涗换浣曠紪鐮佽緭鍏ユ**銆�
+- 鐢熸垚琚嬬爜/鎵樼洏鐮佸墠锛屽厛鐢� `GET /mes/pro/batch/simple-list` 璁╃敤鎴烽�夋嫨鎵规锛堝彧鍏佽閫夋嫨"鐢熶骇涓�"鐘舵�佺殑鎵规锛屽墠绔彲鎸� status=20 杩囨护锛夈��
+- 缁戝畾鎵樼洏鏃讹紝鎵樼洏涓嬫媺搴旇皟鐢� `GET /mes/pro/pallet/simple-list?batchId=`锛岀‘淇濇墭鐩樹笌琚嬬爜鍚屾壒娆°��
+- 鐢熸垚琚嬬爜鐨� `count` 涓烘墜鍔ㄨ緭鍏ョ殑鏈琚嬫暟锛屽彲鑳藉垎澶氭鐢熸垚锛屽簭鍙疯嚜鍔ㄦ帴缁紝涓嶄細閲嶅銆�
+- 鎵爜杩芥函鎺ュ彛瀵逛笉瀛樺湪鐨勮鐮佽繑鍥為敊璇紙閿欒鐮� 1040752000锛夛紝鍓嶇闇�鎻愮ず"琚嬬爜涓嶅瓨鍦�"銆�
+- 瀵煎嚭琚嬬爜 Excel 浼氭敼鍙樿鐮佺姸鎬侊紙宸茬敓鎴� 鈫� 宸插鍑哄嵃鍒凤級锛屽鍑哄悗璇峰埛鏂板垪琛紱閲嶅瀵煎嚭鍚屼竴鏁版嵁鍖呬笉浼氶噸澶嶅彉鏇寸姸鎬併��
+- 宀椾綅绫诲瀷銆佹壒娆$姸鎬併�佽鐮佺姸鎬併�佹墭鐩樼姸鎬佸潎涓哄瓧鍏搁」锛屽瓧鍏哥被鍨嬪垎鍒负 `mes_pro_batch_worker_type`銆乣mes_pro_batch_status`銆乣mes_pro_bag_code_status`銆乣mes_pro_pallet_status`銆�
diff --git a/docs/mes_pro_line_and_item_restore.md b/docs/mes_pro_line_and_item_restore.md
new file mode 100644
index 0000000..63e2517
--- /dev/null
+++ b/docs/mes_pro_line_and_item_restore.md
@@ -0,0 +1,131 @@
+# 涓�琚嬩竴鐮佹ā鍧楋細鏂板浜х嚎缁存姢 + 鎵规鎭㈠鍝佺鍏宠仈 - 鍓嶇鑱旇皟鏂规
+
+> 鏈枃妗d负鍙樻洿璇存槑锛屽彇浠� `mes_bag_code_module_decouple.md` 涓�"绉婚櫎鍝佺銆佷骇绾挎墜濉�"鐨勯儴鍒嗐��
+> 琚嬬爜璧嬬爜銆佹墭鐩樼爜绠$悊涓や釜椤甸潰鏈**鏃犱换浣曞彉鍖�**銆�
+
+## 鍔熻兘姒傝堪
+
+1. **浜х嚎缁存姢锛堟柊澧為〉闈級**锛氱淮鎶や骇绾夸富鏁版嵁锛堢紪鐮併�佸悕绉般�佺姸鎬併�佸娉級锛屼緵鐢熶骇鎵规涓嬫媺閫夋嫨銆�
+2. **鎵规鎭㈠鍝佺鍏宠仈**锛氭壒娆¢噸鏂板叧鑱� MDM 鐗╂枡锛堝搧绉嶏級锛岃〃鍗曠敤鐗╂枡閫夋嫨鍣ㄩ�夋嫨銆�
+3. **鎵规浜х嚎鏀逛负涓嬫媺閫夋嫨**锛氭壒娆¤〃鍗曚笉鍐嶆墜濉骇绾跨紪鐮�/鍚嶇О锛屾敼涓轰粠浜х嚎缁存姢鏁版嵁涓�夋嫨銆�
+4. **鎵规鍙疯鍒欐仮澶�**锛氬墠缂�(PC) + 鏃ユ湡(yyyyMMdd) + 浜х嚎缂栫爜 + 鍝佺缂栫爜 + 娴佹按鍙枫��
+
+## 娑夊強椤甸潰
+
+- **涓�琚嬩竴鐮佺鐞� 鈫� 浜х嚎缁存姢**锛堟柊澧為〉闈細鍒楄〃 + 鏂板/缂栬緫/璇︽儏寮圭獥锛�
+- **涓�琚嬩竴鐮佺鐞� 鈫� 鎵规鐢熶骇绠$悊**锛堣〃鍗曚笌鍒楄〃鏀归�狅級
+
+鑿滃崟宸插垵濮嬪寲锛氫骇绾跨淮鎶よ彍鍗曟寕鍦ㄣ�屼竴琚嬩竴鐮佺鐞嗐�嶄笅绗竴浣嶏紙璺敱 `/bagcode/line`锛岀粍浠� `mes/pro/line/index`锛夛紝鎸夐挳鏉冮檺 `mes:pro-line:query/create/update/delete/export`銆�
+
+## API锛氫骇绾跨淮鎶わ紙鏉冮檺鍓嶇紑 `mes:pro-line`锛�
+
+| 鏂规硶 | 璺緞 | 璇存槑 | 鏉冮檺 |
+|------|------|------|------|
+| POST | /mes/pro/line/create | 鍒涘缓浜х嚎 | mes:pro-line:create |
+| PUT | /mes/pro/line/update | 鏇存柊浜х嚎 | mes:pro-line:update |
+| DELETE | /mes/pro/line/delete | 鍒犻櫎浜х嚎 | mes:pro-line:delete |
+| GET | /mes/pro/line/get | 浜х嚎璇︽儏 | mes:pro-line:query |
+| GET | /mes/pro/line/page | 浜х嚎鍒嗛〉 | mes:pro-line:query |
+| GET | /mes/pro/line/simple-list | 浜х嚎绮剧畝鍒楄〃锛堜粎鍚敤锛屼緵涓嬫媺锛� | 鏃狅紙鐧诲綍鍗冲彲锛� |
+| GET | /mes/pro/line/export-excel | 瀵煎嚭浜х嚎 Excel | mes:pro-line:export |
+
+### 鍒涘缓/鏇存柊璇锋眰鍙傛暟锛圥OST /create銆丳UT /update锛�
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| id | Long | 鏇存柊鏃跺繀濉� | 缂栧彿 |
+| code | String | 鏄� | 浜х嚎缂栫爜锛堝弬涓庢壒娆″彿鐢熸垚锛屽缓璁� 鈮� 8 浣嶏級 |
+| name | String | 鏄� | 浜х嚎鍚嶇О |
+| status | Integer | 鏄� | 鐘舵�侊紙瀛楀吀 common_status锛�0 鍚敤/1 鍋滅敤锛� |
+| remark | String | 鍚� | 澶囨敞 |
+
+### 鍒嗛〉鏌ヨ鍙傛暟锛圙ET /page锛�
+
+code锛堟ā绯婏級銆乶ame锛堟ā绯婏級銆乻tatus銆乧reateTime[]锛堝垱寤烘椂闂磋寖鍥达級銆乸ageNo/pageSize銆�
+
+### 鍝嶅簲瀛楁
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| id | Long | 缂栧彿 |
+| code | String | 浜х嚎缂栫爜 |
+| name | String | 浜х嚎鍚嶇О |
+| status | Integer | 鐘舵�侊紙瀛楀吀 common_status锛� |
+| remark | String | 澶囨敞 |
+| createTime | String | 鍒涘缓鏃堕棿 |
+
+simple-list 杩斿洖鐩稿悓缁撴瀯锛堜粎 id/code/name/remark 鏈夊�硷級锛屼笖鍙寘鍚惎鐢ㄧ姸鎬佺殑浜х嚎銆�
+
+## 鎵规鎺ュ彛鍙樻洿锛�/mes/pro/batch/*锛�
+
+鎺ュ彛璺緞涓庢潈闄愬潎涓嶅彉锛屼粎璇锋眰/鍝嶅簲瀛楁璋冩暣銆�
+
+### 鍒涘缓/鏇存柊璇锋眰鍙傛暟鍙樺寲
+
+| 鍙樺寲 | 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|------|
+| 鏂板 | itemId | Long | 鏄� | 鍝佺锛堜骇鍝佺墿鏂欙級缂栧彿锛岄�� MDM 鐗╂枡 |
+| 鏂板 | lineId | Long | 鏄� | 浜х嚎缂栧彿锛岄�変骇绾跨淮鎶ゆ暟鎹� |
+| 绉婚櫎 | lineCode / lineName | 鈥� | 鈥� | 涓嶅啀鎺ユ敹锛岀敱鍚庣鎸� lineId 鑷姩鍥炲~ |
+
+鍏朵綑鍙傛暟涓嶅彉锛歱roduceDate锛堝繀濉級銆乸lanQuantity銆乷wnerUserId锛堝繀濉級銆乺emark銆亀orkers锛堝繀濉紝鑷冲皯 1 鏉★級銆�
+
+### 鍝嶅簲瀛楁鏂板
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| itemId | Long | 鍝佺缂栧彿 |
+| itemCode / itemName / itemSpecification | String | 鍝佺缂栫爜/鍚嶇О/瑙勬牸锛堝悗绔嫾鎺ワ紝灞曠ず鏈�鏂颁富鏁版嵁锛� |
+| lineId | Long | 浜х嚎缂栧彿 |
+
+lineCode / lineName 浠嶈繑鍥烇紙鍐椾綑蹇収锛屽巻鍙叉壒娆′笉鍙椾骇绾挎敼鍚嶅奖鍝嶏級銆�
+
+### 鍒嗛〉鏌ヨ鍙傛暟鏂板
+
+itemId锛堝搧绉嶇紪鍙凤紝绮剧‘锛夈�乴ineId锛堜骇绾跨紪鍙凤紝绮剧‘锛夛紱鍘� code/lineCode/lineName/ownerUserId/status/produceDate/createTime 涓嶅彉銆�
+
+## 涓氬姟娴佺▼涓庢暟鎹甫鍏�
+
+1. **鍏堢淮鎶や骇绾�**锛氫竴琚嬩竴鐮佺鐞� 鈫� 浜х嚎缁存姢 鈫� 鏂板浜х嚎锛堢紪鐮� + 鍚嶇О + 鐘舵�佸惎鐢級銆�
+2. **鏂板鎵规**锛氶�夊搧绉嶏紙鐗╂枡閫夋嫨鍣級鈫� 閫変骇绾匡紙浠呭睍绀哄惎鐢ㄧ殑浜х嚎锛夆啋 閫夌敓浜ф棩鏈熴�佽矗浠讳汉 鈫� 閰嶇疆鐢熶骇浜哄憳锛堣嚦灏� 1 浜猴級銆備繚瀛樺悗鎵规鍙疯嚜鍔ㄧ敓鎴� = PC + 鏃ユ湡 + 浜х嚎缂栫爜 + 鍝佺缂栫爜 + 娴佹按鍙枫��
+3. **缂栬緫鎵规**锛氬彉鏇村搧绉嶆垨浜х嚎浼�**鑷姩閲嶆柊鐢熸垚鎵规鍙�**锛涗骇绾挎湭鍙樻洿鏃讹紝鍗充娇璇ヤ骇绾垮凡琚仠鐢紝浠嶅彲缂栬緫鍏朵粬瀛楁銆�
+4. **鐢熸垚琚嬬爜/鎵樼洏鐮�**锛氭祦绋嬩笉鍙橈紙閫夋壒娆� + 鏁伴噺锛夛紝鎵规涓嬫媺浠呭睍绀烘壒娆″彿銆�
+
+## 鎺ュ彛璋冪敤鏃跺簭
+
+| 鏃舵満 | 璋冪敤 | 璇存槑 |
+|------|------|------|
+| 鎵规琛ㄥ崟鎵撳紑 | GET /mes/pro/line/simple-list | 浜х嚎涓嬫媺閫夐」锛堜粎鍚敤锛� |
+| 鎵规琛ㄥ崟鎵撳紑 | 鐗╂枡閫夋嫨鍣ㄥ唴閮ㄦ煡璇� | 鍝佺閫夋嫨锛堢幇鏈� MdItemSelect 缁勪欢锛� |
+| 鎵规鍒楄〃/璇︽儏娓叉煋 | 鏃犻渶棰濆璋冪敤 | 鍝佺缂栫爜/鍚嶇О/瑙勬牸鐢卞悗绔嫾鎺ヨ繑鍥� |
+| 浜х嚎缁存姢椤� | /mes/pro/line/page銆乧reate銆乽pdate銆乨elete | 甯歌 CRUD |
+
+## 瀛楁灞曠ず瑙勫垯
+
+| 瀛楁 | 灞曠ず浣嶇疆 | 璇存槑 |
+|------|----------|------|
+| 浜х嚎缂栫爜/鍚嶇О/鐘舵��/澶囨敞 | 浜х嚎缁存姢鍒楄〃銆佽〃鍗� | 鐘舵�佺敤瀛楀吀 common_status |
+| 鍝佺锛堢紪鐮�+鍚嶇О锛� | 鎵规鍒楄〃 | 鍚庣鎷兼帴瀛楁 itemCode/itemName |
+| 鍝佺 itemId | 鎵规琛ㄥ崟锛堢墿鏂欓�夋嫨鍣級 | 蹇呭~ |
+| 浜х嚎 lineId | 鎵规琛ㄥ崟锛堜骇绾夸笅鎷夛級 | 蹇呭~锛屼粎鍚敤浜х嚎鍙�� |
+| 浜х嚎缂栫爜/鍚嶇О | 鎵规鍒楄〃銆佽鎯� | 鍐椾綑蹇収鍒楋紝鍙 |
+
+## 涓氬姟瑙勫垯璇存槑
+
+| 鍦烘櫙 | 瑙勫垯 |
+|------|------|
+| 浜х嚎缂栫爜/鍚嶇О鍞竴 | 鍒涘缓銆佹洿鏂版椂鏍¢獙锛岄噸澶嶆姤閿� |
+| 浜х嚎鍒犻櫎 | 宸茶鐢熶骇鎵规寮曠敤鐨勪骇绾夸笉鍏佽鍒犻櫎 |
+| 浜х嚎鍋滅敤 | 鍋滅敤鍚庢柊鎵规涓嶅彲閫夛紙涓嬫媺涓嶅睍绀猴級锛屽凡鐢熸垚鐨勫巻鍙叉壒娆′笉鍙楀奖鍝� |
+| 鎵规鍙风敓鎴� | 鍓嶇紑 PC + 鏃ユ湡(yyyyMMdd) + 浜х嚎缂栫爜 + 鍝佺缂栫爜 + 娴佹按鍙�(3浣嶆寜鏃ュ惊鐜�) |
+| 鎵规鍙烽噸鏂扮敓鎴� | 缂栬緫鎵规鏃跺搧绉嶆垨浜х嚎鍙樺寲鍗抽噸鏂扮敓鎴� |
+| 琚嬬爜/鎵樼洏鐮� | 瑙勫垯涓嶅彉锛堣鐮� = 鎵规鍙� + "-" + 4浣嶅簭鍙凤紱鎵樼洏鐮� = 鎵规鍙� + "-P" + 2浣嶅簭鍙凤級 |
+
+## 娉ㄦ剰浜嬮」
+
+- 浜х嚎缁存姢椤甸潰宸插湪鏁版嵁搴撳垵濮嬪寲鑿滃崟锛屽墠绔渶鏂板椤甸潰鏂囦欢锛堢粍浠惰矾寰� `mes/pro/line/index`锛岀粍浠跺悕 `MesProLine`锛夈��
+- 鎵规琛ㄥ崟鎻愪氦浣撳彉涓� `{ itemId, lineId, produceDate, planQuantity, ownerUserId, remark, workers }`锛�**涓嶈鍐嶄紶 lineCode/lineName**銆�
+- 浜х嚎涓嬫媺鍔″繀璋冪敤 simple-list锛堜粎鍚敤浜х嚎锛夛紝涓嶈璋冪敤 page 鎺ュ彛銆�
+- 鍝佺鐨勭紪鐮�/鍚嶇О/瑙勬牸**涓嶈**瀛樺叆鎵规琛ㄥ崟锛屼粎浼� itemId锛屽睍绀轰互鎵规鍒楄〃/璇︽儏鎺ュ彛杩斿洖鐨勬嫾鎺ュ瓧娈典负鍑嗐��
+- 琚嬬爜鍒楄〃銆佹墭鐩樼爜鍒楄〃銆佹壂鐮佽拷婧〉闈�**涓嶅睍绀哄搧绉嶄俊鎭�**锛堝搧绉嶅彧鍏宠仈鍒版壒娆″眰锛夈��
+- 鐘舵�佸瓧鍏哥粺涓�涓� common_status锛�0 鍚敤/1 鍋滅敤锛夛紝鏃犻渶鏂板瀛楀吀銆�
diff --git a/sql/mysql/mes_pro_batch_bag_code_init.sql b/sql/mysql/mes_pro_batch_bag_code_init.sql
new file mode 100644
index 0000000..a3a1a03
--- /dev/null
+++ b/sql/mysql/mes_pro_batch_bag_code_init.sql
@@ -0,0 +1,202 @@
+-- =============================================
+-- MES 鐢熶骇绠℃帶 - 鎵规鐢熶骇绠$悊 + 璧嬬爜绠$悊锛堜竴琚嬩竴鐮侊級鍒濆鍖栬剼鏈�
+-- 鍖呭惈锛氱敓浜ф壒娆¤〃銆佹壒娆′汉鍛橀厤缃〃銆佹墭鐩樼爜琛ㄣ�佽鐮佽祴鐮佽〃銆�
+--       鎵规鍙疯嚜鍔ㄧ紪鐮佽鍒欍�佸瓧鍏告暟鎹�佽彍鍗曟潈闄�
+-- MySQL 8.4 閫傜敤
+-- =============================================
+
+SET NAMES utf8mb4;
+
+-- ----------------------------
+-- 1. 鐢熶骇鎵规琛紙浜衡�旀満鈥旂锛�
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `mes_pro_batch` (
+    `id`              BIGINT       NOT NULL AUTO_INCREMENT COMMENT '缂栧彿',
+    `code`            VARCHAR(64)  NOT NULL COMMENT '鎵规鍙凤紙鑷姩鐢熸垚锛氬墠缂�+鏃ユ湡+浜х嚎+鍝佺+娴佹按鍙凤級',
+    `item_id`         BIGINT       NOT NULL COMMENT '鍝佺锛堜骇鍝佺墿鏂欙級缂栧彿锛屽叧鑱� mdm_item.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',
+    `work_order_id`   BIGINT       DEFAULT NULL COMMENT '鍏宠仈鐢熶骇宸ュ崟缂栧彿锛屽叧鑱� mes_pro_work_order.id',
+    `produce_date`    DATETIME     DEFAULT NULL COMMENT '鐢熶骇鏃ユ湡',
+    `plan_quantity`   DECIMAL(24, 6) DEFAULT NULL COMMENT '璁″垝鏁伴噺',
+    `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 '宸茬敓鎴愭墭鐩樼爜鏁伴噺',
+    `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 '鍒涘缓鑰�',
+    `create_time`     DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
+    `updater`         VARCHAR(64)  DEFAULT '' COMMENT '鏇存柊鑰�',
+    `update_time`     DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
+    `deleted`         BIT(1)       NOT NULL DEFAULT b'0' COMMENT '鏄惁鍒犻櫎',
+    PRIMARY KEY (`id`),
+    UNIQUE KEY `uk_code` (`code`),
+    KEY `idx_item_id` (`item_id`),
+    KEY `idx_work_order_id` (`work_order_id`),
+    KEY `idx_status` (`status`)
+) ENGINE = InnoDB COMMENT = 'MES 鐢熶骇鎵规';
+
+-- ----------------------------
+-- 2. 鎵规鐢熶骇浜哄憳閰嶇疆琛紙璐d换钀藉疄鍒颁汉锛�
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `mes_pro_batch_worker` (
+    `id`          BIGINT       NOT NULL AUTO_INCREMENT COMMENT '缂栧彿',
+    `batch_id`    BIGINT       NOT NULL COMMENT '鐢熶骇鎵规缂栧彿锛屽叧鑱� mes_pro_batch.id',
+    `user_id`     BIGINT       NOT NULL COMMENT '鐢熶骇浜哄憳鐢ㄦ埛缂栧彿锛屽叧鑱� system_users.id',
+    `worker_type` TINYINT      NOT NULL COMMENT '宀椾綅绫诲瀷锛堝瓧鍏� mes_pro_batch_worker_type锛�10 缁勯暱 20 鎿嶄綔宸� 30 鍖呰宸� 40 璐ㄦ鍛� 50 鍏朵粬锛�',
+    `remark`      VARCHAR(255) DEFAULT NULL COMMENT '澶囨敞',
+    `creator`     VARCHAR(64)  DEFAULT '' COMMENT '鍒涘缓鑰�',
+    `create_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
+    `updater`     VARCHAR(64)  DEFAULT '' COMMENT '鏇存柊鑰�',
+    `update_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
+    `deleted`     BIT(1)       NOT NULL DEFAULT b'0' COMMENT '鏄惁鍒犻櫎',
+    PRIMARY KEY (`id`),
+    KEY `idx_batch_id` (`batch_id`),
+    KEY `idx_user_id` (`user_id`)
+) ENGINE = InnoDB COMMENT = 'MES 鐢熶骇鎵规浜哄憳閰嶇疆';
+
+-- ----------------------------
+-- 3. 鎵樼洏鐮佽〃锛堜笌鎵规鍙疯嚜鍔ㄥ叧鑱旓級
+-- ----------------------------
+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',
+    `batch_code` VARCHAR(64)  DEFAULT NULL COMMENT '鎵规鍙凤紙鍐椾綑锛屼究浜庡睍绀猴級',
+    `pallet_no`  INT          NOT NULL COMMENT '鎵规鍐呮墭鐩樺簭鍙�',
+    `capacity`   INT          DEFAULT NULL COMMENT '鍙琚嬫暟锛堣/鎵樼洏锛�',
+    `bag_count`  INT          NOT NULL DEFAULT 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 '鍒涘缓鑰�',
+    `create_time` DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
+    `updater`    VARCHAR(64)  DEFAULT '' COMMENT '鏇存柊鑰�',
+    `update_time` DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
+    `deleted`    BIT(1)       NOT NULL DEFAULT b'0' COMMENT '鏄惁鍒犻櫎',
+    PRIMARY KEY (`id`),
+    UNIQUE KEY `uk_code` (`code`),
+    KEY `idx_batch_id` (`batch_id`)
+) ENGINE = InnoDB COMMENT = 'MES 鎵樼洏鐮�';
+
+-- ----------------------------
+-- 4. 琚嬬爜璧嬬爜琛紙涓�琚嬩竴鐮侊紝浜岀淮鐮佹暟鎹寘锛�
+-- ----------------------------
+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',
+    `batch_code`  VARCHAR(64)  DEFAULT NULL COMMENT '鎵规鍙凤紙鍐椾綑锛屼究浜庡睍绀猴級',
+    `item_id`     BIGINT       DEFAULT NULL COMMENT '鍝佺锛堜骇鍝佺墿鏂欙級缂栧彿锛堝啑浣欒嚜鎵规锛�',
+    `pallet_id`   BIGINT       DEFAULT NULL COMMENT '缁戝畾鎵樼洏缂栧彿锛屽叧鑱� mes_pro_pallet.id',
+    `pallet_code` VARCHAR(64)  DEFAULT NULL COMMENT '鎵樼洏鐮侊紙鍐椾綑锛屼究浜庡睍绀猴級',
+    `status`      TINYINT      NOT NULL DEFAULT 10 COMMENT '鐘舵�侊紙瀛楀吀 mes_pro_bag_code_status锛�10 宸茬敓鎴� 20 宸插鍑哄嵃鍒� 30 宸蹭綔搴燂級',
+    `print_time`  DATETIME     DEFAULT NULL COMMENT '瀵煎嚭锛堜氦浠樺嵃鍒凤級鏃堕棿',
+    `remark`      VARCHAR(255) DEFAULT NULL COMMENT '澶囨敞',
+    `creator`     VARCHAR(64)  DEFAULT '' COMMENT '鍒涘缓鑰�',
+    `create_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
+    `updater`     VARCHAR(64)  DEFAULT '' COMMENT '鏇存柊鑰�',
+    `update_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
+    `deleted`     BIT(1)       NOT NULL DEFAULT b'0' COMMENT '鏄惁鍒犻櫎',
+    PRIMARY KEY (`id`),
+    UNIQUE KEY `uk_code` (`code`),
+    KEY `idx_batch_id` (`batch_id`),
+    KEY `idx_uuid` (`uuid`),
+    KEY `idx_pallet_id` (`pallet_id`)
+) ENGINE = InnoDB COMMENT = 'MES 琚嬬爜璧嬬爜锛堜竴琚嬩竴鐮侊級';
+
+-- ----------------------------
+-- 5. 鎵规鍙疯嚜鍔ㄧ紪鐮佽鍒欙細PRO_BATCH_CODE
+--    缁撴瀯锛氬浐瀹氬瓧绗�(PC) + 鏃ユ湡(yyyyMMdd) + 杈撳叆瀛楃(浜х嚎缂栫爜+鍝佺缂栫爜) + 娴佹按鍙�(3浣嶏紝鎸夋棩寰幆)
+--    绀轰緥锛歅C20260818L01NY001
+-- ----------------------------
+INSERT INTO `mes_md_auto_code_rule` (`code`, `name`, `description`, `max_length`, `padded`, `padded_char`, `padded_method`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
+SELECT 'PRO_BATCH_CODE', '鐢熶骇鎵规缂栫爜', '鐢熶骇鎵规鍙凤細鍓嶇紑+鏃ユ湡+浜х嚎+鍝佺+娴佹按鍙�', 24, b'0', NULL, NULL, 0, '鎵规鐢熶骇绠$悊妯″潡鎵规鍙�', '1', NOW(), '1', NOW(), b'0'
+FROM DUAL
+WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM mes_md_auto_code_rule WHERE code = 'PRO_BATCH_CODE' AND deleted = 0) t);
+
+-- 瑙勫垯鍒嗘锛堟暣浣撳箓绛夛細浠呭綋璇ヨ鍒欏皻鏃犱换浣曞垎娈垫椂涓�娆℃�ф彃鍏� 4 娈碉級
+INSERT INTO `mes_md_auto_code_part` (`rule_id`, `sort`, `type`, `length`, `date_format`, `fix_character`, `serial_start_no`, `serial_step`, `cycle_flag`, `cycle_method`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
+SELECT r.id, t.sort, t.type, t.length, t.date_format, t.fix_character, t.serial_start_no, t.serial_step, t.cycle_flag, t.cycle_method, t.remark, '1', NOW(), '1', NOW(), b'0'
+FROM mes_md_auto_code_rule r
+JOIN (
+    SELECT 1 AS sort, 3 AS type, 2 AS length, NULL AS date_format, 'PC' AS fix_character, NULL AS serial_start_no, NULL AS serial_step, b'0' AS cycle_flag, NULL AS cycle_method, '鍥哄畾鍓嶇紑' AS remark
+    UNION ALL SELECT 2, 2, 8, 'yyyyMMdd', NULL, NULL, NULL, b'0', NULL, '鐢熶骇鏃ユ湡'
+    UNION ALL SELECT 3, 1, 8, NULL, NULL, NULL, NULL, b'0', NULL, '浜х嚎缂栫爜+鍝佺缂栫爜锛堣緭鍏ュ瓧绗︼級'
+    UNION ALL SELECT 4, 4, 3, NULL, NULL, 1, 1, b'1', 3, '娴佹按鍙凤紙鎸夋棩寰幆锛�'
+) t
+WHERE r.code = 'PRO_BATCH_CODE' AND r.deleted = 0
+  AND NOT EXISTS (SELECT 1 FROM mes_md_auto_code_part p WHERE p.rule_id = r.id AND p.deleted = 0);
+
+-- ----------------------------
+-- 6. 瀛楀吀绫诲瀷 + 瀛楀吀鏁版嵁
+-- ----------------------------
+INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
+SELECT 'MES 鐢熶骇鎵规鐘舵��', 'mes_pro_batch_status', 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_batch_status' AND deleted = 0) t);
+
+INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
+SELECT 'MES 鎵规浜哄憳宀椾綅绫诲瀷', 'mes_pro_batch_worker_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_batch_worker_type' AND deleted = 0) t);
+
+INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
+SELECT 'MES 琚嬬爜鐘舵��', 'mes_pro_bag_code_status', 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_code_status' AND deleted = 0) t);
+
+INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
+SELECT 'MES 鎵樼洏鐮佺姸鎬�', 'mes_pro_pallet_status', 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_pallet_status' AND deleted = 0) t);
+
+-- 瀛楀吀鏁版嵁锛堟樉寮� ID锛岄伩鍏嶅啿绐侊級
+INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
+(1065350, 1, '鑽夌', '10', 'mes_pro_batch_status', 0, 'info', '', '1', NOW(), '1', NOW(), b'0'),
+(1065351, 2, '鐢熶骇涓�', '20', 'mes_pro_batch_status', 0, 'primary', '', '1', NOW(), '1', NOW(), b'0'),
+(1065352, 3, '宸插畬鎴�', '30', 'mes_pro_batch_status', 0, 'success', '', '1', NOW(), '1', NOW(), b'0'),
+(1065353, 4, '宸蹭綔搴�', '40', 'mes_pro_batch_status', 0, 'danger', '', '1', NOW(), '1', NOW(), b'0'),
+(1065354, 1, '缁勯暱', '10', 'mes_pro_batch_worker_type', 0, 'primary', '', '1', NOW(), '1', NOW(), b'0'),
+(1065355, 2, '鎿嶄綔宸�', '20', 'mes_pro_batch_worker_type', 0, 'default', '', '1', NOW(), '1', NOW(), b'0'),
+(1065356, 3, '鍖呰宸�', '30', 'mes_pro_batch_worker_type', 0, 'default', '', '1', NOW(), '1', NOW(), b'0'),
+(1065357, 4, '璐ㄦ鍛�', '40', 'mes_pro_batch_worker_type', 0, 'warning', '', '1', NOW(), '1', NOW(), b'0'),
+(1065358, 5, '鍏朵粬', '50', 'mes_pro_batch_worker_type', 0, 'info', '', '1', NOW(), '1', NOW(), b'0'),
+(1065359, 1, '宸茬敓鎴�', '10', 'mes_pro_bag_code_status', 0, 'info', '', '1', NOW(), '1', NOW(), b'0'),
+(1065360, 2, '宸插鍑哄嵃鍒�', '20', 'mes_pro_bag_code_status', 0, 'success', '', '1', NOW(), '1', NOW(), b'0'),
+(1065361, 3, '宸蹭綔搴�', '30', 'mes_pro_bag_code_status', 0, 'danger', '', '1', NOW(), '1', NOW(), b'0'),
+(1065362, 1, '鍚敤', '10', 'mes_pro_pallet_status', 0, 'primary', '', '1', NOW(), '1', NOW(), b'0'),
+(1065363, 2, '浣滃簾', '20', 'mes_pro_pallet_status', 0, 'danger', '', '1', NOW(), '1', NOW(), b'0');
+
+-- ----------------------------
+-- 7. 鑿滃崟涓庢寜閽潈闄愶紙鎸傚湪 5700 鐢熶骇绠$悊 涓嬶級
+-- ----------------------------
+-- 鎵规鐢熶骇绠$悊
+INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
+VALUES (602612, '鎵规鐢熶骇绠$悊', '', 2, 10, 5700, 'batch', 'ep:collection-tag', 'mes/pro/batch/index', 'MesProBatch', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0');
+
+INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
+(602613, '鐢熶骇鎵规鏌ヨ', 'mes:pro-batch:query', 3, 1, 602612, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
+(602614, '鐢熶骇鎵规鍒涘缓', 'mes:pro-batch:create', 3, 2, 602612, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
+(602615, '鐢熶骇鎵规鏇存柊', 'mes:pro-batch:update', 3, 3, 602612, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
+(602616, '鐢熶骇鎵规鍒犻櫎', 'mes:pro-batch:delete', 3, 4, 602612, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
+(602617, '鐢熶骇鎵规瀵煎嚭', 'mes:pro-batch:export', 3, 5, 602612, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0');
+
+-- 璧嬬爜绠$悊锛堜竴琚嬩竴鐮侊級
+INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
+VALUES (602618, '璧嬬爜绠$悊', '', 2, 11, 5700, 'bag-code', 'ep:connection', 'mes/pro/bagCode/index', 'MesProBagCode', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0');
+
+INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
+(602619, '琚嬬爜鏌ヨ', 'mes:pro-bag-code:query', 3, 1, 602618, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
+(602620, '鐢熸垚浜岀淮鐮佹暟鎹寘', 'mes:pro-bag-code:generate', 3, 2, 602618, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
+(602621, '琚嬬爜鍒犻櫎', 'mes:pro-bag-code:delete', 3, 3, 602618, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
+(602622, '琚嬬爜瀵煎嚭', 'mes:pro-bag-code:export', 3, 4, 602618, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
+(602623, '琚嬬爜缁戝畾鎵樼洏', 'mes:pro-bag-code:bind', 3, 5, 602618, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0');
+
+-- 鎵樼洏鐮佺鐞�
+INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
+VALUES (602624, '鎵樼洏鐮佺鐞�', '', 2, 12, 5700, 'pallet', 'ep:box', 'mes/pro/pallet/index', 'MesProPallet', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0');
+
+INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
+(602625, '鎵樼洏鐮佹煡璇�', 'mes:pro-pallet:query', 3, 1, 602624, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
+(602626, '鎵樼洏鐮佺敓鎴�', 'mes:pro-pallet:create', 3, 2, 602624, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
+(602627, '鎵樼洏鐮佸垹闄�', 'mes:pro-pallet:delete', 3, 3, 602624, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
+(602628, '鎵樼洏鐮佸鍑�', 'mes:pro-pallet:export', 3, 4, 602624, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0');
diff --git a/yudao-dependencies/pom.xml b/yudao-dependencies/pom.xml
index 4285a8a..b7a64e1 100644
--- a/yudao-dependencies/pom.xml
+++ b/yudao-dependencies/pom.xml
@@ -74,6 +74,7 @@
         <okhttp.version>4.12.0</okhttp.version>
         <californium.version>3.14.0</californium.version>
         <j2mod.version>3.3.0</j2mod.version>
+        <zxing.version>3.5.4</zxing.version>
         <!-- 涓夋柟浜戞湇鍔$浉鍏� -->
         <awssdk.version>2.46.17</awssdk.version>
         <justauth.version>1.16.7</justauth.version>
@@ -501,6 +502,18 @@
                 <version>${hutool-6.version}</version>
             </dependency>
 
+            <!-- 浜岀淮鐮佺敓鎴愶紙hutool QrCodeUtil 搴曞眰渚濊禆 zxing锛� -->
+            <dependency>
+                <groupId>com.google.zxing</groupId>
+                <artifactId>core</artifactId>
+                <version>${zxing.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.zxing</groupId>
+                <artifactId>javase</artifactId>
+                <version>${zxing.version}</version>
+            </dependency>
+
             <dependency>
                 <groupId>cn.idev.excel</groupId>
                 <artifactId>fastexcel</artifactId>
diff --git a/yudao-module-mes/pom.xml b/yudao-module-mes/pom.xml
index 8cf5b36..d8ad94a 100644
--- a/yudao-module-mes/pom.xml
+++ b/yudao-module-mes/pom.xml
@@ -103,6 +103,16 @@
             <artifactId>yudao-spring-boot-starter-excel</artifactId>
         </dependency>
 
+        <!-- 浜岀淮鐮佺敓鎴愶紙hutool QrCodeUtil 搴曞眰渚濊禆 zxing锛� -->
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>javase</artifactId>
+        </dependency>
+
         <!-- Test 娴嬭瘯鐩稿叧 -->
         <dependency>
             <groupId>cn.iocoder.boot</groupId>
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/home/MesBagCodeHomeStatisticsController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/home/MesBagCodeHomeStatisticsController.java
new file mode 100644
index 0000000..0c19396
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/home/MesBagCodeHomeStatisticsController.java
@@ -0,0 +1,49 @@
+package cn.iocoder.yudao.module.mes.controller.admin.home;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.mes.controller.admin.home.vo.MesBagCodeHomeSummaryRespVO;
+import cn.iocoder.yudao.module.mes.controller.admin.home.vo.MesBagCodeHomeTrendRespVO;
+import cn.iocoder.yudao.module.mes.service.home.MesBagCodeHomeStatisticsService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "绠$悊鍚庡彴 - MES 鍩虹鏁版嵁涓庝竴琚嬩竴鐮� 棣栭〉缁熻")
+@RestController
+@RequestMapping("/mes/bag-code-home-statistics")
+@Validated
+public class MesBagCodeHomeStatisticsController {
+
+    @Resource
+    private MesBagCodeHomeStatisticsService homeStatisticsService;
+
+    @GetMapping("/summary")
+    @Operation(summary = "鑾峰緱棣栭〉姹囨�荤粺璁�")
+    @PreAuthorize("@ss.hasPermission('mes:home:query')")
+    public CommonResult<MesBagCodeHomeSummaryRespVO> getHomeSummary() {
+        return success(homeStatisticsService.getHomeSummary());
+    }
+
+    @GetMapping("/trend")
+    @Operation(summary = "鑾峰緱琚嬬爜鐢熸垚瓒嬪娍")
+    @Parameter(name = "days", description = "澶╂暟", example = "7")
+    @PreAuthorize("@ss.hasPermission('mes:home:query')")
+    public CommonResult<List<MesBagCodeHomeTrendRespVO>> getBagCodeTrend(
+            @RequestParam(value = "days", defaultValue = "7") @Min(1) @Max(90) Integer days) {
+        return success(homeStatisticsService.getBagCodeTrend(days));
+    }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/home/vo/MesBagCodeHomeStatusRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/home/vo/MesBagCodeHomeStatusRespVO.java
new file mode 100644
index 0000000..45ae176
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/home/vo/MesBagCodeHomeStatusRespVO.java
@@ -0,0 +1,20 @@
+package cn.iocoder.yudao.module.mes.controller.admin.home.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 鍩虹鏁版嵁涓庝竴琚嬩竴鐮� 鐘舵�佸垎甯� Response VO")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class MesBagCodeHomeStatusRespVO {
+
+    @Schema(description = "鐘舵�佸��", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
+    private Integer status;
+
+    @Schema(description = "鏁伴噺", requiredMode = Schema.RequiredMode.REQUIRED, example = "12")
+    private Long count;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/home/vo/MesBagCodeHomeSummaryRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/home/vo/MesBagCodeHomeSummaryRespVO.java
new file mode 100644
index 0000000..cf6c323
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/home/vo/MesBagCodeHomeSummaryRespVO.java
@@ -0,0 +1,48 @@
+package cn.iocoder.yudao.module.mes.controller.admin.home.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 鍩虹鏁版嵁涓庝竴琚嬩竴鐮� 棣栭〉姹囨�荤粺璁� Response VO")
+@Data
+public class MesBagCodeHomeSummaryRespVO {
+
+    // ========== 鍩虹鏁版嵁 ==========
+
+    @Schema(description = "鍝佺鎬绘暟锛坢dm_item锛�", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
+    private Long mdmItemCount;
+
+    @Schema(description = "MES 鍝佺鏁帮紙mes_md_item锛�", requiredMode = Schema.RequiredMode.REQUIRED, example = "80")
+    private Long mesItemCount;
+
+    @Schema(description = "鍝佺鍒嗙被鏁�", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
+    private Long itemTypeCount;
+
+    @Schema(description = "璁¢噺鍗曚綅鏁�", requiredMode = Schema.RequiredMode.REQUIRED, example = "20")
+    private Long unitMeasureCount;
+
+    // ========== 涓�琚嬩竴鐮� ==========
+
+    @Schema(description = "浜х嚎鏁�", requiredMode = Schema.RequiredMode.REQUIRED, example = "5")
+    private Long lineCount;
+
+    @Schema(description = "鎵规鎬绘暟", requiredMode = Schema.RequiredMode.REQUIRED, example = "30")
+    private Long batchCount;
+
+    @Schema(description = "琚嬬爜鎬绘暟", requiredMode = Schema.RequiredMode.REQUIRED, example = "5000")
+    private Long bagCodeCount;
+
+    @Schema(description = "鎵樼洏鐮佹�绘暟", requiredMode = Schema.RequiredMode.REQUIRED, example = "800")
+    private Long palletCount;
+
+    // ========== 鐘舵�佸垎甯� ==========
+
+    @Schema(description = "鎵规鐘舵�佸垎甯�")
+    private List<MesBagCodeHomeStatusRespVO> batchStatusList;
+
+    @Schema(description = "琚嬬爜鐘舵�佸垎甯�")
+    private List<MesBagCodeHomeStatusRespVO> bagCodeStatusList;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/home/vo/MesBagCodeHomeTrendRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/home/vo/MesBagCodeHomeTrendRespVO.java
new file mode 100644
index 0000000..e009844
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/home/vo/MesBagCodeHomeTrendRespVO.java
@@ -0,0 +1,20 @@
+package cn.iocoder.yudao.module.mes.controller.admin.home.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 鍩虹鏁版嵁涓庝竴琚嬩竴鐮� 琚嬬爜鐢熸垚瓒嬪娍 Response VO")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class MesBagCodeHomeTrendRespVO {
+
+    @Schema(description = "鏃ユ湡", requiredMode = Schema.RequiredMode.REQUIRED, example = "2026-08-13")
+    private String date;
+
+    @Schema(description = "琚嬬爜鐢熸垚鏁伴噺", requiredMode = Schema.RequiredMode.REQUIRED, example = "123")
+    private Long count;
+
+}
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
new file mode 100644
index 0000000..61cb109
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/MesProBagCodeController.java
@@ -0,0 +1,255 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode;
+
+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;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+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.MesProBagCodeBindReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeGenerateReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodePageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeRespVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeTraceRespVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO;
+import cn.iocoder.yudao.module.mes.framework.qrcode.MesProQrLabelBuilder;
+import cn.iocoder.yudao.module.mes.framework.qrcode.QrCodeImageUtils;
+import cn.iocoder.yudao.module.mes.framework.qrcode.QrLabelInfo;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
+import cn.iocoder.yudao.module.mes.service.pro.bagcode.MesProBagCodeService;
+import cn.iocoder.yudao.module.mes.service.pro.batch.MesProBatchService;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_BAG_CODE_NOT_EXISTS;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_QR_EXPORT_PARAMS_INVALID;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_QR_EXPORT_TOO_MANY;
+
+@Tag(name = "绠$悊鍚庡彴 - MES 琚嬬爜璧嬬爜锛堜竴琚嬩竴鐮侊級")
+@RestController
+@RequestMapping("/mes/pro/bag-code")
+@Validated
+public class MesProBagCodeController {
+
+    @Resource
+    private MesProBagCodeService bagCodeService;
+    @Resource
+    private MesProBatchService batchService;
+    @Resource
+    private AdminUserApi adminUserApi;
+    @Resource
+    private MesMdmItemService mdmItemService;
+
+    @PostMapping("/generate")
+    @Operation(summary = "鐢熸垚琚嬬爜鏁版嵁鍖咃紙涓�琚嬩竴鐮侊級")
+    @PreAuthorize("@ss.hasPermission('mes:pro-bag-code:create')")
+    public CommonResult<String> generateBagCodes(@Valid @RequestBody MesProBagCodeGenerateReqVO generateReqVO) {
+        return success(bagCodeService.generateBagCodes(generateReqVO));
+    }
+
+    @DeleteMapping("/delete-by-uuid")
+    @Operation(summary = "鍒犻櫎琚嬬爜鐢熸垚缁勶紙鏁版嵁鍖咃級")
+    @Parameter(name = "uuid", description = "鐢熸垚缁� UUID", required = true)
+    @PreAuthorize("@ss.hasPermission('mes:pro-bag-code:delete')")
+    public CommonResult<Boolean> deleteBagCodesByUuid(@RequestParam("uuid") String uuid) {
+        bagCodeService.deleteBagCodesByUuid(uuid);
+        return success(true);
+    }
+
+    @PutMapping("/bind-pallet")
+    @Operation(summary = "琚嬬爜缁戝畾鎵樼洏")
+    @PreAuthorize("@ss.hasPermission('mes:pro-bag-code:update')")
+    public CommonResult<Boolean> bindPallet(@Valid @RequestBody MesProBagCodeBindReqVO bindReqVO) {
+        bagCodeService.bindPallet(bindReqVO);
+        return success(true);
+    }
+
+    @PutMapping("/unbind-pallet")
+    @Operation(summary = "琚嬬爜瑙g粦鎵樼洏")
+    @PreAuthorize("@ss.hasPermission('mes:pro-bag-code:update')")
+    public CommonResult<Boolean> unbindPallet(@Valid @RequestBody MesProBagCodeBindReqVO bindReqVO) {
+        bagCodeService.unbindPallet(bindReqVO);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "鑾峰緱琚嬬爜")
+    @Parameter(name = "id", description = "缂栧彿", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('mes:pro-bag-code:query')")
+    public CommonResult<MesProBagCodeRespVO> getBagCode(@RequestParam("id") Long id) {
+        MesProBagCodeDO bagCode = bagCodeService.getBagCode(id);
+        if (bagCode == null) {
+            return success(null);
+        }
+        return success(buildBagCodeRespVOList(Collections.singletonList(bagCode)).get(0));
+    }
+
+    @GetMapping("/get-by-code")
+    @Operation(summary = "鎵爜杩芥函锛氭牴鎹鐮侊紙浜岀淮鐮佸唴瀹癸級鍙嶆煡鎵规銆佷骇绾裤�佽矗浠讳汉绛変俊鎭�")
+    @Parameter(name = "code", description = "琚嬬爜锛堜簩缁寸爜鍐呭锛�", required = true, example = "PC20260818L01001-0001")
+    @PreAuthorize("@ss.hasPermission('mes:pro-bag-code:query')")
+    public CommonResult<MesProBagCodeTraceRespVO> getBagCodeByCode(@RequestParam("code") String code) {
+        MesProBagCodeDO bagCode = bagCodeService.getBagCodeByCode(code);
+        if (bagCode == null) {
+            throw exception(PRO_BAG_CODE_NOT_EXISTS);
+        }
+        return success(buildBagCodeTraceRespVO(bagCode));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "鑾峰緱琚嬬爜鍒嗛〉")
+    @PreAuthorize("@ss.hasPermission('mes:pro-bag-code:query')")
+    public CommonResult<PageResult<MesProBagCodeRespVO>> getBagCodePage(@Valid MesProBagCodePageReqVO pageReqVO) {
+        PageResult<MesProBagCodeDO> pageResult = bagCodeService.getBagCodePage(pageReqVO);
+        return success(new PageResult<>(buildBagCodeRespVOList(pageResult.getList()), pageResult.getTotal()));
+    }
+
+    @GetMapping("/list-by-uuid")
+    @Operation(summary = "鑾峰緱鐢熸垚缁勭殑琚嬬爜鍒楄〃")
+    @Parameter(name = "uuid", description = "鐢熸垚缁� UUID", required = true)
+    @PreAuthorize("@ss.hasPermission('mes:pro-bag-code:query')")
+    public CommonResult<List<MesProBagCodeRespVO>> getBagCodeListByUuid(@RequestParam("uuid") String uuid) {
+        List<MesProBagCodeDO> list = bagCodeService.getBagCodeListByUuid(uuid);
+        return success(buildBagCodeRespVOList(list));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "鎵归噺瀵煎嚭琚嬬爜 Excel锛堜氦浠樺嵃鍒凤級锛屽鍑哄悗琚嬬爜鏍囪涓哄凡瀵煎嚭鍗板埛")
+    @PreAuthorize("@ss.hasPermission('mes:pro-bag-code:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportBagCodeExcel(@Valid MesProBagCodePageReqVO pageReqVO,
+                                   HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<MesProBagCodeDO> list = bagCodeService.getBagCodePage(pageReqVO).getList();
+        List<MesProBagCodeRespVO> voList = buildBagCodeRespVOList(list);
+        // 瀵煎嚭鍗充氦浠樺嵃鍒凤細鏍囪涓哄凡瀵煎嚭鍗板埛骞惰褰曟椂闂达紙浠呭鐞�"宸茬敓鎴�"鐘舵�佺殑琚嬬爜锛�
+        bagCodeService.markBagCodesPrinted(convertList(list, MesProBagCodeDO::getId));
+        ExcelUtils.write(response, "琚嬬爜鏁版嵁鍖�.xls", "鏁版嵁", MesProBagCodeRespVO.class, voList);
+    }
+
+    @GetMapping("/export-qr")
+    @Operation(summary = "鎵归噺瀵煎嚭琚嬬爜浜岀淮鐮佸浘鐗� ZIP锛堝浘鐗囧彔鍔犲叧閿俊鎭枃瀛楋級锛屼緵鍗板埛浣跨敤")
+    @Parameters({
+            @Parameter(name = "uuid", description = "鐢熸垚缁� UUID锛堜紭鍏堬級锛屼负绌哄垯鎸� batchId 瀵煎嚭"),
+            @Parameter(name = "batchId", description = "鐢熶骇鎵规缂栧彿")
+    })
+    @PreAuthorize("@ss.hasPermission('mes:pro-bag-code:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportBagCodeQr(@RequestParam(value = "uuid", required = false) String uuid,
+                                @RequestParam(value = "batchId", required = false) Long batchId,
+                                HttpServletResponse response) throws IOException {
+        List<MesProBagCodeDO> list;
+        String zipName;
+        if (StrUtil.isNotEmpty(uuid)) {
+            list = bagCodeService.getBagCodeListByUuid(uuid);
+            zipName = "琚嬬爜浜岀淮鐮�-" + uuid;
+        } else if (batchId != null) {
+            list = bagCodeService.getBagCodeListByBatchId(batchId);
+            zipName = "琚嬬爜浜岀淮鐮�-" + batchId;
+        } else {
+            throw exception(PRO_QR_EXPORT_PARAMS_INVALID);
+        }
+        if (CollUtil.isEmpty(list)) {
+            throw exception(PRO_BAG_CODE_NOT_EXISTS);
+        }
+        if (list.size() > QrCodeImageUtils.MAX_QR_EXPORT) {
+            throw exception(PRO_QR_EXPORT_TOO_MANY);
+        }
+        QrCodeImageUtils.writeZip(response, zipName, buildBagCodeQrLabels(list));
+    }
+
+    // ==================== 鎷兼帴 VO ====================
+
+    private List<MesProBagCodeRespVO> buildBagCodeRespVOList(List<MesProBagCodeDO> list) {
+        if (CollUtil.isEmpty(list)) {
+            return Collections.emptyList();
+        }
+        // 1. 鑾峰緱鍏宠仈鏁版嵁锛堜粎鎵规鐨勪骇绾夸俊鎭級
+        Map<Long, MesProBatchDO> batchMap = convertMap(
+                batchService.getBatchList(convertSet(list, MesProBagCodeDO::getBatchId)), MesProBatchDO::getId);
+        // 2. 鏋勫缓缁撴灉
+        return BeanUtils.toBean(list, MesProBagCodeRespVO.class, vo ->
+                MapUtils.findAndThen(batchMap, vo.getBatchId(), batch ->
+                        vo.setLineCode(batch.getLineCode()).setLineName(batch.getLineName())));
+    }
+
+    private MesProBagCodeTraceRespVO buildBagCodeTraceRespVO(MesProBagCodeDO bagCode) {
+        MesProBagCodeTraceRespVO respVO = BeanUtils.toBean(bagCode, MesProBagCodeTraceRespVO.class);
+        // 鎵规淇℃伅
+        MesProBatchDO batch = batchService.getBatch(bagCode.getBatchId());
+        if (batch != null) {
+            respVO.setBatchStatus(batch.getStatus())
+                    .setProduceDate(batch.getProduceDate())
+                    .setLineCode(batch.getLineCode())
+                    .setLineName(batch.getLineName())
+                    .setOwnerUserId(batch.getOwnerUserId())
+                    .setItemId(batch.getItemId());
+            // 璐d换浜�
+            if (batch.getOwnerUserId() != null) {
+                AdminUserRespDTO user = adminUserApi.getUser(batch.getOwnerUserId());
+                if (user != null) {
+                    respVO.setOwnerUserName(user.getNickname());
+                }
+            }
+            // 鍝佺淇℃伅
+            if (batch.getItemId() != null) {
+                MesMdmItemDO item = mdmItemService.getItem(batch.getItemId());
+                if (item != null) {
+                    respVO.setItemCode(item.getCode())
+                            .setItemName(item.getName())
+                            .setItemSpecification(item.getSpecification());
+                }
+            }
+        }
+        return respVO;
+    }
+
+    /**
+     * 鏋勫缓琚嬬爜浜岀淮鐮佹爣绛惧垪琛紙浜岀淮鐮佺紪鐮佺函鐮佸�硷紝鍥剧墖鍙犲姞鍏抽敭淇℃伅鏂囧瓧锛�
+     */
+    private List<QrLabelInfo> buildBagCodeQrLabels(List<MesProBagCodeDO> list) {
+        // 1. 鑾峰緱鍏宠仈鏁版嵁锛堟壒娆°�佸搧绉嶃�佽矗浠讳汉锛�
+        Map<Long, MesProBatchDO> batchMap = convertMap(
+                batchService.getBatchList(convertSet(list, MesProBagCodeDO::getBatchId)), MesProBatchDO::getId);
+        Map<Long, MesMdmItemDO> itemMap = mdmItemService.getItemMap(
+                convertSet(batchMap.values(), MesProBatchDO::getItemId));
+        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
+                convertSet(batchMap.values(), MesProBatchDO::getOwnerUserId));
+        // 2. 鏋勫缓鏍囩
+        List<QrLabelInfo> labels = new ArrayList<>(list.size());
+        for (MesProBagCodeDO bagCode : list) {
+            labels.add(MesProQrLabelBuilder.buildBagCodeLabel(
+                    bagCode, batchMap.get(bagCode.getBatchId()), itemMap, userMap));
+        }
+        return labels;
+    }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeBindReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeBindReqVO.java
new file mode 100644
index 0000000..f2b543a
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeBindReqVO.java
@@ -0,0 +1,22 @@
+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 琚嬬爜缁戝畾/瑙g粦鎵樼洏 Request VO")
+@Data
+public class MesProBagCodeBindReqVO {
+
+    @Schema(description = "鎵樼洏缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    @NotNull(message = "鎵樼洏缂栧彿涓嶈兘涓虹┖")
+    private Long palletId;
+
+    @Schema(description = "琚嬬爜缂栧彿鍒楄〃", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "琚嬬爜缂栧彿鍒楄〃涓嶈兘涓虹┖")
+    private List<Long> ids;
+
+}
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
new file mode 100644
index 0000000..9fc8107
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeGenerateReqVO.java
@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.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 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")
+    private Integer count;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodePageReqVO.java
new file mode 100644
index 0000000..d8a1fd4
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodePageReqVO.java
@@ -0,0 +1,42 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 琚嬬爜璧嬬爜鍒嗛〉 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MesProBagCodePageReqVO extends PageParam {
+
+    @Schema(description = "琚嬬爜", example = "PC20260818L01A001-0001")
+    private String code;
+
+    @Schema(description = "鐢熶骇鎵规缂栧彿", example = "1024")
+    private Long batchId;
+
+    @Schema(description = "鎵规鍙�", example = "PC20260818L01A001")
+    private String batchCode;
+
+    @Schema(description = "鐢熸垚缁� UUID")
+    private String uuid;
+
+    @Schema(description = "缁戝畾鎵樼洏缂栧彿", example = "1024")
+    private Long palletId;
+
+    @Schema(description = "鐘舵�侊紙瀛楀吀 mes_pro_bag_code_status锛�", example = "10")
+    private Integer status;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeRespVO.java
new file mode 100644
index 0000000..900d5c5
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeRespVO.java
@@ -0,0 +1,79 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo;
+
+import cn.idev.excel.annotation.ExcelIgnore;
+import cn.idev.excel.annotation.ExcelProperty;
+import cn.idev.excel.annotation.write.style.ColumnWidth;
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 琚嬬爜璧嬬爜 Response VO")
+@Data
+public class MesProBagCodeRespVO {
+
+    @Schema(description = "缂栧彿", example = "1024")
+    @ExcelIgnore
+    private Long id;
+
+    @Schema(description = "鐢熸垚缁� UUID")
+    @ExcelIgnore
+    private String uuid;
+
+    @Schema(description = "琚嬬爜锛堜簩缁寸爜鍐呭锛�", example = "PC20260818L01001-0001")
+    @ExcelProperty("浜岀淮鐮佸唴瀹�")
+    @ColumnWidth(30)
+    private String code;
+
+    @Schema(description = "鎵规鍐呰搴忓彿", example = "1")
+    @ExcelProperty("琚嬪簭鍙�")
+    private Integer bagNo;
+
+    @Schema(description = "鐢熶骇鎵规缂栧彿", example = "1024")
+    @ExcelIgnore
+    private Long batchId;
+
+    @Schema(description = "鎵规鍙�", example = "PC20260818L01001")
+    @ExcelProperty("鎵规鍙�")
+    @ColumnWidth(30)
+    private String batchCode;
+
+    @Schema(description = "浜х嚎缂栫爜")
+    @ExcelProperty("浜х嚎缂栫爜")
+    private String lineCode;
+
+    @Schema(description = "浜х嚎鍚嶇О")
+    @ExcelProperty("浜х嚎鍚嶇О")
+    private String lineName;
+
+    @Schema(description = "缁戝畾鎵樼洏缂栧彿", example = "1024")
+    @ExcelIgnore
+    private Long palletId;
+
+    @Schema(description = "鎵樼洏鐮�")
+    @ExcelProperty("鎵樼洏鐮�")
+    @ColumnWidth(30)
+    private String palletCode;
+
+    @Schema(description = "鐘舵�侊紙瀛楀吀 mes_pro_bag_code_status锛�", example = "10")
+    @ExcelProperty(value = "鐘舵��", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MES_PRO_BAG_CODE_STATUS)
+    private Integer status;
+
+    @Schema(description = "瀵煎嚭锛堜氦浠樺嵃鍒凤級鏃堕棿")
+    @ExcelProperty("瀵煎嚭鍗板埛鏃堕棿")
+    @ColumnWidth(20)
+    private LocalDateTime printTime;
+
+    @Schema(description = "澶囨敞")
+    @ExcelIgnore
+    private String remark;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @ExcelIgnore
+    private LocalDateTime createTime;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeTraceRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeTraceRespVO.java
new file mode 100644
index 0000000..d049c46
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeTraceRespVO.java
@@ -0,0 +1,77 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 琚嬬爜鎵爜杩芥函 Response VO")
+@Data
+public class MesProBagCodeTraceRespVO {
+
+    // ========== 琚嬬爜淇℃伅 ==========
+
+    @Schema(description = "琚嬬爜缂栧彿", example = "1024")
+    private Long id;
+
+    @Schema(description = "琚嬬爜锛堜簩缁寸爜鍐呭锛�", example = "PC20260818L01001-0001")
+    private String code;
+
+    @Schema(description = "鎵规鍐呰搴忓彿", example = "1")
+    private Integer bagNo;
+
+    @Schema(description = "琚嬬爜鐘舵�侊紙瀛楀吀 mes_pro_bag_code_status锛�", example = "10")
+    private Integer status;
+
+    @Schema(description = "瀵煎嚭锛堜氦浠樺嵃鍒凤級鏃堕棿")
+    private LocalDateTime printTime;
+
+    // ========== 鎵规淇℃伅 ==========
+
+    @Schema(description = "鐢熶骇鎵规缂栧彿", example = "1024")
+    private Long batchId;
+
+    @Schema(description = "鎵规鍙�", example = "PC20260818L01001")
+    private String batchCode;
+
+    @Schema(description = "鎵规鐘舵�侊紙瀛楀吀 mes_pro_batch_status锛�", example = "20")
+    private Integer batchStatus;
+
+    @Schema(description = "鐢熶骇鏃ユ湡")
+    private LocalDateTime produceDate;
+
+    @Schema(description = "浜х嚎缂栫爜")
+    private String lineCode;
+
+    @Schema(description = "浜х嚎鍚嶇О")
+    private String lineName;
+
+    // ========== 鍝佺淇℃伅 ==========
+
+    @Schema(description = "鍝佺锛堢墿鏂欙級缂栧彿", example = "1024")
+    private Long itemId;
+
+    @Schema(description = "鍝佺缂栫爜")
+    private String itemCode;
+
+    @Schema(description = "鍝佺鍚嶇О")
+    private String itemName;
+
+    @Schema(description = "鍝佺瑙勬牸")
+    private String itemSpecification;
+
+    @Schema(description = "璐d换浜虹敤鎴风紪鍙�", example = "1")
+    private Long ownerUserId;
+
+    @Schema(description = "璐d换浜烘樀绉�")
+    private String ownerUserName;
+
+    // ========== 鎵樼洏淇℃伅 ==========
+
+    @Schema(description = "缁戝畾鎵樼洏缂栧彿", example = "1024")
+    private Long palletId;
+
+    @Schema(description = "鎵樼洏鐮�")
+    private String palletCode;
+
+}
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
new file mode 100644
index 0000000..55a450b
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/MesProBatchController.java
@@ -0,0 +1,281 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.batch;
+
+import cn.hutool.core.collection.CollUtil;
+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;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+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.MesProBagCodeRespVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchPageReqVO;
+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;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchWorkerRespVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletRespVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchWorkerDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.pallet.MesProPalletDO;
+import cn.iocoder.yudao.module.mes.framework.qrcode.MesProQrLabelBuilder;
+import cn.iocoder.yudao.module.mes.framework.qrcode.QrCodeImageUtils;
+import cn.iocoder.yudao.module.mes.framework.qrcode.QrLabelInfo;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
+import cn.iocoder.yudao.module.mes.service.pro.bagcode.MesProBagCodeService;
+import cn.iocoder.yudao.module.mes.service.pro.batch.MesProBatchService;
+import cn.iocoder.yudao.module.mes.service.pro.pallet.MesProPalletService;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_BATCH_NOT_EXISTS;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_QR_EXPORT_TOO_MANY;
+
+@Tag(name = "绠$悊鍚庡彴 - MES 鐢熶骇鎵规")
+@RestController
+@RequestMapping("/mes/pro/batch")
+@Validated
+public class MesProBatchController {
+
+    @Resource
+    private MesProBatchService batchService;
+    @Resource
+    private AdminUserApi adminUserApi;
+    @Resource
+    private MesMdmItemService mdmItemService;
+    @Resource
+    private MesProPalletService palletService;
+    @Resource
+    private MesProBagCodeService bagCodeService;
+
+    @PostMapping("/create")
+    @Operation(summary = "鍒涘缓鐢熶骇鎵规锛堣嚜鍔ㄧ敓鎴愭壒娆″彿锛�")
+    @PreAuthorize("@ss.hasPermission('mes:pro-batch:create')")
+    public CommonResult<Long> createBatch(@Valid @RequestBody MesProBatchSaveReqVO createReqVO) {
+        return success(batchService.createBatch(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "鏇存柊鐢熶骇鎵规")
+    @PreAuthorize("@ss.hasPermission('mes:pro-batch:update')")
+    public CommonResult<Boolean> updateBatch(@Valid @RequestBody MesProBatchSaveReqVO updateReqVO) {
+        batchService.updateBatch(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "鍒犻櫎鐢熶骇鎵规")
+    @Parameter(name = "id", description = "缂栧彿", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('mes:pro-batch:delete')")
+    public CommonResult<Boolean> deleteBatch(@RequestParam("id") Long id) {
+        batchService.deleteBatch(id);
+        return success(true);
+    }
+
+    @PutMapping("/update-status")
+    @Operation(summary = "鏇存柊鐢熶骇鎵规鐘舵��")
+    @Parameters({
+            @Parameter(name = "id", description = "缂栧彿", required = true, example = "1024"),
+            @Parameter(name = "status", description = "鐩爣鐘舵�侊紙瀛楀吀 mes_pro_batch_status锛�", required = true, example = "20")
+    })
+    @PreAuthorize("@ss.hasPermission('mes:pro-batch:update')")
+    public CommonResult<Boolean> updateBatchStatus(@RequestParam("id") Long id,
+                                                   @RequestParam("status") Integer status) {
+        batchService.updateBatchStatus(id, status);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "鑾峰緱鐢熶骇鎵规璇︽儏锛堝惈浜哄憳閰嶇疆锛�")
+    @Parameter(name = "id", description = "缂栧彿", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('mes:pro-batch:query')")
+    public CommonResult<MesProBatchRespVO> getBatch(@RequestParam("id") Long id) {
+        MesProBatchDO batch = batchService.getBatch(id);
+        if (batch == null) {
+            return success(null);
+        }
+        MesProBatchRespVO respVO = buildBatchRespVOList(Collections.singletonList(batch)).get(0);
+        // 濉厖浜哄憳閰嶇疆
+        respVO.setWorkers(buildWorkerRespVOList(batchService.getBatchWorkerListByBatchId(id)));
+        return success(respVO);
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "鑾峰緱鐢熶骇鎵规鍒嗛〉")
+    @PreAuthorize("@ss.hasPermission('mes:pro-batch:query')")
+    public CommonResult<PageResult<MesProBatchRespVO>> getBatchPage(@Valid MesProBatchPageReqVO pageReqVO) {
+        PageResult<MesProBatchDO> pageResult = batchService.getBatchPage(pageReqVO);
+        return success(new PageResult<>(buildBatchRespVOList(pageResult.getList()), pageResult.getTotal()));
+    }
+
+    @GetMapping("/simple-list")
+    @Operation(summary = "鑾峰緱鐢熶骇鎵规绮剧畝鍒楄〃锛堜緵涓嬫媺閫夋嫨锛�")
+    @PreAuthorize("@ss.hasPermission('mes:pro-batch:query')")
+    public CommonResult<List<MesProBatchRespVO>> getBatchSimpleList() {
+        MesProBatchPageReqVO pageReqVO = new MesProBatchPageReqVO();
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<MesProBatchDO> list = batchService.getBatchPage(pageReqVO).getList();
+        return success(BeanUtils.toBean(list, MesProBatchRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "瀵煎嚭鐢熶骇鎵规 Excel")
+    @PreAuthorize("@ss.hasPermission('mes:pro-batch:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportBatchExcel(@Valid MesProBatchPageReqVO pageReqVO,
+                                 HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<MesProBatchDO> list = batchService.getBatchPage(pageReqVO).getList();
+        List<MesProBatchRespVO> voList = buildBatchRespVOList(list);
+        ExcelUtils.write(response, "鐢熶骇鎵规.xls", "鏁版嵁", MesProBatchRespVO.class, voList);
+    }
+
+    @GetMapping("/get-by-code")
+    @Operation(summary = "鎵爜杩芥函锛氭牴鎹壒娆″彿锛堜簩缁寸爜鍐呭锛夊弽鏌ユ壒娆°�佷汉鍛樸�佹墭鐩樸�佽鐮佷俊鎭�")
+    @Parameter(name = "code", description = "鎵规鍙凤紙浜岀淮鐮佸唴瀹癸級", required = true, example = "PC20260818L01001")
+    @PreAuthorize("@ss.hasPermission('mes:pro-batch:query')")
+    public CommonResult<MesProBatchTraceRespVO> getBatchByCode(@RequestParam("code") String code) {
+        MesProBatchDO batch = batchService.getBatchByCode(code);
+        if (batch == null) {
+            throw exception(PRO_BATCH_NOT_EXISTS);
+        }
+        return success(buildBatchTraceRespVO(batch));
+    }
+
+    @GetMapping("/export-qr")
+    @Operation(summary = "鎵归噺瀵煎嚭鎵规浜岀淮鐮佸浘鐗� ZIP锛堟壒娆″浘 + 璇ユ壒娆″叏閮ㄦ墭鐩樺浘锛�")
+    @Parameter(name = "batchId", description = "鐢熶骇鎵规缂栧彿", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('mes:pro-batch:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportBatchQr(@RequestParam("batchId") Long batchId,
+                              HttpServletResponse response) throws IOException {
+        MesProBatchDO batch = batchService.getBatch(batchId);
+        if (batch == null) {
+            throw exception(PRO_BATCH_NOT_EXISTS);
+        }
+        List<MesProPalletDO> pallets = palletService.getPalletListByBatchId(batchId);
+        if (pallets.size() + 1 > QrCodeImageUtils.MAX_QR_EXPORT) {
+            throw exception(PRO_QR_EXPORT_TOO_MANY);
+        }
+        QrCodeImageUtils.writeZip(response, "鎵规浜岀淮鐮�-" + batch.getCode(), buildBatchQrLabels(batch, pallets));
+    }
+
+    // ==================== 鎷兼帴 VO ====================
+
+    private List<MesProBatchRespVO> buildBatchRespVOList(List<MesProBatchDO> list) {
+        if (CollUtil.isEmpty(list)) {
+            return Collections.emptyList();
+        }
+        // 1. 鑾峰緱鍏宠仈鏁版嵁锛堣矗浠讳汉銆佸搧绉嶇墿鏂欙級
+        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
+                convertSet(list, MesProBatchDO::getOwnerUserId));
+        Map<Long, MesMdmItemDO> itemMap = mdmItemService.getItemMap(
+                convertSet(list, MesProBatchDO::getItemId));
+        // 2. 鏋勫缓缁撴灉
+        return BeanUtils.toBean(list, MesProBatchRespVO.class, vo -> {
+            MapUtils.findAndThen(userMap, vo.getOwnerUserId(), user ->
+                    vo.setOwnerUserName(user.getNickname()));
+            MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
+                vo.setItemCode(item.getCode());
+                vo.setItemName(item.getName());
+                vo.setItemSpecification(item.getSpecification());
+            });
+        });
+    }
+
+    private List<MesProBatchWorkerRespVO> buildWorkerRespVOList(List<MesProBatchWorkerDO> workers) {
+        if (CollUtil.isEmpty(workers)) {
+            return Collections.emptyList();
+        }
+        Set<Long> userIds = new HashSet<>(convertList(workers, MesProBatchWorkerDO::getUserId));
+        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
+        return BeanUtils.toBean(workers, MesProBatchWorkerRespVO.class, vo ->
+                MapUtils.findAndThen(userMap, vo.getUserId(), user -> vo.setUserName(user.getNickname())));
+    }
+
+    private MesProBatchTraceRespVO buildBatchTraceRespVO(MesProBatchDO batch) {
+        MesProBatchTraceRespVO respVO = BeanUtils.toBean(batch, MesProBatchTraceRespVO.class);
+        // 鍝佺淇℃伅
+        if (batch.getItemId() != null) {
+            MesMdmItemDO item = mdmItemService.getItem(batch.getItemId());
+            if (item != null) {
+                respVO.setItemCode(item.getCode())
+                        .setItemName(item.getName())
+                        .setItemSpecification(item.getSpecification());
+            }
+        }
+        // 璐d换浜�
+        if (batch.getOwnerUserId() != null) {
+            AdminUserRespDTO user = adminUserApi.getUser(batch.getOwnerUserId());
+            if (user != null) {
+                respVO.setOwnerUserName(user.getNickname());
+            }
+        }
+        // 浜哄憳閰嶇疆
+        respVO.setWorkers(buildWorkerRespVOList(batchService.getBatchWorkerListByBatchId(batch.getId())));
+        // 鎵樼洏鍒楄〃
+        respVO.setPallets(BeanUtils.toBean(palletService.getPalletListByBatchId(batch.getId()), MesProPalletRespVO.class));
+        // 琚嬬爜鍒楄〃锛堝皝椤� 2000锛宐agTotal 璁板綍鎬绘暟锛�
+        List<MesProBagCodeDO> bags = bagCodeService.getBagCodeListByBatchId(batch.getId());
+        respVO.setBagTotal(bags.size());
+        if (bags.size() > QrCodeImageUtils.MAX_QR_EXPORT) {
+            bags = bags.subList(0, QrCodeImageUtils.MAX_QR_EXPORT);
+        }
+        respVO.setBags(buildBagCodeRespVOList(bags));
+        return respVO;
+    }
+
+    private List<MesProBagCodeRespVO> buildBagCodeRespVOList(List<MesProBagCodeDO> list) {
+        if (CollUtil.isEmpty(list)) {
+            return Collections.emptyList();
+        }
+        // 鑾峰緱鎵规鐨勪骇绾夸俊鎭紝鎷兼帴琚嬬爜鐨勪骇绾跨紪鐮�/鍚嶇О
+        Map<Long, MesProBatchDO> batchMap = convertMap(
+                batchService.getBatchList(convertSet(list, MesProBagCodeDO::getBatchId)), MesProBatchDO::getId);
+        return BeanUtils.toBean(list, MesProBagCodeRespVO.class, vo ->
+                MapUtils.findAndThen(batchMap, vo.getBatchId(), batch ->
+                        vo.setLineCode(batch.getLineCode()).setLineName(batch.getLineName())));
+    }
+
+    private List<QrLabelInfo> buildBatchQrLabels(MesProBatchDO batch, List<MesProPalletDO> pallets) {
+        // 鑾峰緱鍏宠仈鏁版嵁锛堝搧绉嶃�佽矗浠讳汉锛夆�斺�旀壒娆′笌鎵樼洏鍚屽睘涓�鎵癸紝鍏辩敤鍚屼竴浠�
+        Map<Long, MesMdmItemDO> itemMap = mdmItemService.getItemMap(
+                convertSet(Collections.singletonList(batch), MesProBatchDO::getItemId));
+        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
+                convertSet(Collections.singletonList(batch), MesProBatchDO::getOwnerUserId));
+        // 鏋勫缓鏍囩锛氭壒娆″浘 + 鍏ㄩ儴鎵樼洏鍥�
+        List<QrLabelInfo> labels = new ArrayList<>(pallets.size() + 1);
+        labels.add(MesProQrLabelBuilder.buildBatchLabel(batch, itemMap, userMap));
+        for (MesProPalletDO pallet : pallets) {
+            labels.add(MesProQrLabelBuilder.buildPalletLabel(pallet, batch, itemMap, userMap));
+        }
+        return labels;
+    }
+
+}
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
new file mode 100644
index 0000000..d8cc18f
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchPageReqVO.java
@@ -0,0 +1,49 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 鐢熶骇鎵规鍒嗛〉 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MesProBatchPageReqVO extends PageParam {
+
+    @Schema(description = "鎵规鍙�", example = "PC20260818L01NY001")
+    private String code;
+
+    @Schema(description = "鍝佺锛堜骇鍝佺墿鏂欙級缂栧彿", example = "1")
+    private Long itemId;
+
+    @Schema(description = "浜х嚎缂栧彿", example = "1")
+    private Long lineId;
+
+    @Schema(description = "浜х嚎缂栫爜", example = "L01")
+    private String lineCode;
+
+    @Schema(description = "浜х嚎鍚嶇О", example = "鍖呰涓�绾�")
+    private String lineName;
+
+    @Schema(description = "璐d换浜虹敤鎴风紪鍙�", example = "1")
+    private Long ownerUserId;
+
+    @Schema(description = "鎵规鐘舵�侊紙瀛楀吀 mes_pro_batch_status锛�", example = "20")
+    private Integer status;
+
+    @Schema(description = "鐢熶骇鏃ユ湡")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] produceDate;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}
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
new file mode 100644
index 0000000..371eac9
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchRespVO.java
@@ -0,0 +1,100 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo;
+
+import cn.idev.excel.annotation.ExcelIgnore;
+import cn.idev.excel.annotation.ExcelProperty;
+import cn.idev.excel.annotation.write.style.ColumnWidth;
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 鐢熶骇鎵规 Response VO")
+@Data
+public class MesProBatchRespVO {
+
+    @Schema(description = "缂栧彿", example = "1024")
+    @ExcelProperty("缂栧彿")
+    private Long id;
+
+    @Schema(description = "鎵规鍙�", example = "PC20260818L01NY001")
+    @ExcelProperty("鎵规鍙�")
+    @ColumnWidth(25)
+    private String code;
+
+    @Schema(description = "鍝佺锛堜骇鍝佺墿鏂欙級缂栧彿", example = "1")
+    @ExcelIgnore
+    private Long itemId;
+
+    @Schema(description = "鍝佺缂栫爜")
+    @ExcelProperty("鍝佺缂栫爜")
+    private String itemCode;
+
+    @Schema(description = "鍝佺鍚嶇О")
+    @ExcelProperty("鍝佺鍚嶇О")
+    private String itemName;
+
+    @Schema(description = "鍝佺瑙勬牸")
+    @ExcelProperty("鍝佺瑙勬牸")
+    private String itemSpecification;
+
+    @Schema(description = "浜х嚎缂栧彿", example = "1")
+    @ExcelIgnore
+    private Long lineId;
+
+    @Schema(description = "浜х嚎缂栫爜", example = "L01")
+    @ExcelProperty("浜х嚎缂栫爜")
+    private String lineCode;
+
+    @Schema(description = "浜х嚎鍚嶇О", example = "鍖呰涓�绾�")
+    @ExcelProperty("浜х嚎鍚嶇О")
+    private String lineName;
+
+    @Schema(description = "鐢熶骇鏃ユ湡")
+    @ExcelProperty("鐢熶骇鏃ユ湡")
+    @ColumnWidth(20)
+    private LocalDateTime produceDate;
+
+    @Schema(description = "璁″垝鏁伴噺", example = "1000")
+    @ExcelProperty("璁″垝鏁伴噺")
+    private BigDecimal planQuantity;
+
+    @Schema(description = "璐d换浜虹敤鎴风紪鍙�", example = "1")
+    @ExcelIgnore
+    private Long ownerUserId;
+
+    @Schema(description = "璐d换浜烘樀绉�")
+    @ExcelProperty("璐d换浜�")
+    private String ownerUserName;
+
+    @Schema(description = "宸茬敓鎴愯鐮佹暟閲忥紙涓�琚嬩竴鐮侊級")
+    @ExcelProperty("琚嬬爜鏁伴噺")
+    private Integer bagQuantity;
+
+    @Schema(description = "宸茬敓鎴愭墭鐩樼爜鏁伴噺")
+    @ExcelProperty("鎵樼洏鐮佹暟閲�")
+    private Integer palletQuantity;
+
+    @Schema(description = "鎵规鐘舵�侊紙瀛楀吀 mes_pro_batch_status锛�", example = "20")
+    @ExcelProperty(value = "鎵规鐘舵��", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MES_PRO_BATCH_STATUS)
+    private Integer status;
+
+    @Schema(description = "澶囨敞")
+    @ExcelProperty("澶囨敞")
+    @ColumnWidth(30)
+    private String remark;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @ExcelIgnore
+    private LocalDateTime createTime;
+
+    @Schema(description = "鐢熶骇浜哄憳閰嶇疆鍒楄〃")
+    @ExcelIgnore
+    private List<MesProBatchWorkerRespVO> workers;
+
+}
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
new file mode 100644
index 0000000..6b5cd8d
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchSaveReqVO.java
@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 鐢熶骇鎵规鏂板/淇敼 Request VO")
+@Data
+public class MesProBatchSaveReqVO {
+
+    @Schema(description = "缂栧彿", example = "1024")
+    private Long id;
+
+    @Schema(description = "鍝佺锛堜骇鍝佺墿鏂欙級缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "鍝佺涓嶈兘涓虹┖")
+    private Long itemId;
+
+    @Schema(description = "浜х嚎缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "浜х嚎涓嶈兘涓虹┖")
+    private Long lineId;
+
+    @Schema(description = "鐢熶骇鏃ユ湡", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "鐢熶骇鏃ユ湡涓嶈兘涓虹┖")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime produceDate;
+
+    @Schema(description = "璁″垝鏁伴噺", example = "1000")
+    private BigDecimal planQuantity;
+
+    @Schema(description = "璐d换浜虹敤鎴风紪鍙凤紙璐d换钀藉疄鍒颁汉锛�", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "璐d换浜轰笉鑳戒负绌�")
+    private Long ownerUserId;
+
+    @Schema(description = "澶囨敞", example = "鍔犳�ユ壒娆�")
+    private String remark;
+
+    @Schema(description = "鐢熶骇浜哄憳閰嶇疆鍒楄〃", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "鐢熶骇浜哄憳閰嶇疆涓嶈兘涓虹┖")
+    @Valid
+    private List<Worker> workers;
+
+    @Schema(description = "鐢熶骇浜哄憳閰嶇疆")
+    @Data
+    public static class Worker {
+
+        @Schema(description = "缂栧彿锛堟洿鏂版椂浼犲叆锛�", example = "1024")
+        private Long id;
+
+        @Schema(description = "鐢熶骇浜哄憳鐢ㄦ埛缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+        @NotNull(message = "鐢熶骇浜哄憳涓嶈兘涓虹┖")
+        private Long userId;
+
+        @Schema(description = "宀椾綅绫诲瀷锛堝瓧鍏� mes_pro_batch_worker_type锛�", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
+        @NotNull(message = "宀椾綅绫诲瀷涓嶈兘涓虹┖")
+        private Integer workerType;
+
+        @Schema(description = "澶囨敞")
+        private String remark;
+
+    }
+
+}
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
new file mode 100644
index 0000000..105822e
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchTraceRespVO.java
@@ -0,0 +1,81 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo;
+
+import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeRespVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 鐢熶骇鎵规鎵爜杩芥函 Response VO")
+@Data
+public class MesProBatchTraceRespVO {
+
+    // ========== 鎵规淇℃伅 ==========
+
+    @Schema(description = "鐢熶骇鎵规缂栧彿", example = "1024")
+    private Long id;
+
+    @Schema(description = "鎵规鍙凤紙浜岀淮鐮佸唴瀹癸級", example = "PC20260818L01001")
+    private String code;
+
+    @Schema(description = "鎵规鐘舵�侊紙瀛楀吀 mes_pro_batch_status锛�", example = "20")
+    private Integer status;
+
+    @Schema(description = "鐢熶骇鏃ユ湡")
+    private LocalDateTime produceDate;
+
+    @Schema(description = "浜х嚎缂栫爜")
+    private String lineCode;
+
+    @Schema(description = "浜х嚎鍚嶇О")
+    private String lineName;
+
+    @Schema(description = "璐d换浜虹敤鎴风紪鍙�", example = "1")
+    private Long ownerUserId;
+
+    @Schema(description = "璐d换浜烘樀绉�")
+    private String ownerUserName;
+
+    @Schema(description = "璁″垝鏁伴噺")
+    private Integer planQuantity;
+
+    @Schema(description = "宸茬敓鎴愯鐮佹暟閲�")
+    private Integer bagQuantity;
+
+    @Schema(description = "宸茬敓鎴愭墭鐩樼爜鏁伴噺")
+    private Integer palletQuantity;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    // ========== 鍝佺淇℃伅 ==========
+
+    @Schema(description = "鍝佺锛堢墿鏂欙級缂栧彿", example = "1024")
+    private Long itemId;
+
+    @Schema(description = "鍝佺缂栫爜")
+    private String itemCode;
+
+    @Schema(description = "鍝佺鍚嶇О")
+    private String itemName;
+
+    @Schema(description = "鍝佺瑙勬牸")
+    private String itemSpecification;
+
+    // ========== 杩芥函淇℃伅 ==========
+
+    @Schema(description = "鐢熶骇浜哄憳閰嶇疆鍒楄〃")
+    private List<MesProBatchWorkerRespVO> workers;
+
+    @Schema(description = "鎵樼洏鐮佸垪琛�")
+    private List<MesProPalletRespVO> pallets;
+
+    @Schema(description = "琚嬬爜鍒楄〃锛堟渶澶氬墠 2000 鏉★紝鎸夎搴忓彿鍗囧簭锛�")
+    private List<MesProBagCodeRespVO> bags;
+
+    @Schema(description = "琚嬬爜鎬绘暟锛堝彲鑳藉ぇ浜� bags 瀹為檯鏉℃暟锛�")
+    private Integer bagTotal;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchWorkerRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchWorkerRespVO.java
new file mode 100644
index 0000000..42ac985
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchWorkerRespVO.java
@@ -0,0 +1,35 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo;
+
+import cn.idev.excel.annotation.ExcelProperty;
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 鐢熶骇鎵规浜哄憳閰嶇疆 Response VO")
+@Data
+public class MesProBatchWorkerRespVO {
+
+    @Schema(description = "缂栧彿", example = "1024")
+    private Long id;
+
+    @Schema(description = "鐢熶骇鎵规缂栧彿", example = "1024")
+    private Long batchId;
+
+    @Schema(description = "鐢熶骇浜哄憳鐢ㄦ埛缂栧彿", example = "1")
+    private Long userId;
+
+    @Schema(description = "鐢熶骇浜哄憳鏄电О")
+    @ExcelProperty("浜哄憳")
+    private String userName;
+
+    @Schema(description = "宀椾綅绫诲瀷锛堝瓧鍏� mes_pro_batch_worker_type锛�", example = "10")
+    @ExcelProperty(value = "宀椾綅绫诲瀷", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MES_PRO_BATCH_WORKER_TYPE)
+    private Integer workerType;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/line/MesProLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/line/MesProLineController.java
new file mode 100644
index 0000000..ab74f80
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/line/MesProLineController.java
@@ -0,0 +1,103 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.line;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+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.line.vo.MesProLinePageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.line.vo.MesProLineRespVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.line.vo.MesProLineSaveReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.line.MesProLineDO;
+import cn.iocoder.yudao.module.mes.service.pro.line.MesProLineService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+
+@Tag(name = "绠$悊鍚庡彴 - MES 浜х嚎缁存姢")
+@RestController
+@RequestMapping("/mes/pro/line")
+@Validated
+public class MesProLineController {
+
+    @Resource
+    private MesProLineService lineService;
+
+    @PostMapping("/create")
+    @Operation(summary = "鍒涘缓浜х嚎")
+    @PreAuthorize("@ss.hasPermission('mes:pro-line:create')")
+    public CommonResult<Long> createLine(@Valid @RequestBody MesProLineSaveReqVO createReqVO) {
+        return success(lineService.createLine(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "鏇存柊浜х嚎")
+    @PreAuthorize("@ss.hasPermission('mes:pro-line:update')")
+    public CommonResult<Boolean> updateLine(@Valid @RequestBody MesProLineSaveReqVO updateReqVO) {
+        lineService.updateLine(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "鍒犻櫎浜х嚎")
+    @Parameter(name = "id", description = "缂栧彿", required = true)
+    @PreAuthorize("@ss.hasPermission('mes:pro-line:delete')")
+    public CommonResult<Boolean> deleteLine(@RequestParam("id") Long id) {
+        lineService.deleteLine(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "鑾峰緱浜х嚎")
+    @Parameter(name = "id", description = "缂栧彿", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('mes:pro-line:query')")
+    public CommonResult<MesProLineRespVO> getLine(@RequestParam("id") Long id) {
+        MesProLineDO line = lineService.getLine(id);
+        return success(BeanUtils.toBean(line, MesProLineRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "鑾峰緱浜х嚎鍒嗛〉")
+    @PreAuthorize("@ss.hasPermission('mes:pro-line:query')")
+    public CommonResult<PageResult<MesProLineRespVO>> getLinePage(@Valid MesProLinePageReqVO pageReqVO) {
+        PageResult<MesProLineDO> pageResult = lineService.getLinePage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, MesProLineRespVO.class));
+    }
+
+    @GetMapping("/simple-list")
+    @Operation(summary = "鑾峰緱浜х嚎绮剧畝鍒楄〃", description = "鍙寘鍚鍚敤鐨勪骇绾匡紝涓昏鐢ㄤ簬鍓嶇鐨勪笅鎷夐�夐」")
+    public CommonResult<List<MesProLineRespVO>> getLineSimpleList() {
+        List<MesProLineDO> list = lineService.getLineListByStatus(CommonStatusEnum.ENABLE.getStatus());
+        return success(convertList(list, line -> new MesProLineRespVO()
+                .setId(line.getId()).setCode(line.getCode()).setName(line.getName())
+                .setRemark(line.getRemark())));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "瀵煎嚭浜х嚎 Excel")
+    @PreAuthorize("@ss.hasPermission('mes:pro-line:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportLineExcel(@Valid MesProLinePageReqVO pageReqVO,
+                                HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<MesProLineDO> list = lineService.getLinePage(pageReqVO).getList();
+        List<MesProLineRespVO> data = BeanUtils.toBean(list, MesProLineRespVO.class);
+        ExcelUtils.write(response, "浜х嚎缁存姢.xls", "鏁版嵁", MesProLineRespVO.class, data);
+    }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/line/vo/MesProLinePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/line/vo/MesProLinePageReqVO.java
new file mode 100644
index 0000000..0626ebb
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/line/vo/MesProLinePageReqVO.java
@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.line.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 浜х嚎缁存姢鍒嗛〉 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MesProLinePageReqVO extends PageParam {
+
+    @Schema(description = "浜х嚎缂栫爜", example = "L01")
+    private String code;
+
+    @Schema(description = "浜х嚎鍚嶇О", example = "鍖呰涓�绾�")
+    private String name;
+
+    @Schema(description = "鐘舵��", example = "0")
+    private Integer status;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/line/vo/MesProLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/line/vo/MesProLineRespVO.java
new file mode 100644
index 0000000..85369ac
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/line/vo/MesProLineRespVO.java
@@ -0,0 +1,41 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.line.vo;
+
+import cn.idev.excel.annotation.ExcelProperty;
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 浜х嚎缁存姢 Response VO")
+@Data
+public class MesProLineRespVO {
+
+    @ExcelProperty("缂栧彿")
+    @Schema(description = "缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Long id;
+
+    @ExcelProperty("浜х嚎缂栫爜")
+    @Schema(description = "浜х嚎缂栫爜", requiredMode = Schema.RequiredMode.REQUIRED, example = "L01")
+    private String code;
+
+    @ExcelProperty("浜х嚎鍚嶇О")
+    @Schema(description = "浜х嚎鍚嶇О", requiredMode = Schema.RequiredMode.REQUIRED, example = "鍖呰涓�绾�")
+    private String name;
+
+    @ExcelProperty(value = "鐘舵��", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.COMMON_STATUS)
+    @Schema(description = "鐘舵��", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
+    private Integer status;
+
+    @ExcelProperty("澶囨敞")
+    @Schema(description = "澶囨敞", example = "鍖呰浜х嚎")
+    private String remark;
+
+    @ExcelProperty("鍒涘缓鏃堕棿")
+    @Schema(description = "鍒涘缓鏃堕棿", requiredMode = Schema.RequiredMode.REQUIRED)
+    private LocalDateTime createTime;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/line/vo/MesProLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/line/vo/MesProLineSaveReqVO.java
new file mode 100644
index 0000000..9cc36b5
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/line/vo/MesProLineSaveReqVO.java
@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.line.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 浜х嚎缁存姢鏂板/淇敼 Request VO")
+@Data
+public class MesProLineSaveReqVO {
+
+    @Schema(description = "缂栧彿", example = "1")
+    private Long id;
+
+    @Schema(description = "浜х嚎缂栫爜", requiredMode = Schema.RequiredMode.REQUIRED, example = "L01")
+    @NotBlank(message = "浜х嚎缂栫爜涓嶈兘涓虹┖")
+    private String code;
+
+    @Schema(description = "浜х嚎鍚嶇О", requiredMode = Schema.RequiredMode.REQUIRED, example = "鍖呰涓�绾�")
+    @NotBlank(message = "浜х嚎鍚嶇О涓嶈兘涓虹┖")
+    private String name;
+
+    @Schema(description = "鐘舵��", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
+    @NotNull(message = "鐘舵�佷笉鑳戒负绌�")
+    private Integer status;
+
+    @Schema(description = "澶囨敞", example = "鍖呰浜х嚎")
+    private String remark;
+
+}
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
new file mode 100644
index 0000000..0489480
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/MesProPalletController.java
@@ -0,0 +1,218 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.pallet;
+
+import cn.hutool.core.collection.CollUtil;
+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;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+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.MesProBagCodeRespVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletBatchCreateReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletPageReqVO;
+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;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO;
+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.framework.qrcode.MesProQrLabelBuilder;
+import cn.iocoder.yudao.module.mes.framework.qrcode.QrCodeImageUtils;
+import cn.iocoder.yudao.module.mes.framework.qrcode.QrLabelInfo;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
+import cn.iocoder.yudao.module.mes.service.pro.bagcode.MesProBagCodeService;
+import cn.iocoder.yudao.module.mes.service.pro.batch.MesProBatchService;
+import cn.iocoder.yudao.module.mes.service.pro.pallet.MesProPalletService;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_PALLET_NOT_EXISTS;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_QR_EXPORT_TOO_MANY;
+
+@Tag(name = "绠$悊鍚庡彴 - MES 鎵樼洏鐮�")
+@RestController
+@RequestMapping("/mes/pro/pallet")
+@Validated
+public class MesProPalletController {
+
+    @Resource
+    private MesProPalletService palletService;
+    @Resource
+    private MesProBatchService batchService;
+    @Resource
+    private MesProBagCodeService bagCodeService;
+    @Resource
+    private MesMdmItemService mdmItemService;
+    @Resource
+    private AdminUserApi adminUserApi;
+
+    @PostMapping("/batch-create")
+    @Operation(summary = "鎵归噺鐢熸垚鎵樼洏鐮�")
+    @PreAuthorize("@ss.hasPermission('mes:pro-pallet:create')")
+    public CommonResult<List<Long>> batchCreatePallet(@Valid @RequestBody MesProPalletBatchCreateReqVO createReqVO) {
+        return success(palletService.batchCreatePallet(createReqVO));
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "鍒犻櫎鎵樼洏鐮�")
+    @Parameter(name = "id", description = "缂栧彿", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('mes:pro-pallet:delete')")
+    public CommonResult<Boolean> deletePallet(@RequestParam("id") Long id) {
+        palletService.deletePallet(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "鑾峰緱鎵樼洏鐮�")
+    @Parameter(name = "id", description = "缂栧彿", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('mes:pro-pallet:query')")
+    public CommonResult<MesProPalletRespVO> getPallet(@RequestParam("id") Long id) {
+        MesProPalletDO pallet = palletService.getPallet(id);
+        return success(BeanUtils.toBean(pallet, MesProPalletRespVO.class));
+    }
+
+    @GetMapping("/get-by-code")
+    @Operation(summary = "鎵爜杩芥函锛氭牴鎹墭鐩樼爜锛堜簩缁寸爜鍐呭锛夊弽鏌ユ壒娆°�佸搧绉嶃�佽矗浠讳汉鍙婅鐮佸垪琛�")
+    @Parameter(name = "code", description = "鎵樼洏鐮侊紙浜岀淮鐮佸唴瀹癸級", required = true, example = "PC20260818L01001-P01")
+    @PreAuthorize("@ss.hasPermission('mes:pro-pallet:query')")
+    public CommonResult<MesProPalletTraceRespVO> getPalletByCode(@RequestParam("code") String code) {
+        MesProPalletDO pallet = palletService.getPalletByCode(code);
+        if (pallet == null) {
+            throw exception(PRO_PALLET_NOT_EXISTS);
+        }
+        return success(buildPalletTraceRespVO(pallet));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "鑾峰緱鎵樼洏鐮佸垎椤�")
+    @PreAuthorize("@ss.hasPermission('mes:pro-pallet:query')")
+    public CommonResult<PageResult<MesProPalletRespVO>> getPalletPage(@Valid MesProPalletPageReqVO pageReqVO) {
+        PageResult<MesProPalletDO> pageResult = palletService.getPalletPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, MesProPalletRespVO.class));
+    }
+
+    @GetMapping("/simple-list")
+    @Operation(summary = "鑾峰緱鎵规鐨勬墭鐩樼爜鍒楄〃锛堜緵涓嬫媺閫夋嫨锛�")
+    @Parameter(name = "batchId", description = "鎵规缂栧彿", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('mes:pro-pallet:query')")
+    public CommonResult<List<MesProPalletRespVO>> getPalletSimpleList(@RequestParam("batchId") Long batchId) {
+        List<MesProPalletDO> list = palletService.getPalletListByBatchId(batchId);
+        return success(BeanUtils.toBean(list, MesProPalletRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "瀵煎嚭鎵樼洏鐮� Excel")
+    @PreAuthorize("@ss.hasPermission('mes:pro-pallet:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportPalletExcel(@Valid MesProPalletPageReqVO pageReqVO,
+                                  HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<MesProPalletDO> list = palletService.getPalletPage(pageReqVO).getList();
+        List<MesProPalletRespVO> voList = BeanUtils.toBean(list, MesProPalletRespVO.class);
+        ExcelUtils.write(response, "鎵樼洏鐮�.xls", "鏁版嵁", MesProPalletRespVO.class, voList);
+    }
+
+    @GetMapping("/export-qr")
+    @Operation(summary = "鎵归噺瀵煎嚭鏌愭壒娆$殑鎵樼洏鐮佷簩缁寸爜鍥剧墖 ZIP锛堝浘鐗囧彔鍔犲叧閿俊鎭枃瀛楋級")
+    @Parameter(name = "batchId", description = "鐢熶骇鎵规缂栧彿", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('mes:pro-pallet:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportPalletQr(@RequestParam("batchId") Long batchId,
+                               HttpServletResponse response) throws IOException {
+        List<MesProPalletDO> list = palletService.getPalletListByBatchId(batchId);
+        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, "鎵樼洏鐮佷簩缁寸爜-" + batchId, buildPalletQrLabels(list));
+    }
+
+    // ==================== 鎷兼帴 VO ====================
+
+    private MesProPalletTraceRespVO buildPalletTraceRespVO(MesProPalletDO pallet) {
+        MesProPalletTraceRespVO respVO = BeanUtils.toBean(pallet, MesProPalletTraceRespVO.class);
+        // 鎵规淇℃伅
+        MesProBatchDO batch = batchService.getBatch(pallet.getBatchId());
+        if (batch != null) {
+            respVO.setBatchStatus(batch.getStatus())
+                    .setProduceDate(batch.getProduceDate())
+                    .setLineCode(batch.getLineCode())
+                    .setLineName(batch.getLineName())
+                    .setOwnerUserId(batch.getOwnerUserId())
+                    .setItemId(batch.getItemId());
+            // 璐d换浜�
+            if (batch.getOwnerUserId() != null) {
+                AdminUserRespDTO user = adminUserApi.getUser(batch.getOwnerUserId());
+                if (user != null) {
+                    respVO.setOwnerUserName(user.getNickname());
+                }
+            }
+            // 鍝佺淇℃伅
+            if (batch.getItemId() != null) {
+                MesMdmItemDO item = mdmItemService.getItem(batch.getItemId());
+                if (item != null) {
+                    respVO.setItemCode(item.getCode())
+                            .setItemName(item.getName())
+                            .setItemSpecification(item.getSpecification());
+                }
+            }
+        }
+        // 璇ユ墭鐩樼粦瀹氱殑琚嬬爜鍒楄〃
+        respVO.setBags(buildBagCodeRespVOList(bagCodeService.getBagCodeListByPalletId(pallet.getId())));
+        return respVO;
+    }
+
+    private List<MesProBagCodeRespVO> buildBagCodeRespVOList(List<MesProBagCodeDO> list) {
+        if (CollUtil.isEmpty(list)) {
+            return Collections.emptyList();
+        }
+        // 鑾峰緱鎵规鐨勪骇绾夸俊鎭紝鎷兼帴琚嬬爜鐨勪骇绾跨紪鐮�/鍚嶇О
+        Map<Long, MesProBatchDO> batchMap = convertMap(
+                batchService.getBatchList(convertSet(list, MesProBagCodeDO::getBatchId)), MesProBatchDO::getId);
+        return BeanUtils.toBean(list, MesProBagCodeRespVO.class, vo ->
+                MapUtils.findAndThen(batchMap, vo.getBatchId(), batch ->
+                        vo.setLineCode(batch.getLineCode()).setLineName(batch.getLineName())));
+    }
+
+    private List<QrLabelInfo> buildPalletQrLabels(List<MesProPalletDO> list) {
+        // 鑾峰緱鍏宠仈鏁版嵁锛堟壒娆°�佸搧绉嶃�佽矗浠讳汉锛�
+        Map<Long, MesProBatchDO> batchMap = convertMap(
+                batchService.getBatchList(convertSet(list, MesProPalletDO::getBatchId)), MesProBatchDO::getId);
+        Map<Long, MesMdmItemDO> itemMap = mdmItemService.getItemMap(
+                convertSet(batchMap.values(), MesProBatchDO::getItemId));
+        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
+                convertSet(batchMap.values(), MesProBatchDO::getOwnerUserId));
+        // 鏋勫缓鏍囩
+        List<QrLabelInfo> labels = new ArrayList<>(list.size());
+        for (MesProPalletDO pallet : list) {
+            labels.add(MesProQrLabelBuilder.buildPalletLabel(
+                    pallet, batchMap.get(pallet.getBatchId()), itemMap, userMap));
+        }
+        return labels;
+    }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletBatchCreateReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletBatchCreateReqVO.java
new file mode 100644
index 0000000..5638401
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletBatchCreateReqVO.java
@@ -0,0 +1,28 @@
+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 MesProPalletBatchCreateReqVO {
+
+    @Schema(description = "鐢熶骇鎵规缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    @NotNull(message = "鐢熶骇鎵规缂栧彿涓嶈兘涓虹┖")
+    private Long batchId;
+
+    @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;
+
+}
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
new file mode 100644
index 0000000..1f5ff36
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletPageReqVO.java
@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 鎵樼洏鐮佸垎椤� Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MesProPalletPageReqVO extends PageParam {
+
+    @Schema(description = "鎵樼洏鐮�", example = "PC20260818L01A001-P01")
+    private String code;
+
+    @Schema(description = "鐢熶骇鎵规缂栧彿", example = "1024")
+    private Long batchId;
+
+    @Schema(description = "鎵规鍙�", example = "PC20260818L01A001")
+    private String batchCode;
+
+    @Schema(description = "鐘舵�侊紙瀛楀吀 mes_pro_pallet_status锛�", example = "10")
+    private Integer status;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}
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
new file mode 100644
index 0000000..0747066
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletRespVO.java
@@ -0,0 +1,63 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo;
+
+import cn.idev.excel.annotation.ExcelIgnore;
+import cn.idev.excel.annotation.ExcelProperty;
+import cn.idev.excel.annotation.write.style.ColumnWidth;
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 鎵樼洏鐮� Response VO")
+@Data
+public class MesProPalletRespVO {
+
+    @Schema(description = "缂栧彿", example = "1024")
+    @ExcelIgnore
+    private Long id;
+
+    @Schema(description = "鎵樼洏鐮�", example = "PC20260818L01A001-P01")
+    @ExcelProperty("鎵樼洏鐮�")
+    @ColumnWidth(30)
+    private String code;
+
+    @Schema(description = "鐢熶骇鎵规缂栧彿", example = "1024")
+    @ExcelIgnore
+    private Long batchId;
+
+    @Schema(description = "鎵规鍙�", example = "PC20260818L01A001")
+    @ExcelProperty("鎵规鍙�")
+    @ColumnWidth(30)
+    private String batchCode;
+
+    @Schema(description = "鎵规鍐呮墭鐩樺簭鍙�", example = "1")
+    @ExcelProperty("鎵樼洏搴忓彿")
+    private Integer palletNo;
+
+    @Schema(description = "鍙琚嬫暟锛堣/鎵樼洏锛�", example = "25")
+    @ExcelProperty("鍙琚嬫暟")
+    private Integer capacity;
+
+    @Schema(description = "宸茬粦瀹氳鐮佹暟閲�", example = "10")
+    @ExcelProperty("宸茶琚嬫暟")
+    private Integer bagCount;
+
+    @Schema(description = "鐘舵�侊紙瀛楀吀 mes_pro_pallet_status锛�", example = "10")
+    @ExcelProperty(value = "鐘舵��", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MES_PRO_PALLET_STATUS)
+    private Integer status;
+
+    @Schema(description = "澶囨敞")
+    @ExcelProperty("澶囨敞")
+    @ColumnWidth(30)
+    private String remark;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @ExcelProperty("鍒涘缓鏃堕棿")
+    @ColumnWidth(20)
+    private LocalDateTime createTime;
+
+}
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
new file mode 100644
index 0000000..93a600a
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletTraceRespVO.java
@@ -0,0 +1,80 @@
+package cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo;
+
+import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 鎵樼洏鐮佹壂鐮佽拷婧� Response VO")
+@Data
+public class MesProPalletTraceRespVO {
+
+    // ========== 鎵樼洏淇℃伅 ==========
+
+    @Schema(description = "鎵樼洏鐮佺紪鍙�", example = "1024")
+    private Long id;
+
+    @Schema(description = "鎵樼洏鐮侊紙浜岀淮鐮佸唴瀹癸級", example = "PC20260818L01001-P01")
+    private String code;
+
+    @Schema(description = "鎵规鍐呮墭鐩樺簭鍙�", example = "1")
+    private Integer palletNo;
+
+    @Schema(description = "鍙琚嬫暟锛堣/鎵樼洏锛�", example = "25")
+    private Integer capacity;
+
+    @Schema(description = "宸茬粦瀹氳鐮佹暟閲�", example = "10")
+    private Integer bagCount;
+
+    @Schema(description = "鐘舵�侊紙瀛楀吀 mes_pro_pallet_status锛�", example = "10")
+    private Integer status;
+
+    @Schema(description = "鐢熶骇鎵规缂栧彿", example = "1024")
+    private Long batchId;
+
+    @Schema(description = "鎵规鍙�", example = "PC20260818L01001")
+    private String batchCode;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    // ========== 鎵规淇℃伅 ==========
+
+    @Schema(description = "鎵规鐘舵�侊紙瀛楀吀 mes_pro_batch_status锛�", example = "20")
+    private Integer batchStatus;
+
+    @Schema(description = "鐢熶骇鏃ユ湡")
+    private LocalDateTime produceDate;
+
+    @Schema(description = "浜х嚎缂栫爜")
+    private String lineCode;
+
+    @Schema(description = "浜х嚎鍚嶇О")
+    private String lineName;
+
+    @Schema(description = "璐d换浜虹敤鎴风紪鍙�", example = "1")
+    private Long ownerUserId;
+
+    @Schema(description = "璐d换浜烘樀绉�")
+    private String ownerUserName;
+
+    @Schema(description = "鍝佺锛堢墿鏂欙級缂栧彿", example = "1024")
+    private Long itemId;
+
+    @Schema(description = "鍝佺缂栫爜")
+    private String itemCode;
+
+    @Schema(description = "鍝佺鍚嶇О")
+    private String itemName;
+
+    @Schema(description = "鍝佺瑙勬牸")
+    private String itemSpecification;
+
+    // ========== 杩芥函淇℃伅 ==========
+
+    @Schema(description = "缁戝畾鍦ㄨ鎵樼洏涓婄殑琚嬬爜鍒楄〃锛堟寜琚嬪簭鍙峰崌搴忥級")
+    private List<MesProBagCodeRespVO> bags;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/bagcode/MesProBagCodeDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/bagcode/MesProBagCodeDO.java
new file mode 100644
index 0000000..feb8e98
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/bagcode/MesProBagCodeDO.java
@@ -0,0 +1,86 @@
+package cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.pallet.MesProPalletDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
+
+/**
+ * MES 琚嬬爜璧嬬爜锛堜竴琚嬩竴鐮侊級DO
+ * <p>
+ * 鏍规嵁鎵规淇℃伅鑷姩鐢熸垚鍞竴浜岀淮鐮佹暟鎹寘锛氱爜鍊� = 鎵规鍙� + - + 琚嬪簭鍙凤紝鍏ㄥ眬鍞竴锛屾弧瓒冲敮涓�鎬с�佸彲璇嗗埆鎬с�佸彲杩芥函鎬ц姹傘��
+ * 鏀寔鎵归噺瀵煎嚭浜や粯鍗板埛锛屽苟涓庢墭鐩樼爜鍏宠仈銆�
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@TableName("mes_pro_bag_code")
+@KeySequence("mes_pro_bag_code_seq")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MesProBagCodeDO extends BaseDO {
+
+    /**
+     * 缂栧彿
+     */
+    @TableId
+    private Long id;
+    /**
+     * 鐢熸垚缁� UUID锛堟爣璁板悓涓�娆$敓鎴愮殑鏁版嵁鍖咃級
+     */
+    private String uuid;
+    /**
+     * 琚嬬爜锛堜簩缁寸爜鍐呭锛氭壒娆″彿-琚嬪簭鍙凤紝鍏ㄥ眬鍞竴锛�
+     */
+    private String code;
+    /**
+     * 鎵规鍐呰搴忓彿
+     */
+    private Integer bagNo;
+    /**
+     * 鐢熶骇鎵规缂栧彿
+     * <p>
+     * 鍏宠仈 {@link MesProBatchDO#getId()}
+     */
+    private Long batchId;
+    /**
+     * 鎵规鍙凤紙鍐椾綑锛屼究浜庡睍绀猴級
+     */
+    private String batchCode;
+    /**
+     * 缁戝畾鎵樼洏缂栧彿
+     * <p>
+     * 鍏宠仈 {@link MesProPalletDO#getId()}
+     */
+    private Long palletId;
+    /**
+     * 鎵樼洏鐮侊紙鍐椾綑锛屼究浜庡睍绀猴級
+     */
+    private String palletCode;
+    /**
+     * 鐘舵��
+     * <p>
+     * 瀛楀吀 {@link DictTypeConstants#MES_PRO_BAG_CODE_STATUS}
+     * 鏋氫妇 {@link cn.iocoder.yudao.module.mes.enums.pro.MesProBagCodeStatusEnum}
+     */
+    private Integer status;
+    /**
+     * 瀵煎嚭锛堜氦浠樺嵃鍒凤級鏃堕棿
+     */
+    private LocalDateTime printTime;
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+}
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
new file mode 100644
index 0000000..e21cb52
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/batch/MesProBatchDO.java
@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
+
+/**
+ * MES 鐢熶骇鎵规 DO
+ * <p>
+ * 鎵规鐢熶骇绠$悊锛堜竴琚嬩竴鐮佹ā鍧楋級锛氬叧鑱斿搧绉嶏紙MDM 鐗╂枡锛夈�佷骇绾匡紙浜х嚎缁存姢锛変笌鐢熶骇浜哄憳锛堜汉鍛橀厤缃 {@link MesProBatchWorkerDO}锛夛紝璐d换钀藉疄鍒颁汉銆�
+ * 鎵规鍙疯嚜鍔ㄧ敓鎴愶紝缂栫爜瑙勫垯鍖呭惈鏃ユ湡銆佷骇绾跨紪鐮併�佸搧绉嶇紪鐮併�佹祦姘村彿绛夎绱狅紝骞朵笌琚嬬爜锛堜竴琚嬩竴鐮侊級銆佹墭鐩樼爜鑷姩鍏宠仈銆�
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@TableName("mes_pro_batch")
+@KeySequence("mes_pro_batch_seq")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MesProBatchDO extends BaseDO {
+
+    /**
+     * 缂栧彿
+     */
+    @TableId
+    private Long id;
+    /**
+     * 鎵规鍙凤紙鑷姩鐢熸垚锛氬墠缂� + 鏃ユ湡 + 浜х嚎缂栫爜 + 鍝佺缂栫爜 + 娴佹按鍙凤級
+     */
+    private String code;
+    /**
+     * 鍝佺锛堜骇鍝佺墿鏂欙級缂栧彿
+     * <p>
+     * 鍏宠仈 {@link cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO#getId()}
+     */
+    private Long itemId;
+    /**
+     * 浜х嚎缂栧彿
+     * <p>
+     * 鍏宠仈 {@link cn.iocoder.yudao.module.mes.dal.dataobject.pro.line.MesProLineDO#getId()}
+     */
+    private Long lineId;
+    /**
+     * 浜х嚎缂栫爜锛堝啑浣欏垪锛岀敱 {@link #lineId} 鍥炲~锛屽弬涓庢壒娆″彿鐢熸垚锛�
+     */
+    private String lineCode;
+    /**
+     * 浜х嚎鍚嶇О锛堝啑浣欏垪锛岀敱 {@link #lineId} 鍥炲~锛�
+     */
+    private String lineName;
+    /**
+     * 鐢熶骇鏃ユ湡
+     */
+    private LocalDateTime produceDate;
+    /**
+     * 璁″垝鏁伴噺
+     */
+    private BigDecimal planQuantity;
+    /**
+     * 璐d换浜虹敤鎴风紪鍙凤紙璐d换钀藉疄鍒颁汉锛�
+     * <p>
+     * 鍏宠仈 AdminUserDO#getId()
+     */
+    private Long ownerUserId;
+    /**
+     * 宸茬敓鎴愯鐮佹暟閲忥紙涓�琚嬩竴鐮侊級
+     */
+    private Integer bagQuantity;
+    /**
+     * 宸茬敓鎴愭墭鐩樼爜鏁伴噺
+     */
+    private Integer palletQuantity;
+    /**
+     * 鎵规鐘舵��
+     * <p>
+     * 瀛楀吀 {@link DictTypeConstants#MES_PRO_BATCH_STATUS}
+     * 鏋氫妇 {@link cn.iocoder.yudao.module.mes.enums.pro.MesProBatchStatusEnum}
+     */
+    private Integer status;
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/batch/MesProBatchWorkerDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/batch/MesProBatchWorkerDO.java
new file mode 100644
index 0000000..593d30a
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/batch/MesProBatchWorkerDO.java
@@ -0,0 +1,57 @@
+package cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
+
+/**
+ * MES 鐢熶骇鎵规浜哄憳閰嶇疆 DO
+ * <p>
+ * 璁板綍鎵规鐨勭敓浜т汉鍛橈紙缁勯暱銆佹搷浣滃伐銆佸寘瑁呭伐銆佽川妫�鍛樼瓑锛夛紝璐d换钀藉疄鍒颁汉銆�
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@TableName("mes_pro_batch_worker")
+@KeySequence("mes_pro_batch_worker_seq")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MesProBatchWorkerDO extends BaseDO {
+
+    /**
+     * 缂栧彿
+     */
+    @TableId
+    private Long id;
+    /**
+     * 鐢熶骇鎵规缂栧彿
+     * <p>
+     * 鍏宠仈 {@link MesProBatchDO#getId()}
+     */
+    private Long batchId;
+    /**
+     * 鐢熶骇浜哄憳鐢ㄦ埛缂栧彿
+     * <p>
+     * 鍏宠仈 AdminUserDO#getId()
+     */
+    private Long userId;
+    /**
+     * 宀椾綅绫诲瀷
+     * <p>
+     * 瀛楀吀 {@link DictTypeConstants#MES_PRO_BATCH_WORKER_TYPE}
+     * 鏋氫妇 {@link cn.iocoder.yudao.module.mes.enums.pro.MesProBatchWorkerTypeEnum}
+     */
+    private Integer workerType;
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/line/MesProLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/line/MesProLineDO.java
new file mode 100644
index 0000000..7389c62
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/line/MesProLineDO.java
@@ -0,0 +1,53 @@
+package cn.iocoder.yudao.module.mes.dal.dataobject.pro.line;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * MES 浜х嚎缁存姢 DO
+ * <p>
+ * 涓�琚嬩竴鐮佹ā鍧楃殑浜х嚎涓绘暟鎹紝渚涚敓浜ф壒娆′笅鎷夐�夋嫨锛�
+ * 鎵规琛ㄥ啑浣欏瓨鍌� line_code / line_name锛岀敱浜х嚎缂栧彿鍥炲~銆�
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@TableName("mes_pro_line")
+@KeySequence("mes_pro_line_seq") // 鐢ㄤ簬 Oracle銆丳ostgreSQL銆並ingbase銆丏B2銆丠2 鏁版嵁搴撶殑涓婚敭鑷銆傚鏋滄槸 MySQL 绛夋暟鎹簱锛屽彲涓嶅啓銆�
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MesProLineDO extends BaseDO {
+
+    /**
+     * 缂栧彿
+     */
+    @TableId
+    private Long id;
+    /**
+     * 浜х嚎缂栫爜
+     * <p>
+     * 鍙備笌鐢熶骇鎵规鍙风敓鎴�
+     */
+    private String code;
+    /**
+     * 浜х嚎鍚嶇О
+     */
+    private String name;
+    /**
+     * 鐘舵��
+     *
+     * 鏋氫妇 {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum}
+     */
+    private Integer status;
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+}
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
new file mode 100644
index 0000000..eadac1c
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/pallet/MesProPalletDO.java
@@ -0,0 +1,72 @@
+package cn.iocoder.yudao.module.mes.dal.dataobject.pro.pallet;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
+
+/**
+ * MES 鎵樼洏鐮� DO
+ * <p>
+ * 鎵樼洏鐮佷笌鎵规鍙疯嚜鍔ㄥ叧鑱旓紝鐮佸�艰鍒欎负锛氭壒娆″彿 + -P + 鎵樼洏搴忓彿銆傝鐮佸彲缁戝畾鍒版墭鐩樼爜銆�
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@TableName("mes_pro_pallet")
+@KeySequence("mes_pro_pallet_seq")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MesProPalletDO extends BaseDO {
+
+    /**
+     * 缂栧彿
+     */
+    @TableId
+    private Long id;
+    /**
+     * 鎵樼洏鐮侊紙鎵规鍙�-P+鎵樼洏搴忓彿锛屽叏灞�鍞竴锛�
+     */
+    private String code;
+    /**
+     * 鐢熶骇鎵规缂栧彿
+     * <p>
+     * 鍏宠仈 {@link MesProBatchDO#getId()}
+     */
+    private Long batchId;
+    /**
+     * 鎵规鍙凤紙鍐椾綑锛屼究浜庡睍绀猴級
+     */
+    private String batchCode;
+    /**
+     * 鎵规鍐呮墭鐩樺簭鍙�
+     */
+    private Integer palletNo;
+    /**
+     * 鍙琚嬫暟锛堣/鎵樼洏锛�
+     */
+    private Integer capacity;
+    /**
+     * 宸茬粦瀹氳鐮佹暟閲�
+     */
+    private Integer bagCount;
+    /**
+     * 鐘舵��
+     * <p>
+     * 瀛楀吀 {@link DictTypeConstants#MES_PRO_PALLET_STATUS}
+     * 鏋氫妇 {@link cn.iocoder.yudao.module.mes.enums.pro.MesProPalletStatusEnum}
+     */
+    private Integer status;
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/home/MesBagCodeHomeStatisticsMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/home/MesBagCodeHomeStatisticsMapper.java
new file mode 100644
index 0000000..e5a7643
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/home/MesBagCodeHomeStatisticsMapper.java
@@ -0,0 +1,74 @@
+package cn.iocoder.yudao.module.mes.dal.mysql.home;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * MES 鍩虹鏁版嵁涓庝竴琚嬩竴鐮� 棣栭〉缁熻 Mapper
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Mapper
+public interface MesBagCodeHomeStatisticsMapper {
+
+    // ========== 鍩虹鏁版嵁 ==========
+
+    /** 缁熻鍝佺鎬绘暟锛坢dm_item锛� */
+    Long selectMdmItemCount();
+
+    /** 缁熻 MES 鍝佺鏁帮紙mes_md_item锛� */
+    Long selectMesItemCount();
+
+    /** 缁熻鍝佺鍒嗙被鏁帮紙mes_md_item_type锛� */
+    Long selectItemTypeCount();
+
+    /** 缁熻璁¢噺鍗曚綅鏁帮紙mdm_unit_measure锛� */
+    Long selectUnitMeasureCount();
+
+    // ========== 涓�琚嬩竴鐮� ==========
+
+    /** 缁熻浜х嚎鏁帮紙mes_pro_line锛� */
+    Long selectLineCount();
+
+    /** 缁熻鎵规鎬绘暟锛坢es_pro_batch锛� */
+    Long selectBatchCount();
+
+    /** 缁熻琚嬬爜鎬绘暟锛坢es_pro_bag_code锛� */
+    Long selectBagCodeCount();
+
+    /** 缁熻鎵樼洏鐮佹�绘暟锛坢es_pro_pallet锛� */
+    Long selectPalletCount();
+
+    // ========== 鐘舵�佸垎甯� ==========
+
+    /**
+     * 鎸夌姸鎬佺粺璁℃壒娆℃暟閲�
+     *
+     * @return [{ "status": 10, "count": 5 }, ...]
+     */
+    List<Map<String, Object>> selectBatchCountGroupByStatus();
+
+    /**
+     * 鎸夌姸鎬佺粺璁¤鐮佹暟閲�
+     *
+     * @return [{ "status": 10, "count": 5 }, ...]
+     */
+    List<Map<String, Object>> selectBagCodeCountGroupByStatus();
+
+    // ========== 瓒嬪娍 ==========
+
+    /**
+     * 鎸夊ぉ鑱氬悎琚嬬爜鐢熸垚閲忥紙杩� N 澶╋級
+     *
+     * @param beginTime >= 寮�濮嬫椂闂�
+     * @param endTime   < 缁撴潫鏃堕棿
+     * @return [{ "date": "2026-08-13", "count": 123 }, ...]
+     */
+    List<Map<String, Object>> selectDailyBagCodeTrend(@Param("beginTime") LocalDateTime beginTime,
+                                                      @Param("endTime") LocalDateTime endTime);
+
+}
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
new file mode 100644
index 0000000..4a4906d
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/bagcode/MesProBagCodeMapper.java
@@ -0,0 +1,116 @@
+package cn.iocoder.yudao.module.mes.dal.mysql.pro.bagcode;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+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 com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.time.LocalDateTime;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * MES 琚嬬爜璧嬬爜锛堜竴琚嬩竴鐮侊級Mapper
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Mapper
+public interface MesProBagCodeMapper extends BaseMapperX<MesProBagCodeDO> {
+
+    default MesProBagCodeDO selectByCode(String code) {
+        return selectOne(MesProBagCodeDO::getCode, code);
+    }
+
+    default List<MesProBagCodeDO> selectListByUuid(String uuid) {
+        return selectList(MesProBagCodeDO::getUuid, uuid);
+    }
+
+    default List<MesProBagCodeDO> selectListByIds(Collection<Long> ids) {
+        return selectBatchIds(ids);
+    }
+
+    default List<MesProBagCodeDO> selectListByBatchId(Long batchId) {
+        return selectList(MesProBagCodeDO::getBatchId, batchId);
+    }
+
+    default Long selectCountByBatchId(Long batchId) {
+        return selectCount(MesProBagCodeDO::getBatchId, batchId);
+    }
+
+    default Long selectCountByPalletId(Long palletId) {
+        return selectCount(MesProBagCodeDO::getPalletId, palletId);
+    }
+
+    default List<MesProBagCodeDO> selectListByPalletId(Long palletId) {
+        return selectList(MesProBagCodeDO::getPalletId, palletId);
+    }
+
+    default PageResult<MesProBagCodeDO> selectPage(MesProBagCodePageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<MesProBagCodeDO>()
+                .likeIfPresent(MesProBagCodeDO::getCode, reqVO.getCode())
+                .eqIfPresent(MesProBagCodeDO::getBatchId, reqVO.getBatchId())
+                .likeIfPresent(MesProBagCodeDO::getBatchCode, reqVO.getBatchCode())
+                .eqIfPresent(MesProBagCodeDO::getUuid, reqVO.getUuid())
+                .eqIfPresent(MesProBagCodeDO::getPalletId, reqVO.getPalletId())
+                .eqIfPresent(MesProBagCodeDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(MesProBagCodeDO::getCreateTime, reqVO.getCreateTime())
+                .orderByAsc(MesProBagCodeDO::getBagNo));
+    }
+
+    /**
+     * 鎵归噺缁戝畾鎵樼洏
+     *
+     * @param ids        琚嬬爜缂栧彿鍒楄〃
+     * @param palletId   鎵樼洏缂栧彿
+     * @param palletCode 鎵樼洏鐮�
+     */
+    default void bindPalletByIds(Collection<Long> ids, Long palletId, String palletCode) {
+        update(null, new LambdaUpdateWrapper<MesProBagCodeDO>()
+                .set(MesProBagCodeDO::getPalletId, palletId)
+                .set(MesProBagCodeDO::getPalletCode, palletCode)
+                .in(MesProBagCodeDO::getId, ids));
+    }
+
+    /**
+     * 鎵归噺瑙g粦鎵樼洏锛堢疆绌烘墭鐩樼紪鍙蜂笌鎵樼洏鐮侊級
+     *
+     * @param ids 琚嬬爜缂栧彿鍒楄〃
+     */
+    default void unbindPalletByIds(Collection<Long> ids) {
+        update(null, new LambdaUpdateWrapper<MesProBagCodeDO>()
+                .set(MesProBagCodeDO::getPalletId, null)
+                .set(MesProBagCodeDO::getPalletCode, null)
+                .in(MesProBagCodeDO::getId, ids));
+    }
+
+    /**
+     * 鏌ヨ鎵规鍐呰鐮佹渶澶у簭鍙凤紙鍖呭惈宸查�昏緫鍒犻櫎璁板綍锛屼繚璇佸簭鍙蜂笉鍥為��銆佺爜鍊煎敮涓�锛�
+     *
+     * @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);
+
+    /**
+     * 鎵归噺鏍囪涓哄凡瀵煎嚭鍗板埛锛堜粎鏇存柊澶勪簬鐩爣鍘熺姸鎬佺殑璁板綍锛�
+     *
+     * @param ids        琚嬬爜缂栧彿鍒楄〃
+     * @param fromStatus 鍘熺姸鎬�
+     * @param toStatus   鐩爣鐘舵��
+     * @param printTime  瀵煎嚭鏃堕棿
+     * @return 鏇存柊琛屾暟
+     */
+    @Update("<script>UPDATE mes_pro_bag_code SET status = #{toStatus}, print_time = #{printTime}, update_time = NOW() " +
+            "WHERE deleted = 0 AND status = #{fromStatus} AND id IN " +
+            "<foreach collection='ids' item='id' open='(' separator=',' close=')'>#{id}</foreach></script>")
+    int updateStatusByIds(@Param("ids") Collection<Long> ids, @Param("fromStatus") Integer fromStatus,
+                          @Param("toStatus") Integer toStatus, @Param("printTime") LocalDateTime printTime);
+
+}
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
new file mode 100644
index 0000000..64d0121
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/batch/MesProBatchMapper.java
@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.module.mes.dal.mysql.pro.batch;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchPageReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * MES 鐢熶骇鎵规 Mapper
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Mapper
+public interface MesProBatchMapper extends BaseMapperX<MesProBatchDO> {
+
+    default MesProBatchDO selectByCode(String code) {
+        return selectOne(MesProBatchDO::getCode, code);
+    }
+
+    default Long selectCountByLineId(Long lineId) {
+        return selectCount(MesProBatchDO::getLineId, lineId);
+    }
+
+    default PageResult<MesProBatchDO> selectPage(MesProBatchPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<MesProBatchDO>()
+                .likeIfPresent(MesProBatchDO::getCode, reqVO.getCode())
+                .eqIfPresent(MesProBatchDO::getItemId, reqVO.getItemId())
+                .eqIfPresent(MesProBatchDO::getLineId, reqVO.getLineId())
+                .likeIfPresent(MesProBatchDO::getLineCode, reqVO.getLineCode())
+                .likeIfPresent(MesProBatchDO::getLineName, reqVO.getLineName())
+                .eqIfPresent(MesProBatchDO::getOwnerUserId, reqVO.getOwnerUserId())
+                .eqIfPresent(MesProBatchDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(MesProBatchDO::getProduceDate, reqVO.getProduceDate())
+                .betweenIfPresent(MesProBatchDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(MesProBatchDO::getId));
+    }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/batch/MesProBatchWorkerMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/batch/MesProBatchWorkerMapper.java
new file mode 100644
index 0000000..2c8c7cd
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/batch/MesProBatchWorkerMapper.java
@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.mes.dal.mysql.pro.batch;
+
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchWorkerDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * MES 鐢熶骇鎵规浜哄憳閰嶇疆 Mapper
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Mapper
+public interface MesProBatchWorkerMapper extends BaseMapperX<MesProBatchWorkerDO> {
+
+    default List<MesProBatchWorkerDO> selectListByBatchId(Long batchId) {
+        return selectList(MesProBatchWorkerDO::getBatchId, batchId);
+    }
+
+    default List<MesProBatchWorkerDO> selectListByBatchIds(Collection<Long> batchIds) {
+        return selectList(MesProBatchWorkerDO::getBatchId, batchIds);
+    }
+
+    default void deleteByBatchId(Long batchId) {
+        delete(MesProBatchWorkerDO::getBatchId, batchId);
+    }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/line/MesProLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/line/MesProLineMapper.java
new file mode 100644
index 0000000..2ac7979
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/line/MesProLineMapper.java
@@ -0,0 +1,41 @@
+package cn.iocoder.yudao.module.mes.dal.mysql.pro.line;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.line.vo.MesProLinePageReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.line.MesProLineDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * MES 浜х嚎缁存姢 Mapper
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Mapper
+public interface MesProLineMapper extends BaseMapperX<MesProLineDO> {
+
+    default PageResult<MesProLineDO> selectPage(MesProLinePageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<MesProLineDO>()
+                .likeIfPresent(MesProLineDO::getCode, reqVO.getCode())
+                .likeIfPresent(MesProLineDO::getName, reqVO.getName())
+                .eqIfPresent(MesProLineDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(MesProLineDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(MesProLineDO::getId));
+    }
+
+    default MesProLineDO selectByCode(String code) {
+        return selectOne(MesProLineDO::getCode, code);
+    }
+
+    default MesProLineDO selectByName(String name) {
+        return selectOne(MesProLineDO::getName, name);
+    }
+
+    default List<MesProLineDO> selectListByStatus(Integer status) {
+        return selectList(MesProLineDO::getStatus, status);
+    }
+
+}
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
new file mode 100644
index 0000000..b2b6512
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/pallet/MesProPalletMapper.java
@@ -0,0 +1,49 @@
+package cn.iocoder.yudao.module.mes.dal.mysql.pro.pallet;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletPageReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.pallet.MesProPalletDO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ * MES 鎵樼洏鐮� Mapper
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Mapper
+public interface MesProPalletMapper extends BaseMapperX<MesProPalletDO> {
+
+    default MesProPalletDO selectByCode(String code) {
+        return selectOne(MesProPalletDO::getCode, code);
+    }
+
+    default List<MesProPalletDO> selectListByBatchId(Long batchId) {
+        return selectList(MesProPalletDO::getBatchId, batchId);
+    }
+
+    default PageResult<MesProPalletDO> selectPage(MesProPalletPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<MesProPalletDO>()
+                .likeIfPresent(MesProPalletDO::getCode, reqVO.getCode())
+                .eqIfPresent(MesProPalletDO::getBatchId, reqVO.getBatchId())
+                .likeIfPresent(MesProPalletDO::getBatchCode, reqVO.getBatchCode())
+                .eqIfPresent(MesProPalletDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(MesProPalletDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(MesProPalletDO::getId));
+    }
+
+    /**
+     * 鏌ヨ鎵规鍐呮墭鐩樻渶澶у簭鍙凤紙鍖呭惈宸查�昏緫鍒犻櫎璁板綍锛屼繚璇佸簭鍙蜂笉鍥為��銆佺爜鍊煎敮涓�锛�
+     *
+     * @param batchId 鎵规缂栧彿
+     * @return 鏈�澶ф墭鐩樺簭鍙凤紝鏃犺褰曡繑鍥� 0
+     */
+    @Select("SELECT IFNULL(MAX(pallet_no), 0) FROM mes_pro_pallet WHERE batch_id = #{batchId}")
+    Integer selectMaxPalletNo(@Param("batchId") Long batchId);
+
+}
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 0fd3d74..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
@@ -29,6 +29,10 @@
     String MES_PRO_FEEDBACK_TYPE = "mes_pro_feedback_type"; // MES 鐢熶骇鎶ュ伐绫诲瀷
     String MES_PRO_FEEDBACK_CHANNEL = "mes_pro_feedback_channel"; // MES 鐢熶骇鎶ュ伐閫斿緞
     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_CODE_STATUS = "mes_pro_bag_code_status"; // MES 琚嬬爜鐘舵��
+    String MES_PRO_PALLET_STATUS = "mes_pro_pallet_status"; // MES 鎵樼洏鐮佺姸鎬�
 
     // ========== 浠撳偍鏉$爜涓庣鐞� (WM) ==========
     String MES_BARCODE_FORMAT = "mes_barcode_format"; // 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 dec84a2..41c8c20 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
@@ -798,6 +798,39 @@
     ErrorCode PD_PROCESS_PARAM_TEMPLATE_NOT_EXISTS = new ErrorCode(1_040_805_000, "宸ヨ壓鍙傛暟妯℃澘涓嶅瓨鍦�");
     ErrorCode PD_PROCESS_PARAM_TEMPLATE_CODE_DUPLICATE = new ErrorCode(1_040_805_001, "宸ヨ壓鍙傛暟妯℃澘缂栫爜宸插瓨鍦�");
 
+    // ========== MES 鐢熶骇绠$悊-鐢熶骇鎵规锛�1-040-750-000锛� ==========
+    ErrorCode PRO_BATCH_NOT_EXISTS = new ErrorCode(1_040_750_000, "鐢熶骇鎵规涓嶅瓨鍦�");
+    ErrorCode PRO_BATCH_STATUS_NOT_DRAFT_OR_PRODUCING = new ErrorCode(1_040_750_001, "鐢熶骇鎵规涓嶆槸鑽夌鎴栫敓浜т腑鐘舵�侊紝涓嶅厑璁歌鎿嶄綔");
+    ErrorCode PRO_BATCH_STATUS_NOT_GENERATE_CODE = new ErrorCode(1_040_750_002, "鐢熶骇鎵规涓嶆槸鐢熶骇涓姸鎬侊紝涓嶅厑璁哥敓鎴愯鐮�/鎵樼洏鐮�");
+    ErrorCode PRO_BATCH_HAS_CODE_NOT_DELETE = new ErrorCode(1_040_750_003, "鐢熶骇鎵规宸茬敓鎴愯鐮佹垨鎵樼洏鐮侊紝涓嶅厑璁稿垹闄�");
+    ErrorCode PRO_BATCH_STATUS_INVALID = new ErrorCode(1_040_750_004, "鐢熶骇鎵规鐘舵�佹祦杞笉鍚堟硶");
+    ErrorCode PRO_BATCH_WORKER_EMPTY = new ErrorCode(1_040_750_005, "鐢熶骇鎵规蹇呴』閰嶇疆鑷冲皯涓�鍚嶇敓浜т汉鍛�");
+    ErrorCode PRO_BATCH_STATUS_NOT_ALLOW_DELETE = new ErrorCode(1_040_750_006, "鍙湁鑽夌鎴栧凡浣滃簾鐨勭敓浜ф壒娆℃墠鍏佽鍒犻櫎");
+    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, "浜岀淮鐮佹壒閲忓鍑虹己灏戞煡璇㈡潯浠�");
+
+    // ========== MES 鐢熶骇绠$悊-琚嬬爜璧嬬爜锛�1-040-752-000锛� ==========
+    ErrorCode PRO_BAG_CODE_NOT_EXISTS = new ErrorCode(1_040_752_000, "琚嬬爜涓嶅瓨鍦�");
+    ErrorCode PRO_BAG_CODE_GENERATE_COUNT_INVALID = new ErrorCode(1_040_752_001, "琚嬬爜鐢熸垚鏁伴噺蹇呴』澶т簬 0");
+    ErrorCode PRO_BAG_CODE_STATUS_NOT_GENERATED = new ErrorCode(1_040_752_002, "琚嬬爜涓嶆槸宸茬敓鎴愮姸鎬侊紝涓嶅厑璁歌鎿嶄綔");
+    ErrorCode PRO_BAG_CODE_BIND_PALLET_MISMATCH = new ErrorCode(1_040_752_003, "琚嬬爜涓庢墭鐩樹笉灞炰簬鍚屼竴鐢熶骇鎵规锛屼笉鍏佽缁戝畾");
+    ErrorCode PRO_BAG_CODE_BIND_PALLET_BOUND = new ErrorCode(1_040_752_004, "瀛樺湪宸茬粦瀹氭墭鐩樼殑琚嬬爜锛岃鍏堣В缁�");
+    ErrorCode PRO_BAG_CODE_UUID_NOT_EXISTS = new ErrorCode(1_040_752_005, "琚嬬爜鐢熸垚缁勪笉瀛樺湪");
+    ErrorCode PRO_BAG_CODE_BIND_PALLET_OVER_CAPACITY = new ErrorCode(1_040_752_006, "缁戝畾鍚庤鐮佹暟閲忚秴杩囨墭鐩樺彲瑁呰鏁�");
+
+    // ========== MES 鐢熶骇绠$悊-鎵樼洏鐮侊紙1-040-753-000锛� ==========
+    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");
+
+    // ========== MES 鐢熶骇绠$悊-浜х嚎缁存姢锛�1-040-754-000锛� ==========
+    ErrorCode PRO_LINE_NOT_EXISTS = new ErrorCode(1_040_754_000, "浜х嚎涓嶅瓨鍦�");
+    ErrorCode PRO_LINE_CODE_DUPLICATE = new ErrorCode(1_040_754_001, "浜х嚎缂栫爜宸插瓨鍦�");
+    ErrorCode PRO_LINE_NAME_DUPLICATE = new ErrorCode(1_040_754_002, "浜х嚎鍚嶇О宸插瓨鍦�");
+    ErrorCode PRO_LINE_IS_DISABLE = new ErrorCode(1_040_754_003, "浜х嚎宸插仠鐢�");
+    ErrorCode PRO_LINE_HAS_BATCH_NOT_DELETE = new ErrorCode(1_040_754_004, "浜х嚎宸茶鐢熶骇鎵规寮曠敤锛屾棤娉曞垹闄�");
+
     // ========== MES 浠撳偍鐗╂祦-瀹℃壒閰嶇疆锛�1-040-900-000锛� ==========
     ErrorCode WMS_APPROVAL_CONFIG_NOT_EXISTS = new ErrorCode(1_040_900_000, "浠撳簱瀹℃壒閰嶇疆涓嶅瓨鍦�");
     ErrorCode WMS_APPROVAL_ORDER_NOT_EXISTS = new ErrorCode(1_040_900_001, "瀹℃壒鍗曟嵁涓嶅瓨鍦�");
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java
index 0e2a210..a4e884d 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java
@@ -56,7 +56,8 @@
     PD_DOCUMENT_AUDIT_CODE("PD_DOCUMENT_AUDIT_CODE", "璧勬枡瀹℃牳鍗曠紪鐮�"),
     PD_ARCHIVE_CODE("PD_ARCHIVE_CODE", "褰掓。鍙拌处缂栫爜"),
     PD_PROCESS_PARAM_CODE("PD_PROCESS_PARAM_CODE", "宸ヨ壓鍙傛暟缂栫爜"),
-    PD_PROCESS_PARAM_TEMPLATE_CODE("PD_PROCESS_PARAM_TEMPLATE_CODE", "宸ヨ壓鍙傛暟妯℃澘缂栫爜");
+    PD_PROCESS_PARAM_TEMPLATE_CODE("PD_PROCESS_PARAM_TEMPLATE_CODE", "宸ヨ壓鍙傛暟妯℃澘缂栫爜"),
+    PRO_BATCH_CODE("PRO_BATCH_CODE", "鐢熶骇鎵规缂栫爜");
 
     /**
      * 瑙勫垯浠g爜
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProBagCodeStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProBagCodeStatusEnum.java
new file mode 100644
index 0000000..05e75e8
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProBagCodeStatusEnum.java
@@ -0,0 +1,38 @@
+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;
+
+/**
+ * MES 琚嬬爜锛堜竴琚嬩竴鐮侊級鐘舵�佹灇涓�
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Getter
+@AllArgsConstructor
+public enum MesProBagCodeStatusEnum implements ArrayValuable<Integer> {
+
+    GENERATED(10, "宸茬敓鎴�"),
+    PRINTED(20, "宸插鍑哄嵃鍒�"),
+    CANCELED(30, "宸蹭綔搴�");
+
+    public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesProBagCodeStatusEnum::getStatus).toArray(Integer[]::new);
+
+    /**
+     * 鐘舵��
+     */
+    private final Integer status;
+    /**
+     * 鐘舵�佸悕绉�
+     */
+    private final String name;
+
+    @Override
+    public Integer[] array() {
+        return ARRAYS;
+    }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProBatchStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProBatchStatusEnum.java
new file mode 100644
index 0000000..4862788
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProBatchStatusEnum.java
@@ -0,0 +1,39 @@
+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;
+
+/**
+ * MES 鐢熶骇鎵规鐘舵�佹灇涓�
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Getter
+@AllArgsConstructor
+public enum MesProBatchStatusEnum implements ArrayValuable<Integer> {
+
+    DRAFT(10, "鑽夌"),
+    PRODUCING(20, "鐢熶骇涓�"),
+    FINISHED(30, "宸插畬鎴�"),
+    CANCELED(40, "宸蹭綔搴�");
+
+    public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesProBatchStatusEnum::getStatus).toArray(Integer[]::new);
+
+    /**
+     * 鐘舵��
+     */
+    private final Integer status;
+    /**
+     * 鐘舵�佸悕绉�
+     */
+    private final String name;
+
+    @Override
+    public Integer[] array() {
+        return ARRAYS;
+    }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProBatchWorkerTypeEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProBatchWorkerTypeEnum.java
new file mode 100644
index 0000000..689b779
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProBatchWorkerTypeEnum.java
@@ -0,0 +1,40 @@
+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;
+
+/**
+ * MES 鎵规鐢熶骇浜哄憳宀椾綅绫诲瀷鏋氫妇
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Getter
+@AllArgsConstructor
+public enum MesProBatchWorkerTypeEnum implements ArrayValuable<Integer> {
+
+    LEADER(10, "缁勯暱"),
+    OPERATOR(20, "鎿嶄綔宸�"),
+    PACKER(30, "鍖呰宸�"),
+    INSPECTOR(40, "璐ㄦ鍛�"),
+    OTHER(50, "鍏朵粬");
+
+    public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesProBatchWorkerTypeEnum::getType).toArray(Integer[]::new);
+
+    /**
+     * 绫诲瀷
+     */
+    private final Integer type;
+    /**
+     * 绫诲瀷鍚嶇О
+     */
+    private final String name;
+
+    @Override
+    public Integer[] array() {
+        return ARRAYS;
+    }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProPalletStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProPalletStatusEnum.java
new file mode 100644
index 0000000..b92b277
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProPalletStatusEnum.java
@@ -0,0 +1,37 @@
+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;
+
+/**
+ * MES 鎵樼洏鐮佺姸鎬佹灇涓�
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Getter
+@AllArgsConstructor
+public enum MesProPalletStatusEnum implements ArrayValuable<Integer> {
+
+    IN_USE(10, "鍚敤"),
+    CANCELED(20, "浣滃簾");
+
+    public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesProPalletStatusEnum::getStatus).toArray(Integer[]::new);
+
+    /**
+     * 鐘舵��
+     */
+    private final Integer status;
+    /**
+     * 鐘舵�佸悕绉�
+     */
+    private final String name;
+
+    @Override
+    public Integer[] array() {
+        return ARRAYS;
+    }
+
+}
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
new file mode 100644
index 0000000..d22a870
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/MesProQrLabelBuilder.java
@@ -0,0 +1,108 @@
+package cn.iocoder.yudao.module.mes.framework.qrcode;
+
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO;
+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.system.api.user.dto.AdminUserRespDTO;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * MES 浜岀淮鐮佹爣绛炬瀯寤哄櫒锛氱粺涓�"浜岀淮鐮佺紪鐮佺函鐮佸�� + 鍥剧墖鍙犲姞鍙鏂囨湰"鐨勬枃鏈粍瑁呰鍒欙紝
+ * 淇濊瘉鎵规銆佹墭鐩樸�佽鐮佷笁绉嶆爣绛剧殑鍏抽敭淇℃伅淇濈暀涓�鑷�
+ */
+public final class MesProQrLabelBuilder {
+
+    private MesProQrLabelBuilder() {
+    }
+
+    /**
+     * 鎵规浜岀淮鐮佹爣绛�
+     */
+    public static QrLabelInfo buildBatchLabel(MesProBatchDO batch,
+                                              Map<Long, MesMdmItemDO> itemMap,
+                                              Map<Long, AdminUserRespDTO> userMap) {
+        LinkedHashMap<String, String> keyValues = new LinkedHashMap<>();
+        keyValues.put("鎵规鍙�", batch.getCode());
+        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 (batch.getPlanQuantity() != null) {
+            keyValues.put("璁″垝鏁伴噺", String.valueOf(batch.getPlanQuantity()));
+        }
+        AdminUserRespDTO user = userMap.get(batch.getOwnerUserId());
+        if (user != null) {
+            keyValues.put("璐d换浜�", user.getNickname());
+        }
+        return QrLabelInfo.builder().fileName(batch.getCode()).code(batch.getCode()).keyValues(keyValues).build();
+    }
+
+    /**
+     * 鎵樼洏浜岀淮鐮佹爣绛�
+     */
+    public static QrLabelInfo buildPalletLabel(MesProPalletDO pallet,
+                                               MesProBatchDO batch,
+                                               Map<Long, MesMdmItemDO> itemMap,
+                                               Map<Long, AdminUserRespDTO> userMap) {
+        LinkedHashMap<String, String> keyValues = new LinkedHashMap<>();
+        keyValues.put("鎵樼洏鐮�", pallet.getCode());
+        keyValues.put("鎵樼洏搴忓彿", pallet.getPalletNo() == null ? "" : String.valueOf(pallet.getPalletNo()));
+        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();
+    }
+
+    /**
+     * 琚嬬爜浜岀淮鐮佹爣绛�
+     */
+    public static QrLabelInfo buildBagCodeLabel(MesProBagCodeDO bagCode,
+                                                MesProBatchDO batch,
+                                                Map<Long, MesMdmItemDO> itemMap,
+                                                Map<Long, AdminUserRespDTO> userMap) {
+        LinkedHashMap<String, String> keyValues = new LinkedHashMap<>();
+        keyValues.put("琚嬬爜", bagCode.getCode());
+        keyValues.put("琚嬪簭鍙�", bagCode.getBagNo() == null ? "" : String.valueOf(bagCode.getBagNo()));
+        keyValues.put("鎵规鍙�", bagCode.getBatchCode());
+        if (StrUtil.isNotEmpty(bagCode.getPalletCode())) {
+            keyValues.put("缁戝畾鎵樼洏", bagCode.getPalletCode());
+        }
+        if (batch != null) {
+            fillBatchKeyValues(keyValues, batch, itemMap, userMap);
+        }
+        return QrLabelInfo.builder().fileName(bagCode.getCode()).code(bagCode.getCode()).keyValues(keyValues).build();
+    }
+
+    /**
+     * 濉厖鎵规鍏叡鍙鏂囨湰锛堝搧绉嶃�佽鏍笺�佷骇绾裤�佺敓浜ф棩鏈熴�佽矗浠讳汉锛�
+     */
+    private static void fillBatchKeyValues(LinkedHashMap<String, String> keyValues, MesProBatchDO batch,
+                                           Map<Long, MesMdmItemDO> itemMap, Map<Long, AdminUserRespDTO> userMap) {
+        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"));
+        AdminUserRespDTO user = userMap.get(batch.getOwnerUserId());
+        if (user != null) {
+            keyValues.put("璐d换浜�", user.getNickname());
+        }
+    }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/QrCodeImageUtils.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/QrCodeImageUtils.java
new file mode 100644
index 0000000..864066c
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/QrCodeImageUtils.java
@@ -0,0 +1,233 @@
+package cn.iocoder.yudao.module.mes.framework.qrcode;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.qrcode.QrCodeUtil;
+import cn.hutool.extra.qrcode.QrConfig;
+import cn.iocoder.yudao.framework.common.util.http.HttpUtils;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.imageio.ImageIO;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics2D;
+import java.awt.GraphicsEnvironment;
+import java.awt.RenderingHints;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+/**
+ * 浜岀淮鐮佹爣绛惧浘鐗囧伐鍏风被
+ * <p>
+ * 鐢熸垚"浜岀淮鐮� + 鍙充晶鍙鏂囨湰"鐨勫悎鎴愬浘鐗囷細浜岀淮鐮佸彧缂栫爜绾爜鍊硷紝鏂囨湰鍙犲姞鍏抽敭淇℃伅锛�
+ * 鍗充娇鏁版嵁搴撲涪澶变篃鑳戒粠鎵撳嵃鍥剧墖杩樺師鍏抽敭淇℃伅銆�
+ */
+@Slf4j
+public final class QrCodeImageUtils {
+
+    private QrCodeImageUtils() {
+    }
+
+    /** 鎵归噺瀵煎嚭浜岀淮鐮佹暟閲忎笂闄愶紙闃叉涓�娆℃�х敓鎴愯繃澶氬鑷村唴瀛�/鍝嶅簲杩囧ぇ锛� */
+    public static final int MAX_QR_EXPORT = 2000;
+
+    /** 浜岀淮鐮佽竟闀� */
+    private static final int QR_SIZE = 260;
+    /** 鍥剧墖鍥涘懆鐣欑櫧 */
+    private static final int PADDING = 16;
+    /** 浜岀淮鐮佷笌鏂囨湰闂磋窛 */
+    private static final int GAP = 24;
+    /** 鏂囨湰鍖哄煙瀹藉害 */
+    private static final int TEXT_WIDTH = 380;
+    /** 瀛椾綋澶у皬 */
+    private static final int FONT_SIZE = 15;
+    /** 琛岄珮 */
+    private static final int LINE_HEIGHT = 24;
+    /** 瀛楁闂磋窛 */
+    private static final int FIELD_GAP = 6;
+
+    /** 涓枃瀛椾綋鍊欓�夛紙鎸変紭鍏堢骇锛夛紝閬垮厤 Linux headless 涓嬫枃瀛楀彉鏂规 */
+    private static final String[] FONT_CANDIDATES = {
+            "Noto Sans CJK SC", "WenQuanYi Zen Hei", "Microsoft YaHei", "SimSun", "Arial"
+    };
+
+    private static final String FONT_NAME = resolveFontName();
+
+    /**
+     * 鐢熸垚浜岀淮鐮佹爣绛惧浘鐗�
+     *
+     * @param code      浜岀淮鐮佸唴瀹癸紙绾爜鍊硷級
+     * @param keyValues 鍙犲姞鐨勫彲璇绘枃鏈紙椤哄簭鍗崇粯鍒堕『搴忥級
+     * @return 鍚堟垚鍥剧墖
+     */
+    public static BufferedImage createQrLabel(String code, LinkedHashMap<String, String> keyValues) {
+        QrConfig config = new QrConfig();
+        config.setErrorCorrection(ErrorCorrectionLevel.H); // 鎵撳嵃鏍囩鏄撶(鎹燂紝鐢ㄩ珮瀹归敊
+        config.setMargin(1); // 淇濊瘉闈欏尯锛屾壂鐮佺巼
+        config.setWidth(QR_SIZE);
+        config.setHeight(QR_SIZE);
+        BufferedImage qrImage = QrCodeUtil.generate(code, config);
+
+        Font labelFont = new Font(FONT_NAME, Font.BOLD, FONT_SIZE);
+        Font valueFont = new Font(FONT_NAME, Font.PLAIN, FONT_SIZE);
+
+        // 绗竴閬嶏細娴嬮噺鏂囨湰鍧楁�婚珮搴︼紝鐢ㄤ簬纭畾鍥剧墖楂樺害
+        int textHeight = measureTextHeight(keyValues, labelFont, valueFont);
+
+        int height = PADDING * 2 + Math.max(QR_SIZE, textHeight);
+        int width = PADDING * 2 + QR_SIZE + GAP + TEXT_WIDTH;
+
+        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+        Graphics2D g = image.createGraphics();
+        try {
+            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+            g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+            g.setColor(Color.WHITE);
+            g.fillRect(0, 0, width, height);
+            // 浜岀淮鐮侊紙鍨傜洿灞呬腑锛�
+            int qrY = (height - QR_SIZE) / 2;
+            g.drawImage(qrImage, PADDING, qrY, null);
+            // 鍙鏂囨湰
+            int textX = PADDING + QR_SIZE + GAP;
+            int textY = (height - textHeight) / 2;
+            drawKeyValues(g, keyValues, labelFont, valueFont, textX, textY);
+        } finally {
+            g.dispose();
+        }
+        return image;
+    }
+
+    /**
+     * 灏嗗寮犱簩缁寸爜鏍囩鍥剧墖鍐欏叆 ZIP 鍝嶅簲锛堟祦寮忥紝閫愬紶鐢熸垚锛屽唴瀛樺彧鍗犱竴寮狅級
+     *
+     * @param response 鍝嶅簲
+     * @param zipName  ZIP 鏂囦欢鍚嶏紙涓嶅惈鍚庣紑锛�
+     * @param labels   鏍囩鍒楄〃
+     */
+    public static void writeZip(HttpServletResponse response, String zipName, List<QrLabelInfo> labels) throws IOException {
+        response.setContentType("application/zip");
+        response.setHeader("Content-Disposition",
+                "attachment;filename=" + HttpUtils.encodeUtf8(zipName + ".zip"));
+        ZipOutputStream zip = new ZipOutputStream(response.getOutputStream());
+        try {
+            for (QrLabelInfo label : labels) {
+                BufferedImage image = createQrLabel(label.getCode(), label.getKeyValues());
+                zip.putNextEntry(new ZipEntry(label.getFileName() + ".png"));
+                ImageIO.write(image, "png", zip);
+                zip.closeEntry();
+            }
+            zip.finish();
+            zip.flush();
+        } finally {
+            // 涓� close ZipOutputStream锛岄伩鍏嶅叧闂簳灞� ServletOutputStream锛堜笌 FileTypeUtils 鍚岀悊锛�
+        }
+    }
+
+    // ==================== 绉佹湁鏂规硶 ====================
+
+    private static String resolveFontName() {
+        Set<String> families = Set.of(GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames());
+        for (String candidate : FONT_CANDIDATES) {
+            if (families.contains(candidate)) {
+                return candidate;
+            }
+        }
+        return Font.SANS_SERIF;
+    }
+
+    private static int measureTextHeight(LinkedHashMap<String, String> keyValues, Font labelFont, Font valueFont) {
+        BufferedImage scratch = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
+        Graphics2D g = scratch.createGraphics();
+        try {
+            return measureKeyValuesHeight(g, keyValues, labelFont, valueFont);
+        } finally {
+            g.dispose();
+        }
+    }
+
+    private static int measureKeyValuesHeight(Graphics2D g, LinkedHashMap<String, String> keyValues,
+                                              Font labelFont, Font valueFont) {
+        int total = 0;
+        for (Map.Entry<String, String> entry : keyValues.entrySet()) {
+            String label = StrUtil.emptyToDefault(entry.getKey(), "") + "锛�";
+            String value = StrUtil.emptyToDefault(entry.getValue(), "");
+            g.setFont(labelFont);
+            int labelWidth = g.getFontMetrics().stringWidth(label);
+            g.setFont(valueFont);
+            List<String> lines = wrapText(g, value, TEXT_WIDTH - labelWidth);
+            total += Math.max(1, lines.size()) * LINE_HEIGHT + FIELD_GAP;
+        }
+        return total;
+    }
+
+    private static void drawKeyValues(Graphics2D g, LinkedHashMap<String, String> keyValues,
+                                      Font labelFont, Font valueFont, int x, int y) {
+        FontMetrics labelMetrics = g.getFontMetrics(labelFont);
+        int baselineOffset = labelMetrics.getAscent(); // drawString 鐨� y 鏄熀绾匡紝鍏堜笅绉讳竴涓� ascent
+        int baseline = y + baselineOffset;
+        for (Map.Entry<String, String> entry : keyValues.entrySet()) {
+            String label = StrUtil.emptyToDefault(entry.getKey(), "") + "锛�";
+            String value = StrUtil.emptyToDefault(entry.getValue(), "");
+
+            g.setFont(labelFont);
+            int labelWidth = g.getFontMetrics().stringWidth(label);
+            g.setColor(Color.BLACK);
+            g.drawString(label, x, baseline);
+
+            g.setFont(valueFont);
+            int remainingWidth = TEXT_WIDTH - labelWidth;
+            List<String> lines = wrapText(g, value, remainingWidth);
+            if (!lines.isEmpty()) {
+                g.drawString(lines.get(0), x + labelWidth, baseline);
+                baseline += LINE_HEIGHT;
+                for (int i = 1; i < lines.size(); i++) {
+                    g.drawString(lines.get(i), x, baseline);
+                    baseline += LINE_HEIGHT;
+                }
+            } else {
+                baseline += LINE_HEIGHT;
+            }
+            baseline += FIELD_GAP;
+        }
+    }
+
+    /**
+     * 鏂囨湰鎸夋渶澶у搴︽崲琛岋紙閫愬瓧娴嬮噺锛屽吋瀹逛腑鏂囷級
+     */
+    private static List<String> wrapText(Graphics2D g, String text, int maxWidth) {
+        List<String> lines = new ArrayList<>();
+        if (StrUtil.isEmpty(text)) {
+            return lines;
+        }
+        if (maxWidth <= 0) {
+            lines.add(text);
+            return lines;
+        }
+        StringBuilder current = new StringBuilder();
+        FontMetrics metrics = g.getFontMetrics();
+        for (int i = 0; i < text.length(); i++) {
+            char ch = text.charAt(i);
+            String test = current.toString() + ch;
+            if (metrics.stringWidth(test) > maxWidth && current.length() > 0) {
+                lines.add(current.toString());
+                current = new StringBuilder().append(ch);
+            } else {
+                current.append(ch);
+            }
+        }
+        if (current.length() > 0) {
+            lines.add(current.toString());
+        }
+        return lines;
+    }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/QrLabelInfo.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/QrLabelInfo.java
new file mode 100644
index 0000000..8af2af5
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/QrLabelInfo.java
@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.mes.framework.qrcode;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.LinkedHashMap;
+
+/**
+ * 浜岀淮鐮佹爣绛句俊鎭細涓�寮犳爣绛剧殑浜岀淮鐮佸唴瀹� + 鍙犲姞鐨勫彲璇绘枃鏈紙椤哄簭鍗崇粯鍒堕『搴忥級
+ */
+@Data
+@Builder
+public class QrLabelInfo {
+
+    /** 鏂囦欢鍚嶏紙涓嶅甫鍚庣紑锛岀洿鎺ョ敤鐮佸�硷紝淇濊瘉 ZIP 鏉$洰鍚� ASCII 瀹夊叏锛� */
+    private String fileName;
+
+    /** 浜岀淮鐮佸唴瀹癸紙绾爜鍊硷級 */
+    private String code;
+
+    /** 鍙犲姞鐨勫彲璇绘枃鏈紝濡� {鐮佸��:xx, 鍝佺:xx, 浜х嚎:xx, 鐢熶骇鏃ユ湡:xx, 璐d换浜�:xx} */
+    private LinkedHashMap<String, String> keyValues;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/home/MesBagCodeHomeStatisticsService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/home/MesBagCodeHomeStatisticsService.java
new file mode 100644
index 0000000..67fd4b1
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/home/MesBagCodeHomeStatisticsService.java
@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.mes.service.home;
+
+import cn.iocoder.yudao.module.mes.controller.admin.home.vo.MesBagCodeHomeSummaryRespVO;
+import cn.iocoder.yudao.module.mes.controller.admin.home.vo.MesBagCodeHomeTrendRespVO;
+
+import java.util.List;
+
+/**
+ * MES 鍩虹鏁版嵁涓庝竴琚嬩竴鐮� 棣栭〉缁熻 Service 鎺ュ彛
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+public interface MesBagCodeHomeStatisticsService {
+
+    /**
+     * 鑾峰緱棣栭〉姹囨�荤粺璁★紙鏁伴噺 + 鐘舵�佸垎甯冿級
+     *
+     * @return 姹囨�荤粺璁℃暟鎹�
+     */
+    MesBagCodeHomeSummaryRespVO getHomeSummary();
+
+    /**
+     * 鑾峰緱琚嬬爜鐢熸垚瓒嬪娍锛堣繎 N 澶╋級
+     *
+     * @param days 澶╂暟
+     * @return 姣忓ぉ鐨勮鐮佺敓鎴愭暟閲�
+     */
+    List<MesBagCodeHomeTrendRespVO> getBagCodeTrend(Integer days);
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/home/MesBagCodeHomeStatisticsServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/home/MesBagCodeHomeStatisticsServiceImpl.java
new file mode 100644
index 0000000..4a14ca7
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/home/MesBagCodeHomeStatisticsServiceImpl.java
@@ -0,0 +1,99 @@
+package cn.iocoder.yudao.module.mes.service.home;
+
+import cn.iocoder.yudao.module.mes.controller.admin.home.vo.MesBagCodeHomeStatusRespVO;
+import cn.iocoder.yudao.module.mes.controller.admin.home.vo.MesBagCodeHomeSummaryRespVO;
+import cn.iocoder.yudao.module.mes.controller.admin.home.vo.MesBagCodeHomeTrendRespVO;
+import cn.iocoder.yudao.module.mes.dal.mysql.home.MesBagCodeHomeStatisticsMapper;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * MES 鍩虹鏁版嵁涓庝竴琚嬩竴鐮� 棣栭〉缁熻 Service 瀹炵幇绫�
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Service
+public class MesBagCodeHomeStatisticsServiceImpl implements MesBagCodeHomeStatisticsService {
+
+    @Resource
+    private MesBagCodeHomeStatisticsMapper homeStatisticsMapper;
+
+    @Override
+    public MesBagCodeHomeSummaryRespVO getHomeSummary() {
+        MesBagCodeHomeSummaryRespVO summary = new MesBagCodeHomeSummaryRespVO();
+
+        // 1. 鍩虹鏁版嵁
+        summary.setMdmItemCount(getCount(homeStatisticsMapper.selectMdmItemCount()));
+        summary.setMesItemCount(getCount(homeStatisticsMapper.selectMesItemCount()));
+        summary.setItemTypeCount(getCount(homeStatisticsMapper.selectItemTypeCount()));
+        summary.setUnitMeasureCount(getCount(homeStatisticsMapper.selectUnitMeasureCount()));
+
+        // 2. 涓�琚嬩竴鐮�
+        summary.setLineCount(getCount(homeStatisticsMapper.selectLineCount()));
+        summary.setBatchCount(getCount(homeStatisticsMapper.selectBatchCount()));
+        summary.setBagCodeCount(getCount(homeStatisticsMapper.selectBagCodeCount()));
+        summary.setPalletCount(getCount(homeStatisticsMapper.selectPalletCount()));
+
+        // 3. 鐘舵�佸垎甯�
+        summary.setBatchStatusList(toStatusList(homeStatisticsMapper.selectBatchCountGroupByStatus()));
+        summary.setBagCodeStatusList(toStatusList(homeStatisticsMapper.selectBagCodeCountGroupByStatus()));
+
+        return summary;
+    }
+
+    @Override
+    public List<MesBagCodeHomeTrendRespVO> getBagCodeTrend(Integer days) {
+        LocalDate endDate = LocalDate.now().plusDays(1);
+        LocalDate startDate = endDate.minusDays(days);
+        LocalDateTime beginTime = startDate.atStartOfDay();
+        LocalDateTime endTime = endDate.atStartOfDay();
+
+        // 鏌ヨ鏁版嵁搴�
+        List<Map<String, Object>> dbData = homeStatisticsMapper.selectDailyBagCodeTrend(beginTime, endTime);
+        Map<String, Map<String, Object>> dateMap = new LinkedHashMap<>();
+        for (Map<String, Object> row : dbData) {
+            dateMap.put((String) row.get("date"), row);
+        }
+
+        // 琛ュ叏鎵�鏈夋棩鏈燂紙鏃犳暟鎹殑鏃ユ湡濉� 0锛�
+        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        List<MesBagCodeHomeTrendRespVO> result = new ArrayList<>();
+        for (LocalDate d = startDate; d.isBefore(endDate); d = d.plusDays(1)) {
+            String dateStr = d.format(fmt);
+            Map<String, Object> row = dateMap.get(dateStr);
+            MesBagCodeHomeTrendRespVO vo = new MesBagCodeHomeTrendRespVO();
+            vo.setDate(dateStr);
+            vo.setCount(row != null ? ((Number) row.get("count")).longValue() : 0L);
+            result.add(vo);
+        }
+        return result;
+    }
+
+    // ========== 宸ュ叿鏂规硶 ==========
+
+    private Long getCount(Long count) {
+        return count != null ? count : 0L;
+    }
+
+    private List<MesBagCodeHomeStatusRespVO> toStatusList(List<Map<String, Object>> stats) {
+        List<MesBagCodeHomeStatusRespVO> result = new ArrayList<>();
+        if (stats == null) {
+            return result;
+        }
+        for (Map<String, Object> stat : stats) {
+            Integer status = ((Number) stat.get("status")).intValue();
+            Long count = ((Number) stat.get("count")).longValue();
+            result.add(new MesBagCodeHomeStatusRespVO(status, count));
+        }
+        return result;
+    }
+
+}
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
new file mode 100644
index 0000000..5608218
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeService.java
@@ -0,0 +1,114 @@
+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.MesProBagCodeBindReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeGenerateReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodePageReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO;
+import jakarta.validation.Valid;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * MES 琚嬬爜璧嬬爜锛堜竴琚嬩竴鐮侊級Service 鎺ュ彛
+ * <p>
+ * 鏍规嵁鎵规淇℃伅鑷姩鐢熸垚鍞竴浜岀淮鐮佹暟鎹寘锛屾敮鎸佹壒閲忓鍑轰氦浠樺嵃鍒凤紝婊¤冻鍞竴鎬с�佸彲璇嗗埆鎬с�佸彲杩芥函鎬ц姹傘��
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+public interface MesProBagCodeService {
+
+    /**
+     * 鐢熸垚琚嬬爜鏁版嵁鍖咃紙鐮佸�� = 鎵规鍙�-琚嬪簭鍙凤級锛屽苟鍥炲啓鎵规琚嬬爜鏁伴噺
+     *
+     * @param generateReqVO 鐢熸垚淇℃伅
+     * @return 鐢熸垚缁� UUID锛堟爣璁板悓涓�娆$敓鎴愮殑鏁版嵁鍖咃級
+     */
+    String generateBagCodes(@Valid MesProBagCodeGenerateReqVO generateReqVO);
+
+    /**
+     * 鍒犻櫎鐢熸垚缁勶紙浠�"宸茬敓鎴�"鐘舵�佷笖鏈粦瀹氭墭鐩樼殑琚嬬爜鍏佽鍒犻櫎锛�
+     *
+     * @param uuid 鐢熸垚缁� UUID
+     */
+    void deleteBagCodesByUuid(String uuid);
+
+    /**
+     * 琚嬬爜缁戝畾鎵樼洏锛堥渶鍚屼竴鎵规銆佹湭缁戝畾杩囷紝涓斾笉瓒呰繃鎵樼洏鍙琚嬫暟锛�
+     *
+     * @param bindReqVO 缁戝畾淇℃伅
+     */
+    void bindPallet(@Valid MesProBagCodeBindReqVO bindReqVO);
+
+    /**
+     * 琚嬬爜瑙g粦鎵樼洏
+     *
+     * @param bindReqVO 瑙g粦淇℃伅
+     */
+    void unbindPallet(@Valid MesProBagCodeBindReqVO bindReqVO);
+
+    /**
+     * 鎵归噺鏍囪琚嬬爜涓哄凡瀵煎嚭鍗板埛锛堜氦浠樺嵃鍒凤級
+     *
+     * @param ids 琚嬬爜缂栧彿鍒楄〃
+     */
+    void markBagCodesPrinted(Collection<Long> ids);
+
+    /**
+     * 鑾峰緱琚嬬爜
+     *
+     * @param id 缂栧彿
+     * @return 琚嬬爜
+     */
+    MesProBagCodeDO getBagCode(Long id);
+
+    /**
+     * 鏍¢獙琚嬬爜瀛樺湪
+     *
+     * @param id 缂栧彿
+     * @return 琚嬬爜
+     */
+    MesProBagCodeDO validateBagCodeExists(Long id);
+
+    /**
+     * 鏍规嵁琚嬬爜锛堜簩缁寸爜鍐呭锛夋煡璇㈣鐮侊紝鐢ㄤ簬鎵爜杩芥函
+     *
+     * @param code 琚嬬爜
+     * @return 琚嬬爜锛屼笉瀛樺湪杩斿洖 null
+     */
+    MesProBagCodeDO getBagCodeByCode(String code);
+
+    /**
+     * 鑾峰緱琚嬬爜鍒嗛〉
+     *
+     * @param pageReqVO 鍒嗛〉鏌ヨ
+     * @return 琚嬬爜鍒嗛〉
+     */
+    PageResult<MesProBagCodeDO> getBagCodePage(MesProBagCodePageReqVO pageReqVO);
+
+    /**
+     * 鑾峰緱鐢熸垚缁勭殑琚嬬爜鍒楄〃
+     *
+     * @param uuid 鐢熸垚缁� UUID
+     * @return 琚嬬爜鍒楄〃
+     */
+    List<MesProBagCodeDO> getBagCodeListByUuid(String uuid);
+
+    /**
+     * 鑾峰緱缁戝畾鍦ㄦ煇鎵樼洏涓婄殑琚嬬爜鍒楄〃锛堟寜琚嬪簭鍙峰崌搴忥級锛岀敤浜庢墭鐩樻壂鐮佽拷婧�
+     *
+     * @param palletId 鎵樼洏缂栧彿
+     * @return 琚嬬爜鍒楄〃
+     */
+    List<MesProBagCodeDO> getBagCodeListByPalletId(Long palletId);
+
+    /**
+     * 鑾峰緱鏌愭壒娆′笅鐨勫叏閮ㄨ鐮佸垪琛紙鎸夎搴忓彿鍗囧簭锛夛紝鐢ㄤ簬鎵归噺瀵煎嚭浜岀淮鐮�
+     *
+     * @param batchId 鎵规缂栧彿
+     * @return 琚嬬爜鍒楄〃
+     */
+    List<MesProBagCodeDO> getBagCodeListByBatchId(Long batchId);
+
+}
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
new file mode 100644
index 0000000..3ac2f9d
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeServiceImpl.java
@@ -0,0 +1,226 @@
+package cn.iocoder.yudao.module.mes.service.pro.bagcode;
+
+import cn.hutool.core.collection.CollUtil;
+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.MesProBagCodeBindReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeGenerateReqVO;
+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.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.enums.pro.MesProBagCodeStatusEnum;
+import cn.iocoder.yudao.module.mes.enums.pro.MesProBatchStatusEnum;
+import cn.iocoder.yudao.module.mes.service.pro.pallet.MesProPalletService;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
+
+/**
+ * MES 琚嬬爜璧嬬爜锛堜竴琚嬩竴鐮侊級Service 瀹炵幇绫�
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Service
+@Validated
+@Slf4j
+public class MesProBagCodeServiceImpl implements MesProBagCodeService {
+
+    @Resource
+    private MesProBagCodeMapper bagCodeMapper;
+    @Resource
+    private MesProBatchMapper batchMapper;
+
+    @Resource
+    private MesProPalletService palletService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String generateBagCodes(MesProBagCodeGenerateReqVO generateReqVO) {
+        // 1. 鏍¢獙鎵规瀛樺湪涓斿浜庣敓浜т腑鐘舵��
+        MesProBatchDO batch = batchMapper.selectById(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锛堟暟鎹寘锛�
+        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'))
+                    .setBagNo(bagNo)
+                    .setBatchId(batch.getId())
+                    .setBatchCode(batch.getCode())
+                    .setStatus(MesProBagCodeStatusEnum.GENERATED.getStatus())
+                    .setRemark(generateReqVO.getRemark()));
+        }
+        bagCodeMapper.insertBatch(bagCodes);
+
+        // 4. 鍥炲啓鎵规琚嬬爜鏁伴噺
+        batchMapper.updateById(new MesProBatchDO().setId(batch.getId())
+                .setBagQuantity((batch.getBagQuantity() == null ? 0 : batch.getBagQuantity())
+                        + generateReqVO.getCount()));
+        return uuid;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteBagCodesByUuid(String uuid) {
+        // 1. 鏍¢獙鐢熸垚缁勫瓨鍦�
+        List<MesProBagCodeDO> bagCodes = bagCodeMapper.selectListByUuid(uuid);
+        if (CollUtil.isEmpty(bagCodes)) {
+            throw exception(PRO_BAG_CODE_UUID_NOT_EXISTS);
+        }
+        // 2. 鏍¢獙鍧囦负宸茬敓鎴愮姸鎬佷笖鏈粦瀹氭墭鐩�
+        if (bagCodes.stream().anyMatch(bagCode ->
+                !MesProBagCodeStatusEnum.GENERATED.getStatus().equals(bagCode.getStatus()))) {
+            throw exception(PRO_BAG_CODE_STATUS_NOT_GENERATED);
+        }
+        if (bagCodes.stream().anyMatch(bagCode -> bagCode.getPalletId() != null)) {
+            throw exception(PRO_BAG_CODE_BIND_PALLET_BOUND);
+        }
+        // 3. 鍒犻櫎鐢熸垚缁�
+        bagCodeMapper.deleteByIds(bagCodes.stream().map(MesProBagCodeDO::getId).toList());
+        // 4. 鍥炲噺鎵规琚嬬爜鏁伴噺
+        MesProBatchDO batch = batchMapper.selectById(bagCodes.get(0).getBatchId());
+        if (batch != null && batch.getBagQuantity() != null) {
+            batchMapper.updateById(new MesProBatchDO().setId(batch.getId())
+                    .setBagQuantity(Math.max(0, batch.getBagQuantity() - bagCodes.size())));
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void bindPallet(MesProBagCodeBindReqVO bindReqVO) {
+        // 1. 鏍¢獙鎵樼洏瀛樺湪
+        MesProPalletDO pallet = palletService.validatePalletExists(bindReqVO.getPalletId());
+        // 2. 鏍¢獙琚嬬爜
+        List<MesProBagCodeDO> bagCodes = validateBagCodesForBind(bindReqVO.getIds(), pallet);
+        // 3. 鏍¢獙涓嶈秴杩囨墭鐩樺彲瑁呰鏁�
+        int currentCount = pallet.getBagCount() == null ? 0 : pallet.getBagCount();
+        if (pallet.getCapacity() != null && pallet.getCapacity() > 0
+                && currentCount + bagCodes.size() > pallet.getCapacity()) {
+            throw exception(PRO_BAG_CODE_BIND_PALLET_OVER_CAPACITY);
+        }
+        // 4. 缁戝畾琚嬬爜骞剁疮鍔犳墭鐩樺凡瑁呰鏁�
+        bagCodeMapper.bindPalletByIds(bindReqVO.getIds(), pallet.getId(), pallet.getCode());
+        palletService.updatePalletBagCount(pallet.getId(), currentCount + bagCodes.size());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void unbindPallet(MesProBagCodeBindReqVO bindReqVO) {
+        // 1. 鏍¢獙鎵樼洏瀛樺湪
+        MesProPalletDO pallet = palletService.validatePalletExists(bindReqVO.getPalletId());
+        // 2. 鏍¢獙琚嬬爜鍧囩粦瀹氬湪褰撳墠鎵樼洏涓�
+        List<MesProBagCodeDO> bagCodes = bagCodeMapper.selectListByIds(bindReqVO.getIds());
+        if (bagCodes.size() != bindReqVO.getIds().size()) {
+            throw exception(PRO_BAG_CODE_NOT_EXISTS);
+        }
+        if (bagCodes.stream().anyMatch(bagCode -> !pallet.getId().equals(bagCode.getPalletId()))) {
+            throw exception(PRO_BAG_CODE_BIND_PALLET_MISMATCH);
+        }
+        // 3. 瑙g粦琚嬬爜骞跺洖鍑忔墭鐩樺凡瑁呰鏁�
+        bagCodeMapper.unbindPalletByIds(bindReqVO.getIds());
+        int currentCount = pallet.getBagCount() == null ? 0 : pallet.getBagCount();
+        palletService.updatePalletBagCount(pallet.getId(), Math.max(0, currentCount - bagCodes.size()));
+    }
+
+    @Override
+    public void markBagCodesPrinted(Collection<Long> ids) {
+        if (CollUtil.isEmpty(ids)) {
+            return;
+        }
+        bagCodeMapper.updateStatusByIds(ids, MesProBagCodeStatusEnum.GENERATED.getStatus(),
+                MesProBagCodeStatusEnum.PRINTED.getStatus(), LocalDateTime.now());
+    }
+
+    @Override
+    public MesProBagCodeDO getBagCode(Long id) {
+        return bagCodeMapper.selectById(id);
+    }
+
+    @Override
+    public MesProBagCodeDO validateBagCodeExists(Long id) {
+        MesProBagCodeDO bagCode = bagCodeMapper.selectById(id);
+        if (bagCode == null) {
+            throw exception(PRO_BAG_CODE_NOT_EXISTS);
+        }
+        return bagCode;
+    }
+
+    @Override
+    public MesProBagCodeDO getBagCodeByCode(String code) {
+        return bagCodeMapper.selectByCode(code);
+    }
+
+    @Override
+    public PageResult<MesProBagCodeDO> getBagCodePage(MesProBagCodePageReqVO pageReqVO) {
+        return bagCodeMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public List<MesProBagCodeDO> getBagCodeListByUuid(String uuid) {
+        return bagCodeMapper.selectListByUuid(uuid);
+    }
+
+    @Override
+    public List<MesProBagCodeDO> getBagCodeListByPalletId(Long palletId) {
+        return bagCodeMapper.selectListByPalletId(palletId);
+    }
+
+    @Override
+    public List<MesProBagCodeDO> getBagCodeListByBatchId(Long batchId) {
+        return bagCodeMapper.selectListByBatchId(batchId);
+    }
+
+    // ==================== 绉佹湁鏂规硶 ====================
+
+    /**
+     * 鏍¢獙寰呯粦瀹氱殑琚嬬爜锛氬瓨鍦ㄣ�佷笌鎵樼洏鍚屾壒娆°�佹湭缁戝畾杩囨墭鐩樸�佺姸鎬佹湁鏁堬紙宸茬敓鎴�/宸插鍑哄嵃鍒凤級
+     */
+    private List<MesProBagCodeDO> validateBagCodesForBind(List<Long> ids, MesProPalletDO pallet) {
+        List<MesProBagCodeDO> bagCodes = bagCodeMapper.selectListByIds(ids);
+        if (bagCodes.size() != ids.size()) {
+            throw exception(PRO_BAG_CODE_NOT_EXISTS);
+        }
+        for (MesProBagCodeDO bagCode : bagCodes) {
+            if (!pallet.getBatchId().equals(bagCode.getBatchId())) {
+                throw exception(PRO_BAG_CODE_BIND_PALLET_MISMATCH);
+            }
+            if (bagCode.getPalletId() != null) {
+                throw exception(PRO_BAG_CODE_BIND_PALLET_BOUND);
+            }
+            if (MesProBagCodeStatusEnum.CANCELED.getStatus().equals(bagCode.getStatus())) {
+                throw exception(PRO_BAG_CODE_STATUS_NOT_GENERATED);
+            }
+        }
+        return bagCodes;
+    }
+
+}
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
new file mode 100644
index 0000000..03a02a6
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchService.java
@@ -0,0 +1,106 @@
+package cn.iocoder.yudao.module.mes.service.pro.batch;
+
+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.MesProBatchSaveReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchWorkerDO;
+import jakarta.validation.Valid;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * MES 鐢熶骇鎵规 Service 鎺ュ彛
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+public interface MesProBatchService {
+
+    /**
+     * 鍒涘缓鐢熶骇鎵规锛堝惈鐢熶骇浜哄憳閰嶇疆锛夛紝鑷姩鐢熸垚鎵规鍙�
+     *
+     * @param createReqVO 鍒涘缓淇℃伅
+     * @return 缂栧彿
+     */
+    Long createBatch(@Valid MesProBatchSaveReqVO createReqVO);
+
+    /**
+     * 鏇存柊鐢熶骇鎵规锛堝惈鐢熶骇浜哄憳閰嶇疆锛�
+     *
+     * @param updateReqVO 鏇存柊淇℃伅
+     */
+    void updateBatch(@Valid MesProBatchSaveReqVO updateReqVO);
+
+    /**
+     * 鍒犻櫎鐢熶骇鎵规
+     *
+     * @param id 缂栧彿
+     */
+    void deleteBatch(Long id);
+
+    /**
+     * 鏇存柊鐢熶骇鎵规鐘舵��
+     *
+     * @param id     缂栧彿
+     * @param status 鐩爣鐘舵��
+     */
+    void updateBatchStatus(Long id, Integer status);
+
+    /**
+     * 鑾峰緱鐢熶骇鎵规
+     *
+     * @param id 缂栧彿
+     * @return 鐢熶骇鎵规
+     */
+    MesProBatchDO getBatch(Long id);
+
+    /**
+     * 鏍¢獙鐢熶骇鎵规瀛樺湪
+     *
+     * @param id 缂栧彿
+     * @return 鐢熶骇鎵规
+     */
+    MesProBatchDO validateBatchExists(Long id);
+
+    /**
+     * 鏍规嵁鎵规鍙凤紙浜岀淮鐮佸唴瀹癸級鏌ヨ鎵规锛岀敤浜庢壂鐮佽拷婧�
+     *
+     * @param code 鎵规鍙�
+     * @return 鐢熶骇鎵规锛屼笉瀛樺湪杩斿洖 null
+     */
+    MesProBatchDO getBatchByCode(String code);
+
+    /**
+     * 鑾峰緱鐢熶骇鎵规鍒嗛〉
+     *
+     * @param pageReqVO 鍒嗛〉鏌ヨ
+     * @return 鐢熶骇鎵规鍒嗛〉
+     */
+    PageResult<MesProBatchDO> getBatchPage(MesProBatchPageReqVO pageReqVO);
+
+    /**
+     * 鑾峰緱鐢熶骇鎵规鍒楄〃
+     *
+     * @param ids 缂栧彿鍒楄〃
+     * @return 鐢熶骇鎵规鍒楄〃
+     */
+    List<MesProBatchDO> getBatchList(Collection<Long> ids);
+
+    /**
+     * 鑾峰緱鎵规鐨勭敓浜т汉鍛橀厤缃垪琛�
+     *
+     * @param batchId 鎵规缂栧彿
+     * @return 浜哄憳閰嶇疆鍒楄〃
+     */
+    List<MesProBatchWorkerDO> getBatchWorkerListByBatchId(Long batchId);
+
+    /**
+     * 鑾峰緱澶氫釜鎵规鐨勭敓浜т汉鍛橀厤缃垪琛�
+     *
+     * @param batchIds 鎵规缂栧彿鍒楄〃
+     * @return 浜哄憳閰嶇疆鍒楄〃
+     */
+    List<MesProBatchWorkerDO> getBatchWorkerListByBatchIds(Collection<Long> batchIds);
+
+}
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
new file mode 100644
index 0000000..de727f9
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchServiceImpl.java
@@ -0,0 +1,264 @@
+package cn.iocoder.yudao.module.mes.service.pro.batch;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+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.MesProBatchSaveReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchWorkerDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.line.MesProLineDO;
+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.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.MesProBatchStatusEnum;
+import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
+import cn.iocoder.yudao.module.mes.service.pro.line.MesProLineService;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
+
+/**
+ * MES 鐢熶骇鎵规 Service 瀹炵幇绫�
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Service
+@Validated
+@Slf4j
+public class MesProBatchServiceImpl implements MesProBatchService {
+
+    @Resource
+    private MesProBatchMapper batchMapper;
+    @Resource
+    private MesProBatchWorkerMapper batchWorkerMapper;
+    @Resource
+    private MesProBagCodeMapper bagCodeMapper;
+    @Resource
+    private MesProPalletMapper palletMapper;
+
+    @Resource
+    private MesMdAutoCodeRecordService autoCodeRecordService;
+    @Resource
+    private AdminUserApi adminUserApi;
+    @Resource
+    private MesMdmItemService mdmItemService;
+    @Resource
+    private MesProLineService lineService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long createBatch(MesProBatchSaveReqVO createReqVO) {
+        // 1. 鏍¢獙鍏宠仈鏁版嵁锛堝搧绉嶃�佷骇绾裤�佺敓浜т汉鍛橈級
+        MesMdmItemDO item = mdmItemService.validateItemExists(createReqVO.getItemId());
+        MesProLineDO line = lineService.validateLineExistsAndEnable(createReqVO.getLineId());
+        validateRelations(createReqVO);
+
+        // 2. 鐢熸垚鎵规鍙凤紙缂栫爜瑙勫垯锛氬墠缂� + 鏃ユ湡 + 浜х嚎缂栫爜 + 鍝佺缂栫爜 + 娴佹按鍙凤級
+        String code = generateBatchCode(line.getCode(), item.getCode());
+
+        // 3. 鎻掑叆鎵规锛堜骇绾跨紪鐮�/鍚嶇О鍐椾綑鍥炲~锛�
+        MesProBatchDO batch = BeanUtils.toBean(createReqVO, MesProBatchDO.class)
+                .setCode(code)
+                .setLineCode(line.getCode())
+                .setLineName(line.getName())
+                .setBagQuantity(0)
+                .setPalletQuantity(0)
+                .setStatus(MesProBatchStatusEnum.DRAFT.getStatus());
+        batchMapper.insert(batch);
+
+        // 4. 鎻掑叆鐢熶骇浜哄憳閰嶇疆
+        insertBatchWorkers(batch.getId(), createReqVO.getWorkers());
+        return batch.getId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateBatch(MesProBatchSaveReqVO updateReqVO) {
+        // 1. 鏍¢獙瀛樺湪 + 鐘舵�侊紙鑽夌/鐢熶骇涓墠鍏佽淇敼锛�
+        MesProBatchDO oldBatch = validateBatchExists(updateReqVO.getId());
+        validateBatchEditable(oldBatch);
+        // 2. 鏍¢獙鍏宠仈鏁版嵁锛堢敓浜т汉鍛橈級
+        validateRelations(updateReqVO);
+
+        // 3. 鍝佺/浜х嚎鍙樺寲鏃堕噸鏂扮敓鎴愭壒娆″彿锛堟壒娆″彿鍖呭惈浜х嚎缂栫爜 + 鍝佺缂栫爜瑕佺礌锛�
+        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) {
+            MesMdmItemDO item = mdmItemService.validateItemExists(updateReqVO.getItemId());
+            // 鍙樻洿浜х嚎鏃讹紝鐩爣浜х嚎蹇呴』鍚敤锛涙湭鍙樻洿鍒欎粎鏍¢獙瀛樺湪锛堥伩鍏嶅仠鐢ㄤ骇绾跨殑鍘嗗彶鎵规鏃犳硶缂栬緫鍏朵粬瀛楁锛�
+            MesProLineDO line = lineChanged
+                    ? lineService.validateLineExistsAndEnable(updateReqVO.getLineId())
+                    : lineService.validateLineExists(updateReqVO.getLineId());
+            code = generateBatchCode(line.getCode(), item.getCode());
+            updateObj.setLineCode(line.getCode()).setLineName(line.getName());
+        }
+        // 4. 鏇存柊鎵规
+        updateObj.setCode(code);
+        batchMapper.updateById(updateObj);
+
+        // 5. 閲嶅缓鐢熶骇浜哄憳閰嶇疆
+        batchWorkerMapper.deleteByBatchId(updateReqVO.getId());
+        insertBatchWorkers(updateReqVO.getId(), updateReqVO.getWorkers());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteBatch(Long id) {
+        // 1. 鏍¢獙瀛樺湪
+        MesProBatchDO batch = validateBatchExists(id);
+        // 2. 鏍¢獙鐘舵�侊細浠呰崏绋裤�佸凡浣滃簾鍙垹闄�
+        if (!MesProBatchStatusEnum.DRAFT.getStatus().equals(batch.getStatus())
+                && !MesProBatchStatusEnum.CANCELED.getStatus().equals(batch.getStatus())) {
+            throw exception(PRO_BATCH_STATUS_NOT_ALLOW_DELETE);
+        }
+        // 3. 鏍¢獙鏈敓鎴愯鐮併�佹墭鐩樼爜
+        if (bagCodeMapper.selectCountByBatchId(id) > 0 || palletMapper.selectListByBatchId(id).size() > 0) {
+            throw exception(PRO_BATCH_HAS_CODE_NOT_DELETE);
+        }
+        // 4. 鍒犻櫎鎵规涓庝汉鍛橀厤缃�
+        batchMapper.deleteById(id);
+        batchWorkerMapper.deleteByBatchId(id);
+    }
+
+    @Override
+    public void updateBatchStatus(Long id, Integer status) {
+        // 1. 鏍¢獙瀛樺湪
+        MesProBatchDO batch = validateBatchExists(id);
+        // 2. 鏍¢獙鐘舵�佹祦杞悎娉曟��
+        Integer oldStatus = batch.getStatus();
+        boolean valid = false;
+        if (MesProBatchStatusEnum.DRAFT.getStatus().equals(oldStatus)) {
+            valid = MesProBatchStatusEnum.PRODUCING.getStatus().equals(status)
+                    || MesProBatchStatusEnum.CANCELED.getStatus().equals(status);
+        } else if (MesProBatchStatusEnum.PRODUCING.getStatus().equals(oldStatus)) {
+            valid = MesProBatchStatusEnum.FINISHED.getStatus().equals(status)
+                    || MesProBatchStatusEnum.CANCELED.getStatus().equals(status);
+        }
+        if (!valid) {
+            throw exception(PRO_BATCH_STATUS_INVALID);
+        }
+        // 3. 鏇存柊鐘舵��
+        batchMapper.updateById(new MesProBatchDO().setId(id).setStatus(status));
+    }
+
+    @Override
+    public MesProBatchDO getBatch(Long id) {
+        return batchMapper.selectById(id);
+    }
+
+    @Override
+    public MesProBatchDO getBatchByCode(String code) {
+        return batchMapper.selectByCode(code);
+    }
+
+    @Override
+    public MesProBatchDO validateBatchExists(Long id) {
+        MesProBatchDO batch = batchMapper.selectById(id);
+        if (batch == null) {
+            throw exception(PRO_BATCH_NOT_EXISTS);
+        }
+        return batch;
+    }
+
+    @Override
+    public PageResult<MesProBatchDO> getBatchPage(MesProBatchPageReqVO pageReqVO) {
+        return batchMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public List<MesProBatchDO> getBatchList(Collection<Long> ids) {
+        if (CollUtil.isEmpty(ids)) {
+            return List.of();
+        }
+        return batchMapper.selectBatchIds(ids);
+    }
+
+    @Override
+    public List<MesProBatchWorkerDO> getBatchWorkerListByBatchId(Long batchId) {
+        return batchWorkerMapper.selectListByBatchId(batchId);
+    }
+
+    @Override
+    public List<MesProBatchWorkerDO> getBatchWorkerListByBatchIds(Collection<Long> batchIds) {
+        if (CollUtil.isEmpty(batchIds)) {
+            return List.of();
+        }
+        return batchWorkerMapper.selectListByBatchIds(batchIds);
+    }
+
+    // ==================== 绉佹湁鏂规硶 ====================
+
+    /**
+     * 鏍¢獙鍏宠仈鏁版嵁锛堢敓浜т汉鍛橈細璐d换浜� + 鐢熶骇浜哄憳閰嶇疆锛�
+     * <p>
+     * 鍝佺銆佷骇绾跨殑鏍¢獙鍦ㄥ垱寤�/鏇存柊娴佺▼涓唴鑱旀墽琛岋紙闇�鍙栫紪鐮佸弬涓庢壒娆″彿鐢熸垚锛�
+     */
+    private void validateRelations(MesProBatchSaveReqVO reqVO) {
+        Set<Long> userIds = new HashSet<>();
+        userIds.add(reqVO.getOwnerUserId());
+        userIds.addAll(convertList(reqVO.getWorkers(), MesProBatchSaveReqVO.Worker::getUserId));
+        adminUserApi.validateUserList(userIds);
+    }
+
+    /**
+     * 鐢熸垚鎵规鍙�
+     * <p>
+     * 缂栫爜瑙勫垯锛氬浐瀹氬墠缂�(PC) + 鏃ユ湡(yyyyMMdd) + 杈撳叆瀛楃(浜х嚎缂栫爜 + 鍝佺缂栫爜) + 娴佹按鍙�(鎸夋棩寰幆)
+     *
+     * @param lineCode 浜х嚎缂栫爜
+     * @param itemCode 鍝佺锛堢墿鏂欙級缂栫爜
+     * @return 鎵规鍙�
+     */
+    private String generateBatchCode(String lineCode, String itemCode) {
+        String inputChar = StrUtil.emptyToDefault(lineCode, "") + StrUtil.emptyToDefault(itemCode, "");
+        return autoCodeRecordService.generateAutoCode(MesMdAutoCodeRuleCodeEnum.PRO_BATCH_CODE.getCode(), inputChar);
+    }
+
+    /**
+     * 鏍¢獙鎵规鍙紪杈戯紙鑽夌銆佺敓浜т腑锛�
+     */
+    private void validateBatchEditable(MesProBatchDO batch) {
+        if (!MesProBatchStatusEnum.DRAFT.getStatus().equals(batch.getStatus())
+                && !MesProBatchStatusEnum.PRODUCING.getStatus().equals(batch.getStatus())) {
+            throw exception(PRO_BATCH_STATUS_NOT_DRAFT_OR_PRODUCING);
+        }
+    }
+
+    /**
+     * 鎻掑叆鎵规鐢熶骇浜哄憳閰嶇疆
+     */
+    private void insertBatchWorkers(Long batchId, List<MesProBatchSaveReqVO.Worker> workers) {
+        if (CollUtil.isEmpty(workers)) {
+            return;
+        }
+        List<MesProBatchWorkerDO> workerDOs = convertList(workers,
+                worker -> new MesProBatchWorkerDO()
+                        .setBatchId(batchId)
+                        .setUserId(worker.getUserId())
+                        .setWorkerType(worker.getWorkerType())
+                        .setRemark(worker.getRemark()));
+        batchWorkerMapper.insertBatch(workerDOs);
+    }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/line/MesProLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/line/MesProLineService.java
new file mode 100644
index 0000000..76ecf0b
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/line/MesProLineService.java
@@ -0,0 +1,103 @@
+package cn.iocoder.yudao.module.mes.service.pro.line;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.line.vo.MesProLinePageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.line.vo.MesProLineSaveReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.line.MesProLineDO;
+
+import jakarta.validation.Valid;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
+
+/**
+ * MES 浜х嚎缁存姢 Service 鎺ュ彛
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+public interface MesProLineService {
+
+    /**
+     * 鍒涘缓浜х嚎
+     *
+     * @param createReqVO 鍒涘缓淇℃伅
+     * @return 缂栧彿
+     */
+    Long createLine(@Valid MesProLineSaveReqVO createReqVO);
+
+    /**
+     * 鏇存柊浜х嚎
+     *
+     * @param updateReqVO 鏇存柊淇℃伅
+     */
+    void updateLine(@Valid MesProLineSaveReqVO updateReqVO);
+
+    /**
+     * 鍒犻櫎浜х嚎
+     *
+     * @param id 缂栧彿
+     */
+    void deleteLine(Long id);
+
+    /**
+     * 鑾峰緱浜х嚎
+     *
+     * @param id 缂栧彿
+     * @return 浜х嚎
+     */
+    MesProLineDO getLine(Long id);
+
+    /**
+     * 鑾峰緱浜х嚎鍒楄〃
+     *
+     * @param ids 缂栧彿鍒楄〃
+     * @return 浜х嚎鍒楄〃
+     */
+    List<MesProLineDO> getLineList(Collection<Long> ids);
+
+    /**
+     * 鑾峰緱浜х嚎鍒嗛〉
+     *
+     * @param pageReqVO 鍒嗛〉鏌ヨ
+     * @return 浜х嚎鍒嗛〉
+     */
+    PageResult<MesProLineDO> getLinePage(MesProLinePageReqVO pageReqVO);
+
+    /**
+     * 鑾峰緱鎸囧畾鐘舵�佺殑浜х嚎鍒楄〃
+     *
+     * @param status 鐘舵��
+     * @return 浜х嚎鍒楄〃
+     */
+    List<MesProLineDO> getLineListByStatus(Integer status);
+
+    /**
+     * 鏍¢獙浜х嚎瀛樺湪
+     *
+     * @param id 缂栧彿
+     * @return 浜х嚎
+     */
+    MesProLineDO validateLineExists(Long id);
+
+    /**
+     * 鏍¢獙浜х嚎瀛樺湪涓斿惎鐢�
+     *
+     * @param id 缂栧彿
+     * @return 浜х嚎
+     */
+    MesProLineDO validateLineExistsAndEnable(Long id);
+
+    /**
+     * 鑾峰緱浜х嚎 Map
+     *
+     * @param ids 缂栧彿鍒楄〃
+     * @return 浜х嚎 Map
+     */
+    default Map<Long, MesProLineDO> getLineMap(Collection<Long> ids) {
+        return convertMap(getLineList(ids), MesProLineDO::getId);
+    }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/line/MesProLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/line/MesProLineServiceImpl.java
new file mode 100644
index 0000000..33219b6
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/line/MesProLineServiceImpl.java
@@ -0,0 +1,145 @@
+package cn.iocoder.yudao.module.mes.service.pro.line;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjUtil;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+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.line.vo.MesProLinePageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.line.vo.MesProLineSaveReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.line.MesProLineDO;
+import cn.iocoder.yudao.module.mes.dal.mysql.pro.batch.MesProBatchMapper;
+import cn.iocoder.yudao.module.mes.dal.mysql.pro.line.MesProLineMapper;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
+
+/**
+ * MES 浜х嚎缁存姢 Service 瀹炵幇绫�
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Service
+@Validated
+public class MesProLineServiceImpl implements MesProLineService {
+
+    @Resource
+    private MesProLineMapper lineMapper;
+
+    @Resource
+    private MesProBatchMapper batchMapper;
+
+    @Override
+    public Long createLine(MesProLineSaveReqVO createReqVO) {
+        // 1. 鏍¢獙缂栫爜銆佸悕绉板敮涓�
+        validateLineSaveData(createReqVO);
+
+        // 2. 鎻掑叆浜х嚎
+        MesProLineDO line = BeanUtils.toBean(createReqVO, MesProLineDO.class);
+        lineMapper.insert(line);
+        return line.getId();
+    }
+
+    @Override
+    public void updateLine(MesProLineSaveReqVO updateReqVO) {
+        // 1.1 鏍¢獙瀛樺湪
+        validateLineExists(updateReqVO.getId());
+        // 1.2 鏍¢獙缂栫爜銆佸悕绉板敮涓�
+        validateLineSaveData(updateReqVO);
+
+        // 2. 鏇存柊浜х嚎
+        MesProLineDO updateObj = BeanUtils.toBean(updateReqVO, MesProLineDO.class);
+        lineMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteLine(Long id) {
+        // 1.1 鏍¢獙瀛樺湪
+        validateLineExists(id);
+        // 1.2 鏍¢獙鏄惁琚敓浜ф壒娆″紩鐢�
+        if (batchMapper.selectCountByLineId(id) > 0) {
+            throw exception(PRO_LINE_HAS_BATCH_NOT_DELETE);
+        }
+
+        // 2. 鍒犻櫎浜х嚎
+        lineMapper.deleteById(id);
+    }
+
+    @Override
+    public MesProLineDO getLine(Long id) {
+        return lineMapper.selectById(id);
+    }
+
+    @Override
+    public List<MesProLineDO> getLineList(Collection<Long> ids) {
+        if (CollUtil.isEmpty(ids)) {
+            return Collections.emptyList();
+        }
+        return lineMapper.selectByIds(ids);
+    }
+
+    @Override
+    public PageResult<MesProLineDO> getLinePage(MesProLinePageReqVO pageReqVO) {
+        return lineMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public List<MesProLineDO> getLineListByStatus(Integer status) {
+        return lineMapper.selectListByStatus(status);
+    }
+
+    @Override
+    public MesProLineDO validateLineExists(Long id) {
+        MesProLineDO line = lineMapper.selectById(id);
+        if (line == null) {
+            throw exception(PRO_LINE_NOT_EXISTS);
+        }
+        return line;
+    }
+
+    @Override
+    public MesProLineDO validateLineExistsAndEnable(Long id) {
+        MesProLineDO line = validateLineExists(id);
+        if (ObjUtil.notEqual(CommonStatusEnum.ENABLE.getStatus(), line.getStatus())) {
+            throw exception(PRO_LINE_IS_DISABLE);
+        }
+        return line;
+    }
+
+    // ==================== 绉佹湁鏂规硶 ====================
+
+    private void validateLineCodeUnique(Long id, String code) {
+        MesProLineDO line = lineMapper.selectByCode(code);
+        if (line == null) {
+            return;
+        }
+        if (id == null || !line.getId().equals(id)) {
+            throw exception(PRO_LINE_CODE_DUPLICATE);
+        }
+    }
+
+    private void validateLineNameUnique(Long id, String name) {
+        MesProLineDO line = lineMapper.selectByName(name);
+        if (line == null) {
+            return;
+        }
+        if (id == null || !line.getId().equals(id)) {
+            throw exception(PRO_LINE_NAME_DUPLICATE);
+        }
+    }
+
+    private void validateLineSaveData(MesProLineSaveReqVO saveReqVO) {
+        // 1. 鏍¢獙缂栫爜鍞竴
+        validateLineCodeUnique(saveReqVO.getId(), saveReqVO.getCode());
+        // 2. 鏍¢獙鍚嶇О鍞竴
+        validateLineNameUnique(saveReqVO.getId(), saveReqVO.getName());
+    }
+
+}
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
new file mode 100644
index 0000000..4f104c9
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/pallet/MesProPalletService.java
@@ -0,0 +1,81 @@
+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.MesProPalletBatchCreateReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletPageReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.pallet.MesProPalletDO;
+import jakarta.validation.Valid;
+
+import java.util.List;
+
+/**
+ * MES 鎵樼洏鐮� Service 鎺ュ彛
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+public interface MesProPalletService {
+
+    /**
+     * 鎵归噺鐢熸垚鎵樼洏鐮侊紙鐮佸�� = 鎵规鍙�-P+鎵樼洏搴忓彿锛夛紝骞跺洖鍐欐壒娆℃墭鐩樻暟閲�
+     *
+     * @param createReqVO 鐢熸垚淇℃伅
+     * @return 鐢熸垚鐨勬墭鐩樼爜缂栧彿鍒楄〃
+     */
+    List<Long> batchCreatePallet(@Valid MesProPalletBatchCreateReqVO createReqVO);
+
+    /**
+     * 鍒犻櫎鎵樼洏鐮侊紙鏈粦瀹氳鐮佹墠鍏佽鍒犻櫎锛�
+     *
+     * @param id 缂栧彿
+     */
+    void deletePallet(Long id);
+
+    /**
+     * 鑾峰緱鎵樼洏鐮�
+     *
+     * @param id 缂栧彿
+     * @return 鎵樼洏鐮�
+     */
+    MesProPalletDO getPallet(Long id);
+
+    /**
+     * 鏍¢獙鎵樼洏鐮佸瓨鍦�
+     *
+     * @param id 缂栧彿
+     * @return 鎵樼洏鐮�
+     */
+    MesProPalletDO validatePalletExists(Long id);
+
+    /**
+     * 鏍规嵁鎵樼洏鐮侊紙浜岀淮鐮佸唴瀹癸級鏌ヨ鎵樼洏鐮侊紝鐢ㄤ簬鎵爜杩芥函
+     *
+     * @param code 鎵樼洏鐮�
+     * @return 鎵樼洏鐮侊紝涓嶅瓨鍦ㄨ繑鍥� null
+     */
+    MesProPalletDO getPalletByCode(String code);
+
+    /**
+     * 鑾峰緱鎵樼洏鐮佸垎椤�
+     *
+     * @param pageReqVO 鍒嗛〉鏌ヨ
+     * @return 鎵樼洏鐮佸垎椤�
+     */
+    PageResult<MesProPalletDO> getPalletPage(MesProPalletPageReqVO pageReqVO);
+
+    /**
+     * 鑾峰緱鎵规鐨勬墭鐩樼爜鍒楄〃
+     *
+     * @param batchId 鎵规缂栧彿
+     * @return 鎵樼洏鐮佸垪琛�
+     */
+    List<MesProPalletDO> getPalletListByBatchId(Long batchId);
+
+    /**
+     * 鏇存柊鎵樼洏宸茬粦瀹氳鐮佹暟閲�
+     *
+     * @param palletId 鎵樼洏缂栧彿
+     * @param bagCount 宸茬粦瀹氳鐮佹暟閲�
+     */
+    void updatePalletBagCount(Long palletId, Integer bagCount);
+
+}
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
new file mode 100644
index 0000000..1ba2901
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/pallet/MesProPalletServiceImpl.java
@@ -0,0 +1,137 @@
+package cn.iocoder.yudao.module.mes.service.pro.pallet;
+
+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.MesProPalletBatchCreateReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletPageReqVO;
+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.enums.pro.MesProBatchStatusEnum;
+import cn.iocoder.yudao.module.mes.enums.pro.MesProPalletStatusEnum;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
+
+/**
+ * MES 鎵樼洏鐮� Service 瀹炵幇绫�
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Service
+@Validated
+@Slf4j
+public class MesProPalletServiceImpl implements MesProPalletService {
+
+    @Resource
+    private MesProPalletMapper palletMapper;
+    @Resource
+    private MesProBagCodeMapper bagCodeMapper;
+    @Resource
+    private MesProBatchMapper batchMapper;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public List<Long> batchCreatePallet(MesProPalletBatchCreateReqVO createReqVO) {
+        // 1. 鏍¢獙鎵规瀛樺湪涓斿浜庣敓浜т腑鐘舵��
+        MesProBatchDO batch = batchMapper.selectById(createReqVO.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 (createReqVO.getCount() == null || createReqVO.getCount() <= 0) {
+            throw exception(PRO_PALLET_GENERATE_COUNT_INVALID);
+        }
+
+        // 2. 璁$畻璧峰搴忓彿锛堝寘鍚凡閫昏緫鍒犻櫎璁板綍锛屼繚璇佸簭鍙蜂笉鍥為��銆佺爜鍊煎敮涓�锛�
+        int startNo = palletMapper.selectMaxPalletNo(batch.getId()) + 1;
+
+        // 3. 鎵归噺鐢熸垚鎵樼洏鐮侊細鎵规鍙� + -P + 2 浣嶆墭鐩樺簭鍙�
+        List<MesProPalletDO> pallets = new ArrayList<>(createReqVO.getCount());
+        for (int i = 0; i < createReqVO.getCount(); i++) {
+            int palletNo = startNo + i;
+            pallets.add(new MesProPalletDO()
+                    .setCode(batch.getCode() + "-P" + StrUtil.padPre(String.valueOf(palletNo), 2, '0'))
+                    .setBatchId(batch.getId())
+                    .setBatchCode(batch.getCode())
+                    .setPalletNo(palletNo)
+                    .setCapacity(createReqVO.getCapacity())
+                    .setBagCount(0)
+                    .setStatus(MesProPalletStatusEnum.IN_USE.getStatus())
+                    .setRemark(createReqVO.getRemark()));
+        }
+        palletMapper.insertBatch(pallets);
+
+        // 4. 鍥炲啓鎵规鎵樼洏鐮佹暟閲�
+        batchMapper.updateById(new MesProBatchDO().setId(batch.getId())
+                .setPalletQuantity((batch.getPalletQuantity() == null ? 0 : batch.getPalletQuantity())
+                        + createReqVO.getCount()));
+        return pallets.stream().map(MesProPalletDO::getId).toList();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deletePallet(Long id) {
+        // 1. 鏍¢獙瀛樺湪
+        MesProPalletDO pallet = validatePalletExists(id);
+        // 2. 鏍¢獙鏈粦瀹氳鐮�
+        if (bagCodeMapper.selectCountByPalletId(id) > 0) {
+            throw exception(PRO_PALLET_HAS_BAG_NOT_DELETE);
+        }
+        // 3. 鍒犻櫎鎵樼洏鐮�
+        palletMapper.deleteById(id);
+        // 4. 鍥炲噺鎵规鎵樼洏鐮佹暟閲�
+        MesProBatchDO batch = batchMapper.selectById(pallet.getBatchId());
+        if (batch != null && batch.getPalletQuantity() != null && batch.getPalletQuantity() > 0) {
+            batchMapper.updateById(new MesProBatchDO().setId(batch.getId())
+                    .setPalletQuantity(batch.getPalletQuantity() - 1));
+        }
+    }
+
+    @Override
+    public MesProPalletDO getPallet(Long id) {
+        return palletMapper.selectById(id);
+    }
+
+    @Override
+    public MesProPalletDO getPalletByCode(String code) {
+        return palletMapper.selectByCode(code);
+    }
+
+    @Override
+    public MesProPalletDO validatePalletExists(Long id) {
+        MesProPalletDO pallet = palletMapper.selectById(id);
+        if (pallet == null) {
+            throw exception(PRO_PALLET_NOT_EXISTS);
+        }
+        return pallet;
+    }
+
+    @Override
+    public PageResult<MesProPalletDO> getPalletPage(MesProPalletPageReqVO pageReqVO) {
+        return palletMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public List<MesProPalletDO> getPalletListByBatchId(Long batchId) {
+        return palletMapper.selectListByBatchId(batchId);
+    }
+
+    @Override
+    public void updatePalletBagCount(Long palletId, Integer bagCount) {
+        palletMapper.updateById(new MesProPalletDO().setId(palletId).setBagCount(bagCount));
+    }
+
+}
diff --git a/yudao-module-mes/src/main/resources/mapper/home/MesBagCodeHomeStatisticsMapper.xml b/yudao-module-mes/src/main/resources/mapper/home/MesBagCodeHomeStatisticsMapper.xml
new file mode 100644
index 0000000..8e19a64
--- /dev/null
+++ b/yudao-module-mes/src/main/resources/mapper/home/MesBagCodeHomeStatisticsMapper.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.iocoder.yudao.module.mes.dal.mysql.home.MesBagCodeHomeStatisticsMapper">
+
+    <!-- ========== 鍩虹鏁版嵁 ========== -->
+
+    <!-- 缁熻鍝佺鎬绘暟锛坢dm_item锛� -->
+    <select id="selectMdmItemCount" resultType="java.lang.Long">
+        SELECT COUNT(*)
+        FROM mdm_item
+        WHERE deleted = 0
+    </select>
+
+    <!-- 缁熻 MES 鍝佺鏁帮紙mes_md_item锛� -->
+    <select id="selectMesItemCount" resultType="java.lang.Long">
+        SELECT COUNT(*)
+        FROM mes_md_item
+        WHERE deleted = 0
+    </select>
+
+    <!-- 缁熻鍝佺鍒嗙被鏁帮紙mes_md_item_type锛� -->
+    <select id="selectItemTypeCount" resultType="java.lang.Long">
+        SELECT COUNT(*)
+        FROM mes_md_item_type
+        WHERE deleted = 0
+    </select>
+
+    <!-- 缁熻璁¢噺鍗曚綅鏁帮紙mdm_unit_measure锛� -->
+    <select id="selectUnitMeasureCount" resultType="java.lang.Long">
+        SELECT COUNT(*)
+        FROM mdm_unit_measure
+        WHERE deleted = 0
+    </select>
+
+    <!-- ========== 涓�琚嬩竴鐮� ========== -->
+
+    <!-- 缁熻浜х嚎鏁帮紙mes_pro_line锛� -->
+    <select id="selectLineCount" resultType="java.lang.Long">
+        SELECT COUNT(*)
+        FROM mes_pro_line
+        WHERE deleted = 0
+    </select>
+
+    <!-- 缁熻鎵规鎬绘暟锛坢es_pro_batch锛� -->
+    <select id="selectBatchCount" resultType="java.lang.Long">
+        SELECT COUNT(*)
+        FROM mes_pro_batch
+        WHERE deleted = 0
+    </select>
+
+    <!-- 缁熻琚嬬爜鎬绘暟锛坢es_pro_bag_code锛� -->
+    <select id="selectBagCodeCount" resultType="java.lang.Long">
+        SELECT COUNT(*)
+        FROM mes_pro_bag_code
+        WHERE deleted = 0
+    </select>
+
+    <!-- 缁熻鎵樼洏鐮佹�绘暟锛坢es_pro_pallet锛� -->
+    <select id="selectPalletCount" resultType="java.lang.Long">
+        SELECT COUNT(*)
+        FROM mes_pro_pallet
+        WHERE deleted = 0
+    </select>
+
+    <!-- ========== 鐘舵�佸垎甯� ========== -->
+
+    <!-- 鎸夌姸鎬佺粺璁℃壒娆℃暟閲� -->
+    <select id="selectBatchCountGroupByStatus" resultType="java.util.Map">
+        SELECT status, COUNT(*) AS count
+        FROM mes_pro_batch
+        WHERE deleted = 0
+        GROUP BY status
+    </select>
+
+    <!-- 鎸夌姸鎬佺粺璁¤鐮佹暟閲� -->
+    <select id="selectBagCodeCountGroupByStatus" resultType="java.util.Map">
+        SELECT status, COUNT(*) AS count
+        FROM mes_pro_bag_code
+        WHERE deleted = 0
+        GROUP BY status
+    </select>
+
+    <!-- 鎸夊ぉ鑱氬悎琚嬬爜鐢熸垚閲� -->
+    <select id="selectDailyBagCodeTrend" resultType="java.util.Map">
+        SELECT DATE_FORMAT(create_time, '%Y-%m-%d') AS date,
+               COUNT(*)                              AS count
+        FROM mes_pro_bag_code
+        WHERE deleted = 0
+          AND create_time >= #{beginTime}
+          <if test="endTime != null">
+              AND create_time &lt; #{endTime}
+          </if>
+        GROUP BY DATE_FORMAT(create_time, '%Y-%m-%d')
+        ORDER BY date
+    </select>
+
+</mapper>
diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml
index eaf06ab..0c3d99a 100644
--- a/yudao-server/src/main/resources/application-local.yaml
+++ b/yudao-server/src/main/resources/application-local.yaml
@@ -65,7 +65,7 @@
       primary: master
       datasource:
         master:
-          url: jdbc:mysql://localhost:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 杩炴帴鐨勭ず渚�
+          url: jdbc:mysql://localhost:3306/mom-thzy?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 杩炴帴鐨勭ず渚�
           username: root
           password: 123456
 
diff --git a/yudao-server/src/main/resources/application-thzy.yaml b/yudao-server/src/main/resources/application-thzy.yaml
new file mode 100644
index 0000000..778d435
--- /dev/null
+++ b/yudao-server/src/main/resources/application-thzy.yaml
@@ -0,0 +1,198 @@
+server:
+  port: 48080
+
+--- #################### 鏁版嵁搴撶浉鍏抽厤缃� ####################
+spring:
+  autoconfigure:
+    # noinspection SpringBootApplicationYaml
+    exclude:
+      - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 榛樿 local 鐜锛屼笉寮�鍚� Quartz 鐨勮嚜鍔ㄩ厤缃�
+      - org.springframework.ai.vectorstore.qdrant.autoconfigure.QdrantVectorStoreAutoConfiguration # 绂佺敤 AI 妯″潡鐨� Qdrant锛屾墜鍔ㄥ垱寤�
+      - org.springframework.ai.vectorstore.redis.autoconfigure.RedisVectorStoreAutoConfiguration # 绂佺敤 AI 妯″潡鐨� Redis锛屾墜鍔ㄥ垱寤�
+      - org.springframework.ai.vectorstore.milvus.autoconfigure.MilvusVectorStoreAutoConfiguration # 绂佺敤 AI 妯″潡鐨� Milvus锛屾墜鍔ㄥ垱寤�
+      - org.dromara.trans.config.TransServiceConfig # TODO 鑺嬭壙锛歟asy-trans 鍏煎 Spring Boot 4 鍚庣Щ闄わ紙TransServiceConfig 寮曠敤浜嗗凡绉婚櫎鐨� RestTemplateBuilder锛�
+      # 绂佺敤鏈厤缃� API Key 鐨勬ā鍨嬭嚜鍔ㄩ厤缃紙鍙繚鐣欓�氫箟鍗冮棶 Embedding 鐨勬墜鍔ㄩ厤缃級
+      - org.springframework.ai.model.openai.autoconfigure.OpenAiChatAutoConfiguration
+      - org.springframework.ai.model.openai.autoconfigure.OpenAiEmbeddingAutoConfiguration
+      - org.springframework.ai.model.openai.autoconfigure.OpenAiImageAutoConfiguration
+      - org.springframework.ai.model.openai.autoconfigure.OpenAiAudioSpeechAutoConfiguration
+      - org.springframework.ai.model.openai.autoconfigure.OpenAiAudioTranscriptionAutoConfiguration
+      - org.springframework.ai.model.openai.autoconfigure.OpenAiModerationAutoConfiguration
+      - org.springframework.ai.model.deepseek.autoconfigure.DeepSeekChatAutoConfiguration
+      - org.springframework.ai.model.anthropic.autoconfigure.AnthropicChatAutoConfiguration
+      - org.springframework.ai.model.google.genai.autoconfigure.chat.GoogleGenAiChatAutoConfiguration
+      - org.springframework.ai.model.google.genai.autoconfigure.embedding.GoogleGenAiEmbeddingConnectionAutoConfiguration
+      - org.springframework.ai.model.google.genai.autoconfigure.embedding.GoogleGenAiTextEmbeddingAutoConfiguration
+      - org.springframework.ai.model.ollama.autoconfigure.OllamaApiAutoConfiguration
+      - org.springframework.ai.model.ollama.autoconfigure.OllamaChatAutoConfiguration
+      - org.springframework.ai.model.ollama.autoconfigure.OllamaEmbeddingAutoConfiguration
+      - org.springframework.ai.model.stabilityai.autoconfigure.StabilityAiImageAutoConfiguration
+  # 鏁版嵁婧愰厤缃」
+  datasource:
+    druid: # Druid 銆愮洃鎺с�戠浉鍏崇殑鍏ㄥ眬閰嶇疆
+      web-stat-filter:
+        enabled: true
+      stat-view-servlet:
+        enabled: true
+        allow: # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        url-pattern: /druid/*
+        login-username: # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-password:
+      filter:
+        stat:
+          enabled: true
+          log-slow-sql: true # 鎱� SQL 璁板綍
+          slow-sql-millis: 100
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+    dynamic: # 澶氭暟鎹簮閰嶇疆
+      druid: # Druid 銆愯繛鎺ユ睜銆戠浉鍏崇殑鍏ㄥ眬閰嶇疆
+        initial-size: 1 # 鍒濆杩炴帴鏁�
+        min-idle: 1 # 鏈�灏忚繛鎺ユ睜鏁伴噺
+        max-active: 20 # 鏈�澶ц繛鎺ユ睜鏁伴噺
+        max-wait: 60000 # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂达紝鍗曚綅锛氭绉掞紙1 鍒嗛挓锛�
+        time-between-eviction-runs-millis: 60000 # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶏細姣锛�1 鍒嗛挓锛�
+        min-evictable-idle-time-millis: 600000 # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶏細姣锛�10 鍒嗛挓锛�
+        max-evictable-idle-time-millis: 1800000 # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶏細姣锛�30 鍒嗛挓锛�
+        validation-query: SELECT 1 FROM DUAL # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+        test-while-idle: true
+        test-on-borrow: false
+        test-on-return: false
+        pool-prepared-statements: true # 鏄惁寮�鍚� PreparedStatement 缂撳瓨
+        max-pool-prepared-statement-per-connection-size: 20 # 姣忎釜杩炴帴缂撳瓨鐨� PreparedStatement 鏁伴噺
+      primary: master
+      datasource:
+        master:
+          url: jdbc:mysql://172.17.0.1:9000/mom-thzy?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 杩炴帴鐨勭ず渚�
+          username: root
+          password: thzy@123456..
+
+  # Redis 閰嶇疆銆俁edisson 榛樿鐨勯厤缃冻澶熶娇鐢紝涓�鑸笉闇�瑕佽繘琛岃皟浼�
+  data:
+    redis:
+      host: 172.17.0.1 # 鍦板潃
+      port: 6379 # 绔彛
+      database: 1 # 鏁版嵁搴撶储寮�
+#      password: dev # 瀵嗙爜锛屽缓璁敓浜х幆澧冨紑鍚�
+
+--- #################### 瀹氭椂浠诲姟鐩稿叧閰嶇疆 ####################
+
+# Quartz 閰嶇疆椤癸紝瀵瑰簲 QuartzProperties 閰嶇疆绫�
+spring:
+  quartz:
+    auto-startup: true # 鏈湴寮�鍙戠幆澧冿紝灏介噺涓嶈寮�鍚� Job
+    scheduler-name: schedulerName # Scheduler 鍚嶅瓧銆傞粯璁や负 schedulerName
+    job-store-type: jdbc # Job 瀛樺偍鍣ㄧ被鍨嬨�傞粯璁や负 memory 琛ㄧず鍐呭瓨锛屽彲閫� jdbc 浣跨敤鏁版嵁搴撱��
+    wait-for-jobs-to-complete-on-shutdown: true # 搴旂敤鍏抽棴鏃讹紝鏄惁绛夊緟瀹氭椂浠诲姟鎵ц瀹屾垚銆傞粯璁や负 false 锛屽缓璁缃负 true
+    properties: # 娣诲姞 Quartz Scheduler 闄勫姞灞炴�э紝鏇村鍙互鐪� http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 鏂囨。
+      org:
+        quartz:
+          # Scheduler 鐩稿叧閰嶇疆
+          scheduler:
+            instanceName: schedulerName
+            instanceId: AUTO # 鑷姩鐢熸垚 instance ID
+          # JobStore 鐩稿叧閰嶇疆
+          jobStore:
+            # JobStore 瀹炵幇绫汇�傚彲瑙佸崥瀹細https://blog.csdn.net/weixin_42458219/article/details/122247162
+            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
+            isClustered: true # 鏄泦缇ゆā寮�
+            clusterCheckinInterval: 15000 # 闆嗙兢妫�鏌ラ鐜囷紝鍗曚綅锛氭绉掋�傞粯璁や负 15000锛屽嵆 15 绉�
+            misfireThreshold: 60000 # misfire 闃�鍊硷紝鍗曚綅锛氭绉掋��
+          # 绾跨▼姹犵浉鍏抽厤缃�
+          threadPool:
+            threadCount: 25 # 绾跨▼姹犲ぇ灏忋�傞粯璁や负 10 銆�
+            threadPriority: 5 # 绾跨▼浼樺厛绾�
+            class: org.quartz.simpl.SimpleThreadPool # 绾跨▼姹犵被鍨�
+    jdbc: # 浣跨敤 JDBC 鐨� JobStore 鐨勬椂鍊欙紝JDBC 鐨勯厤缃�
+      initialize-schema: NEVER # 鏄惁鑷姩浣跨敤 SQL 鍒濆鍖� Quartz 琛ㄧ粨鏋勩�傝繖閲岃缃垚 never 锛屾垜浠墜鍔ㄥ垱寤鸿〃缁撴瀯銆�
+
+--- #################### 鏈嶅姟淇濋殰鐩稿叧閰嶇疆 ####################
+
+# Lock4j 閰嶇疆椤�
+lock4j:
+  acquire-timeout: 3000 # 鑾峰彇鍒嗗竷寮忛攣瓒呮椂鏃堕棿锛岄粯璁や负 3000 姣
+  expire: 30000 # 鍒嗗竷寮忛攣鐨勮秴鏃舵椂闂达紝榛樿涓� 30000 姣
+
+--- #################### 鐩戞帶鐩稿叧閰嶇疆 ####################
+
+# Actuator 鐩戞帶绔偣鐨勯厤缃」
+management:
+  endpoints:
+    web:
+      base-path: /actuator # Actuator 鎻愪緵鐨� API 鎺ュ彛鐨勬牴鐩綍銆傞粯璁や负 /actuator
+      exposure:
+        include: '*' # 闇�瑕佸紑鏀剧殑绔偣銆傞粯璁ゅ�煎彧鎵撳紑 health 鍜� info 涓や釜绔偣銆傞�氳繃璁剧疆 * 锛屽彲浠ュ紑鏀炬墍鏈夌鐐广��
+
+# Spring Boot Admin 閰嶇疆椤�
+spring:
+  boot:
+    admin:
+      # Spring Boot Admin Client 瀹㈡埛绔殑鐩稿叧閰嶇疆
+      client:
+        url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path} # 璁剧疆 Spring Boot Admin Server 鍦板潃
+        instance:
+          service-host-type: IP # 娉ㄥ唽瀹炰緥鏃讹紝浼樺厛浣跨敤 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
+        username: admin
+        password: admin
+      # Spring Boot Admin Server 鏈嶅姟绔殑鐩稿叧閰嶇疆
+      context-path: /admin # 閰嶇疆 Spring
+      # 鍏佽宓屽叆 iframe 鐨勫煙鍚嶏紙鏀寔閫氶厤绗︼級锛屽疄闄呴儴缃叉椂锛屽彲浠ユ敼涓� "'self' [浣犵殑鍏綉鍩熷悕]"
+      frame-ancestors: "'self' localhost localhost:48080 127.0.0.1 127.0.0.1:48080"
+
+# 鏃ュ織鏂囦欢閰嶇疆
+logging:
+  file:
+    name: logs/${spring.application.name}.log # 鏃ュ織鏂囦欢鍚嶏紝鐩稿浜庨」鐩牴鐩綍
+  level:
+    # 閰嶇疆鑷繁鍐欑殑 MyBatis Mapper 鎵撳嵃鏃ュ織
+    cn.iocoder.yudao.module.bpm.dal.mysql: debug
+    cn.iocoder.yudao.module.infra.dal.mysql: debug
+    cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiErrorLogMapper: INFO # 閰嶇疆 ApiErrorLogMapper 鐨勬棩蹇楃骇鍒负 info锛岄伩鍏嶅拰 GlobalExceptionHandler 閲嶅鎵撳嵃
+    cn.iocoder.yudao.module.infra.dal.mysql.job.JobLogMapper: INFO # 閰嶇疆 JobLogMapper 鐨勬棩蹇楃骇鍒负 info
+    cn.iocoder.yudao.module.infra.dal.mysql.file.FileConfigMapper: INFO # 閰嶇疆 FileConfigMapper 鐨勬棩蹇楃骇鍒负 info
+    cn.iocoder.yudao.module.system.dal.mysql: debug
+    cn.iocoder.yudao.module.system.dal.mysql.sms.SmsChannelMapper: INFO # 閰嶇疆 SmsChannelMapper 鐨勬棩蹇楃骇鍒负 info
+    cn.iocoder.yudao.module.member.dal.mysql: debug
+    cn.iocoder.yudao.module.crm.dal.mysql: debug
+    cn.iocoder.yudao.module.erp.dal.mysql: debug
+    cn.iocoder.yudao.module.mes.dal.mysql: debug
+    cn.iocoder.yudao.module.ai.dal.mysql: debug
+    cn.iocoder.yudao.module.im.dal.mysql: debug
+    org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO 鑺嬭壙锛氬厛绂佺敤锛孲pring Boot 3.X 瀛樺湪閮ㄥ垎閿欒鐨� WARN 鎻愮ず
+
+debug: false
+
+yudao:
+  ai:
+    vector-store:
+      type: milvus # 鍚戦噺搴撶被鍨嬶細milvus
+      milvus:
+        initialize-schema: true
+        database-name: test
+        collection-name: knowledge_segment_thzy
+        host: 36.213.180.217
+        port: 19530
+
+--- #################### 瓒呯骇绠$悊鍛樼浉鍏抽厤缃� ####################
+
+# 瓒呯骇绠$悊鍛橀厤缃」锛岃缃綋鍓嶉」鐩墍鏈夎嚜瀹氫箟鐨勯厤缃�
+yudao:
+  captcha:
+    enable: false # 鏈湴鐜锛屾殏鏃跺叧闂浘鐗囬獙璇佺爜锛屾柟渚跨櫥褰曠瓑鎺ュ彛鐨勬祴璇曪紱
+  security:
+    mock-enable: true
+  access-log: # 璁块棶鏃ュ織鐨勯厤缃」
+    enable: false
+  demo: false # 鍏抽棴婕旂ず妯″紡
+  storage: # 鏂囦欢涓婁紶閰嶇疆
+    path: /home/mom/javaWork/file # 鏂囦欢瀛樺偍鏍圭洰褰�
+    url-prefix: /admin-api/system/storage-blob # URL璺緞鍓嶇紑
+    domain: http://47.97.181.254:9002 # 鍩熷悕鍓嶇紑锛堟寜瀹為檯鍩熷悕閰嶇疆锛夛紝鍓嶇閰嶇疆濂藉儚涓嶅お瀵圭幇鍦ㄦ槸鐩磋繛鍚庣锛屾墍鏈夎鍚庣绔彛
+    expired: 120 # token杩囨湡鏃堕棿锛堝垎閽燂級
+    use-limit: 10 # token浣跨敤娆℃暟涓婇檺
+    jwt-secret: abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG # JWT瀵嗛挜
+    compress: true # 鏄惁鍘嬬缉鍥剧墖
+    need-compress-size: 10MB # 瑙﹀彂鍘嬬缉鐨勬枃浠跺ぇ灏忛槇鍊�
+    compress-quality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)

--
Gitblit v1.9.3