From 8b3f8afd777a6443276690533cce439aed817227 Mon Sep 17 00:00:00 2001 From: chenxing Date: Fri, 9 Oct 2026 00:26:40 +0800 Subject: [PATCH] =?UTF-8?q?fix(appearance):=20=E7=94=9F=E6=95=88=E5=80=BC?= =?UTF-8?q?=E5=90=88=E6=88=90=E7=BB=9F=E4=B8=80=E7=B4=A7=E5=87=91=E7=BC=96?= =?UTF-8?q?=E7=A0=81=E2=80=94=E2=80=94=E7=BA=A7=E8=81=94=E5=91=BD=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=20ThemeState=20JSON=20=E8=BD=AC=E5=9B=9E=20theme|0|1|?= =?UTF-8?q?1=20=E5=BD=A2=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 线上验证发现:readThemeWithFallback 返回 ThemeState JSON(schTheme 端点口径),而 oapi 契约/init 收敛只认紧凑编码——层间编码不一致会让学校/平台档被 init 当脏值跳过。合成层补 encodeThemeState 转换(读侧宽松:转换失败降 null 不抛)。 --- .../userhome/service/impl/AppearanceServiceImpl.java | 11 ++++++++++- .../userhome/service/AppearanceServiceTest.java | 7 ++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/yunhai/userhome/service/impl/AppearanceServiceImpl.java b/src/main/java/com/yunhai/userhome/service/impl/AppearanceServiceImpl.java index b29b632..1c7c968 100644 --- a/src/main/java/com/yunhai/userhome/service/impl/AppearanceServiceImpl.java +++ b/src/main/java/com/yunhai/userhome/service/impl/AppearanceServiceImpl.java @@ -125,7 +125,16 @@ public class AppearanceServiceImpl implements IAppearanceService { String avatar = myAvatar; try { if (theme == null) { - theme = schSettingsService.readThemeWithFallback(schId).getValue(); + // readThemeWithFallback 命中值是 ThemeState JSON(schTheme 端点口径);oapi 契约统一出 + // 紧凑编码(init 侧 compactThemeToJson 只认紧凑形态),脏值宽松降 null 不抛 + String hit = schSettingsService.readThemeWithFallback(schId).getValue(); + if (hit != null) { + try { + theme = ThemeCodec.encodeThemeState(hit); + } catch (DException e) { + theme = null; + } + } } if (avatar == null) { avatar = schSettingsService.readAvatarWithFallback(schId).getValue(); diff --git a/src/test/java/com/yunhai/userhome/service/AppearanceServiceTest.java b/src/test/java/com/yunhai/userhome/service/AppearanceServiceTest.java index f1f597d..8585563 100644 --- a/src/test/java/com/yunhai/userhome/service/AppearanceServiceTest.java +++ b/src/test/java/com/yunhai/userhome/service/AppearanceServiceTest.java @@ -254,18 +254,19 @@ class AppearanceServiceTest { } @Test - @DisplayName("生效值:个人未设 → 学校/平台级联(缺陷 C 修复验证:合成链走 readThemeWithFallback)") + @DisplayName("生效值:个人未设 → 学校/平台级联(缺陷 C 修复验证:合成链走 readThemeWithFallback),层间编码统一紧凑形态") void effective_fallsToCascade() { stubCurrentRole(3); when(userAppearanceRepository.findByUserId(10133)).thenReturn(Optional.empty()); + // 级联命中值是 ThemeState JSON(schTheme 端点口径)——合成层须转回紧凑编码 when(schSettingsService.readThemeWithFallback(3)) - .thenReturn(new ISchSettingsService.LayerValue("ink|0|1|1", 0)); + .thenReturn(new ISchSettingsService.LayerValue("{\"theme\":\"ink\",\"sideDeep\":false,\"gradOn\":true,\"sideFollow\":false}", 0)); when(schSettingsService.readAvatarWithFallback(3)) .thenReturn(new ISchSettingsService.LayerValue("text", 3)); when(logoRepository.findBySchIdAndType(any(), any())).thenReturn(Collections.emptyList()); Map out = service.getEffectiveAppearance(10133); - assertEquals("ink|0|1|1", out.get("theme"), "本校空回落平台档(hitSchId=0)"); + assertEquals("ink|0|1|0", out.get("theme"), "级联 JSON 转紧凑编码,init 侧才可收敛"); assertEquals("text", out.get("avatar"), "本校已配直接生效(hitSchId=本校)"); // 出参只三字段,不外露 my/sch 拆分 assertTrue(out.containsKey("theme") && out.containsKey("avatar") && out.containsKey("logoUrl"));