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 < #{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