diff --git a/update-service/src/main/java/com/xuqm/update/service/AppStoreService.java b/update-service/src/main/java/com/xuqm/update/service/AppStoreService.java index eb6f24c..e457f29 100644 --- a/update-service/src/main/java/com/xuqm/update/service/AppStoreService.java +++ b/update-service/src/main/java/com/xuqm/update/service/AppStoreService.java @@ -860,6 +860,24 @@ public class AppStoreService { } } + /** + * Remove a store's review entry from the version's storeReviewStatus. + * Used when a previously-written state is discovered to be a false positive + * (e.g. an old online version was incorrectly marked as nonCurrentRelease). + */ + public AppVersionEntity clearStoreReview(String versionId, String storeType) throws Exception { + synchronized (lockFor(versionId)) { + AppVersionEntity v = versionRepo.findById(versionId).orElseThrow(); + Map reviewMap = parseReviewStatus(v.getStoreReviewStatus()); + if (reviewMap.remove(storeType) != null) { + v.setStoreReviewStatus(mapper.writeValueAsString(reviewMap)); + versionRepo.save(v); + log.info("Cleared store review state for {}/{}", versionId, storeType); + } + return v; + } + } + private Object lockFor(String versionId) { return versionLocks.computeIfAbsent(versionId, ignored -> new Object()); } diff --git a/update-service/src/main/java/com/xuqm/update/service/StoreSubmissionService.java b/update-service/src/main/java/com/xuqm/update/service/StoreSubmissionService.java index ee81ef7..321c7b9 100644 --- a/update-service/src/main/java/com/xuqm/update/service/StoreSubmissionService.java +++ b/update-service/src/main/java/com/xuqm/update/service/StoreSubmissionService.java @@ -866,8 +866,17 @@ public class StoreSubmissionService { // Already APPROVED (from webhook): version approved but pending distribution. // Do NOT overwrite with nonCurrentRelease=true — that would show a misleading // "已上线(非本次发布)" label when the version is simply awaiting distribution. - log.debug("Manual refresh: {}/{} already APPROVED (webhook), store live version={} — pending distribution, no change", - v.getId(), storeType, polled.getOnlineVersionCode()); + int cmp = compareVersionCodes(polled.getOnlineVersionCode(), String.valueOf(v.getVersionCode())); + if (cmp < 0) { + // Previously incorrectly marked as nonCurrentRelease due to an older live version. + // Clear the stale state so the user can submit this newer version. + log.info("Manual refresh: {}/{} clearing stale APPROVED state — online {} < submitted {}", + v.getId(), storeType, polled.getOnlineVersionCode(), v.getVersionCode()); + storeService.clearStoreReview(v.getId(), storeType); + } else { + log.debug("Manual refresh: {}/{} already APPROVED (webhook), store live version={} — pending distribution, no change", + v.getId(), storeType, polled.getOnlineVersionCode()); + } } } else if ("MI".equals(storeType) && polled.getReviewState() == StoreRemoteState.ReviewState.UNDER_REVIEW_XIAOMI) {