Browse Source

fix(exam-sprint): 调整成果报告命中率与学习效率精度

金逸霄 1 week ago
parent
commit
9a406bdf11

+ 6 - 2
abilities/exam-sprint/application/src/main/java/cn/yunzhixue/ability/center/examsprint/application/report/AchievementReportContentMapper.java

@@ -82,14 +82,18 @@ final class AchievementReportContentMapper {
     }
     }
 
 
     private static String masteryHitRateText(BigDecimal paperMasteryHitRate) {
     private static String masteryHitRateText(BigDecimal paperMasteryHitRate) {
-        return format(paperMasteryHitRate) + "%";
+        return formatTwoDecimals(paperMasteryHitRate) + "%";
     }
     }
 
 
     private static String learningEfficiencyText(BigDecimal paperMasteryHitRate) {
     private static String learningEfficiencyText(BigDecimal paperMasteryHitRate) {
         BigDecimal derivedEfficiency = paperMasteryHitRate
         BigDecimal derivedEfficiency = paperMasteryHitRate
                 .divide(BigDecimal.valueOf(100), 8, RoundingMode.HALF_UP)
                 .divide(BigDecimal.valueOf(100), 8, RoundingMode.HALF_UP)
                 .divide(new BigDecimal("0.04"), 6, RoundingMode.HALF_UP);
                 .divide(new BigDecimal("0.04"), 6, RoundingMode.HALF_UP);
-        return format(derivedEfficiency);
+        return formatTwoDecimals(derivedEfficiency);
+    }
+
+    private static String formatTwoDecimals(BigDecimal value) {
+        return value.setScale(2, RoundingMode.HALF_UP).stripTrailingZeros().toPlainString();
     }
     }
 
 
     private static List<String> hitWords(List<JsonNode> improvedWords) {
     private static List<String> hitWords(List<JsonNode> improvedWords) {

+ 2 - 2
abilities/exam-sprint/application/src/test/java/cn/yunzhixue/ability/center/examsprint/application/report/AchievementReportContentMapperTest.java

@@ -26,7 +26,7 @@ class AchievementReportContentMapperTest {
         assertThat(content.summaryMetrics().vocabularyGrowthText()).isEqualTo("+19");
         assertThat(content.summaryMetrics().vocabularyGrowthText()).isEqualTo("+19");
         assertThat(content.summaryMetrics().paperKnownWordsGrowthText()).isEqualTo("+4");
         assertThat(content.summaryMetrics().paperKnownWordsGrowthText()).isEqualTo("+4");
         assertThat(content.summaryMetrics().unknownWordHitRateText()).isEqualTo("1.93%");
         assertThat(content.summaryMetrics().unknownWordHitRateText()).isEqualTo("1.93%");
-        assertThat(content.summaryMetrics().learningEfficiencyText()).isEqualTo("0.4825");
+        assertThat(content.summaryMetrics().learningEfficiencyText()).isEqualTo("0.48");
         assertThat(content.vocabularyComparison().beforeValue()).isEqualTo(2328.0);
         assertThat(content.vocabularyComparison().beforeValue()).isEqualTo(2328.0);
         assertThat(content.vocabularyComparison().afterText()).isEqualTo("2347");
         assertThat(content.vocabularyComparison().afterText()).isEqualTo("2347");
         assertThat(content.vocabularyComparison().growthText()).isEqualTo("+19");
         assertThat(content.vocabularyComparison().growthText()).isEqualTo("+19");
@@ -46,7 +46,7 @@ class AchievementReportContentMapperTest {
         assertThat(content.testPaperVocabularySummary().masteryRateAfterText()).isEqualTo("75.96");
         assertThat(content.testPaperVocabularySummary().masteryRateAfterText()).isEqualTo("75.96");
         assertThat(content.testPaperVocabularySummary().masteryRateImprovementText()).isEqualTo("+0.62");
         assertThat(content.testPaperVocabularySummary().masteryRateImprovementText()).isEqualTo("+0.62");
         assertThat(content.examUnknownWordsHitStatus().unknownWordHitRateText()).isEqualTo("1.93%");
         assertThat(content.examUnknownWordsHitStatus().unknownWordHitRateText()).isEqualTo("1.93%");
-        assertThat(content.examUnknownWordsHitStatus().learningEfficiencyText()).isEqualTo("0.4825");
+        assertThat(content.examUnknownWordsHitStatus().learningEfficiencyText()).isEqualTo("0.48");
         assertThat(content.examUnknownWordsHitStatus().unknownWordsBeforeText()).isEqualTo("207");
         assertThat(content.examUnknownWordsHitStatus().unknownWordsBeforeText()).isEqualTo("207");
         assertThat(content.examUnknownWordsHitStatus().unknownWordsAfterText()).isEqualTo("203");
         assertThat(content.examUnknownWordsHitStatus().unknownWordsAfterText()).isEqualTo("203");
         assertThat(content.examUnknownWordsHitStatus().reducedUnknownWordsText()).isEqualTo("4");
         assertThat(content.examUnknownWordsHitStatus().reducedUnknownWordsText()).isEqualTo("4");

+ 8 - 8
abilities/exam-sprint/application/src/test/java/cn/yunzhixue/ability/center/examsprint/application/report/ExamSprintReportApplicationServiceTest.java

@@ -347,7 +347,7 @@ class ExamSprintReportApplicationServiceTest {
         assertThat(content.summaryMetrics().vocabularyGrowthText()).isEqualTo("+19");
         assertThat(content.summaryMetrics().vocabularyGrowthText()).isEqualTo("+19");
         assertThat(content.summaryMetrics().paperKnownWordsGrowthText()).isEqualTo("+4");
         assertThat(content.summaryMetrics().paperKnownWordsGrowthText()).isEqualTo("+4");
         assertThat(content.summaryMetrics().unknownWordHitRateText()).isEqualTo("1.93%");
         assertThat(content.summaryMetrics().unknownWordHitRateText()).isEqualTo("1.93%");
-        assertThat(content.summaryMetrics().learningEfficiencyText()).isEqualTo("0.4825");
+        assertThat(content.summaryMetrics().learningEfficiencyText()).isEqualTo("0.48");
         assertThat(content.stageVocabularySummary().stageName()).isEqualTo("高考");
         assertThat(content.stageVocabularySummary().stageName()).isEqualTo("高考");
         assertThat(content.stageVocabularySummary().stageVocabularyText()).isEqualTo("3500");
         assertThat(content.stageVocabularySummary().stageVocabularyText()).isEqualTo("3500");
         assertThat(content.stageVocabularySummary().masteryImprovementText()).isEqualTo("+0.55");
         assertThat(content.stageVocabularySummary().masteryImprovementText()).isEqualTo("+0.55");
@@ -355,7 +355,7 @@ class ExamSprintReportApplicationServiceTest {
         assertThat(content.testPaperVocabularySummary().testPaperWordCountText()).isEqualTo("861");
         assertThat(content.testPaperVocabularySummary().testPaperWordCountText()).isEqualTo("861");
         assertThat(content.testPaperVocabularySummary().masteryRateImprovementText()).isEqualTo("+0.62");
         assertThat(content.testPaperVocabularySummary().masteryRateImprovementText()).isEqualTo("+0.62");
         assertThat(content.examUnknownWordsHitStatus().unknownWordHitRateText()).isEqualTo("1.93%");
         assertThat(content.examUnknownWordsHitStatus().unknownWordHitRateText()).isEqualTo("1.93%");
-        assertThat(content.examUnknownWordsHitStatus().learningEfficiencyText()).isEqualTo("0.4825");
+        assertThat(content.examUnknownWordsHitStatus().learningEfficiencyText()).isEqualTo("0.48");
         assertThat(content.examUnknownWordsHitStatus().hitWords())
         assertThat(content.examUnknownWordsHitStatus().hitWords())
                 .containsExactly("number", "bear", "popular", "importance");
                 .containsExactly("number", "bear", "popular", "importance");
     }
     }
@@ -395,9 +395,9 @@ class ExamSprintReportApplicationServiceTest {
 
 
         AchievementReportContent content = (AchievementReportContent) repository.findById(response.reportId()).orElseThrow().content();
         AchievementReportContent content = (AchievementReportContent) repository.findById(response.reportId()).orElseThrow().content();
         assertThat(content.summaryMetrics().unknownWordHitRateText()).isEqualTo("77.77%");
         assertThat(content.summaryMetrics().unknownWordHitRateText()).isEqualTo("77.77%");
-        assertThat(content.summaryMetrics().learningEfficiencyText()).isEqualTo("19.4425");
+        assertThat(content.summaryMetrics().learningEfficiencyText()).isEqualTo("19.44");
         assertThat(content.examUnknownWordsHitStatus().unknownWordHitRateText()).isEqualTo("77.77%");
         assertThat(content.examUnknownWordsHitStatus().unknownWordHitRateText()).isEqualTo("77.77%");
-        assertThat(content.examUnknownWordsHitStatus().learningEfficiencyText()).isEqualTo("19.4425");
+        assertThat(content.examUnknownWordsHitStatus().learningEfficiencyText()).isEqualTo("19.44");
     }
     }
 
 
     /** 覆盖成果报告学习效率口径场景,当词数比例与 PaperMasteryHitRate 不一致时,应按 PaperMasteryHitRate 除以 0.04 计算。 */
     /** 覆盖成果报告学习效率口径场景,当词数比例与 PaperMasteryHitRate 不一致时,应按 PaperMasteryHitRate 除以 0.04 计算。 */
@@ -413,10 +413,10 @@ class ExamSprintReportApplicationServiceTest {
         var response = service.createAchievementReport(payload);
         var response = service.createAchievementReport(payload);
 
 
         AchievementReportContent content = (AchievementReportContent) repository.findById(response.reportId()).orElseThrow().content();
         AchievementReportContent content = (AchievementReportContent) repository.findById(response.reportId()).orElseThrow().content();
-        assertThat(content.summaryMetrics().unknownWordHitRateText()).isEqualTo("33.333333%");
-        assertThat(content.summaryMetrics().learningEfficiencyText()).isEqualTo("8.333333");
-        assertThat(content.examUnknownWordsHitStatus().unknownWordHitRateText()).isEqualTo("33.333333%");
-        assertThat(content.examUnknownWordsHitStatus().learningEfficiencyText()).isEqualTo("8.333333");
+        assertThat(content.summaryMetrics().unknownWordHitRateText()).isEqualTo("33.33%");
+        assertThat(content.summaryMetrics().learningEfficiencyText()).isEqualTo("8.33");
+        assertThat(content.examUnknownWordsHitStatus().unknownWordHitRateText()).isEqualTo("33.33%");
+        assertThat(content.examUnknownWordsHitStatus().learningEfficiencyText()).isEqualTo("8.33");
     }
     }
 
 
     /** 覆盖成果报告调用方 PascalCase 类型边界场景,当核心数字字段为 string 时,应在保存前校验失败。 */
     /** 覆盖成果报告调用方 PascalCase 类型边界场景,当核心数字字段为 string 时,应在保存前校验失败。 */