package cn.iocoder.yudao.module.mes.service.pro.bagcode; import cn.iocoder.yudao.module.mes.dal.mysql.pro.bagcode.MesProBagCodeMapper; import cn.iocoder.yudao.module.mes.dal.mysql.pro.pallet.MesProPalletMapper; import cn.iocoder.yudao.module.mes.framework.bagcode.MesProBagCodeGenerateProperties; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /** * 袋码生成半成品清理器 *

* 生成失败或取消时会留下部分袋码与托盘。这些数据从未对外展示,不做逻辑删除, * 直接按 {@code uuid} 分段物理删除,避免留下几十万条垃圾行。 *

* 单条 DELETE 自带原子性,且已用 LIMIT 控制单次影响行数,因此不需要额外事务。 */ @Slf4j @Component public class MesProBagCodeGenerateCleaner { @Resource private MesProBagCodeMapper bagCodeMapper; @Resource private MesProPalletMapper palletMapper; @Resource private MesProBagCodeGenerateProperties properties; /** * 清理某个生成组的所有半成品数据 * * @param uuid 生成组 UUID */ public void cleanup(String uuid) { int batchSize = Math.max(1, properties.getCleanupBatchSize()); int deleted; do { deleted = bagCodeMapper.deletePhysicallyByUuidChunk(uuid, batchSize); } while (deleted >= batchSize); do { deleted = palletMapper.deletePhysicallyByGenerateUuidChunk(uuid, batchSize); } while (deleted >= batchSize); log.info("[cleanup][生成组 {} 半成品清理完成]", uuid); } }