From 98e4f94c6897cf93401c5af2a7ddea7011a6fa3b Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 31 Mar 2026 22:41:46 +0800 Subject: [PATCH] ✨ feat(mes): 优化条码生成与校验逻辑 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeServiceImpl.java | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------- 1 file changed, 80 insertions(+), 41 deletions(-) diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeServiceImpl.java index 2dd719e..d2d826f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeServiceImpl.java @@ -34,25 +34,13 @@ public class MesWmBarcodeServiceImpl implements MesWmBarcodeService { @Override public Long createBarcode(MesWmBarcodeSaveReqVO createReqVO) { - // 1.1 校验条码配置 - MesWmBarcodeConfigDO config = barcodeConfigService.validateBarcodeConfigByBizType(createReqVO.getBizType()); - // 1.2 校验是否已存在条码 - MesWmBarcodeDO existBarcode = barcodeMapper.selectByBizTypeAndBizId( + // 1. 校验数据 + MesWmBarcodeConfigDO config = validateBarcodeSaveData(createReqVO.getId(), createReqVO.getBizType(), createReqVO.getBizId()); - if (existBarcode != null) { - throw exception(WM_BARCODE_ALREADY_EXISTS); - } - // 2.1 生成条码内容(如果前端未传递,则自动生成) - String content = createReqVO.getContent(); - if (StrUtil.isBlank(content)) { - content = generateBarcodeContent(config.getContentFormat(), createReqVO.getBizCode()); - } - // 2.2 校验条码内容唯一性 - MesWmBarcodeDO contentBarcode = barcodeMapper.selectByContent(content); - if (contentBarcode != null) { - throw exception(WM_BARCODE_CONTENT_DUPLICATE); - } + // 2. 生成条码内容,并校验唯一性 + String content = generateAndValidateContent(createReqVO.getId(), + createReqVO.getContent(), config.getContentFormat(), createReqVO.getBizCode()); // 3. 保存条码记录 MesWmBarcodeDO barcode = BeanUtils.toBean(createReqVO, MesWmBarcodeDO.class).setContent(content) @@ -77,45 +65,96 @@ public class MesWmBarcodeServiceImpl implements MesWmBarcodeService { return generateBarcodeContent(config.getContentFormat(), bizCode); } + @Override + public void updateBarcode(MesWmBarcodeSaveReqVO updateReqVO) { + // 1.1 校验存在 + validateBarcodeExists(updateReqVO.getId()); + // 1.2 校验数据 + MesWmBarcodeConfigDO config = validateBarcodeSaveData(updateReqVO.getId(), + updateReqVO.getBizType(), updateReqVO.getBizId()); + + // 2. 生成条码内容,并校验唯一性 + String content = generateAndValidateContent(updateReqVO.getId(), + updateReqVO.getContent(), config.getContentFormat(), updateReqVO.getBizCode()); + + // 3. 更新(刷新 configId 和 format,确保与最新配置一致) + MesWmBarcodeDO updateObj = BeanUtils.toBean(updateReqVO, MesWmBarcodeDO.class) + .setConfigId(config.getId()).setFormat(config.getFormat()); + if (StrUtil.isNotBlank(content)) { + updateObj.setContent(content); + } + barcodeMapper.updateById(updateObj); + } + /** - * 生成条码内容 + * 校验条码保存数据:条码配置 + 业务对象唯一性 * - * @param contentFormat 内容格式模板 - * @param bizCode 业务编码 - * @return 条码内容 + * @param id 条码编号(新增时为 null) + * @param bizType 业务类型 + * @param bizId 业务编号 + * @return 条码配置 */ - private String generateBarcodeContent(String contentFormat, String bizCode) { - if (StrUtil.isBlank(contentFormat)) { - return bizCode; - } - return contentFormat.replace(MesWmBarcodeConfigDO.PLACEHOLDER_BUSINESS_CODE, bizCode); + private MesWmBarcodeConfigDO validateBarcodeSaveData(Long id, Integer bizType, Long bizId) { + // 1. 校验条码配置 + MesWmBarcodeConfigDO config = barcodeConfigService.validateBarcodeConfigByBizType(bizType); + // 2. 校验业务对象唯一性 + validateBarcodeUnique(id, bizType, bizId); + return config; } - @Override - public void updateBarcode(MesWmBarcodeSaveReqVO updateReqVO) { - // 1. 校验存在 - validateBarcodeExists(updateReqVO.getId()); + /** + * 校验业务对象(bizType + bizId)唯一性 + * + * @param id 条码编号(新增时为 null,更新时排除自身) + * @param bizType 业务类型 + * @param bizId 业务编号 + */ + private void validateBarcodeUnique(Long id, Integer bizType, Long bizId) { + MesWmBarcodeDO barcode = barcodeMapper.selectByBizTypeAndBizId(bizType, bizId); + if (barcode == null) { + return; + } + if (ObjUtil.notEqual(barcode, id)) { + throw exception(WM_BARCODE_ALREADY_EXISTS); + } + } - // 2.1 生成条码内容(如果前端未传递,则自动生成) - String content = updateReqVO.getContent(); + /** + * 生成条码内容(如果前端未传递则自动生成),并校验内容唯一性 + * + * @param id 条码编号(新增时为 null,更新时排除自身) + * @param content 前端传递的条码内容(可为空) + * @param contentFormat 内容格式模板 + * @param bizCode 业务编码 + * @return 最终条码内容 + */ + private String generateAndValidateContent(Long id, String content, String contentFormat, String bizCode) { + // 1. 如果前端未传递内容,则自动生成 if (StrUtil.isBlank(content)) { - MesWmBarcodeConfigDO config = barcodeConfigService.validateBarcodeConfigByBizType(updateReqVO.getBizType()); - content = generateBarcodeContent(config.getContentFormat(), updateReqVO.getBizCode()); + content = generateBarcodeContent(contentFormat, bizCode); } - // 2.2 校验条码内容唯一性(排除自己) + // 2. 校验条码内容唯一性(排除自身) if (StrUtil.isNotBlank(content)) { MesWmBarcodeDO contentBarcode = barcodeMapper.selectByContent(content); - if (contentBarcode != null && ObjUtil.notEqual(contentBarcode.getId(), updateReqVO.getId())) { + if (contentBarcode != null && ObjUtil.notEqual(contentBarcode.getId(), id)) { throw exception(WM_BARCODE_CONTENT_DUPLICATE); } } + return content; + } - // 3. 更新 - MesWmBarcodeDO updateObj = BeanUtils.toBean(updateReqVO, MesWmBarcodeDO.class); - if (StrUtil.isNotBlank(content)) { - updateObj.setContent(content); + /** + * 生成条码内容 + * + * @param contentFormat 内容格式模板 + * @param bizCode 业务编码 + * @return 条码内容 + */ + private String generateBarcodeContent(String contentFormat, String bizCode) { + if (StrUtil.isBlank(contentFormat)) { + return bizCode; } - barcodeMapper.updateById(updateObj); + return contentFormat.replace(MesWmBarcodeConfigDO.PLACEHOLDER_BUSINESS_CODE, bizCode); } @Override -- libgit2 0.21.4