Просмотр исходного кода

feat(backend): ReportBlock 实体/Mapper/Service(blocks upsert + 读取)

Xiaogang Liao 1 месяц назад
Родитель
Сommit
45f916bfdb

+ 24 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/ReportBlock.java

@@ -0,0 +1,24 @@
+package com.etotem.cfc.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("report_blocks")
+public class ReportBlock implements Serializable {
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    /** 报告类型: gut_flora/dan/physical_exam/tongue */
+    private String reportType;
+    /** 各类型报告主键ID */
+    private Long reportId;
+    /** 块数组 JSON 字符串 */
+    private String blocks;
+    private Integer version;
+    private Date createdAt;
+    private Date updatedAt;
+}

+ 9 - 0
cfc-backend/src/main/java/com/etotem/cfc/mapper/ReportBlockMapper.java

@@ -0,0 +1,9 @@
+package com.etotem.cfc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.etotem.cfc.entity.ReportBlock;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface ReportBlockMapper extends BaseMapper<ReportBlock> {
+}

+ 72 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/ReportBlockService.java

@@ -0,0 +1,72 @@
+package com.etotem.cfc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.etotem.cfc.entity.ReportBlock;
+import com.etotem.cfc.mapper.ReportBlockMapper;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class ReportBlockService {
+
+    @Resource
+    private ReportBlockMapper reportBlockMapper;
+
+    private final ObjectMapper objectMapper = new ObjectMapper();
+
+    /** 保存或覆盖 blocks(幂等 upsert) */
+    public void save(String reportType, Long reportId, List<Map<String, Object>> blocks) {
+        if (blocks == null || blocks.isEmpty()) return;
+        try {
+            ReportBlock existing = reportBlockMapper.selectOne(
+                    new LambdaQueryWrapper<ReportBlock>()
+                            .eq(ReportBlock::getReportType, reportType)
+                            .eq(ReportBlock::getReportId, reportId));
+            String json = objectMapper.writeValueAsString(blocks);
+            Date now = new Date();
+            if (existing != null) {
+                existing.setBlocks(json);
+                existing.setVersion(existing.getVersion() == null ? 1 : existing.getVersion() + 1);
+                existing.setUpdatedAt(now);
+                reportBlockMapper.updateById(existing);
+            } else {
+                ReportBlock nb = new ReportBlock();
+                nb.setReportType(reportType);
+                nb.setReportId(reportId);
+                nb.setBlocks(json);
+                nb.setVersion(1);
+                nb.setCreatedAt(now);
+                nb.setUpdatedAt(now);
+                reportBlockMapper.insert(nb);
+            }
+        } catch (Exception e) {
+            log.warn("保存report_blocks失败 type={} reportId={}: {}", reportType, reportId, e.getMessage());
+        }
+    }
+
+    /** 读取 blocks,无记录返回空列表 */
+    public List<Map<String, Object>> getBlocks(String reportType, Long reportId) {
+        try {
+            ReportBlock existing = reportBlockMapper.selectOne(
+                    new LambdaQueryWrapper<ReportBlock>()
+                            .eq(ReportBlock::getReportType, reportType)
+                            .eq(ReportBlock::getReportId, reportId));
+            if (existing == null || existing.getBlocks() == null || existing.getBlocks().isEmpty()) {
+                return new ArrayList<>();
+            }
+            return objectMapper.readValue(existing.getBlocks(), new TypeReference<List<Map<String, Object>>>() {});
+        } catch (Exception e) {
+            log.warn("读取report_blocks失败 type={} reportId={}: {}", reportType, reportId, e.getMessage());
+            return new ArrayList<>();
+        }
+    }
+}