ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

高效导入功能设计规范指南

高效导入功能设计规范指南 导入功能设计规范一、导入工程流程导入工程流程一般如下下载模板上传文件解析下载解析报告或确认导入二、接口规范1. 下载模板接口规范GET请求无需参数/** * 下载模板 * * param response */GetMapping(template)publicvoidtemplate(HttpServletResponseresponse){programGradService.template(response);}下载模板一般是从 MinIO 上读取已经上传的模板进行导入也可以通过代码生成模板如下publicvoiddownload(StringexamBatchId,HttpServletResponseresponse){// 获取表头ListStringheaderRowthis.getHeaderList(examBatchId);// 生成文件try{StringfileNameleExamBatch.getName()导入模板.xls;response.setContentType(application/x-msdownload);response.setHeader(Content-Disposition,attachment; filenameURLEncoder.encode(fileName,StandardCharsets.UTF_8.name()));OutputStreamoutresponse.getOutputStream();ListListStringrowsCollUtil.newArrayList(Collections.singleton(headerRow));ExcelWriterwriterExcelUtil.getWriter();writer.write(rows);writer.flush(out);writer.close();}catch(Exceptione){thrownewUniException(下载失败);}}2. 解析文件接口规范POST请求表单形式传参入参为文件返回参数为对象在工具类里面已经定义好统一返回类AnalyzeResultVO属性包含表头、所有数据、解析成功的数据、解析失败的数据、成功的条数、失败的条数。/** * 解析文件 * * param file */PostMapping(analysis)publicResponseAnalyzeResultVOanalysis(RequestParam(file)MultipartFilefile){returnResponse.ok(programGradService.analysis(file));}解析返回对象 AnalyzeResultVOpublicclassAnalyzeResultVOT{/** * 表头 */privateListStringheaderList;/** * 解析总的数据用于前端展示 */privateListListStringdataList;/** * 解析成功的数据用于后端导入 */privateListTsuccessList;/** * 解析失败的数据用于后端下载解析报告 */privateListTerrorList;/** * 成功条数 */privateIntegersuccessNums;/** * 失败条数 */privateIntegererrorNums;}后端解析时可以使用工具类TableUtils直接获取表头并将数据解析成ListListString。需要在解析对象属性上添加注解TableHeader再通过工具类方法直接获取数据。注意为了规范解析对象第一个属性为状态最后一个属性为解析失败的原因。后续转换为二维数组时按属性顺序转换方便前端展示状态和原因。解析数据对象示例DataAccessors(chaintrue)NoArgsConstructorAllArgsConstructorpublicclassAnalyzeDownGradeImportVO{/** * 解析结果 */TableHeader(value状态)privateStringstatus;/* 具体解析的列属性 *//** * 申请说明 */TableHeader(value申请说明)Excel(name申请说明)privateStringreason;/** * 解析原因 */TableHeader(value原因)privateStringanalyzeReason;}具体解析方法// 解析数据使用 easyPOI 解析不存在复杂表头时使用否则使用 POI 进行解析ListPunishImportVOpunishImportsEasyPoiUtil.importExcel(file,0,1,PunishImportVO.class,newArrayList(0));publicAnalyzePunishVOanalysePunishImportErrorInfo(ListPunishImportVOpunishImportDTOList){if(CollectionUtils.isEmpty(punishImportDTOList)){returnnewAnalyzePunishVO();}ListPunishImportVOsuccessImportVoSnewArrayList(10);ListPunishImportVOerrorImportVoSnewArrayList(10);IntegerfailureNum0;IntegersuccessNum0;for(PunishImportVOpunish:punishImportDTOList){// 具体判断数据是否成功/失败if(StringUtils.isBlank(punish.getLifeCycle())){errorImportVoS.add(punish.setStatus(失败).setReason(失败的原因));failureNum;}// 成功的数据successNum;successImportVoS.add(punish.setStatus(成功));}returnnewAnalyzeResultVOPunishImportVO().setSuccessList(successImportVoS).setErrorNums(failureNum).setSuccessNums(successNum).setErrorList(errorImportVoS);}工具类转换publicTAnalyzeCommonApplyVOanalyzeCommonApplyResponse(ListTanalyzeList,ClassTclazz){// 将对象转换成 stringListListStringtableDataTableUtils.getTableData(analyzeList,clazz);// 获取表头ListStringheaderTableUtils.getTableHeader(clazz);returnnewAnalyzeResultVOPunishImportVO().setHeaderList(header).setDataList(tableData);}3. 下载解析报告接口规范POST方式JSON格式传参前端只需传失败的数据到后端下载解析报告/** * 下载解析报告 * * param dto */PostMapping(analysis-report)publicvoiddownloadAnalysis(RequestBodyProgramGradDTOdto,HttpServletResponseresponse){programGradService.downloadAnalysis(dto,response);}4. 导入接口规范POST方式JSON格式传参前端只需传成功的数据到后端后端需把成功的数据再进行一次解析然后再进行导入/** * 导入 * * param dto */PostMapping(import)publicResponseimportProgramGrad(RequestBodyProgramGradDTOdto){programGradService.importProgramGrad(dto);returnResponse.ok();}
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进