| | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchPreGenerateReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO; |
| | |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Collection; |
| | | import java.util.HashSet; |
| | | import java.util.List; |
| | |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public List<MesProBatchDO> preGenerateBatch(MesProBatchPreGenerateReqVO reqVO) { |
| | | // 1. 生成临时批次码(全局 8 位序号,格式 PB-00000001) |
| | | int startSeq = batchMapper.selectMaxTempCodeSeq() + 1; |
| | | List<MesProBatchDO> list = new ArrayList<>(reqVO.getCount()); |
| | | for (int i = 0; i < reqVO.getCount(); i++) { |
| | | list.add(new MesProBatchDO() |
| | | .setTempCode("PB-" + StrUtil.padPre(String.valueOf(startSeq + i), 8, '0')) |
| | | .setBagQuantity(0) |
| | | .setPalletQuantity(0) |
| | | .setStatus(MesProBatchStatusEnum.DRAFT.getStatus()) |
| | | .setRemark(reqVO.getRemark())); |
| | | } |
| | | // 2. 批量插入(草稿状态,等待补录业务信息) |
| | | for (MesProBatchDO batch : list) { |
| | | batchMapper.insert(batch); |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void fillBatchInfo(MesProBatchSaveReqVO fillReqVO) { |
| | | // 1. 锁定批次,仅允许尚未补录正式信息的临时批次 |
| | | MesProBatchDO batch = batchMapper.selectByIdForUpdate(fillReqVO.getId()); |
| | | if (batch == null) { |
| | | throw exception(PRO_BATCH_NOT_EXISTS); |
| | | } |
| | | if (StrUtil.isNotEmpty(batch.getCode())) { |
| | | throw exception(PRO_BATCH_ALREADY_FILLED); |
| | | } |
| | | // 2. 校验关联数据并生成正式批次号 |
| | | MesMdmItemDO item = mdmItemService.validateItemExists(fillReqVO.getItemId()); |
| | | MesProLineDO line = lineService.validateLineExistsAndEnable(fillReqVO.getLineId()); |
| | | validateRelations(fillReqVO); |
| | | String code = generateBatchCode(line.getCode(), item.getCode()); |
| | | // 3. 落库业务信息(保留临时批次码用于历史扫码追溯;产线编码/名称冗余回填) |
| | | MesProBatchDO updateObj = BeanUtils.toBean(fillReqVO, MesProBatchDO.class) |
| | | .setCode(code) |
| | | .setLineCode(line.getCode()) |
| | | .setLineName(line.getName()) |
| | | .setStatus(MesProBatchStatusEnum.DRAFT.getStatus()); |
| | | batchMapper.updateById(updateObj); |
| | | // 4. 重建生产人员配置 |
| | | batchWorkerMapper.deleteByBatchId(fillReqVO.getId()); |
| | | insertBatchWorkers(fillReqVO.getId(), fillReqVO.getWorkers()); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateBatch(MesProBatchSaveReqVO updateReqVO) { |
| | | // 1. 校验存在 + 状态(草稿/生产中才允许修改) |
| | | MesProBatchDO oldBatch = validateBatchExists(updateReqVO.getId()); |
| | |
| | | // 2. 校验关联数据(生产人员) |
| | | validateRelations(updateReqVO); |
| | | |
| | | // 3. 品种/产线变化时重新生成批次号(批次号包含产线编码 + 品种编码要素) |
| | | // 3. 未生成正式批次号或品种/产线变化时重新生成批次号(批次号包含产线编码 + 品种编码要素) |
| | | boolean codeEmpty = StrUtil.isEmpty(oldBatch.getCode()); |
| | | boolean itemChanged = !Objects.equals(oldBatch.getItemId(), updateReqVO.getItemId()); |
| | | boolean lineChanged = !Objects.equals(oldBatch.getLineId(), updateReqVO.getLineId()); |
| | | String code = oldBatch.getCode(); |
| | | MesProBatchDO updateObj = BeanUtils.toBean(updateReqVO, MesProBatchDO.class); |
| | | if (itemChanged || lineChanged) { |
| | | if (codeEmpty || itemChanged || lineChanged) { |
| | | MesMdmItemDO item = mdmItemService.validateItemExists(updateReqVO.getItemId()); |
| | | // 变更产线时,目标产线必须启用;未变更则仅校验存在(避免停用产线的历史批次无法编辑其他字段) |
| | | MesProLineDO line = lineChanged |
| | | MesProLineDO line = (lineChanged || codeEmpty) |
| | | ? lineService.validateLineExistsAndEnable(updateReqVO.getLineId()) |
| | | : lineService.validateLineExists(updateReqVO.getLineId()); |
| | | code = generateBatchCode(line.getCode(), item.getCode()); |
| | |
| | | if (!valid) { |
| | | throw exception(PRO_BATCH_STATUS_INVALID); |
| | | } |
| | | if (MesProBatchStatusEnum.PRODUCING.getStatus().equals(status)) { |
| | | // 未补录业务信息的临时批次不允许进入生产 |
| | | if (StrUtil.isEmpty(batch.getCode())) { |
| | | throw exception(PRO_BATCH_NOT_FILLED); |
| | | } |
| | | } |
| | | // 3. 更新状态 |
| | | batchMapper.updateById(new MesProBatchDO().setId(id).setStatus(status)); |
| | | } |
| | |
| | | |
| | | @Override |
| | | public MesProBatchDO getBatchByCode(String code) { |
| | | return batchMapper.selectByCode(code); |
| | | MesProBatchDO batch = batchMapper.selectByCode(code); |
| | | if (batch == null) { |
| | | batch = batchMapper.selectByTempCode(code); |
| | | } |
| | | return batch; |
| | | } |
| | | |
| | | @Override |