fix: clear stale APPROVED state when online version is older than submitted

- Add AppStoreService.clearStoreReview() to remove a store's review entry
  from storeReviewStatus JSON (used for false-positive cleanup)
- refreshStoreReviewStatus: when existing state is APPROVED but polled
  onlineVersionCode < submittedCode, clear the stale state instead of
  leaving the misleading nonCurrentRelease flag in place

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
这个提交包含在:
XuqmGroup 2026-05-22 19:20:48 +08:00
父节点 8f2f29170e
当前提交 0c9fd338eb
共有 2 个文件被更改,包括 29 次插入2 次删除

查看文件

@ -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<String, Object> 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());
}

查看文件

@ -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) {