package jnpf.limsController; import cn.dev33.satoken.annotation.SaCheckLogin; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jnpf.base.DictionaryDataApi; import jnpf.base.entity.DictionaryDataEntity; import jnpf.base.vo.DownloadVO; import jnpf.constant.FileTypeConstant; import jnpf.exception.DataException; import jnpf.file.FileUploadApi; import jnpf.limsEntity.LimsWendingxingFenxiDataVo; import jnpf.limsEntity.LimsWendingxingFenxiOptionsVo; import jnpf.limsEntity.LimsWendingxingFenxiParam; import jnpf.limsEntity.LimsWendingxingFenxiRowVo; import jnpf.limsController.export.LimsWendingxingFenxiWorkbookBuilder; import jnpf.limsService.LimsWendingxingFenxiService; import jnpf.util.R; import jnpf.util.ExcelUtil; import jnpf.util.UploaderUtil; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.Workbook; import org.dromara.x.file.storage.core.FileInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.text.SimpleDateFormat; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.UUID; @Slf4j @Tag(name = "lims稳定性数据分析", description = "") @RestController @SaCheckLogin @RequestMapping("/lims/biz/wendingxing/fenxi") public class LimsWendingxingFenxiController { @Autowired private LimsWendingxingFenxiService fenxiService; @Autowired private FileUploadApi fileUploadApi; @Autowired private DictionaryDataApi dictionaryDataApi; private final LimsWendingxingFenxiWorkbookBuilder workbookBuilder = new LimsWendingxingFenxiWorkbookBuilder(); @Operation(summary = "稳定性分析筛选选项") @PostMapping("/options") public R options( @RequestBody(required = false) LimsWendingxingFenxiParam param) { try { return R.success(fenxiService.listOptions( param == null ? new LimsWendingxingFenxiParam() : param)); } catch (DataException e) { return R.error(e.getMessage()); } } @Operation(summary = "稳定性分析数据") @PostMapping("/data") public R data(@RequestBody LimsWendingxingFenxiParam param) { String error = validateRequired(param); if (error != null) { return R.error(error); } try { return R.success(fenxiService.listData(param)); } catch (DataException e) { return R.error(e.getMessage()); } } @Operation(summary = "导出稳定性数据分析表") @PostMapping("/export") public R export(@RequestBody LimsWendingxingFenxiParam param) { String error = validateRequired(param); if (error != null) { return R.error(error); } try { List rows = fenxiService.listData(param).getRows(); if (rows.isEmpty()) { throw new DataException("当前筛选条件没有可导出的已审核数据"); } String suffix = UUID.randomUUID().toString().replace("-", "").substring(0, 8); String fileName = "稳定性数据分析表_" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + "_" + suffix + ".xls"; FileInfo fileInfo; try (Workbook workbook = workbookBuilder.build(rows, listPeriodUnits())) { MultipartFile multipartFile = ExcelUtil.workbookToCommonsMultipartFile(workbook, fileName); fileInfo = fileUploadApi.uploadFile( multipartFile, FileTypeConstant.TEMPORARY, fileName); } if (fileInfo == null || !StringUtils.hasText(fileInfo.getFilename())) { throw new DataException("稳定性数据分析表上传文件服务失败"); } DownloadVO download = DownloadVO.builder() .name(fileName) .url(UploaderUtil.uploaderFile( fileInfo.getFilename() + "#" + FileTypeConstant.TEMPORARY)) .build(); return R.success(download); } catch (DataException e) { return R.error(e.getMessage()); } catch (Exception e) { log.error("稳定性数据分析表导出失败", e); return R.error("稳定性数据分析表导出失败"); } } private List listPeriodUnits() { try { List units = dictionaryDataApi.getListByCode("zhouqiDanwei"); return units == null ? Collections.emptyList() : units; } catch (Exception e) { log.warn("读取周期单位字典 zhouqiDanwei 失败,导出保留原始编码", e); return Collections.emptyList(); } } private String validateRequired(LimsWendingxingFenxiParam param) { if (param == null) { return "请求参数不能为空"; } if (!StringUtils.hasText(param.getFenleiBianma())) { return "分类不能为空"; } if (!StringUtils.hasText(param.getYangpinId())) { return "品名不能为空"; } if (param.getXiangmuIds() == null || param.getXiangmuIds().isEmpty()) { return "检验项目不能为空"; } return null; } }