package com.ruoyi.manage.excel; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.manage.service.ManageDocumentControlledService; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; /** * 文件受控申请批量导入 */ public class ManageDocumentControlledImportListener extends AnalysisEventListener { private static final List HEADERS = Arrays.asList("文件名称", "文件版本", "发布日期", "实施日期"); private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-M-d"); private final ManageDocumentControlledService manageDocumentControlledService; private final List rows = new ArrayList<>(); public ManageDocumentControlledImportListener(ManageDocumentControlledService manageDocumentControlledService) { this.manageDocumentControlledService = manageDocumentControlledService; } @Override public void invoke(ManageDocumentControlledImportDto data, AnalysisContext context) { if (isBlankRow(data)) { return; } int rowNum = context.readRowHolder().getRowIndex() + 1; if (!StringUtils.hasText(data.getName())) { throw new BaseException("第" + rowNum + "行:文件名称不能为空"); } data.setPublishDateValue(parseDate(data.getPublishDate(), rowNum, "发布日期")); data.setImplementDateValue(parseDate(data.getImplementDate(), rowNum, "实施日期")); rows.add(data); } private LocalDate parseDate(String value, int rowNum, String column) { if (!StringUtils.hasText(value)) { return null; } String text = value.trim(); int space = text.indexOf(' '); if (space > 0) { text = text.substring(0, space); } text = text.replace("年", "-").replace("月", "-").replace("日", "") .replace("/", "-").replace(".", "-"); try { // Excel 里日期单元格可能被读成数字序列(1899-12-30 起算) if (text.matches("\\d{5}(\\.\\d+)?")) { return LocalDate.of(1899, 12, 30).plusDays((long) Double.parseDouble(text)); } return LocalDate.parse(text, DATE_FORMAT); } catch (Exception e) { throw new BaseException("第" + rowNum + "行:" + column + "格式不正确,请按 yyyy-MM-dd 填写"); } } @Override public void doAfterAllAnalysed(AnalysisContext context) { if (rows.isEmpty()) { throw new BaseException("导入数据不得为空"); } manageDocumentControlledService.importManageDocumentControlled(rows); } @Override public void invokeHeadMap(Map headMap, AnalysisContext context) { if (CollectionUtils.isEmpty(headMap) || headMap.size() != HEADERS.size()) { throw new BaseException("导入模板有误,请使用最新模板"); } for (int i = 0; i < HEADERS.size(); i++) { String head = headMap.get(i); if (head == null || !HEADERS.get(i).equals(head.trim())) { throw new BaseException("导入模板有误,表头必须为:文件名称、文件版本、发布日期、实施日期"); } } } private boolean isBlankRow(ManageDocumentControlledImportDto data) { return data == null || (!StringUtils.hasText(data.getName()) && !StringUtils.hasText(data.getVersion()) && !StringUtils.hasText(data.getPublishDate()) && !StringUtils.hasText(data.getImplementDate())); } }