diff --git a/README.md b/README.md index 1535bf8e..0680e5ba 100644 --- a/README.md +++ b/README.md @@ -16,4 +16,71 @@ -Dspring.redis.port=31276 -Dspring.redis.password=Kjgnj93JKj3je -DCUSTOM_ENV=test --Dserver.port=8080 \ No newline at end of file +-Dserver.port=8080 + +# 各模块结构 +## all-login 登录白名单 +~~~json +{ + "phone": "手机号" +} +~~~ +## attendance-pass 考勤黑名单 +~~~json +{ + "name": "姓名", + "phone": "手机号", + "idNumber": "身份证号" +} +~~~ +## gxjg-blackuser-worker 产业工人黑名单 +~~~json +{ + "userName": "姓名", + "userIdCard": "身份证号", + "userPhone": "联系电话", + "blackReasonName": "拉黑原因", + "teamLeaderName": "拉黑时班组管理人员", + "projectName": "拉黑时所在项目", + "blacklistTime": "拉黑时间", + "remark": "备注" +} +~~~ +## gxjg-blackuser-teamleader 班组管理人员黑名单 +~~~json +{ + "userName": "姓名", + "userIdCard": "身份证号", + "userPhone": "联系电话", + "blackReasonName": "拉黑原因", + "projectName": "拉黑时所在项目", + "blacklistTime": "拉黑时间", + "remark": "备注" +} +~~~ + +## gxjg-blackuser-employee 项目管理人员黑名单 +~~~json +{ + "userName": "姓名", + "userIdCard": "身份证号", + "userPhone": "联系电话", + "projectName": "拉黑时所在项目", + "blacklistTime": "拉黑时间", + "remark": "备注" +} +~~~ + +## gxjg-blackcompany 企业黑名单 +~~~json +{ + "companyName": "企业名称", + "companyUscc": "统一社会信用代码", + "legalName": "企业法人", + "projectName": "参建项目名称", + "projectCompanyPartName": "拉黑时参建类型", + "blackReasonName": "拉黑原因", + "blacklistTime": "拉黑时间", + "remark": "备注" +} +~~~ \ No newline at end of file diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java index 0083c319..1a1bba5a 100644 --- a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java @@ -1,13 +1,24 @@ package cn.axzo.nanopart.api; import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.nanopart.api.constant.enums.ListTypeEnum; +import cn.axzo.nanopart.api.request.BlackAndWhiteListExcelImportReq; import cn.axzo.nanopart.api.request.BlackAndWhiteListReq; +import cn.axzo.nanopart.api.response.BlackAndWhiteListExcelImportResp; import cn.axzo.nanopart.api.response.BlackAndWhiteListResp; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.multipart.MultipartFile; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.IOException; import java.util.List; /** @@ -22,6 +33,7 @@ public interface BlackAndWhiteListApi { /** * 创建黑名单或白名单 + * * @param req 包含type,module,params三个字段 * @return 记录id */ @@ -30,14 +42,25 @@ public interface BlackAndWhiteListApi { /** * 删除黑名单或白名单 + * * @param req 包含type,module,params三个字段 * @return void */ @PostMapping("api/black-white-list/delete") ApiResult delete(@RequestBody @Validated BlackAndWhiteListReq req); + /** + * 批量删除黑名单或白名单 + * + * @param ids 黑白名单id列表 + * @return true-删除成功,false-删除失败 + */ + @GetMapping("/api/black-white-list/delete-by-id") + ApiResult deleteByIds(@RequestParam(value = "ids") @NotEmpty(message = "id不能为空") List ids); + /** * 查询黑名单或白名单 + * * @param req 包含type,module,params三个字段 * @return 黑白名单记录列表 */ @@ -46,10 +69,19 @@ public interface BlackAndWhiteListApi { /** * 判断指定模块、指定参数记录是否在黑名单或白名单中 + * * @param req 包含type,module,params三个字段 * @return 若记录存在则返回true,否则返回false */ @PostMapping("api/black-white-list/is-in") ApiResult isInBlackOrWhiteList(@RequestBody @Validated BlackAndWhiteListReq req); + /** + * 通过excel导入黑白名单 + * + * @return 导入结果 + */ + @PostMapping("api/black-white-list/import") + ApiResult importBlackAndWhiteListExcel(@RequestParam(value = "type") @NotNull(message = "名单类型不能为空") ListTypeEnum type, + @RequestParam(value = "module") @NotBlank(message = "模块不能为空") String module, @RequestParam(value = "url", required = false) String url, @RequestPart(value = "file") MultipartFile file); } diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListExcelImportReq.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListExcelImportReq.java new file mode 100644 index 00000000..e32045ff --- /dev/null +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListExcelImportReq.java @@ -0,0 +1,47 @@ +package cn.axzo.nanopart.api.request; + +import cn.axzo.nanopart.api.constant.enums.ListTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 黑白名单excel导入入参 + * + * @author chenwenjian + * @version 1.0 + * @date 2023/12/22 15:37 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BlackAndWhiteListExcelImportReq { + + /** + * excel文件地址,url和file二选一,若有url则忽略file + */ + private String url; + + /** + * excel文件,url和file二选一,若有url则忽略file + */ + private MultipartFile file; + + /** + * 业务模块名,如:“cms-register”,”attendance-pass“ + */ + @NotBlank(message = "module名不能为空") + private String module; + + /** + * 黑白名单类型,0-黑名单,1-白名单 + */ + @NotNull(message = "名单类型不能为空") + private ListTypeEnum type; +} diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/response/BlackAndWhiteListExcelImportResp.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/response/BlackAndWhiteListExcelImportResp.java new file mode 100644 index 00000000..1d971573 --- /dev/null +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/response/BlackAndWhiteListExcelImportResp.java @@ -0,0 +1,31 @@ +package cn.axzo.nanopart.api.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Map; + +/** + * 黑白名单导入返回结果 + * + * @author chenwenjian + * @version 1.0 + * @date 2023/12/21 18:48 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BlackAndWhiteListExcelImportResp { + /** + * 导入结果,true表示导入成功,false表示导入失败 + */ + private Boolean result; + + /** + * 只有result导入失败的行号和错误信息,key为行号,value为错误信息 + */ + private Map errorMap; +} diff --git a/black-list/black-list-api/src/test/java/cn/axzo/nanopart/api/BlackAndWhiteListApiTest.java b/black-list/black-list-api/src/test/java/cn/axzo/nanopart/api/BlackAndWhiteListApiTest.java new file mode 100644 index 00000000..a521cb15 --- /dev/null +++ b/black-list/black-list-api/src/test/java/cn/axzo/nanopart/api/BlackAndWhiteListApiTest.java @@ -0,0 +1,12 @@ +package cn.axzo.nanopart.api; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2023/12/22 15:17 + */ +public class BlackAndWhiteListApiTest { + + + +} diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/BlackAndWhiteListController.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/BlackAndWhiteListController.java index ac9efcdf..fee9a255 100644 --- a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/BlackAndWhiteListController.java +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/BlackAndWhiteListController.java @@ -3,13 +3,30 @@ package cn.axzo.nanopart.server.controller; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.nanopart.api.BlackAndWhiteListApi; +import cn.axzo.nanopart.api.constant.enums.ListTypeEnum; +import cn.axzo.nanopart.api.request.BlackAndWhiteListExcelImportReq; import cn.axzo.nanopart.api.request.BlackAndWhiteListReq; +import cn.axzo.nanopart.api.response.BlackAndWhiteListExcelImportResp; import cn.axzo.nanopart.api.response.BlackAndWhiteListResp; +import cn.axzo.nanopart.server.dao.entity.SaasBlackWhiteList; import cn.axzo.nanopart.server.service.BlackAndWhiteListService; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.annotations.Select; +import org.json.JSONObject; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @author: chenwenjian @@ -18,11 +35,13 @@ import java.util.List; * @modifiedBy: * @version: 1.0` */ +@Slf4j @RestController @RequiredArgsConstructor public class BlackAndWhiteListController implements BlackAndWhiteListApi { private final BlackAndWhiteListService blackAndWhiteListService; + @Override public ApiResult create(BlackAndWhiteListReq req) { return blackAndWhiteListService.create(req); @@ -33,6 +52,11 @@ public class BlackAndWhiteListController implements BlackAndWhiteListApi { return blackAndWhiteListService.delete(req); } + @Override + public ApiResult deleteByIds(List ids) { + return ApiResult.ok(blackAndWhiteListService.deleteByIds(ids)); + } + @Override public ApiResult> detail(BlackAndWhiteListReq req) { return blackAndWhiteListService.detail(req); @@ -42,4 +66,11 @@ public class BlackAndWhiteListController implements BlackAndWhiteListApi { public ApiResult isInBlackOrWhiteList(BlackAndWhiteListReq req) { return blackAndWhiteListService.isInBlackOrWhiteList(req); } + + @Override + public ApiResult importBlackAndWhiteListExcel(ListTypeEnum type, String module, String url, MultipartFile file) { + log.info("导入Excel数据参数:type={}, module={}, url={}, file={}", type, module, url, file); + return ApiResult.ok(blackAndWhiteListService.importBlackAndWhiteListExcel(type, module, url, file)); + } + } diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java index 1bfbeddf..4c69e6de 100644 --- a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java @@ -17,6 +17,7 @@ import org.springframework.stereotype.Repository; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Set; /** * @author: chenwenjian @@ -75,4 +76,11 @@ public class BlackAndWhiteListRepository extends ServiceImpl idSet) { + return lambdaUpdate() + .in(SaasBlackWhiteList::getId, idSet) + .set(SaasBlackWhiteList::getIsDelete, 1) + .update(); + } } \ No newline at end of file diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/BlackAndWhiteListService.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/BlackAndWhiteListService.java index 8987ad75..4ceeed1f 100644 --- a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/BlackAndWhiteListService.java +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/BlackAndWhiteListService.java @@ -1,8 +1,11 @@ package cn.axzo.nanopart.server.service; import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.nanopart.api.constant.enums.ListTypeEnum; import cn.axzo.nanopart.api.request.BlackAndWhiteListReq; +import cn.axzo.nanopart.api.response.BlackAndWhiteListExcelImportResp; import cn.axzo.nanopart.api.response.BlackAndWhiteListResp; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -24,4 +27,7 @@ public interface BlackAndWhiteListService { ApiResult isInBlackOrWhiteList(BlackAndWhiteListReq req); + BlackAndWhiteListExcelImportResp importBlackAndWhiteListExcel(ListTypeEnum type, String module, String url, MultipartFile file); + + Boolean deleteByIds(List ids); } diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/impl/BlackAndWhiteListServiceImpl.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/impl/BlackAndWhiteListServiceImpl.java index 2b2cb9a6..6452b9e8 100644 --- a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/impl/BlackAndWhiteListServiceImpl.java +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/impl/BlackAndWhiteListServiceImpl.java @@ -5,16 +5,31 @@ import cn.axzo.basics.common.exception.ServiceException; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.nanopart.api.constant.enums.ListTypeEnum; import cn.axzo.nanopart.api.request.BlackAndWhiteListReq; +import cn.axzo.nanopart.api.response.BlackAndWhiteListExcelImportResp; import cn.axzo.nanopart.api.response.BlackAndWhiteListResp; import cn.axzo.nanopart.server.dao.entity.SaasBlackWhiteList; import cn.axzo.nanopart.server.dao.repository.BlackAndWhiteListRepository; import cn.axzo.nanopart.server.service.BlackAndWhiteListService; import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; /** * @author: chenwenjian @@ -32,6 +47,7 @@ public class BlackAndWhiteListServiceImpl implements BlackAndWhiteListService { /** * 新增一条黑白名单记录 + * * @param req 包含type,module和param三个字段 * @return 记录id */ @@ -39,12 +55,12 @@ public class BlackAndWhiteListServiceImpl implements BlackAndWhiteListService { public ApiResult create(BlackAndWhiteListReq req) { // 黑白名单创建互斥,若存在于黑名单中则不允许存在于白名单中,反之亦然 BlackAndWhiteListReq reverseReq = BeanMapper.copyBean(req, BlackAndWhiteListReq.class, (req1, req2) -> req2.setType((req1.getType().equals(ListTypeEnum.BLACK_LIST)) ? ListTypeEnum.WHITE_LIST : ListTypeEnum.BLACK_LIST)); - if (isInBlackOrWhiteList(reverseReq).getData()){ - throw new ServiceException("该记录已存在于"+reverseReq.getType().getDescription()+"中,不能创建对应"+req.getType().getDescription()); + if (isInBlackOrWhiteList(reverseReq).getData()) { + throw new ServiceException("该记录已存在于" + reverseReq.getType().getDescription() + "中,不能创建对应" + req.getType().getDescription()); } // 同类型名单内唯一性校验 - if (isInBlackOrWhiteList(req).getData()){ - throw new ServiceException("该记录已存在于"+req.getType().getDescription()+"中"); + if (isInBlackOrWhiteList(req).getData()) { + throw new ServiceException("该记录已存在于" + req.getType().getDescription() + "中"); } return ApiResult.ok(blackAndWhiteListRepository.create(req)); } @@ -62,6 +78,7 @@ public class BlackAndWhiteListServiceImpl implements BlackAndWhiteListService { /** * 查询指定条件的所有黑白名单记录 + * * @param req 包含type,module和param三个字段 * @return 记录列表 */ @@ -74,6 +91,7 @@ public class BlackAndWhiteListServiceImpl implements BlackAndWhiteListService { /** * 判断是否存在指定条件的黑白名单记录 + * * @param req 包含type,module和param三个字段 * @return 记录存在返回true,否则返回false */ @@ -82,4 +100,148 @@ public class BlackAndWhiteListServiceImpl implements BlackAndWhiteListService { List blackWhiteLists = blackAndWhiteListRepository.detail(req); return ApiResult.ok(CollectionUtil.isNotEmpty(blackWhiteLists)); } + + /** + * 导入黑白名单Excel文件 + * + * @param type 名单类型 + * @param module 模块 + * @param url 文件url,如果为空则从文件流中读取 + * @param file 文件流 + */ + @Override + public BlackAndWhiteListExcelImportResp importBlackAndWhiteListExcel(ListTypeEnum type, String module, String url, MultipartFile file) { + InputStream inputStream = null; + BlackAndWhiteListExcelImportResp importResp = new BlackAndWhiteListExcelImportResp(); + // 获取文件 + try { + inputStream = file.getInputStream(); + if (StringUtils.hasText(url)) { + inputStream = new URL(url).openStream(); + } + } catch (IOException e) { + throw new ServiceException("文件读取异常"); + } + // 使用EasyExcel解析文件 + List> excelData = readExcel(inputStream, importResp); + // 将数据写入数据库 + importResp.setResult(writeDataToDatabase(excelData, module, type.getValue())); + return importResp; + } + + /** + * 批量删除黑白名单记录 + * + * @param ids 记录id列表 + * @return true-删除成功,false-删除失败 + */ + @Override + public Boolean deleteByIds(List ids) { + if (CollectionUtil.isNotEmpty(ids)) { + Set idSet = new HashSet<>(ids); + return blackAndWhiteListRepository.deleteByIds(idSet); + } + return true; + } + + /** + * 使用EasyExcel读取Excel数据 + * + * @param inputStream + * @param importResp + * @return + */ + public List> readExcel(InputStream inputStream, BlackAndWhiteListExcelImportResp importResp) { + // 存储读取的每一行数据 + List> dataList = new ArrayList<>(); + + // 使用EasyExcel读取数据 + EasyExcel.read(inputStream, new AnalysisEventListener>() { + + // 表头 + private Map header; + + @Override + public void invokeHeadMap(Map headMap, AnalysisContext context) { + log.info("表头信息:{}", headMap); + header = headMap; + } + + /** + * 读取每一行数据 + * @param rowData 每一行数据 + * @param context 上下文 + */ + @Override + public void invoke(Map rowData, AnalysisContext context) { + try { + log.info("第{}行数据:{}", context.readRowHolder().getRowIndex(), rowData); + Map dataMap = new HashMap<>(); + for (Map.Entry entry : rowData.entrySet()) { + int columnIndex = entry.getKey(); + String columnName = header.get(columnIndex); + dataMap.put(columnName, entry.getValue()); + } + dataList.add(dataMap); + } catch (Exception e) { + HashMap errorMap = new HashMap<>(); + errorMap.put(Long.valueOf(context.readRowHolder().getRowIndex()), e.getMessage()); + importResp.setErrorMap(errorMap); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 解析完成后的操作 + try { + inputStream.close(); + } catch (IOException e) { + throw new ServiceException("资源关闭失败"); + } + } + }).autoTrim(true).ignoreEmptyRow(true).sheet().doRead(); + + return dataList; + } + + + /** + * 将数据转换为JSON对象 + * + * @param dataList + * @return + */ + private List convertExcelDataToJson(List> dataList) { + List jsonList = new ArrayList<>(); + // 遍历数据列表 + for (Map dataMap : dataList) { + com.alibaba.fastjson.JSONObject jsonObject = new com.alibaba.fastjson.JSONObject(); + // 构造JSON对象 + for (Map.Entry entry : dataMap.entrySet()) { + String columnName = entry.getKey(); + Object columnValue = entry.getValue(); + jsonObject.put(columnName, columnValue); + } + jsonList.add(jsonObject); + } + return jsonList; + } + + /** + * 将数据写入数据库 + * + * @param dataList param参数 + * @param module 模块 + * @return 写入结果 + */ + private Boolean writeDataToDatabase(List> dataList, String module, Integer type) { + List list = dataList.stream().map(map -> { + SaasBlackWhiteList blackWhiteList = new SaasBlackWhiteList(); + blackWhiteList.setType(type); + blackWhiteList.setModule(module); + blackWhiteList.setParam(map); + return blackWhiteList; + }).collect(Collectors.toList()); + return blackAndWhiteListRepository.saveBatch(list); + } } \ No newline at end of file diff --git a/black-list/pom.xml b/black-list/pom.xml index c9135890..50a52c62 100644 --- a/black-list/pom.xml +++ b/black-list/pom.xml @@ -19,11 +19,21 @@ black-list-service - - - - - - - + + + + org.apache.poi + poi-ooxml + ${poi.version} + + + + + com.alibaba + easyexcel + ${easyexcel.version} + + + + diff --git a/nanopart-server/src/test/java/cn/axzo/nanopart/NanopartApplicationTests.java b/nanopart-server/src/test/java/cn/axzo/nanopart/NanopartApplicationTests.java index 9de4dd20..dbcf7842 100644 --- a/nanopart-server/src/test/java/cn/axzo/nanopart/NanopartApplicationTests.java +++ b/nanopart-server/src/test/java/cn/axzo/nanopart/NanopartApplicationTests.java @@ -1,15 +1,34 @@ package cn.axzo.nanopart; +import cn.axzo.basics.common.exception.ServiceException; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.nanopart.api.BlackAndWhiteListApi; +import cn.axzo.nanopart.api.constant.enums.ListTypeEnum; import cn.axzo.nanopart.api.request.BlackAndWhiteListReq; import cn.axzo.nanopart.api.response.BlackAndWhiteListResp; +import cn.axzo.nanopart.server.dao.entity.SaasBlackWhiteList; +import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import lombok.extern.slf4j.Slf4j; +import okhttp3.RequestBody; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import javax.annotation.Resource; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; /** * @author: chenwenjian @@ -18,12 +37,17 @@ import java.util.List; * @modifiedBy: * @version: 1.0 */ +@Slf4j @SpringBootTest public class NanopartApplicationTests { + private final String[] envs ={"dev", "test", "pre", "prod"}; + @Resource private BlackAndWhiteListApi blackAndWhiteListApi; + private + @Test void contextLoad(){ BlackAndWhiteListReq blackAndWhiteListReq = new BlackAndWhiteListReq(); @@ -35,4 +59,77 @@ public class NanopartApplicationTests { ApiResult> detail = blackAndWhiteListApi.detail(blackAndWhiteListReq); System.out.println(detail.getData().toString()); } + + @Test + void batchAdd(){ + // 指定环境和文件路径 + String env = "test"; + String type = "BLACK_LIST"; + // String filePath = "C:\\Users\\admin\\Desktop\\企业黑名单.xlsx"; + // String module = "gxjg-blackcompany"; + String filePath = "C:\\Users\\admin\\Desktop\\产业工人黑名单.xlsx"; + String module = "gxjg-blackuser-worker"; + + HashMap envMap = new HashMap<>(); + envMap.put("dev", "https://dev-app.axzo.cn/"); + envMap.put("test", "https://test-api.axzo.cn/"); + envMap.put("pre", "https://pre-api.axzo.cn/"); + envMap.put("prod", "https://api.axzo.cn/"); + + // 存储读取的每一行数据 + List> dataList = new ArrayList<>(); + + // 使用EasyExcel读取数据 + EasyExcel.read(filePath, new AnalysisEventListener>() { + + // 表头 + private Map header; + + @Override + public void invokeHeadMap(Map headMap, AnalysisContext context) { + log.info("表头信息:{}", headMap); + header = headMap; + } + + /** + * 读取每一行数据 + * @param rowData 每一行数据 + * @param context 上下文 + */ + @Override + public void invoke(Map rowData, AnalysisContext context) { + log.info("第{}行数据:{}", context.readRowHolder().getRowIndex(), rowData); + Map dataMap = new HashMap<>(); + for (Map.Entry entry : rowData.entrySet()) { + int columnIndex = entry.getKey(); + String columnName = header.get(columnIndex); + dataMap.put(columnName, entry.getValue()); + } + dataList.add(dataMap); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 解析完成后的操作 + } + }).autoTrim(true).ignoreEmptyRow(true).sheet().doRead(); + + // 发送请求 + dataList.stream().map(map -> { + HashMap body = new HashMap<>(); + body.put("module", module); + body.put("type", type); + body.put("param", map); + return JSONUtil.toJsonStr(body); + }).forEach(body -> { + // 构建参数 + String result = HttpRequest.post(envMap.get(env) + SpringUtil.getApplicationName() + "/api/black-white-list/create") + .body(body, "application/json") + .execute().body(); + log.info("请求结果:{}", result); + }); + + + + } } diff --git a/pom.xml b/pom.xml index c57ee360..38182ced 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,8 @@ 2.0.0-SNAPSHOT 1.18.22 1.4.2.Final + 5.2.2 + 3.3.3 @@ -57,6 +59,11 @@ lombok + + cn.hutool + hutool-all + +