| | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodePageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeUnboundTonBagPageReqVO; |
| | | 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 com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | import org.apache.ibatis.annotations.Param; |
| | | import org.apache.ibatis.annotations.Select; |
| | |
| | | .eq(MesProBagCodeDO::getBatchId, batchId) |
| | | .ne(MesProBagCodeDO::getStatus, MesProBagCodeStatusEnum.CANCELED.getStatus()) |
| | | .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) { |
| | |
| | | .orderByAsc(MesProBagCodeDO::getId)); |
| | | } |
| | | |
| | | /** |
| | | * 分页查询可绑定批次的吨袋:无托盘、未绑定批次、品种计量单位类型为吨。 |
| | | * <p> |
| | | * 计量单位类型在 MDM 侧维护,因此通过 mdm_item + mdm_unit_measure 关联过滤, |
| | | * 避免把全部袋码拉到内存再逐个查单位,数据量大时不可用。 |
| | | */ |
| | | default PageResult<MesProBagCodeDO> selectUnboundTonBagPage(MesProBagCodeUnboundTonBagPageReqVO reqVO, |
| | | String unitType) { |
| | | IPage<MesProBagCodeDO> result = selectUnboundTonBagPage(MyBatisUtils.buildPage(reqVO), reqVO.getKeyword(), |
| | | unitType, List.of(MesProBagCodeStatusEnum.GENERATED.getStatus(), |
| | | MesProBagCodeStatusEnum.PRINTED.getStatus())); |
| | | return new PageResult<>(result.getRecords(), result.getTotal()); |
| | | } |
| | | |
| | | IPage<MesProBagCodeDO> selectUnboundTonBagPage(IPage<MesProBagCodeDO> page, |
| | | @Param("keyword") String keyword, |
| | | @Param("unitType") String unitType, |
| | | @Param("statuses") Collection<Integer> statuses); |
| | | |
| | | /** 批次内有效袋码的品种编号集合(忽略历史空品种袋码),用于录入批次时的品种一致性校验 */ |
| | | @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) |