Browse Source

feat(indicators): getLatestIndicatorsByDomain 返回 delta/trend/trendDesc

- value 无观测时回退到 member_indicator_current(B方案 diff 表)
- 附加 previousValue/delta/trend/trendDesc(较上次±x, stripTrailingZeros 去尾零)
- MemberIndicatorCurrentService 加 getByMemberAndDefinition
Xiaogang Liao 1 week ago
parent
commit
9eb2ad8d0e

+ 26 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/HealthReportService.java

@@ -2162,6 +2162,11 @@ public class HealthReportService {
              .orderByDesc(IndicatorValue::getRecordedAt)
              .last("LIMIT 1");
             IndicatorValue latest = indicatorValueMapper.selectOne(w);
+            // B方案 diff:member_indicator_current(member_id+definition_id 唯一)
+            com.etotem.cfc.entity.MemberIndicatorCurrent mic = null;
+            try {
+                mic = memberIndicatorCurrentService.getByMemberAndDefinition(memberId, def.getId());
+            } catch (Exception ignore) { }
             Map<String, Object> item = new HashMap<>();
             item.put("code", def.getCode());
             item.put("name", def.getName());
@@ -2173,12 +2178,33 @@ public class HealthReportService {
                 item.put("numericValue", latest.getNumericValue() != null ? latest.getNumericValue().doubleValue() : null);
                 item.put("remark", latest.getRemark());
                 item.put("recordedAt", latest.getRecordedAt());
+            } else if (mic != null) {
+                // indicator_values 无观测行时回退到 member_indicator_current(B方案 diff 表)
+                item.put("value", mic.getValue());
+                item.put("numericValue", mic.getNumericValue() != null ? mic.getNumericValue().doubleValue() : null);
+                item.put("remark", null);
+                item.put("recordedAt", mic.getUpdatedAt());
             } else {
                 item.put("value", null);
                 item.put("numericValue", null);
                 item.put("remark", null);
                 item.put("recordedAt", null);
             }
+            if (mic != null) {
+                item.put("previousValue", mic.getPreviousValue());
+                java.math.BigDecimal delta = mic.getDelta();
+                item.put("delta", delta != null ? delta.doubleValue() : null);
+                item.put("trend", mic.getTrend());
+                // trendDesc: 前端展示"较上次 ±x"
+                if (delta != null && delta.compareTo(java.math.BigDecimal.ZERO) != 0) {
+                    String arrow = delta.signum() > 0 ? "+" : "";
+                    // stripTrailingZeros: 去掉 decimal(12,4) 带来的尾零 (如 -9.0000 -> -9)
+                    String plain = delta.stripTrailingZeros().toPlainString();
+                    item.put("trendDesc", "较上次 " + arrow + plain);
+                } else {
+                    item.put("trendDesc", "");
+                }
+            }
             result.add(item);
         }
         return result;

+ 4 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/MemberIndicatorCurrentService.java

@@ -16,6 +16,10 @@ public class MemberIndicatorCurrentService {
     @Resource
     private MemberIndicatorCurrentMapper mapper;
 
+    public MemberIndicatorCurrent getByMemberAndDefinition(Long memberId, Long definitionId) {
+        return mapper.selectByMemberAndDefinition(memberId, definitionId);
+    }
+
     public List<MemberIndicatorCurrent> getByMemberAndDomain(Long memberId, String domain) {
         return mapper.selectByMemberAndDomain(memberId, domain);
     }