huminmin
2026-06-05 24019a8c1d8e78656e85b29ee7be223e0dd253a0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package com.ruoyi.report.service.impl;
 
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.report.dto.TestItemDataDto;
import com.ruoyi.report.mapper.TestItemDataMapper;
import com.ruoyi.report.service.TestItemDataService;
import com.ruoyi.report.vo.TestItemDataVo;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
 
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
 
/**
 * 检测项目数据服务实现
 */
@Service
@AllArgsConstructor
public class TestItemDataServiceImpl implements TestItemDataService {
 
    private TestItemDataMapper testItemDataMapper;
 
    @Override
    public Page<TestItemDataVo> pageTestItemData(Page page, TestItemDataDto dto) {
        Page<TestItemDataVo> result = testItemDataMapper.pageTestItemData(page, dto);
        // 处理检测结果名称
        List<TestItemDataVo> records = result.getRecords();
        for (TestItemDataVo vo : records) {
            vo.setInsResultName(formatInsResult(vo.getInsResult()));
        }
        return result;
    }
 
    @Override
    public List<TestItemDataVo> getDetail(Long sampleId) {
        List<TestItemDataVo> list = testItemDataMapper.getDetail(sampleId);
        for (TestItemDataVo vo : list) {
            vo.setInsResultName(formatInsResult(vo.getInsResult()));
        }
        return list;
    }
 
    @Override
    public Map<String, Object> compare(TestItemDataDto dto) {
        if (CollectionUtils.isEmpty(dto.getSampleIds())) {
            return new HashMap<>();
        }
 
        // 查询数据
        List<TestItemDataVo> dataList = testItemDataMapper.listBySampleIds(dto.getSampleIds());
 
        // 获取所有检测项名称
        List<String> itemNames = dataList.stream()
                .map(TestItemDataVo::getItemName)
                .distinct()
                .sorted()
                .collect(Collectors.toList());
 
        // 按样品分组
        Map<Long, List<TestItemDataVo>> sampleMap = dataList.stream()
                .collect(Collectors.groupingBy(TestItemDataVo::getSampleId));
 
        // 构建比较数据
        List<Map<String, Object>> compareList = new ArrayList<>();
        for (Long sampleId : dto.getSampleIds()) {
            Map<String, Object> row = new HashMap<>();
            List<TestItemDataVo> sampleData = sampleMap.getOrDefault(sampleId, new ArrayList<>());
 
            // 获取样品信息
            if (CollectionUtil.isNotEmpty(sampleData)) {
                TestItemDataVo first = sampleData.get(0);
                row.put("sampleCode", first.getSampleCode());
                row.put("sampleName", first.getSampleName());
                row.put("batchNo", first.getBatchNo());
            }
 
            // 填充检测项值
            for (String itemName : itemNames) {
                Optional<TestItemDataVo> match = sampleData.stream()
                        .filter(v -> v.getItemName().equals(itemName))
                        .findFirst();
                row.put(itemName, match.map(TestItemDataVo::getLastValue).orElse(null));
            }
 
            compareList.add(row);
        }
 
        Map<String, Object> result = new HashMap<>();
        result.put("itemNames", itemNames);
        result.put("compareList", compareList);
        return result;
    }
 
    @Override
    public void exportTestItemData(TestItemDataDto dto, HttpServletResponse response) {
        try {
            // 查询全部数据
            Page<TestItemDataVo> page = new Page<>();
            page.setSize(Long.MAX_VALUE);
            Page<TestItemDataVo> result = testItemDataMapper.pageTestItemData(page, dto);
 
            // 处理数据
            List<TestItemDataVo> records = result.getRecords();
            for (TestItemDataVo vo : records) {
                vo.setInsResultName(formatInsResult(vo.getInsResult()));
            }
 
            // 设置响应头
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            String fileName = "检测项目数据_" + DateUtil.format(new Date(), "yyyyMMddHHmmss");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
 
            // 使用EasyExcel导出
            EasyExcel.write(response.getOutputStream(), TestItemDataVo.class)
                    .sheet("检测项目数据")
                    .doWrite(records);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    @Override
    public List<String> getItemNames(TestItemDataDto dto) {
        return testItemDataMapper.getItemNames(dto);
    }
 
    /**
     * 格式化检测结果
     */
    private String formatInsResult(Integer val) {
        if (val == null) return "";
        if (val == 1) return "合格";
        if (val == 0) return "不合格";
        return "";
    }
 
}