云
9 小时以前 02a1ae81eba7b48223052fb833859f0a65dd7d21
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/bagcode/MesProBagCodeMapper.java
@@ -108,6 +108,58 @@
                .orderByAsc(MesProBagCodeDO::getBagNo));
    }
    /**
     * 统计生成组下可印刷的袋码数量(供导出分流判断,避免为了拿数量而全量加载)
     */
    default Long selectPrintableCountByUuid(String uuid) {
        return selectCount(new LambdaQueryWrapperX<MesProBagCodeDO>()
                .eq(MesProBagCodeDO::getUuid, uuid)
                .ne(MesProBagCodeDO::getStatus, MesProBagCodeStatusEnum.CANCELED.getStatus()));
    }
    /**
     * 统计批次下可印刷的袋码数量(供导出分流判断)
     */
    default Long selectPrintableCountByBatchId(Long batchId) {
        return selectCount(new LambdaQueryWrapperX<MesProBagCodeDO>()
                .eq(MesProBagCodeDO::getBatchId, batchId)
                .ne(MesProBagCodeDO::getStatus, MesProBagCodeStatusEnum.CANCELED.getStatus()));
    }
    /**
     * 分页查询生成组下可印刷的袋码(后台导出任务用,逐页取以控制内存)
     * <p>
     * 排序与全量查询保持一致(按袋序号升序),保证 ZIP 内的标签顺序不变。
     */
    default List<MesProBagCodeDO> selectPrintablePageByUuid(String uuid, int pageNo, int pageSize) {
        return selectPageByWrapper(new LambdaQueryWrapperX<MesProBagCodeDO>()
                .eq(MesProBagCodeDO::getUuid, uuid)
                .ne(MesProBagCodeDO::getStatus, MesProBagCodeStatusEnum.CANCELED.getStatus())
                .orderByAsc(MesProBagCodeDO::getBagNo), pageNo, pageSize);
    }
    /**
     * 分页查询批次下可印刷的袋码(后台导出任务用)
     */
    default List<MesProBagCodeDO> selectPrintablePageByBatchId(Long batchId, int pageNo, int pageSize) {
        return selectPageByWrapper(new LambdaQueryWrapperX<MesProBagCodeDO>()
                .eq(MesProBagCodeDO::getBatchId, batchId)
                .ne(MesProBagCodeDO::getStatus, MesProBagCodeStatusEnum.CANCELED.getStatus())
                .orderByAsc(MesProBagCodeDO::getBagNo), pageNo, pageSize);
    }
    /**
     * 按条件分页查询,不执行 count 查询(调用方通常已知总数)
     */
    private List<MesProBagCodeDO> selectPageByWrapper(
            com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<MesProBagCodeDO> wrapper,
            int pageNo, int pageSize) {
        com.baomidou.mybatisplus.extension.plugins.pagination.Page<MesProBagCodeDO> page =
                new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(pageNo, pageSize);
        page.setSearchCount(false);
        return selectPage(page, wrapper).getRecords();
    }
    default Long selectCountByBatchId(Long batchId) {
        return selectCount(MesProBagCodeDO::getBatchId, batchId);
    }
@@ -208,11 +260,33 @@
                .orderByAsc(MesProBagCodeDO::getId));
    }
    default List<MesProBagCodeDO> selectUnboundPalletlessList() {
        return selectList(new LambdaQueryWrapperX<MesProBagCodeDO>()
                .isNull(MesProBagCodeDO::getBatchId)
                .isNull(MesProBagCodeDO::getPalletId)
                .in(MesProBagCodeDO::getStatus, MesProBagCodeStatusEnum.GENERATED.getStatus(),
                        MesProBagCodeStatusEnum.PRINTED.getStatus())
                .isNotNull(MesProBagCodeDO::getItemId)
                .orderByAsc(MesProBagCodeDO::getId));
    }
    /** 批次内有效袋码的品种编号集合(忽略历史空品种袋码),用于录入批次时的品种一致性校验 */
    @Select("SELECT DISTINCT item_id FROM mes_pro_bag_code " +
            "WHERE deleted = 0 AND status <> 30 AND batch_id = #{batchId} AND item_id IS NOT NULL")
    List<Long> selectDistinctItemIdsByBatchId(@Param("batchId") Long batchId);
    /**
     * 物理删除生成组下的一批袋码(仅用于生成失败/取消后的半成品清理)
     * <p>
     * 半成品从未对外展示,逻辑删除只会留下几十万条垃圾并占用索引空间,因此这里直接物理删除。
     *
     * @param uuid  生成组 UUID
     * @param limit 单次最多删除行数
     * @return 实际删除行数
     */
    @org.apache.ibatis.annotations.Delete("DELETE FROM mes_pro_bag_code WHERE uuid = #{uuid} LIMIT #{limit}")
    int deletePhysicallyByUuidChunk(@Param("uuid") String uuid, @Param("limit") int limit);
    default List<MesProBagCodeDO> selectListByIdsForUpdate(Collection<Long> ids) {
        return selectList(new LambdaQueryWrapperX<MesProBagCodeDO>()
                .in(MesProBagCodeDO::getId, ids)