| | |
| | | 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; |
| | |
| | | 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.*; |
| | |
| | | private MesProBagCodeMapper bagCodeMapper; |
| | | @Resource |
| | | private MesProBatchMapper batchMapper; |
| | | @Resource |
| | | private MesProBagCodeReplaceMapper replaceMapper; |
| | | @Resource |
| | | private MesProPalletMapper palletMapper; |
| | | |
| | | @Resource |
| | | private MesProPalletService palletService; |
| | |
| | | @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); |
| | | } |
| | |
| | | .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 |
| | |
| | | } |
| | | |
| | | @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); |
| | | } |