From 3e81d49b647af443ef33d0a93532c6e1cf4d384e Mon Sep 17 00:00:00 2001 From: lihongjie0209 Date: Thu, 4 Apr 2024 14:08:05 +0800 Subject: [PATCH] bugfix --- pom.xml | 10 + .../cn/lihongjie/coal/common/ExcelUtils.java | 411 ++++++++++++++++++ .../cn/lihongjie/coal/common/TreeUtils.java | 5 + .../repository/DepartmentRepository.java | 3 +- .../department/service/DepartmentService.java | 9 + .../dictionary/service/DictionaryService.java | 16 + .../controller/EmployeeController.java | 18 + .../dto/ImportEmpFromExcelRequest.java | 13 + .../employee/service/EmployeeService.java | 122 +++++- .../coal/file/service/FileService.java | 108 +++-- .../jobPost/repository/JobPostRepository.java | 4 +- .../coal/jobPost/service/JobPostService.java | 9 + 12 files changed, 679 insertions(+), 49 deletions(-) create mode 100644 src/main/java/cn/lihongjie/coal/common/ExcelUtils.java create mode 100644 src/main/java/cn/lihongjie/coal/employee/dto/ImportEmpFromExcelRequest.java diff --git a/pom.xml b/pom.xml index dd242eac..f3245c83 100644 --- a/pom.xml +++ b/pom.xml @@ -51,6 +51,16 @@ + + org.apache.poi + poi + 5.2.0 + + + org.apache.poi + poi-ooxml + 5.2.0 + org.springframework.boot spring-boot-starter-amqp diff --git a/src/main/java/cn/lihongjie/coal/common/ExcelUtils.java b/src/main/java/cn/lihongjie/coal/common/ExcelUtils.java new file mode 100644 index 00000000..6d266581 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/common/ExcelUtils.java @@ -0,0 +1,411 @@ +package cn.lihongjie.coal.common; + +import com.google.common.base.Splitter; + +import io.vavr.Function2; + +import jakarta.servlet.http.HttpServletResponse; + +import lombok.experimental.UtilityClass; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.formula.functions.T; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.ss.util.CellReference; +import org.apache.poi.xssf.usermodel.*; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.function.Function; +import java.util.function.Supplier; + +@UtilityClass +public class ExcelUtils { + + public static String getCode(Object value) { + if (value == null) { + return null; + } + if (value instanceof String) { + return Splitter.on("-") + .trimResults() + .omitEmptyStrings() + .splitToList((String) value) + .get(0); + } + return value.toString(); + } + + public static LocalDate getLocalDate(Object value) { + + + if (value == null) { + return null; + } + if (value instanceof LocalDate) { + return (LocalDate) value; + } + if (value instanceof Date) { + return ((Date) value).toInstant().atZone(TimeZone.getDefault().toZoneId()).toLocalDate(); + } + if (value instanceof LocalDateTime) { + return ((LocalDateTime) value).toLocalDate(); + } + if (value instanceof Number) { + return LocalDate.ofEpochDay(((Number) value).longValue()); + } + if (value instanceof String) { + return LocalDate.parse((String) value); + } + return null; + + } + + public static List readFirstSheetToObjectList( + InputStream inputStream, + Supplier objectCreator, + CellValueToObjectSetter valueSetter) { + ArrayList ans = new ArrayList<>(); + readFirstSheet( + inputStream, + row -> { + return objectCreator.get(); + }, + (headerCell, dataCell, object, value) -> { + valueSetter.set(headerCell.getStringCellValue(), (T) object, value); + }); + return ans; + } + + public static void readFirstSheet( + InputStream inputStream, + Function rowMapper, + CellValueHandler cellValueHandler) { + + try (Workbook workbook = WorkbookFactory.create(inputStream)) { + Sheet sheet = workbook.getSheetAt(0); + Row headerRow = sheet.getRow(0); + + for (int i = 1; i <= sheet.getLastRowNum(); i++) { + Row row = sheet.getRow(i); + + if (row == null) { + continue; + } + Object object = rowMapper.apply(row); + + for (int j = 0; j < headerRow.getLastCellNum(); j++) { + Cell cell = row.getCell(j); + if (cell == null) { + continue; + } + Object value = null; + switch (cell.getCellType()) { + case STRING: + { + value = cell.getStringCellValue(); + break; + } + case NUMERIC: + { + + if (DateUtil.isCellDateFormatted(cell)) { + value = cell.getDateCellValue(); + } else { + + value = cell.getNumericCellValue(); + } + break; + } + case BOOLEAN: + { + value = cell.getBooleanCellValue(); + break; + } + case FORMULA: + { + switch (cell.getCachedFormulaResultType()) { + case STRING: + { + value = cell.getStringCellValue(); + break; + } + case NUMERIC: + { + value = cell.getNumericCellValue(); + break; + } + case BOOLEAN: + { + value = cell.getBooleanCellValue(); + break; + } + case BLANK, ERROR, _NONE: + { + value = null; + break; + } + } + break; + } + case BLANK, ERROR, _NONE: + { + value = null; + break; + } + } + + cellValueHandler.handle(headerRow.getCell(j), cell, object, value); + } + } + + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static void genSingleSheetToHttp( + String wbName, + List headers, + HeaderCellCustomizer headerCellCustomizer, + HttpServletResponse response) { + genSingleSheetToHttp( + wbName, + null, + headers, + headerCellCustomizer, + Collections.emptyList(), + null, + response); + } + + public static void genSingleSheetToHttp( + String wbName, + String sheetName, + List headers, + HeaderCellCustomizer headerCellCustomizer, + Iterable data, + Function2 valueGetter, + HttpServletResponse response) { + genSingleSheet( + wbName, + sheetName, + headers, + headerCellCustomizer, + data, + valueGetter, + WorkbookConsumer.httpResponseConsumer(response)); + } + + public static void genSingleSheet( + String wbName, + String sheetName, + List headers, + HeaderCellCustomizer headerCellCustomizer, + Iterable data, + Function2 valueGetter, + WorkbookConsumer workbookConsumer) { + genSingleSheet( + wbName, + sheetName, + headers, + headerCellCustomizer, + data, + valueGetter, + null, + workbookConsumer); + } + + public static void genSingleSheet( + String wbName, + String sheetName, + List headers, + HeaderCellCustomizer headerCellCustomizer, + Iterable data, + Function2 valueGetter, + DataCellCustomizer dataCellCustomizer, + WorkbookConsumer workbookConsumer) { + + try (Workbook workbook = new XSSFWorkbook()) { + + Sheet sheet = + StringUtils.isEmpty(sheetName) + ? workbook.createSheet() + : workbook.createSheet(sheetName); + + Row headerRow = sheet.createRow(0); + for (int i = 0, headersSize = headers.size(); i < headersSize; i++) { + String header = headers.get(i); + + Cell cell = headerRow.createCell(i); + cell.setCellValue(header); + if (headerCellCustomizer != null) { + + headerCellCustomizer.customize(header, cell); + } + } + + int rowNum = 1; + + for (Object d : data) { + Row row = sheet.createRow(rowNum++); + for (int i = 0, headersSize = headers.size(); i < headersSize; i++) { + String header = headers.get(i); + Cell cell = row.createCell(i); + Object value = valueGetter == null ? null : valueGetter.apply(header, d); + + if (value == null) { + + cell.setBlank(); + } else if (value instanceof CharSequence) { + cell.setCellValue(value.toString()); + } else if (value instanceof Number) { + cell.setCellValue(((Number) value).doubleValue()); + } else if (value instanceof Date) { + cell.setCellValue((Date) value); + } else if (value instanceof Boolean) { + cell.setCellValue((Boolean) value); + } else if (value instanceof LocalDateTime) { + + cell.setCellValue((LocalDateTime) value); + } else if (value instanceof LocalDate) { + + cell.setCellValue((LocalDate) value); + } else if (value instanceof Calendar) { + cell.setCellValue((Calendar) value); + } else { + + if (value instanceof Iterable) { + List list = new ArrayList<>(); + for (Object o : (Iterable) value) { + list.add(o.toString()); + } + cell.setCellValue(String.join(",", list)); + } else { + cell.setCellValue(value.toString()); + } + } + + if (dataCellCustomizer != null) { + + dataCellCustomizer.customize(header, d, value, cell); + } + } + } + + workbookConsumer.accept(wbName, workbook); + + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @FunctionalInterface + public interface CellValueHandler { + void handle(Cell headerCell, Cell dataCell, Object rowObject, Object value); + } + + @FunctionalInterface + public interface CellValueToObjectSetter { + void set(String header, T object, Object value); + } + + @FunctionalInterface + public interface WorkbookConsumer { + + static WorkbookConsumer httpResponseConsumer(HttpServletResponse response) { + return (name, workbook) -> { + try { + response.setHeader( + "Content-Disposition", + "attachment; filename=" + URLEncoder.encode(name, StandardCharsets.UTF_8) + ".xlsx"); + workbook.write(response.getOutputStream()); + } catch (IOException e) { + throw new RuntimeException(e); + } + }; + } + + void accept(String name, org.apache.poi.ss.usermodel.Workbook workbook); + } + + @FunctionalInterface + public interface DataCellCustomizer { + + void customize(String header, Object model, Object value, Cell cell); + } + + @FunctionalInterface + public interface HeaderCellCustomizer { + + static HeaderCellCustomizer validationCustomizer( + Function> validationGetter) { + + return new HeaderCellCustomizer() { + + private Sheet hiddenSheet; + + private int rowIndex = 0; + + @Override + public void customize(String name, Cell cell) { + + List list = validationGetter.apply(name); + if (!CollectionUtils.isNotEmpty(list)) { + return; + } + + if (hiddenSheet == null) { + hiddenSheet = cell.getSheet().getWorkbook().createSheet("hidden"); + cell.getSheet() + .getWorkbook() + .setSheetHidden( + hiddenSheet.getWorkbook().getSheetIndex(hiddenSheet), true); + } + + Row row = hiddenSheet.createRow(rowIndex); + + for (int i = 0; i < list.size(); i++) { + + row.createCell(i).setCellValue(list.get(i)); + } + + Name wbName = hiddenSheet.getWorkbook().createName(); + wbName.setNameName("validate_" + (rowIndex)); + CellReference cellReference = + new CellReference( + hiddenSheet.getSheetName(), rowIndex, list.size(), true, true); + wbName.setRefersToFormula(cellReference.formatAsString()); + XSSFDataValidationHelper dvHelper = + new XSSFDataValidationHelper((XSSFSheet) cell.getSheet()); + XSSFDataValidationConstraint dvConstraint = + (XSSFDataValidationConstraint) + dvHelper.createFormulaListConstraint(wbName.getNameName()); + CellRangeAddressList addressList = + new CellRangeAddressList( + cell.getRowIndex() + 1, + cell.getRowIndex() + 100000, + cell.getColumnIndex(), + cell.getColumnIndex()); + XSSFDataValidation validation = + (XSSFDataValidation) + dvHelper.createValidation(dvConstraint, addressList); + validation.setSuppressDropDownArrow(true); + validation.setShowErrorBox(true); + cell.getSheet().addValidationData(validation); + + rowIndex++; + } + }; + } + + void customize(String name, Cell cell); + } +} diff --git a/src/main/java/cn/lihongjie/coal/common/TreeUtils.java b/src/main/java/cn/lihongjie/coal/common/TreeUtils.java index 79e483d3..6f161d8a 100644 --- a/src/main/java/cn/lihongjie/coal/common/TreeUtils.java +++ b/src/main/java/cn/lihongjie/coal/common/TreeUtils.java @@ -70,6 +70,11 @@ public class TreeUtils { return ans; } + public static void dfsList(Iterable src, Function> getter, Consumer> handler, Function hashFn){ + + src.forEach(t -> dfs(t, getter, handler, hashFn)); + } + public static void dfs(T src, Function> getter, Consumer> handler, Function hashFn){ var seen = new HashSet<>(); diff --git a/src/main/java/cn/lihongjie/coal/department/repository/DepartmentRepository.java b/src/main/java/cn/lihongjie/coal/department/repository/DepartmentRepository.java index 5dab43f2..3f8cf890 100644 --- a/src/main/java/cn/lihongjie/coal/department/repository/DepartmentRepository.java +++ b/src/main/java/cn/lihongjie/coal/department/repository/DepartmentRepository.java @@ -7,5 +7,6 @@ import org.springframework.stereotype.Repository; @Repository public interface DepartmentRepository extends BaseRepository { - + + DepartmentEntity findByNameAndOrganizationId(String name, String organizationId); } diff --git a/src/main/java/cn/lihongjie/coal/department/service/DepartmentService.java b/src/main/java/cn/lihongjie/coal/department/service/DepartmentService.java index b5080c55..f4a24ee9 100644 --- a/src/main/java/cn/lihongjie/coal/department/service/DepartmentService.java +++ b/src/main/java/cn/lihongjie/coal/department/service/DepartmentService.java @@ -3,6 +3,7 @@ package cn.lihongjie.coal.department.service; import cn.lihongjie.coal.base.dto.CommonQuery; import cn.lihongjie.coal.base.dto.IdRequest; import cn.lihongjie.coal.base.service.BaseService; +import cn.lihongjie.coal.common.Ctx; import cn.lihongjie.coal.common.TreeUtils; import cn.lihongjie.coal.dbFunctions.DbFunctionService; import cn.lihongjie.coal.department.dto.CreateDepartmentDto; @@ -145,4 +146,12 @@ class DepartmentService extends BaseService getExcelValidation(String s) { + + + DictTreeRequest request = new DictTreeRequest(); + request.setCode(s); + DictionaryTreeDto tree = tree(request); + + ArrayList list = new ArrayList<>(); + + TreeUtils.dfsList(tree.getTree(), (TreeDto x )->x.getChildren(), object -> list.add(object.getCurrent().getCode() + "-" + object.getCurrent().getName()), (TreeDto x )->x.getId()); + + return list; + } } diff --git a/src/main/java/cn/lihongjie/coal/employee/controller/EmployeeController.java b/src/main/java/cn/lihongjie/coal/employee/controller/EmployeeController.java index 4b582e00..09650099 100644 --- a/src/main/java/cn/lihongjie/coal/employee/controller/EmployeeController.java +++ b/src/main/java/cn/lihongjie/coal/employee/controller/EmployeeController.java @@ -6,9 +6,12 @@ import cn.lihongjie.coal.base.dto.CommonQuery; import cn.lihongjie.coal.base.dto.IdRequest; import cn.lihongjie.coal.employee.dto.CreateEmployeeDto; import cn.lihongjie.coal.employee.dto.EmployeeDto; +import cn.lihongjie.coal.employee.dto.ImportEmpFromExcelRequest; import cn.lihongjie.coal.employee.dto.UpdateEmployeeDto; import cn.lihongjie.coal.employee.service.EmployeeService; +import jakarta.servlet.http.HttpServletResponse; + import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -51,4 +54,19 @@ public class EmployeeController { public Page list(@RequestBody CommonQuery request) { return this.service.list(request); } + + + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + this.service.generateImportTemplate(response); + + } + + + @PostMapping("/import") + public Object importData(@RequestBody ImportEmpFromExcelRequest request) { + this.service.importFromExcel(request); + + return true; + } } diff --git a/src/main/java/cn/lihongjie/coal/employee/dto/ImportEmpFromExcelRequest.java b/src/main/java/cn/lihongjie/coal/employee/dto/ImportEmpFromExcelRequest.java new file mode 100644 index 00000000..5c840523 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/employee/dto/ImportEmpFromExcelRequest.java @@ -0,0 +1,13 @@ +package cn.lihongjie.coal.employee.dto; + +import lombok.Data; + +import java.util.*; + +@Data +public class ImportEmpFromExcelRequest { + + private String fileId; + + +} diff --git a/src/main/java/cn/lihongjie/coal/employee/service/EmployeeService.java b/src/main/java/cn/lihongjie/coal/employee/service/EmployeeService.java index 18f5a770..31704f3a 100644 --- a/src/main/java/cn/lihongjie/coal/employee/service/EmployeeService.java +++ b/src/main/java/cn/lihongjie/coal/employee/service/EmployeeService.java @@ -3,14 +3,32 @@ package cn.lihongjie.coal.employee.service; import cn.lihongjie.coal.base.dto.CommonQuery; import cn.lihongjie.coal.base.dto.IdRequest; import cn.lihongjie.coal.base.service.BaseService; +import cn.lihongjie.coal.common.ExcelUtils; +import cn.lihongjie.coal.department.dto.CreateDepartmentDto; +import cn.lihongjie.coal.department.dto.DepartmentDto; +import cn.lihongjie.coal.department.entity.DepartmentEntity; +import cn.lihongjie.coal.department.service.DepartmentService; +import cn.lihongjie.coal.dictionary.service.DictionaryService; import cn.lihongjie.coal.employee.dto.CreateEmployeeDto; import cn.lihongjie.coal.employee.dto.EmployeeDto; +import cn.lihongjie.coal.employee.dto.ImportEmpFromExcelRequest; import cn.lihongjie.coal.employee.dto.UpdateEmployeeDto; import cn.lihongjie.coal.employee.entity.EmployeeEntity; import cn.lihongjie.coal.employee.mapper.EmployeeMapper; import cn.lihongjie.coal.employee.repository.EmployeeRepository; import cn.lihongjie.coal.file.service.FileService; +import cn.lihongjie.coal.jobPost.dto.CreateJobPostDto; +import cn.lihongjie.coal.jobPost.entity.JobPostEntity; +import cn.lihongjie.coal.jobPost.service.JobPostService; +import io.vavr.Function1; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.servlet.http.HttpServletResponse; + +import lombok.Cleanup; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -22,11 +40,18 @@ import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + @Service @Slf4j @Transactional -public -class EmployeeService extends BaseService { +public class EmployeeService extends BaseService { + public static final List HEADERS = + List.of( + "姓名", "性别", "民族", "婚姻状况", "入职时间", "身份证号", "学历", "毕业学校", "籍贯", "住址", "手机号", "部门", + "岗位", "银行卡号", "收款人姓名"); @Autowired private EmployeeRepository repository; @Autowired private EmployeeMapper mapper; @@ -70,7 +95,6 @@ class EmployeeService extends BaseService { if (CollectionUtils.isNotEmpty(x.getFileIds())) x.setFiles(fileService.findAllByIds(x.getFileIds())); }); - } if (CollectionUtils.isNotEmpty(dto.getCars())) { dto.getCars() @@ -79,7 +103,6 @@ class EmployeeService extends BaseService { if (CollectionUtils.isNotEmpty(x.getFileIds())) x.setFiles(fileService.findAllByIds(x.getFileIds())); }); - } return dto; } @@ -95,4 +118,95 @@ class EmployeeService extends BaseService { return page.map(this::toDto); } + + @Autowired DictionaryService dictionaryService; + @Autowired DepartmentService departmentService; + @Autowired JobPostService jobPostService; + @PersistenceContext private EntityManager entityManager; + + public void generateImportTemplate(HttpServletResponse response) { + + ExcelUtils.genSingleSheetToHttp( + "员工导入模板", + HEADERS, + ExcelUtils.HeaderCellCustomizer.validationCustomizer( + name -> + switch (name) { + case "性别" -> dictionaryService.getExcelValidation("sex"); + case "民族" -> dictionaryService.getExcelValidation("nation"); + case "婚姻状况" -> dictionaryService.getExcelValidation("marriage"); + case "学历" -> dictionaryService.getExcelValidation("education"); + default -> new ArrayList<>(); + }), + response); + } + + @SneakyThrows + public void importFromExcel(ImportEmpFromExcelRequest request) { + + @Cleanup InputStream download = fileService.download(request.getFileId()); + + io.vavr.Function1 getDepartmentId = + Function1.of( + (String name) -> { + DepartmentDto department = + departmentService.findByName(name); + + if (department == null) { + CreateDepartmentDto dto = new CreateDepartmentDto(); + dto.setName(name); + department = departmentService.create(dto); + } + + return department == null ? null : department.getId(); + }) + .memoized(); + + io.vavr.Function1 getJobPostId = + Function1.of( + (String name) -> { + var jobPost = jobPostService.findByName(name); + if (jobPost == null) { + CreateJobPostDto dto = new CreateJobPostDto(); + dto.setName(name); + jobPost = jobPostService.create(dto); + } + return jobPost == null ? null : jobPost.getId(); + }) + .memoized(); + + List list = + ExcelUtils.readFirstSheetToObjectList( + download, + EmployeeEntity::new, + (header, emp, value) -> { + switch (header) { + case "姓名" -> emp.setName((String) value); + case "性别" -> emp.setSex(ExcelUtils.getCode(value)); + case "民族" -> emp.setNation(ExcelUtils.getCode(value)); + case "婚姻状况" -> emp.setMarriage(ExcelUtils.getCode(value)); + case "入职时间" -> emp.setEntryDate(ExcelUtils.getLocalDate(value)); + case "身份证号" -> emp.setIdCard((String) value); + case "学历" -> emp.setEducation(ExcelUtils.getCode(value)); + case "毕业学校" -> emp.setSchool((String) value); + case "籍贯" -> emp.setNativePlace((String) value); + case "住址" -> emp.setAddress((String) value); + case "手机号" -> emp.setPhone((String) value); + case "部门" -> + emp.setDepartment( + entityManager.getReference( + DepartmentEntity.class, + getDepartmentId.apply((String) value))); + case "岗位" -> + emp.setJobPost( + entityManager.getReference( + JobPostEntity.class, + getJobPostId.apply((String) value))); + case "银行卡号" -> emp.setBank(ExcelUtils.getCode(value)); + case "收款人姓名" -> emp.setBankName((String) value); + } + }); + + this.repository.saveAll(list); + } } diff --git a/src/main/java/cn/lihongjie/coal/file/service/FileService.java b/src/main/java/cn/lihongjie/coal/file/service/FileService.java index 15a6422e..291f3b33 100644 --- a/src/main/java/cn/lihongjie/coal/file/service/FileService.java +++ b/src/main/java/cn/lihongjie/coal/file/service/FileService.java @@ -17,6 +17,7 @@ import cn.lihongjie.coal.spring.config.HwCloudProperty; import com.aliyun.oss.OSSClient; import com.fasterxml.jackson.databind.ObjectMapper; import com.obs.services.ObsClient; +import com.obs.services.model.ObsObject; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -24,6 +25,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; import org.apache.tika.Tika; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.convert.ConversionService; @@ -96,6 +98,11 @@ public class FileService extends BaseService { @Autowired ObjectMapper objectMapper; + @NotNull + private static String getObjectKey(FileEntity fileEntity) { + return fileEntity.getDirectory() + "/" + fileEntity.getObjectId(); + } + @SneakyThrows public FileDto upload( MultipartFile file, @@ -129,7 +136,7 @@ public class FileService extends BaseService { fileEntity.setMimeType(tika.detect(inputStream)); } - String objectKey = fileEntity.getDirectory() + "/" + fileEntity.getObjectId(); + String objectKey = getObjectKey(fileEntity); fileEntity.setPublicUrl(uploadToOSS(objectKey, file.getInputStream())); @@ -138,48 +145,6 @@ public class FileService extends BaseService { return getById(fileEntity.getId()); } - @SneakyThrows - public FileDto upload( - InputStream file, - String name, - String dir, - String sortKey, - String code, - String remarks) { - FileEntity fileEntity = new FileEntity(); - fileEntity.setFileName(name); - fileEntity.setFileSize(Long.valueOf(file.available())); - fileEntity.setCode(code); - fileEntity.setRemarks(remarks); - try { - - fileEntity.setSortKey(Integer.parseInt(sortKey)); - } catch (Exception e) { - - fileEntity.setSortKey(1); - } - fileEntity.setDirectory( - "%s/%s/%s" - .formatted( - activateProfile, - Ctx.currentUser().getOrganizationId(), - StringUtils.defaultIfBlank(dir, "public"))); - InputStream inputStream = file; - fileEntity.setObjectId( - UUID.randomUUID() + "." + FilenameUtils.getExtension(name.replace(":", "_"))); - try (inputStream) { - fileEntity.setMimeType(tika.detect(inputStream)); - } - - String objectKey = fileEntity.getDirectory() + "/" + fileEntity.getObjectId(); - - fileEntity.setPublicUrl(uploadToOSS(objectKey, file)); - - this.save(fileEntity); - - return getById(fileEntity.getId()); - } - private String uploadToOSS(String objectKey, InputStream inputStream) { String objectUrl; try { @@ -213,4 +178,61 @@ public class FileService extends BaseService { objectKey); return objectUrl; } + + @SneakyThrows + public FileDto upload( + InputStream file, + String name, + String dir, + String sortKey, + String code, + String remarks) { + FileEntity fileEntity = new FileEntity(); + fileEntity.setFileName(name); + fileEntity.setFileSize(Long.valueOf(file.available())); + fileEntity.setCode(code); + fileEntity.setRemarks(remarks); + try { + + fileEntity.setSortKey(Integer.parseInt(sortKey)); + } catch (Exception e) { + + fileEntity.setSortKey(1); + } + fileEntity.setDirectory( + "%s/%s/%s" + .formatted( + activateProfile, + Ctx.currentUser().getOrganizationId(), + StringUtils.defaultIfBlank(dir, "public"))); + InputStream inputStream = file; + fileEntity.setObjectId( + UUID.randomUUID() + "." + FilenameUtils.getExtension(name.replace(":", "_"))); + try (inputStream) { + fileEntity.setMimeType(tika.detect(inputStream)); + } + + String objectKey = getObjectKey(fileEntity); + + fileEntity.setPublicUrl(uploadToOSS(objectKey, file)); + + this.save(fileEntity); + + return getById(fileEntity.getId()); + } + + public InputStream download(String fileId) { + + FileEntity fileEntity = repository.get(fileId); + String objectKey = getObjectKey(fileEntity); + try { + ObsObject object = + obsClient.getObject(aliyunProperty.getOSS().getBucketName(), objectKey); + return + object.getObjectContent(); + } catch (Exception e) { + log.warn("下载文件失败", e); + throw new BizException("下载文件失败 %s".formatted(e.getMessage())); + } + } } diff --git a/src/main/java/cn/lihongjie/coal/jobPost/repository/JobPostRepository.java b/src/main/java/cn/lihongjie/coal/jobPost/repository/JobPostRepository.java index bfb8cc36..f76c601d 100644 --- a/src/main/java/cn/lihongjie/coal/jobPost/repository/JobPostRepository.java +++ b/src/main/java/cn/lihongjie/coal/jobPost/repository/JobPostRepository.java @@ -6,4 +6,6 @@ import cn.lihongjie.coal.jobPost.entity.JobPostEntity; import org.springframework.stereotype.Repository; @Repository -public interface JobPostRepository extends BaseRepository {} +public interface JobPostRepository extends BaseRepository { + JobPostEntity findByNameAndOrganizationId(String name, String organizationId); +} diff --git a/src/main/java/cn/lihongjie/coal/jobPost/service/JobPostService.java b/src/main/java/cn/lihongjie/coal/jobPost/service/JobPostService.java index 3ad78a6c..3c668cfc 100644 --- a/src/main/java/cn/lihongjie/coal/jobPost/service/JobPostService.java +++ b/src/main/java/cn/lihongjie/coal/jobPost/service/JobPostService.java @@ -3,6 +3,7 @@ package cn.lihongjie.coal.jobPost.service; import cn.lihongjie.coal.base.dto.CommonQuery; import cn.lihongjie.coal.base.dto.IdRequest; import cn.lihongjie.coal.base.service.BaseService; +import cn.lihongjie.coal.common.Ctx; import cn.lihongjie.coal.jobPost.dto.CreateJobPostDto; import cn.lihongjie.coal.jobPost.dto.JobPostDto; import cn.lihongjie.coal.jobPost.dto.UpdateJobPostDto; @@ -68,4 +69,12 @@ class JobPostService extends BaseService { return page.map(this.mapper::toDto); } + + public JobPostDto findByName(String name) { + + JobPostEntity post = repository.findByNameAndOrganizationId(name, Ctx.currentUser().getOrganizationId()); + + return mapper.toDto(post); + + } }