diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/config/MybatisPlusConfig.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/config/MybatisPlusConfig.java index 341c1ed..f924e36 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/config/MybatisPlusConfig.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/config/MybatisPlusConfig.java @@ -22,9 +22,9 @@ public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); - interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); - interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); - interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); //分页插件 + interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); //乐观锁插件 + interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); //防全表更新删除插件 return interceptor; } } diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/config/SerializeConfig.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/config/SerializeConfig.java index ed81dda..84ed59d 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/config/SerializeConfig.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/config/SerializeConfig.java @@ -17,7 +17,7 @@ import java.time.*; import java.util.Map; /** - * Jackson序列化配置,主要配置了{@link LocalDateTime} {@link LocalDate} {@link LocalTime}转为秒级时间戳的序列化 + * Jackson序列化配置以及Springboot Converter配置 * * @author 佘语殊 * @since 2022/6/28 23:59 @@ -103,7 +103,6 @@ public class SerializeConfig { return javaTimeModule; } - //TODO: Redis可能改成tostringSerializer private SimpleModule customClassModule() { SimpleModule customClassModule = new SimpleModule("CustomClassModule"); customClassModule.addSerializer(IPAddress.class, new JsonSerializer<>() { @@ -117,7 +116,7 @@ public class SerializeConfig { customClassModule.addDeserializer(IPAddress.class, new JsonDeserializer<>() { @Override public IPAddress deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - return IPAddress.of(Long.decode(p.getValueAsString())); + return IPAddress.of(Long.decode('#' + p.getValueAsString())); } }); return customClassModule; diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/ProjectGroupController.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/ProjectGroupController.java index b4b79ec..d796b2b 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/ProjectGroupController.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/ProjectGroupController.java @@ -70,7 +70,6 @@ public class ProjectGroupController { )); } - //TODO: test @Operation(description = "body中只传staffUsername和projectStaffPosition") @SneakyThrows @PostMapping @@ -98,7 +97,6 @@ public class ProjectGroupController { throw new BadRequestException(BadRequestException.OPERATE_FAILED); } - //TODO: test @Operation(description = "body中只传projectStaffPosition") @SneakyThrows @PutMapping("/{staffId}") @@ -123,7 +121,6 @@ public class ProjectGroupController { return ResponseMap.ofSuccess(projectGroupService.collectStatsForGroupPositions(token, projectId)); } - //TODO: TEST @Operation(description = "请求体是一个key为taskId,value为staffId的map") @SneakyThrows @PutMapping("/{staffId}/transfer") diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/StaffController.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/StaffController.java index 6571d4a..47ecd8b 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/StaffController.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/StaffController.java @@ -4,7 +4,6 @@ import cn.edu.hfut.rmdjzz.projectmanagement.entity.Staff; import cn.edu.hfut.rmdjzz.projectmanagement.exception.BadRequestException; import cn.edu.hfut.rmdjzz.projectmanagement.exception.TokenException; import cn.edu.hfut.rmdjzz.projectmanagement.service.IStaffService; -import cn.edu.hfut.rmdjzz.projectmanagement.utils.FileUtils; import cn.edu.hfut.rmdjzz.projectmanagement.utils.TokenUtils; import cn.edu.hfut.rmdjzz.projectmanagement.utils.http.HttpUtils; import cn.edu.hfut.rmdjzz.projectmanagement.utils.http.ResponseMap; @@ -54,7 +53,7 @@ public class StaffController { @PostMapping(value = "/import") public ResponseMap importStaffs( @RequestHeader(TokenUtils.HEADER_TOKEN) String token, - @RequestHeader(FileUtils.HEADER_FILE_DIGEST) String digest, + @RequestParam("fileDigest") String digest, @RequestParam("uploadFile") MultipartFile uploadFile ) { if (null == uploadFile) { @@ -92,7 +91,7 @@ public class StaffController { @ResponseStatus(HttpStatus.SEE_OTHER) public ResponseMap downloadTemplate() { return ResponseMap.of(HttpStatus.SEE_OTHER.value(), - HttpStatus.SEE_OTHER.getReasonPhrase()) - .put("URI","/public/账户导入模板.xlsx"); + HttpStatus.SEE_OTHER.getReasonPhrase()) + .put("URI", "/public/账户导入模板.xlsx"); } } diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/TaskController.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/TaskController.java index 6c7105b..5c9505c 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/TaskController.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/TaskController.java @@ -1,6 +1,7 @@ package cn.edu.hfut.rmdjzz.projectmanagement.controller; import cn.edu.hfut.rmdjzz.projectmanagement.entity.Task; +import cn.edu.hfut.rmdjzz.projectmanagement.entity.dto.StaffProcessDTO; import cn.edu.hfut.rmdjzz.projectmanagement.entity.dto.TaskDTO; import cn.edu.hfut.rmdjzz.projectmanagement.exception.BadRequestException; import cn.edu.hfut.rmdjzz.projectmanagement.service.IProjectService; @@ -122,10 +123,9 @@ public class TaskController { return ResponseMap.ofSuccess("查询成功", taskService.getProjectProcessOfEveryone(token, projectId)); } - //TODO: @SneakyThrows @GetMapping({"/stats", "/stats/{staffId}"}) - public ResponseList getProjectStatistics( + public ResponseList getProjectStatistics( @RequestHeader(TokenUtils.HEADER_TOKEN) String token, @PathVariable Integer projectId, @PathVariable(required = false) Integer staffId diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/StaffServiceImpl.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/StaffServiceImpl.java index 0927cf8..5481e7f 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/StaffServiceImpl.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/StaffServiceImpl.java @@ -10,10 +10,13 @@ import cn.edu.hfut.rmdjzz.projectmanagement.utils.MapBuilder; import cn.edu.hfut.rmdjzz.projectmanagement.utils.TimeUtils; import cn.edu.hfut.rmdjzz.projectmanagement.utils.TokenUtils; import cn.edu.hfut.rmdjzz.projectmanagement.utils.http.IPAddress; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomStringUtils; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; @@ -159,10 +162,8 @@ public class StaffServiceImpl extends ServiceImpl implements throw new BadRequestException("读取列staffGlobalLevel失败"); } System.out.println(staffGlobalLevelC); - for (int i = 0; i < totalCount; i++) { - if (Integer.parseInt(staffGlobalLevelC.get(i)) != 2 && Integer.parseInt(staffGlobalLevelC.get(i)) != 3) { - throw new BadRequestException("列staffGlobalLevel无效"); - } + if (staffGlobalLevelC.stream().anyMatch(level -> Integer.parseInt(level) < 2)) { + throw new BadRequestException("列staffGlobalLevel无效"); } for (int i = 0; i < totalCount; i++) { @@ -198,10 +199,12 @@ public class StaffServiceImpl extends ServiceImpl implements return false; } for (int i = 1; i <= sheet.getLastRowNum(); i++) { - String value = sheet.getRow(i).getCell(columnIndex).getStringCellValue(); - if (value == null || value.length() <= 2) + XSSFCell cell = sheet.getRow(i).getCell(columnIndex); + cell.setCellType(CellType.STRING); + String value = cell.getStringCellValue(); + if (StringUtils.isEmpty(value)) return true; - result.add(value.substring(1, value.length() - 1)); + result.add(value); } return true; } catch (Exception e) { diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/utils/http/IPAddress.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/utils/http/IPAddress.java index ee6b965..3b18564 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/utils/http/IPAddress.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/utils/http/IPAddress.java @@ -16,6 +16,7 @@ public class IPAddress { public static IPAddress of(String ip) { long ipHex = 0; + ip = ip.substring(0, ip.indexOf(':')); String[] split = ip.split("\\."); for (String s : split) { ipHex = (ipHex << 8) + Integer.parseInt(s); @@ -38,6 +39,6 @@ public class IPAddress { @Override public String toString() { - return "#" + Long.toHexString(ipHex); + return Long.toHexString(ipHex); } } diff --git a/src/main/resources/static/public/账户导入模板.xlsx b/src/main/resources/static/public/账户导入模板.xlsx index 35cd573..e820299 100644 Binary files a/src/main/resources/static/public/账户导入模板.xlsx and b/src/main/resources/static/public/账户导入模板.xlsx differ diff --git a/src/test/java/cn/edu/hfut/rmdjzz/projectmanagement/ExcelTests.java b/src/test/java/cn/edu/hfut/rmdjzz/projectmanagement/ExcelTests.java new file mode 100644 index 0000000..da56d5e --- /dev/null +++ b/src/test/java/cn/edu/hfut/rmdjzz/projectmanagement/ExcelTests.java @@ -0,0 +1,29 @@ +package cn.edu.hfut.rmdjzz.projectmanagement; + +import cn.edu.hfut.rmdjzz.projectmanagement.service.IStaffService; +import cn.edu.hfut.rmdjzz.projectmanagement.utils.FileUtils; +import lombok.SneakyThrows; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.web.multipart.MultipartFile; + +/** + * @author 佘语殊 + * @since 2022/7/13 10:05 + */ +@SpringBootTest +public class ExcelTests { + + @Autowired + private IStaffService staffService; + + @SneakyThrows + @Test + public void importTest() { + MultipartFile excelFile = new MockMultipartFile("账户导入模板.xlsx", + FileUtils.class.getClassLoader().getResourceAsStream("static/public/账户导入模板.xlsx")); + staffService.multiImport("", excelFile); + } +}