2 天以前 ac2545f3cd01f3061a107e4980fc6fa59eaeaa6b
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeServiceImpl.java
@@ -7,13 +7,20 @@
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.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;
import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeReplaceRespVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeReplaceDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO;
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.bagcode.MesProBagCodeReplaceMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.batch.MesProBatchMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.pallet.MesProPalletMapper;
import cn.iocoder.yudao.module.mes.enums.pro.MesProBagCodeStatusEnum;
import cn.iocoder.yudao.module.mes.enums.pro.MesProBatchStatusEnum;
import cn.iocoder.yudao.module.mes.enums.pro.MesProPalletStatusEnum;
import cn.iocoder.yudao.module.mes.service.pro.pallet.MesProPalletService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
@@ -24,7 +31,9 @@
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
@@ -43,6 +52,10 @@
    private MesProBagCodeMapper bagCodeMapper;
    @Resource
    private MesProBatchMapper batchMapper;
    @Resource
    private MesProBagCodeReplaceMapper replaceMapper;
    @Resource
    private MesProPalletMapper palletMapper;
    @Resource
    private MesProPalletService palletService;
@@ -51,7 +64,7 @@
    @Transactional(rollbackFor = Exception.class)
    public String generateBagCodes(MesProBagCodeGenerateReqVO generateReqVO) {
        // 1. 校验批次存在且处于生产中状态
        MesProBatchDO batch = batchMapper.selectById(generateReqVO.getBatchId());
        MesProBatchDO batch = batchMapper.selectByIdForUpdate(generateReqVO.getBatchId());
        if (batch == null) {
            throw exception(PRO_BATCH_NOT_EXISTS);
        }
@@ -86,6 +99,118 @@
                .setBagQuantity((batch.getBagQuantity() == null ? 0 : batch.getBagQuantity())
                        + generateReqVO.getCount()));
        return uuid;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public MesProBagCodeReplaceRespVO replaceBagCodes(MesProBagCodeReplaceReqVO replaceReqVO) {
        MesProBatchDO batch = batchMapper.selectByIdForUpdate(replaceReqVO.getBatchId());
        if (batch == null) {
            throw exception(PRO_BATCH_NOT_EXISTS);
        }
        if (!MesProBatchStatusEnum.PRODUCING.getStatus().equals(batch.getStatus())
                && !MesProBatchStatusEnum.FINISHED.getStatus().equals(batch.getStatus())) {
            throw exception(PRO_BAG_CODE_REPLACE_BATCH_STATUS_INVALID);
        }
        List<Long> oldIds = replaceReqVO.getOldIds().stream()
                .distinct().sorted().toList();
        List<MesProBagCodeDO> oldBagCodes = bagCodeMapper.selectListByIdsForUpdate(oldIds);
        if (oldBagCodes.size() != oldIds.size()) {
            throw exception(PRO_BAG_CODE_NOT_EXISTS);
        }
        for (MesProBagCodeDO oldBagCode : oldBagCodes) {
            if (!batch.getId().equals(oldBagCode.getBatchId())) {
                throw exception(PRO_BAG_CODE_REPLACE_BATCH_MISMATCH);
            }
            if (!MesProBagCodeStatusEnum.GENERATED.getStatus().equals(oldBagCode.getStatus())
                    && !MesProBagCodeStatusEnum.PRINTED.getStatus().equals(oldBagCode.getStatus())) {
                throw exception(PRO_BAG_CODE_REPLACE_STATUS_INVALID);
            }
            if (replaceMapper.selectByOldBagCodeId(oldBagCode.getId()) != null) {
                throw exception(PRO_BAG_CODE_REPLACE_ALREADY_REPLACED);
            }
        }
        Map<Long, MesProPalletDO> palletMap = new LinkedHashMap<>();
        oldBagCodes.stream().map(MesProBagCodeDO::getPalletId).filter(id -> id != null)
                .distinct().sorted().forEach(palletId -> {
                    MesProPalletDO pallet = palletMapper.selectByIdForUpdate(palletId);
                    if (pallet == null || !MesProPalletStatusEnum.IN_USE.getStatus().equals(pallet.getStatus())) {
                        throw exception(PRO_BAG_CODE_REPLACE_PALLET_INVALID);
                    }
                    palletMap.put(palletId, pallet);
                });
        String replaceUuid = IdUtil.fastSimpleUUID();
        LocalDateTime replaceTime = LocalDateTime.now();
        int startNo = bagCodeMapper.selectMaxBagNo(batch.getId()) + 1;
        List<MesProBagCodeDO> newBagCodes = new ArrayList<>(oldBagCodes.size());
        List<MesProBagCodeReplaceDO> replacements = new ArrayList<>(oldBagCodes.size());
        List<MesProBagCodeReplaceItemRespVO> items = new ArrayList<>(oldBagCodes.size());
        for (int i = 0; i < oldBagCodes.size(); i++) {
            MesProBagCodeDO oldBagCode = oldBagCodes.get(i);
            if (bagCodeMapper.cancelById(oldBagCode.getId(), oldBagCode.getStatus(),
                    MesProBagCodeStatusEnum.CANCELED.getStatus(), replaceTime, replaceReqVO.getReason()) != 1) {
                throw exception(PRO_BAG_CODE_REPLACE_STATUS_INVALID);
            }
            int newBagNo = startNo + i;
            MesProPalletDO pallet = oldBagCode.getPalletId() == null ? null : palletMap.get(oldBagCode.getPalletId());
            MesProBagCodeDO newBagCode = new MesProBagCodeDO()
                    .setUuid(replaceUuid)
                    .setCode(batch.getCode() + "-" + StrUtil.padPre(String.valueOf(newBagNo), 4, '0'))
                    .setBagNo(newBagNo)
                    .setBatchId(batch.getId())
                    .setBatchCode(batch.getCode())
                    .setPalletId(pallet == null ? null : pallet.getId())
                    .setPalletCode(pallet == null ? null : pallet.getCode())
                    .setStatus(MesProBagCodeStatusEnum.GENERATED.getStatus())
                    .setRemark(replaceReqVO.getReason());
            newBagCodes.add(newBagCode);
            replacements.add(new MesProBagCodeReplaceDO()
                    .setReplaceUuid(replaceUuid)
                    .setBatchId(batch.getId())
                    .setBatchCode(batch.getCode())
                    .setOldBagCodeId(oldBagCode.getId())
                    .setOldCode(oldBagCode.getCode())
                    .setOldBagNo(oldBagCode.getBagNo())
                    .setOldStatus(oldBagCode.getStatus())
                    .setOldPalletId(oldBagCode.getPalletId())
                    .setOldPalletCode(oldBagCode.getPalletCode())
                    .setNewCode(newBagCode.getCode())
                    .setNewBagNo(newBagNo)
                    .setReason(replaceReqVO.getReason())
                    .setReplaceTime(replaceTime));
            items.add(new MesProBagCodeReplaceItemRespVO()
                    .setOldBagCodeId(oldBagCode.getId())
                    .setOldCode(oldBagCode.getCode())
                    .setOldBagNo(oldBagCode.getBagNo())
                    .setOldStatus(oldBagCode.getStatus())
                    .setOldPalletId(oldBagCode.getPalletId())
                    .setOldPalletCode(oldBagCode.getPalletCode())
                    .setNewCode(newBagCode.getCode())
                    .setNewBagNo(newBagNo)
                    .setNewPalletId(newBagCode.getPalletId())
                    .setNewPalletCode(newBagCode.getPalletCode())
                    .setReason(replaceReqVO.getReason())
                    .setReplaceTime(replaceTime));
        }
        bagCodeMapper.insertBatch(newBagCodes);
        for (int i = 0; i < replacements.size(); i++) {
            replacements.get(i).setNewBagCodeId(newBagCodes.get(i).getId());
            items.get(i).setNewBagCodeId(newBagCodes.get(i).getId());
        }
        replaceMapper.insertBatch(replacements);
        batchMapper.updateById(new MesProBatchDO().setId(batch.getId())
                .setBagQuantity(bagCodeMapper.selectEffectiveCountByBatchId(batch.getId())));
        return new MesProBagCodeReplaceRespVO()
                .setReplaceUuid(replaceUuid)
                .setBatchId(batch.getId())
                .setBatchCode(batch.getCode())
                .setCount(newBagCodes.size())
                .setItems(items);
    }
    @Override
@@ -180,6 +305,16 @@
    }
    @Override
    public MesProBagCodeReplaceDO getReplacementByOldBagCodeId(Long oldBagCodeId) {
        return replaceMapper.selectByOldBagCodeId(oldBagCodeId);
    }
    @Override
    public MesProBagCodeReplaceDO getReplacementByNewBagCodeId(Long newBagCodeId) {
        return replaceMapper.selectByNewBagCodeId(newBagCodeId);
    }
    @Override
    public PageResult<MesProBagCodeDO> getBagCodePage(MesProBagCodePageReqVO pageReqVO) {
        return bagCodeMapper.selectPage(pageReqVO);
    }