From 41f3a15dddd3258294bf91220554508c092631e1 Mon Sep 17 00:00:00 2001 From: mediabot-pt <295750538+mediabot-pt@users.noreply.github.com> Date: Mon, 29 Jun 2026 23:02:30 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=89=88=E6=9C=AC=E5=8F=B7?= =?UTF-8?q?=E7=94=B1PAR=E5=AE=A1=E6=A0=B8=E9=80=9A=E8=BF=87=E6=97=B6?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=88=86=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - submitConfig: 不再比较版本号,相同hash跳过,不同hash都插入pending - approveConfig: 自动取最大版本号+1 分配(如 1, 2, 3...) - 存储路径含hash前缀避免同名冲突 --- .../par/api/controller/AdminController.java | 13 ++++++++ .../core/service/impl/ConfigServiceImpl.java | 33 ++++++++----------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/par-api/src/main/java/com/par/api/controller/AdminController.java b/par-api/src/main/java/com/par/api/controller/AdminController.java index 99d9601..9a2e799 100644 --- a/par-api/src/main/java/com/par/api/controller/AdminController.java +++ b/par-api/src/main/java/com/par/api/controller/AdminController.java @@ -71,6 +71,19 @@ public class AdminController { Long reviewerId = (Long) request.getAttribute("accountId"); + // 自动分配版本号:取该站点已审批的最大版本号 + 1 + var latestApproved = siteConfigMapper.selectList( + new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + .eq(SiteConfig::getSiteId, config.getSiteId()) + .eq(SiteConfig::getStatus, ConfigStatus.APPROVED) + .orderByDesc(SiteConfig::getVersion)); + int nextVersion = 1; + if (!latestApproved.isEmpty()) { + try { nextVersion = Integer.parseInt(latestApproved.get(0).getVersion()) + 1; } + catch (NumberFormatException ignored) {} + } + config.setVersion(String.valueOf(nextVersion)); + config.setStatus(ConfigStatus.APPROVED); config.setReviewerId(reviewerId); config.setReviewedAt(LocalDateTime.now()); diff --git a/par-core/src/main/java/com/par/core/service/impl/ConfigServiceImpl.java b/par-core/src/main/java/com/par/core/service/impl/ConfigServiceImpl.java index c5ef800..ccca1f3 100644 --- a/par-core/src/main/java/com/par/core/service/impl/ConfigServiceImpl.java +++ b/par-core/src/main/java/com/par/core/service/impl/ConfigServiceImpl.java @@ -59,28 +59,21 @@ public class ConfigServiceImpl implements ConfigService { @Override public SiteConfig submitConfig(String siteId, String version, String configJson, String schemaVersion, Long submitterId) { - SiteConfig existing = getConfig(siteId, version); String configHash = HmacUtil.sha256(configJson); - String storagePath = String.format("configs/%s/%s.json", siteId, version); + String storagePath = String.format("configs/%s/%s/%s.json", siteId, version, configHash.substring(0, 8)); - // 版本已存在 → 根据 hash 判断是重复还是更新 - if (existing != null) { - if (configHash.equals(existing.getConfigHash())) { - log.info("配置未变化,跳过: siteId={}, version={}, hash={}", siteId, version, configHash); - return existing; - } - // hash 不同 → 覆盖更新 - log.info("配置内容变化,更新: siteId={}, version={}, oldHash={}, newHash={}", - siteId, version, existing.getConfigHash(), configHash); - storageService.store(storagePath, configJson); - existing.setConfigHash(configHash); - existing.setFileSize((long) configJson.getBytes(StandardCharsets.UTF_8).length); - existing.setStoragePath(storagePath); - siteConfigMapper.updateById(existing); - return existing; + // 相同 hash 的提交 → 真正重复,跳过 + SiteConfig sameHash = siteConfigMapper.selectOne( + new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + .eq(SiteConfig::getSiteId, siteId) + .eq(SiteConfig::getConfigHash, configHash) + .eq(SiteConfig::getDeleted, 0)); + if (sameHash != null) { + log.info("配置未变化,跳过: siteId={}, hash={}", siteId, configHash); + return sameHash; } - // 存储到抽象存储层(七牛或本地) + // 存储到抽象存储层 try { storageService.store(storagePath, configJson); } catch (Exception e) { @@ -90,7 +83,7 @@ public class ConfigServiceImpl implements ConfigService { SiteConfig config = new SiteConfig(); config.setSiteId(siteId); - config.setVersion(version); + config.setVersion(version); // 客户端提交的版本号,仅供参考 config.setConfigHash(configHash); config.setStoragePath(storagePath); config.setFileSize((long) configJson.getBytes(StandardCharsets.UTF_8).length); @@ -100,7 +93,7 @@ public class ConfigServiceImpl implements ConfigService { config.setIsLatest(false); siteConfigMapper.insert(config); - log.info("Config submitted: siteId={}, version={}, id={}", siteId, version, config.getId()); + log.info("Config submitted: siteId={}, version={}, id={}, hash={}", siteId, version, config.getId(), configHash); return config; }