| | |
| | | import cn.hutool.core.util.IdUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeBindBatchReqVO; |
| | | 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; |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public MesProBagCodeGenerateRespVO generateBagCodes(MesProBagCodeGenerateReqVO generateReqVO) { |
| | | // 1. 校验批次存在且处于生产中状态 |
| | | MesProBatchDO batch = batchMapper.selectByIdForUpdate(generateReqVO.getBatchId()); |
| | | if (batch == null) { |
| | | throw exception(PRO_BATCH_NOT_EXISTS); |
| | | } |
| | | if (!MesProBatchStatusEnum.PRODUCING.getStatus().equals(batch.getStatus())) { |
| | | throw exception(PRO_BATCH_STATUS_NOT_GENERATE_CODE); |
| | | } |
| | | if (generateReqVO.getCount() == null || generateReqVO.getCount() <= 0) { |
| | | throw exception(PRO_BAG_CODE_GENERATE_COUNT_INVALID); |
| | | } |
| | | |
| | | // 2. 计算起始序号(包含已逻辑删除记录,保证序号不回退、码值唯一) |
| | | int startNo = bagCodeMapper.selectMaxBagNo(batch.getId()) + 1; |
| | | |
| | | // 3. 批量生成袋码:批次号 + - + 4 位袋序号,同一次生成共享同一 UUID(数据包) |
| | | // 生成阶段只创建全局唯一袋码,生产批次在后续录入 |
| | | int startNo = bagCodeMapper.selectMaxBagNo() + 1; |
| | | String uuid = IdUtil.fastSimpleUUID(); |
| | | List<MesProBagCodeDO> bagCodes = new ArrayList<>(generateReqVO.getCount()); |
| | | for (int i = 0; i < generateReqVO.getCount(); i++) { |
| | | int bagNo = startNo + i; |
| | | bagCodes.add(new MesProBagCodeDO() |
| | | .setUuid(uuid) |
| | | .setCode(batch.getCode() + "-" + StrUtil.padPre(String.valueOf(bagNo), 4, '0')) |
| | | .setCode("BAG-" + StrUtil.padPre(String.valueOf(bagNo), 8, '0')) |
| | | .setBagNo(bagNo) |
| | | .setBatchId(batch.getId()) |
| | | .setBatchCode(batch.getCode()) |
| | | .setStatus(MesProBagCodeStatusEnum.GENERATED.getStatus()) |
| | | .setRemark(generateReqVO.getRemark())); |
| | | } |
| | | bagCodeMapper.insertBatch(bagCodes); |
| | | return new MesProBagCodeGenerateRespVO().setUuid(uuid); |
| | | } |
| | | |
| | | // 4. 回写批次袋码数量 |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void bindBatch(MesProBagCodeBindBatchReqVO bindReqVO) { |
| | | MesProBatchDO batch = batchMapper.selectByIdForUpdate(bindReqVO.getBatchId()); |
| | | if (batch == null) { |
| | | throw exception(PRO_BATCH_NOT_EXISTS); |
| | | } |
| | | if (!MesProBatchStatusEnum.PRODUCING.getStatus().equals(batch.getStatus())) { |
| | | throw exception(PRO_BATCH_STATUS_NOT_GENERATE_CODE); |
| | | } |
| | | // 临时批次(未补录正式批次号)不允许袋码录入 |
| | | if (StrUtil.isEmpty(batch.getCode())) { |
| | | throw exception(PRO_BATCH_NOT_FILLED); |
| | | } |
| | | List<Long> ids = bindReqVO.getIds().stream().distinct().toList(); |
| | | List<MesProBagCodeDO> bagCodes = bagCodeMapper.selectListByIdsForUpdate(ids); |
| | | if (bagCodes.size() != ids.size() || bagCodes.stream().anyMatch(code -> |
| | | code.getBatchId() != null || !MesProBagCodeStatusEnum.GENERATED.getStatus().equals(code.getStatus()))) { |
| | | throw exception(PRO_BAG_CODE_STATUS_NOT_GENERATED); |
| | | } |
| | | if (bagCodeMapper.bindBatchByIds(ids, batch.getId(), batch.getCode(), |
| | | MesProBagCodeStatusEnum.GENERATED.getStatus()) != ids.size()) { |
| | | throw exception(PRO_BAG_CODE_STATUS_NOT_GENERATED); |
| | | } |
| | | batchMapper.updateById(new MesProBatchDO().setId(batch.getId()) |
| | | .setBagQuantity((batch.getBagQuantity() == null ? 0 : batch.getBagQuantity()) |
| | | + generateReqVO.getCount())); |
| | | return new MesProBagCodeGenerateRespVO() |
| | | .setUuid(uuid) |
| | | .setAutoPallets(palletService.autoCreatePallets(batch.getId())); |
| | | .setBagQuantity(bagCodeMapper.selectEffectiveCountByBatchId(batch.getId()))); |
| | | } |
| | | |
| | | @Override |
| | |
| | | |
| | | String replaceUuid = IdUtil.fastSimpleUUID(); |
| | | LocalDateTime replaceTime = LocalDateTime.now(); |
| | | int startNo = bagCodeMapper.selectMaxBagNo(batch.getId()) + 1; |
| | | int startNo = bagCodeMapper.selectMaxBagNo() + 1; |
| | | List<MesProBagCodeDO> newBagCodes = new ArrayList<>(oldBagCodes.size()); |
| | | List<MesProBagCodeReplaceDO> replacements = new ArrayList<>(oldBagCodes.size()); |
| | | List<MesProBagCodeReplaceItemRespVO> items = new ArrayList<>(oldBagCodes.size()); |
| | |
| | | return bagCodeMapper.selectListByBatchId(batchId); |
| | | } |
| | | |
| | | @Override |
| | | public void markOutbound(Long id, Long salesId) { |
| | | bagCodeMapper.markOutbound(id, salesId, LocalDateTime.now()); |
| | | } |
| | | |
| | | @Override |
| | | public void clearOutbound(Long id) { |
| | | bagCodeMapper.clearOutbound(id); |
| | | } |
| | | |
| | | // ==================== 私有方法 ==================== |
| | | |
| | | /** |