From 4c011cd0606faa6ca015bb719d3577dce610e872 Mon Sep 17 00:00:00 2001 From: whb <17803890193@163.com> Date: Wed, 17 Apr 2024 16:04:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=B4=A2=E5=8A=A1=E6=8C=87?= =?UTF-8?q?=E6=A0=87=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StuExportToExcelController.java | 166 +++++++++++++++++- .../service/impl/StuRateServiceImpl.java | 18 +- src/main/resources/template/财务指标.xls | Bin 0 -> 24064 bytes 3 files changed, 168 insertions(+), 16 deletions(-) create mode 100644 src/main/resources/template/财务指标.xls diff --git a/src/main/java/com/sztzjy/digital_credit/controller/StuExportToExcelController.java b/src/main/java/com/sztzjy/digital_credit/controller/StuExportToExcelController.java index 3d41299..ad22f60 100644 --- a/src/main/java/com/sztzjy/digital_credit/controller/StuExportToExcelController.java +++ b/src/main/java/com/sztzjy/digital_credit/controller/StuExportToExcelController.java @@ -13,9 +13,7 @@ import com.alibaba.excel.write.metadata.fill.FillConfig; import com.alibaba.excel.write.metadata.fill.FillWrapper; import com.sztzjy.digital_credit.annotation.AnonymousAccess; import com.sztzjy.digital_credit.entity.*; -import com.sztzjy.digital_credit.mapper.StuFinancialStatementsMapper; -import com.sztzjy.digital_credit.mapper.StuOperationAssetAnalysisModuleMapper; -import com.sztzjy.digital_credit.mapper.StuScoreModuleMapper; +import com.sztzjy.digital_credit.mapper.*; import com.sztzjy.digital_credit.util.excel.FilePortUtil; import com.sztzjy.digital_credit.util.file.IFileUtil; @@ -64,10 +62,168 @@ public class StuExportToExcelController { @Autowired private StuOperationAssetAnalysisModuleMapper operationAssetAnalysisModuleMapper; + @Autowired + private StuProfitAbilityMapper profitAbilityMapper; + + @Autowired + private StuSolvencyMapper solvencyMapper; + + @Autowired + private StuOperatingCapacityMapper operatingCapacityMapper; + + + @Autowired + private StuGrowthAbilityMapper growthAbilityMapper; + + @Autowired + private StuDuPontAnalysisMapper duPontAnalysisMapper; + + + + + + + @ApiOperation("财务指标") + @GetMapping("/financialIndexExport") + @AnonymousAccess + public void financialIndexExport(HttpServletResponse response, @RequestParam("userId") String userId) { + Map sheetMap = new HashMap<>(); + + //盈利能力 + StuProfitAbilityExample profitAbilityExample = new StuProfitAbilityExample(); + profitAbilityExample.createCriteria().andUserIdEqualTo(userId); + List profitAbilityList = profitAbilityMapper.selectByExample(profitAbilityExample); + if (!profitAbilityList.isEmpty()){ + + sheetMap.put("data1", profitAbilityList.get(0).getGrossMargin()); + sheetMap.put("data2", profitAbilityList.get(0).getReturnAssetRoa()); + sheetMap.put("data3", profitAbilityList.get(0).getReturnEquityRoe()); + sheetMap.put("data4", profitAbilityList.get(0).getNetOperatProfitMargin()); + } + + + + //偿债能力 + StuSolvencyExample solvencyExample = new StuSolvencyExample(); + solvencyExample.createCriteria().andUserIdEqualTo(userId); + List stuSolvencyList = solvencyMapper.selectByExample(solvencyExample); + if (!stuSolvencyList.isEmpty()){ + + //与模板对应字段-值设置 + + sheetMap.put("data5", stuSolvencyList.get(0).getCurrentRatio()); + sheetMap.put("data6", stuSolvencyList.get(0).getAssetLiabilityRatio()); + sheetMap.put("data7", stuSolvencyList.get(0).getEquityRatio()); + sheetMap.put("data8", stuSolvencyList.get(0).getEquityMultiplier()); + + sheetMap.put("data9", stuSolvencyList.get(0).getQuickRatio()); + sheetMap.put("data10", stuSolvencyList.get(0).getCashRatio()); + } + + + //营运能力 + StuOperatingCapacityExample operatingCapacityExample = new StuOperatingCapacityExample(); + operatingCapacityExample.createCriteria().andUserIdEqualTo(userId); + List operatingCapacityList = operatingCapacityMapper.selectByExample(operatingCapacityExample); + if (!operatingCapacityList.isEmpty()){ + + //与模板对应字段-值设置 + sheetMap.put("data11", operatingCapacityList.get(0).getTotalAssetTurnover()); + sheetMap.put("data12", operatingCapacityList.get(0).getCurrentAssetTurnover()); + sheetMap.put("data13", operatingCapacityList.get(0).getAccountsReceivalTurnoverRate()); + sheetMap.put("data14", operatingCapacityList.get(0).getInventoryTurnoverRate()); + + } + + + //成长能力 + StuGrowthAbilityExample growthAbilityExample = new StuGrowthAbilityExample(); + growthAbilityExample.createCriteria().andUserIdEqualTo(userId); + List growthAbilityList = growthAbilityMapper.selectByExample(growthAbilityExample); + if (!growthAbilityList.isEmpty()){ + + //与模板对应字段-值设置 + sheetMap.put("data15", growthAbilityList.get(0).getYearGrowth()); + + } + + //杜邦分析 + StuDuPontAnalysisExample duPontAnalysisExample = new StuDuPontAnalysisExample(); + duPontAnalysisExample.createCriteria().andUserIdEqualTo(userId); + List duPontAnalysisList = duPontAnalysisMapper.selectByExample(duPontAnalysisExample); + if (!duPontAnalysisList.isEmpty()){ + + //与模板对应字段-值设置 + sheetMap.put("data16", duPontAnalysisList.get(0).getNetOperatProfitMargin()); + sheetMap.put("data17", duPontAnalysisList.get(0).getTotalAssetTurnover()); + sheetMap.put("data18", duPontAnalysisList.get(0).getEquityMultiplier()); + sheetMap.put("data19", duPontAnalysisList.get(0).getNetPrifitMarginTotalAsset()); + sheetMap.put("data20", duPontAnalysisList.get(0).getReturnEquity()); + + } + + + ExcelWriter excelWriter = null; + InputStream inputStream = null; + ServletOutputStream outputStream = null; + + try { + + ClassPathResource classPathResource = new ClassPathResource("/template/财务指标.xls"); + inputStream = classPathResource.getInputStream(); + outputStream = response.getOutputStream(); + + excelWriter = EasyExcel.write(outputStream).inMemory(Boolean.TRUE).withTemplate(inputStream).excelType(ExcelTypeEnum.XLS).build(); + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + //FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + excelWriter.fill(sheetMap, writeSheet); + + + String fileName = URLEncoder.encode("财务指标", "UTF-8").replaceAll("\\+", "%20"); + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xls"); + excelWriter.finish(); + + + } catch (IOException e) { + throw new RuntimeException(e); + }finally { + // 千万别忘记finish 会帮忙关闭流 + if (excelWriter != null) { + excelWriter.finish(); + } + //关闭流 + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + + + + + + + + + + + } + - //TODO - // 财务指标Excel 未导出 @AnonymousAccess diff --git a/src/main/java/com/sztzjy/digital_credit/service/impl/StuRateServiceImpl.java b/src/main/java/com/sztzjy/digital_credit/service/impl/StuRateServiceImpl.java index 4abaf90..2b08379 100644 --- a/src/main/java/com/sztzjy/digital_credit/service/impl/StuRateServiceImpl.java +++ b/src/main/java/com/sztzjy/digital_credit/service/impl/StuRateServiceImpl.java @@ -430,21 +430,17 @@ public class StuRateServiceImpl implements StuRateService { ratingResultMapper.deleteByExample(stuRatingResultExample); -// StuScoreModuleExample stuOperationAssetAnalysisModuleExample = new StuScoreModuleExample(); -// stuOperationAssetAnalysisModuleExample.createCriteria().andUserIdEqualTo(userId); -// operationAssetAnalysisModuleMapper.deleteByExample(stuOperationAssetAnalysisModuleExample); -// -// -// StuDuPontAnalysisExample stuDuPontAnalysisExample = new StuDuPontAnalysisExample(); -// stuDuPontAnalysisExample.createCriteria().andUserIdEqualTo(userId); -// duPontAnalysisMapper.deleteByExample(stuDuPontAnalysisExample); + StuScoreModuleExample stuScoreModuleExample = new StuScoreModuleExample(); + stuScoreModuleExample.createCriteria().andUserIdEqualTo(userId); + scoreModuleMapper.deleteByExample(stuScoreModuleExample); + StuSolvencyExample stuSolvencyExample = new StuSolvencyExample(); + stuSolvencyExample.createCriteria().andUserIdEqualTo(userId); + solvencyMapper.deleteByExample(stuSolvencyExample); - - - return null; + return new ResultEntity<>(HttpStatus.OK); } //增信措施自动评分 diff --git a/src/main/resources/template/财务指标.xls b/src/main/resources/template/财务指标.xls new file mode 100644 index 0000000000000000000000000000000000000000..beeec4ee30143e2b939477ffe0b022bbcad434db GIT binary patch literal 24064 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 caLNzsjM!mt4PfDca7B5Th66