package cn.iocoder.yudao.module.mes.service.pro.bagcode;
|
|
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO;
|
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.pallet.MesProPalletMapper;
|
import jakarta.annotation.Resource;
|
import org.springframework.stereotype.Component;
|
import org.springframework.transaction.annotation.Propagation;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.util.List;
|
|
/**
|
* 袋码/托盘分段写入器
|
* <p>
|
* 每段使用独立事务(REQUIRES_NEW):几十万行放在同一个事务里会形成超大事务,
|
* 长时间占用 undo/redo 与行锁,失败时回滚成本也极高。
|
* <p>
|
* 独立成 Bean 是为了让 {@code REQUIRES_NEW} 经 Spring 代理生效,避免同类自调用绕过事务。
|
*/
|
@Component
|
public class MesProBagCodeChunkWriter {
|
|
/**
|
* 单条 INSERT 语句的行数;与分段大小分开,控制单条 SQL 的包体大小
|
*/
|
private static final int INSERT_BATCH_SIZE = 1000;
|
|
@Resource
|
private MesProBagCodeMapper bagCodeMapper;
|
@Resource
|
private MesProPalletMapper palletMapper;
|
|
/**
|
* 写入一段袋码
|
*/
|
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
|
public void insertBagCodes(List<MesProBagCodeDO> bagCodes) {
|
bagCodeMapper.insertBatch(bagCodes, INSERT_BATCH_SIZE);
|
}
|
|
/**
|
* 写入一段托盘(插入后 ID 会回填到实体上)
|
*/
|
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
|
public void insertPallets(List<MesProPalletDO> pallets) {
|
palletMapper.insertBatch(pallets, INSERT_BATCH_SIZE);
|
}
|
|
}
|