9 小时以前 8655501ffb8dbdaf2508e575933063e6731be714
refactor(mes): 重构MES生产批次和袋码管理功能

- 移除包装袋型相关常量定义和枚举类
- 调整错误码常量,替换袋型相关错误为批次补录错误
- 修改数据库表结构,增加临时批次码和托盘码字段,调整批次号生成逻辑
- 删除前端联调文档和自动托盘生成脚本
- 优化袋码生成接口,支持先生成临时码后绑定批次
- 新增批次预生成和补录信息功能接口
- 重构袋码绑定托盘逻辑,支持独立批次绑定操作
已删除4个文件
已添加31个文件
已修改28个文件
4906 ■■■■■ 文件已修改
.playwright-mcp/page-2026-08-28T07-29-23-803Z.yml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T07-29-42-173Z.yml 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T07-30-00-661Z.yml 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T07-30-23-438Z.yml 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T07-33-08-854Z.yml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T07-33-35-681Z.yml 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T07-41-21-761Z.yml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T07-41-44-827Z.yml 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T07-42-08-037Z.yml 285 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T07-48-07-459Z.yml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T07-48-24-872Z.yml 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T07-48-51-155Z.yml 239 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T07-49-26-431Z.yml 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T08-59-32-379Z.yml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T08-59-49-723Z.yml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T09-00-00-757Z.yml 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T09-00-15-736Z.yml 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T09-02-56-093Z.yml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T09-03-07-573Z.yml 336 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T09-03-14-535Z.yml 351 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T09-04-30-577Z.yml 354 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T09-04-44-764Z.yml 353 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T09-04-52-568Z.yml 337 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/mes_bag_code_integration.md 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/mes_pro_pallet_auto_generation_integration.md 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/mysql/mes_pro_batch_bag_code_init.sql 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/mysql/mes_pro_pallet_auto_threshold.sql 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/MesProBagCodeController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeBindBatchReqVO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeGenerateReqVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/bagcode/vo/MesProBagCodeGenerateRespVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/MesProBatchController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchPageReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchPreGenerateReqVO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchPreGenerateRespVO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchRespVO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchSaveReqVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/batch/vo/MesProBatchTraceRespVO.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/MesProPalletController.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletAutoPrintRespVO.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletBindBatchReqVO.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletExportQrReqVO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletPageReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletPreGenerateReqVO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletPreGenerateRespVO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletRespVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletTraceRespVO.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/batch/MesProBatchDO.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/pallet/MesProPalletDO.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/bagcode/MesProBagCodeMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/batch/MesProBatchMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/pallet/MesProPalletMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProBagTypeEnum.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/MesProQrLabelBuilder.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeServiceImpl.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchServiceImpl.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/pallet/MesProPalletService.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/pallet/MesProPalletServiceImpl.java 141 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/page-2026-08-28T07-29-23-803Z.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
- generic [active]: å·¥ä¸šAI智造平台
.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]: èµ‹ç ç®¡ç†
.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]: èµ‹ç ç®¡ç†
.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]: è´£ä»»äºº
            - textbox "请选择责任人" [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 "责任人" [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]
.playwright-mcp/page-2026-08-28T07-33-08-854Z.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
- generic [active]: å·¥ä¸šAI智造平台
.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]: è´£ä»»äºº
            - textbox "请选择责任人" [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 "责任人" [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]
.playwright-mcp/page-2026-08-28T07-41-21-761Z.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
- generic [active]: å·¥ä¸šAI智造平台
.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]: è´£ä»»äºº
            - textbox "请选择责任人" [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 "责任人" [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]
.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]: è´£ä»»äºº
              - textbox "请选择责任人" [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 "责任人" [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: è´£ä»»äºº
          - textbox "请选择责任人" [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]
.playwright-mcp/page-2026-08-28T07-48-07-459Z.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
- generic [active]: å·¥ä¸šAI智造平台
.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]: è´£ä»»äºº
              - textbox "请选择责任人" [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 "责任人" [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]
.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]: è´£ä»»äºº
              - textbox "请选择责任人" [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 "责任人" [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]
.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]: è´£ä»»äºº
              - textbox "请选择责任人" [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 "责任人" [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]
.playwright-mcp/page-2026-08-28T08-59-32-379Z.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
- generic [active]: å·¥ä¸šAI智造平台
.playwright-mcp/page-2026-08-28T08-59-49-723Z.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
- generic [active] [ref=f7e1]: å·¥ä¸šAI智造平台
.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]: èµ‹ç ç®¡ç†
.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]: èµ‹ç ç®¡ç†
.playwright-mcp/page-2026-08-28T09-02-56-093Z.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
- generic [active]: å·¥ä¸šAI智造平台
.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]
.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]
.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]
.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]
.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: æ“ä½œæˆåŠŸ
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`)→ è¡¥å½•品种、袋型、产线、日期、责任人、生产人员(生成正式批次号 `PC...`)。
2. æ‰˜ç›˜ï¼šé¢„生成临时托盘码(`PL-YYYYYYYY`,不绑定批次)→ ç»‘定已正式补录且生产中的生产批次(生成正式托盘码 `批次号-PXX`)。
3. è¢‹ç ï¼šå…ˆç”Ÿæˆå”¯ä¸€è¢‹ç ï¼ˆ`BAG-YYYYYYYY`,不绑定批次)→ å½•入已正式补录且生产中的生产批次 â†’ ç»‘定同批次托盘。
二维码一经打印不会因“转正式”而失效:扫码追溯同时兼容正式码与临时码,临时码扫码回持久保留并映射到原记录。
## API
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|---|---|---|
| POST | `/mes/pro/batch/pre-generate` | é¢„生成批次临时二维码(不录入业务信息) |
| PUT | `/mes/pro/batch/fill-info` | æ‰¹æ¬¡è¡¥å½•正式信息(生成正式批次号) |
| 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 | æ˜¯ | è´£ä»»äºº |
| `workers` | List | æ˜¯ | ç”Ÿäº§äººå‘˜é…ç½®ï¼ˆuser_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 | æ˜¯ | ç”Ÿäº§æ‰¹æ¬¡ç¼–号 |
仅允许未绑定批次的临时托盘绑定;目标批次必须已完成正式信息补录且处于生产中。绑定后按批次内序号生成正式托盘码。
**按编号导出二维码(`/mes/pro/pallet/export-qr-by-ids`):** è¯·æ±‚ `{ ids: Long[] }`,返回 ZIP;未绑定批次的临时托盘会显示“未绑定批次”状态而非虚构批次信息。
### è¢‹ç å½•入批次请求(`/mes/pro/bag-code/bind-batch`)
| å‚æ•° | ç±»åž‹ | å¿…å¡« | è¯´æ˜Ž |
|---|---|---|---|
| `ids` | Long[] | æ˜¯ | å¾…录入的袋码 ID åˆ—表 |
| `batchId` | Long | æ˜¯ | ç”Ÿäº§æ‰¹æ¬¡ ID |
目标批次必须已完成正式信息补录(`code` éžç©ºï¼‰ä¸”处于生产中;录入后批次的袋码数量同步重算。托盘一律通过手工“预生成 â†’ ç»‘定批次 â†’ ç»‘定袋码”流程维护。
## å­—段展示规则
| å­—段 | å±•示位置 | è¯´æ˜Ž |
|---|---|---|
| `code` | åˆ—表、详情、二维码 | æ­£å¼æ‰¹æ¬¡å· / æ­£å¼æ‰˜ç›˜ç  |
| `tempCode` | åˆ—表、详情、扫码追溯(新增) | ä¸´æ—¶æ‰¹æ¬¡ç ï¼ˆ`PB-`)/ ä¸´æ—¶æ‰˜ç›˜ç ï¼ˆ`PL-`);未补录/未绑定时作为二维码展示值 |
| `status`(批次) | åˆ—表、追踪 | æœªè¡¥å½•临时批次为“草稿”,列表显示“待补录”标签 |
| `batchId` / `batchCode`(托盘) | åˆ—表、详情 | æœªç»‘定为空,列表显示“未绑定批次”标签 |
| æ‰¹æ¬¡ä¸šåŠ¡å­—æ®µ | è¿½æº¯ | æœªè¡¥å½•/未绑定时不展示虚构的品种、产线、日期、责任人 |
## ä¸šåŠ¡è§„åˆ™è¯´æ˜Ž
| åœºæ™¯ | è§„则 |
|---|---|
| é¢„生成批次 | ä¸è¦æ±‚品种/袋型/产线/日期/责任人;生成全局唯一临时批次码,状态为草稿 |
| æ‰¹æ¬¡è¡¥å½• | ä»…允许尚未生成正式批次号的临时批次;重复补录提示“已补录” |
| æ‰¹æ¬¡å¼€å§‹ç”Ÿäº§ | æœªè¡¥å½•正式信息的临时批次不允许进入生产(后端校验 + å‰ç«¯æŒ‰é’®éšè—ï¼‰ |
| é¢„生成托盘 | ä¸è¦æ±‚生产批次;生成全局唯一临时托盘码,`batchId` ä¸ºç©º |
| æ‰˜ç›˜ç»‘定批次 | ä¸´æ—¶æ‰˜ç›˜ä»…能绑定已正式补录且生产中的批次;跨批次、重复绑定被拒绝 |
| ä¸´æ—¶æ‰˜ç›˜å‡ºåº“ | æœªç»‘定批次的托盘禁止参与销售出库等业务操作 |
| è¢‹ç å½•入批次 | ä»…允许生产中的正式批次;临时批次不可作为录入目标 |
| è¢‹ç ç»‘定托盘 | åŒæ–¹å¿…须为同一正式批次;未绑定批次的临时托盘不可参与绑定 |
| äºŒç»´ç å¯¼å‡º | ä¸´æ—¶æ‰¹æ¬¡/临时托盘按临时码导出;业务信息为空时不显示虚构内容 |
| æ‰«ç è¯†åˆ« | `PB-YYYYYYYY`→批次、`PL-YYYYYYYY`→托盘、`批次号-PXX`→托盘、`BAG-YYYYYYYY`→袋码;正式批次号/托盘码照常识别 |
## æ³¨æ„äº‹é¡¹
- å‰ç«¯è°ƒç”¨é¡ºåºï¼šæ‰¹æ¬¡â€œé¢„生成 â†’ è¡¥å½•信息 â†’ å¼€å§‹ç”Ÿäº§â€ï¼›æ‰˜ç›˜â€œé¢„生成 â†’ ç»‘定批次 â†’ ç»‘定袋码”;袋码“生成 â†’ å½•入批次 â†’ ç»‘定托盘”。
- æ‰¹æ¬¡æ­£å¼åŒ–后 `tempCode` ä¸åˆ é™¤ï¼ŒåŽ†å²æ‰“å°çš„ä¸´æ—¶äºŒç»´ç æ‰«ç ä»èƒ½è¿½æº¯ï¼Œå‹¿ç”¨æ­£å¼ç è¦†ç›–ä¸´æ—¶ç ã€‚
- ä¸´æ—¶æ‰˜ç›˜åœ¨ç»‘定批次前不可被袋码绑定、不可销售出库;批量绑定需先勾选多条临时托盘记录。
- è¡¥å½•/绑定失败时保留当前选择,避免误以为已完成业务关联。
docs/mes_pro_pallet_auto_generation_integration.md
ÎļþÒÑɾ³ý
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 '责任人用户编号(责任落实到人),关联 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',
sql/mysql/mes_pro_pallet_auto_threshold.sql
ÎļþÒÑɾ³ý
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')")
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;
}
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")
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;
}
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 ====================
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;
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;
}
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;
}
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("品种编码")
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;
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 = "批次号(补录后的正式批次号)", 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;
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 = "托盘码绑定生产批次(生成正式托盘码)")
    @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())
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/pallet/vo/MesProPalletAutoPrintRespVO.java
ÎļþÒÑɾ³ý
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;
}
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;
}
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;
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;
}
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;
}
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;
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 = "托盘码(绑定批次后的正式托盘码)", example = "PC20260818L01001-P01")
    private String code;
    @Schema(description = "临时托盘码(二维码内容;未绑定批次时展示)", example = "PL-00000001")
    private String tempCode;
    @Schema(description = "批次内托盘序号", example = "1")
    private Integer palletNo;
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位全局序号,预生成二维码阶段使用;补录正式信息后仍可扫码追溯)
     */
    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>
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()}
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>()
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())
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())
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 æ‰˜ç›˜ç çŠ¶æ€
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, "生产批次尚未补录正式信息");
    // ========== 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, "产线不存在");
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProBagTypeEnum.java
ÎļþÒÑɾ³ý
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("责任人", 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();
    }
    /**
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);
    /**
     * ä½œåºŸç ´æŸè¢‹ç å¹¶åœ¨åŽŸæ‰¹æ¬¡ç”Ÿæˆç­‰é‡æ›¿æ¢è¢‹ç 
     */
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);
        }
        // ä¸´æ—¶æ‰¹æ¬¡ï¼ˆæœªè¡¥å½•正式批次号)不允许袋码录入
        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());
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 è¡¥å½•信息,id å¿…å¡«
     */
    void fillBatchInfo(@Valid MesProBatchSaveReqVO fillReqVO);
    /**
     * æ›´æ–°ç”Ÿäº§æ‰¹æ¬¡ï¼ˆå«ç”Ÿäº§äººå‘˜é…ç½®ï¼‰
     *
     * @param updateReqVO æ›´æ–°ä¿¡æ¯
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. é”å®šæ‰¹æ¬¡ï¼Œä»…允许尚未补录正式信息的临时批次
        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);
    }
    /**
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);
    /**
     * æ‰˜ç›˜ç ç»‘定生产批次:生成正式托盘码(批次号-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 æ‰˜ç›˜ç¼–号
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. é”å®šç›®æ ‡æ‰¹æ¬¡å¹¶æ ¡éªŒå·²è¡¥å½•正式信息 + ç”Ÿäº§ä¸­
        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. åˆ†é…æ­£å¼æ‰˜ç›˜ç ï¼šæ‰¹æ¬¡å· + -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));
    }
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)