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 pageTestItemData(Page page, TestItemDataDto dto) { Page result = testItemDataMapper.pageTestItemData(page, dto); // 处理检测结果名称 List records = result.getRecords(); for (TestItemDataVo vo : records) { vo.setInsResultName(formatInsResult(vo.getInsResult())); } return result; } @Override public List getDetail(Long sampleId) { List list = testItemDataMapper.getDetail(sampleId); for (TestItemDataVo vo : list) { vo.setInsResultName(formatInsResult(vo.getInsResult())); } return list; } @Override public Map compare(TestItemDataDto dto) { if (CollectionUtils.isEmpty(dto.getSampleIds())) { return new HashMap<>(); } // 查询数据 List dataList = testItemDataMapper.listBySampleIds(dto.getSampleIds()); // 获取所有检测项名称 List itemNames = dataList.stream() .map(TestItemDataVo::getItemName) .distinct() .sorted() .collect(Collectors.toList()); // 按样品分组 Map> sampleMap = dataList.stream() .collect(Collectors.groupingBy(TestItemDataVo::getSampleId)); // 构建比较数据 List> compareList = new ArrayList<>(); for (Long sampleId : dto.getSampleIds()) { Map row = new HashMap<>(); List 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 match = sampleData.stream() .filter(v -> v.getItemName().equals(itemName)) .findFirst(); row.put(itemName, match.map(TestItemDataVo::getLastValue).orElse(null)); } compareList.add(row); } Map result = new HashMap<>(); result.put("itemNames", itemNames); result.put("compareList", compareList); return result; } @Override public void exportTestItemData(TestItemDataDto dto, HttpServletResponse response) { try { // 查询全部数据 Page page = new Page<>(); page.setSize(Long.MAX_VALUE); Page result = testItemDataMapper.pageTestItemData(page, dto); // 处理数据 List 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 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 ""; } }