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