20 小时以前 476d70b2f294f36a9dbd8d0c3cf5d1b75ba34c66
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeServiceImpl.java
@@ -6,6 +6,7 @@
import cn.iocoder.yudao.framework.common.pojo.PageResult;
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;
import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeReplaceItemRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeReplaceReqVO;
@@ -62,7 +63,7 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public String generateBagCodes(MesProBagCodeGenerateReqVO generateReqVO) {
    public MesProBagCodeGenerateRespVO generateBagCodes(MesProBagCodeGenerateReqVO generateReqVO) {
        // 1. 校验批次存在且处于生产中状态
        MesProBatchDO batch = batchMapper.selectByIdForUpdate(generateReqVO.getBatchId());
        if (batch == null) {
@@ -98,7 +99,9 @@
        batchMapper.updateById(new MesProBatchDO().setId(batch.getId())
                .setBagQuantity((batch.getBagQuantity() == null ? 0 : batch.getBagQuantity())
                        + generateReqVO.getCount()));
        return uuid;
        return new MesProBagCodeGenerateRespVO()
                .setUuid(uuid)
                .setAutoPallets(palletService.autoCreatePallets(batch.getId()));
    }
    @Override
@@ -242,10 +245,13 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void bindPallet(MesProBagCodeBindReqVO bindReqVO) {
        // 1. 校验托盘存在
        MesProPalletDO pallet = palletService.validatePalletExists(bindReqVO.getPalletId());
        // 2. 校验袋码
        List<MesProBagCodeDO> bagCodes = validateBagCodesForBind(bindReqVO.getIds(), pallet);
        // 1. 锁定托盘,避免与自动归集并发修改袋数
        MesProPalletDO pallet = palletMapper.selectByIdForUpdate(bindReqVO.getPalletId());
        if (pallet == null) {
            throw exception(PRO_PALLET_NOT_EXISTS);
        }
        // 2. 锁定并校验袋码
        List<MesProBagCodeDO> bagCodes = validateBagCodesForBind(bindReqVO.getIds(), pallet, true);
        // 3. 校验不超过托盘可装袋数
        int currentCount = pallet.getBagCount() == null ? 0 : pallet.getBagCount();
        if (pallet.getCapacity() != null && pallet.getCapacity() > 0
@@ -260,10 +266,13 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void unbindPallet(MesProBagCodeBindReqVO bindReqVO) {
        // 1. 校验托盘存在
        MesProPalletDO pallet = palletService.validatePalletExists(bindReqVO.getPalletId());
        // 2. 校验袋码均绑定在当前托盘上
        List<MesProBagCodeDO> bagCodes = bagCodeMapper.selectListByIds(bindReqVO.getIds());
        // 1. 锁定托盘,避免与自动归集并发修改袋数
        MesProPalletDO pallet = palletMapper.selectByIdForUpdate(bindReqVO.getPalletId());
        if (pallet == null) {
            throw exception(PRO_PALLET_NOT_EXISTS);
        }
        // 2. 锁定并校验袋码均绑定在当前托盘上
        List<MesProBagCodeDO> bagCodes = bagCodeMapper.selectListByIdsForUpdate(bindReqVO.getIds());
        if (bagCodes.size() != bindReqVO.getIds().size()) {
            throw exception(PRO_BAG_CODE_NOT_EXISTS);
        }
@@ -339,8 +348,8 @@
    /**
     * 校验待绑定的袋码:存在、与托盘同批次、未绑定过托盘、状态有效(已生成/已导出印刷)
     */
    private List<MesProBagCodeDO> validateBagCodesForBind(List<Long> ids, MesProPalletDO pallet) {
        List<MesProBagCodeDO> bagCodes = bagCodeMapper.selectListByIds(ids);
    private List<MesProBagCodeDO> validateBagCodesForBind(List<Long> ids, MesProPalletDO pallet, boolean lock) {
        List<MesProBagCodeDO> bagCodes = lock ? bagCodeMapper.selectListByIdsForUpdate(ids) : bagCodeMapper.selectListByIds(ids);
        if (bagCodes.size() != ids.size()) {
            throw exception(PRO_BAG_CODE_NOT_EXISTS);
        }