Browse Source

✨ feat(mes): 优化条码生成与校验逻辑

重构条码创建和更新流程,合并数据校验与内容生成逻辑,确保条码内容唯一性和配置一致性。新增校验方法以提高代码可读性和维护性。
YunaiV 4 months ago
parent
commit
98e4f94c68

+ 80 - 41
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