diff --git a/pom.xml b/pom.xml index a072ead..d1570ca 100644 --- a/pom.xml +++ b/pom.xml @@ -216,6 +216,28 @@ poi-ooxml 4.1.2 + + com.ibeetl + admin-convert-pdf + 1.3.1 + compile + + + + org.xhtmlrenderer + flying-saucer-pdf + 9.1.22 + + + + org.xhtmlrenderer + flying-saucer-pdf-itext5 + 9.1.22 + + + + + diff --git a/src/main/java/com/sztzjy/admin-convert-pdf/pom.xml b/src/main/java/com/sztzjy/admin-convert-pdf/pom.xml new file mode 100644 index 0000000..c1167cb --- /dev/null +++ b/src/main/java/com/sztzjy/admin-convert-pdf/pom.xml @@ -0,0 +1,88 @@ + + + + + + + + 4.0.0 + + com.ibeetl + admin-convert-pdf + 1.3.1 + + 任意格式转换成PDF的工具包 + + + 8 + 8 + + + + + org.apache.poi + poi-scratchpad + 4.1.2 + compile + + + com.itextpdf + itextpdf + 5.5.13.3 + compile + + + + com.aspose + aspose-words + 18.10 + system + ${project.basedir}/src/main/resources/lib/aspose-words-18.10-jdk16.jar + + + com.aspose + aspose-pdf + 18.2 + system + ${project.basedir}/src/main/resources/lib/aspose-pdf-18.2.jar + + + com.aspose + aspose-cells + 20.7 + system + ${project.basedir}/src/main/resources/lib/aspose-cells-20.7-crack.jar + + + org.apache.poi + poi-ooxml + 4.1.2 + compile + + + org.springframework + spring-web + 6.0.11 + compile + + + + + + + + AsposeJavaAPI + Aspose Java API + https://repository.aspose.com/repo/ + + + + + AsposeJavaAPI + https://repository.aspose.com/repo/ + + + + \ No newline at end of file diff --git a/src/main/java/com/sztzjy/admin-convert-pdf/src/main/java/util/convertPDF/PDFConvertUtil.java b/src/main/java/com/sztzjy/admin-convert-pdf/src/main/java/util/convertPDF/PDFConvertUtil.java new file mode 100644 index 0000000..8619f6d --- /dev/null +++ b/src/main/java/com/sztzjy/admin-convert-pdf/src/main/java/util/convertPDF/PDFConvertUtil.java @@ -0,0 +1,538 @@ +package util.convertPDF; + +import com.aspose.words.FontSettings; +import com.aspose.words.License; +import com.aspose.words.SaveFormat; +import com.itextpdf.text.Document; +import com.itextpdf.text.Image; +import com.itextpdf.text.PageSize; +import com.itextpdf.text.pdf.PdfPCell; +import com.itextpdf.text.pdf.PdfPTable; +import com.itextpdf.text.pdf.PdfWriter; +import org.apache.poi.hslf.usermodel.*; +import org.apache.poi.xslf.usermodel.*; + +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static util.convertPDF.PDFConvertUtil.TypeEnum.*; + + +/** + * 功能描述:
+ * PDF 转换工具 + * + * @Author: lx + * @Date: 2022/12/13 16:26 + */ +public final class PDFConvertUtil { + + final private static Map> types = new HashMap<>(); + + public static enum TypeEnum { + WORD, EXCEL, PPT, PPTX, IMG, OTHER + } + + static { + types.put(WORD, Arrays.asList("DOC", "DOCX")); + types.put(EXCEL, Arrays.asList("XLS", "XLSX")); + types.put(PPT, Arrays.asList("PPT")); + types.put(PPTX, Arrays.asList("PPTX")); +// types.put(IMG, Arrays.asList("JPEG", "JPG", "PNG")); + types.put(OTHER, Arrays.asList("OOXML", "RTF HTML", "OpenDocument", "EPUB", "XPS", "SWF")); + + } + + /** + * @param inputStream 源文件输入流 + * @param outputStream pdf文件输出流 + **/ + public static boolean imgToPdf(InputStream inputStream, OutputStream outputStream) { + + Document document = null; PdfWriter pdfWriter = null; + try { + //此处处理乱码和小方块 + //如果在本地运行,此处报错,请注释这个这是字体,主要是为了解决linux环境下面运行jar时找不到中文字体的问题 + //指定文件库内容路径 + FontSettings.getDefaultInstance().setFontsFolders( + new String[] {"/usr/share/fonts", "/usr/share/fonts/chinese"} + , true); + + // 创建文档,设置PDF页面的大小 A2-A9, 个人觉得A3最合适 + document = new Document(PageSize.A6, 0, 0, 0, 0); + + // 新建pdf文档,具体逻辑看.getInstance方法 + pdfWriter = PdfWriter.getInstance(document, outputStream); + + document.open(); + document.newPage(); + + // 将文件流转换为字节流,便于格式转换 + BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + byte[] bytes = new byte[1024]; + int length = 0 ; + while (-1 != (length = bufferedInputStream.read(bytes))) { + byteArrayOutputStream.write(bytes, 0, length); + } + + // 处理img图片 + Image image = Image.getInstance(byteArrayOutputStream.toByteArray()); + + float height = image.getHeight(); + float width = image.getWidth(); + + float percent = 0.0f; + // 设置像素或者长宽高,将会影响图片的清晰度,因为只是对图片放大或缩小 + if (height > width) { + // A4 - A9 + percent = PageSize.A6.getHeight() / height * 100; + } else { + percent = PageSize.A6.getWidth() / width * 100; + } + + image.setAlignment(Image.MIDDLE); + image.scalePercent(percent); + + // 将图片放入文档中,完成pdf转换 + document.add(image); + System.out.println("image转换完毕"); + } catch (Exception e) { + e.printStackTrace(); + return false; + } finally { + close(document, pdfWriter); + closeOutput(outputStream); + closeInput(inputStream); + } + + return true; + } + + /** + * @param inputStream 源文件输入流 + * @param outputStream pdf文件输出流 + **/ + public static boolean wordToPdfByAspose(InputStream inputStream, OutputStream outputStream) { + + // 验证License 若不验证则转化出的pdf文档会有水印产生 + if (!getLicense()) { + return false; + } + try { + //此处处理乱码和小方块 + //如果在本地运行,此处报错,请注释这个这是字体,主要是为了解决linux环境下面运行jar时找不到中文字体的问题 + //指定文件库内容路径 + FontSettings.getDefaultInstance().setFontsFolders( + new String[] {"/usr/share/fonts", "/usr/share/fonts/win"} + , true); + // 将源文件保存在com.aspose.words.Document中,具体的转换格式依靠里面的save方法 + com.aspose.words.Document doc = new com.aspose.words.Document(inputStream); + + // 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,EPUB, XPS, SWF 相互转换 + doc.save(outputStream, SaveFormat.PDF); + + System.out.println("word转换完毕"); + } catch (Exception e) { + e.printStackTrace(); + return false; + }finally { + closeOutput(outputStream); + closeInput(inputStream); + } + return true; + } + + /** + * 关闭输出流 + * @param outputStream + */ + private static void closeOutput(OutputStream outputStream) { + if (outputStream != null) { + try { + outputStream.flush(); + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 关闭输出流 + * @param inputStream + */ + private static void closeInput(InputStream inputStream) { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private static void close(Document document, PdfWriter pdfWriter) { + if (document != null) { + document.close(); + } + if (pdfWriter != null) { + pdfWriter.close(); + } + } + + // 官方文档的要求 无需理会 + public static boolean getLicense() { + boolean result = false; + try { + String s = "\n" + + " \n" + + " \n" + + " Aspose.Total for Java\n" + + " Aspose.Words for Java\n" + + " \n" + + " Enterprise\n" + + " 20991231\n" + + " 20991231\n" + + " 8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7\n" + + " \n" + + " sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=\n" + + ""; + ByteArrayInputStream is = new ByteArrayInputStream(s.getBytes()); + License aposeLic = new License(); + aposeLic.setLicense(is); + result = true; + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + /** + * @param inputStream 源文件输入流 + * @param outputStream pdf文件输出流 + **/ + public static boolean excelToPdf(InputStream inputStream, OutputStream outputStream) { + // 验证License 若不验证则转化出的pdf文档会有水印产生 + if (!getExcelLicense()) { + return false; + } + try { + //此处处理乱码和小方块 + //如果在本地运行,此处报错,请注释这个这是字体,主要是为了解决linux环境下面运行jar时找不到中文字体的问题 + //指定文件库内容路径 + FontSettings.getDefaultInstance().setFontsFolders( + new String[] {"/usr/share/fonts", "/usr/share/fonts/win"} + , true); + // 原始excel路径 + com.aspose.cells.Workbook wb = new com.aspose.cells.Workbook(inputStream); + + com.aspose.cells.PdfSaveOptions pdfSaveOptions = new com.aspose.cells.PdfSaveOptions(); + pdfSaveOptions.setOnePagePerSheet(false); + + int[] autoDrawSheets={3}; + //当excel中对应的sheet页宽度太大时,在PDF中会拆断并分页。此处等比缩放。 + autoDraw(wb,autoDrawSheets); + + int[] showSheets={0}; + //隐藏workbook中不需要的sheet页。 + printSheetPage(wb,showSheets); + wb.save(outputStream, pdfSaveOptions); + System.out.println("excel转换完毕"); + } catch (IOException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + }finally { + closeOutput(outputStream); + closeInput(inputStream); + } + return true; + } + + + /** + * 设置打印的sheet 自动拉伸比例 + * @param wb + * @param page 自动拉伸的页的sheet数组 + */ + public static void autoDraw(com.aspose.cells.Workbook wb,int[] page){ + if(null!=page&&page.length>0){ + for (int i = 0; i < page.length; i++) { + wb.getWorksheets().get(i).getHorizontalPageBreaks().clear(); + wb.getWorksheets().get(i).getVerticalPageBreaks().clear(); + } + } + } + + /** + * 隐藏workbook中不需要的sheet页。 + * + * @param wb + * @param page 显示页的sheet数组 + */ + public static void printSheetPage(com.aspose.cells.Workbook wb, int[] page) { + for (int i = 1; i < wb.getWorksheets().getCount(); i++) { + wb.getWorksheets().get(i).setVisible(false); + } + if (null == page || page.length == 0) { + wb.getWorksheets().get(0).setVisible(true); + } else { + for (int i = 0; i < page.length; i++) { + wb.getWorksheets().get(i).setVisible(true); + } + } + } + + public static boolean getExcelLicense() { + boolean result = false; + try { + String s = "\n" + + " \n" + + " \n" + + " Aspose.Cells for Java\n" + + " \n" + + " Enterprise\n" + + " 29991231\n" + + " 29991231\n" + + " evilrule\n" + + " \n" + + " evilrule\n" + + ""; + ByteArrayInputStream is = new ByteArrayInputStream(s.getBytes()); + com.aspose.cells.License aposeLic = new com.aspose.cells.License(); + aposeLic.setLicense(is); + result = true; + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * pptToPdf + * @param inputStream + * @param outputStream + * @return + */ + public static boolean pptToPdf(InputStream inputStream, OutputStream outputStream) { + + Document document = null; + HSLFSlideShow hslfSlideShow = null; + PdfWriter pdfWriter = null; + + try { + //此处处理乱码和小方块 + //如果在本地运行,此处报错,请注释这个这是字体,主要是为了解决linux环境下面运行jar时找不到中文字体的问题 + //指定文件库内容路径 + FontSettings.getDefaultInstance().setFontsFolders( + new String[] {"/usr/share/fonts", "/usr/share/fonts/win"} + , true); + hslfSlideShow = new HSLFSlideShow(inputStream); + + // 获取ppt文件页面 + Dimension dimension = hslfSlideShow.getPageSize(); + + document = new Document(); + + // pdfWriter实例 + pdfWriter = PdfWriter.getInstance(document, outputStream); + + document.open(); + + PdfPTable pdfPTable = new PdfPTable(1); + + List hslfSlideList = hslfSlideShow.getSlides(); + + for (int i=0; i < hslfSlideList.size(); i++) { + HSLFSlide hslfSlide = hslfSlideList.get(i); + // 设置字体, 解决中文乱码 + for (HSLFShape shape : hslfSlide.getShapes()) { + if (shape instanceof HSLFTextShape) { + HSLFTextShape textShape = (HSLFTextShape) shape; + + for (HSLFTextParagraph textParagraph : textShape.getTextParagraphs()) { + for (HSLFTextRun textRun : textParagraph.getTextRuns()) { + textRun.setFontFamily("宋体"); + } + } + } + } + BufferedImage bufferedImage = new BufferedImage((int)dimension.getWidth(), (int)dimension.getHeight(), BufferedImage.TYPE_INT_RGB); + + Graphics2D graphics2d = bufferedImage.createGraphics(); + + graphics2d.setPaint(Color.white); + graphics2d.setFont(new java.awt.Font("宋体", java.awt.Font.PLAIN, 12)); + + hslfSlide.draw(graphics2d); + + graphics2d.dispose(); + + Image image = Image.getInstance(bufferedImage, null); + image.scalePercent(56f); + + // 写入单元格 + pdfPTable.addCell(new PdfPCell(image, true)); + document.add(image); + + } + } catch (Exception e) { + e.printStackTrace(); + return false; + } finally { + close(document, pdfWriter); + closeOutput(outputStream); + closeInput(inputStream); + } + System.out.println("ppt转换完毕"); + return true; + } + + /** + * pptxToPdf + * @param inputStream + * @param outputStream + * @return + */ + public static boolean pptxToPdf(InputStream inputStream, OutputStream outputStream) { + + Document document = null; + + XMLSlideShow slideShow = null; + + PdfWriter pdfWriter = null; + + try { + //此处处理乱码和小方块 + //如果在本地运行,此处报错,请注释这个这是字体,主要是为了解决linux环境下面运行jar时找不到中文字体的问题 + //指定文件库内容路径 + FontSettings.getDefaultInstance().setFontsFolders( + new String[] {"/usr/share/fonts", "/usr/share/fonts/win"} + , true); + + slideShow = new XMLSlideShow(inputStream); + + Dimension dimension = slideShow.getPageSize(); + + document = new Document(); + + pdfWriter = PdfWriter.getInstance(document, outputStream); + + document.open(); + + PdfPTable pdfPTable = new PdfPTable(1); + + List slideList = slideShow.getSlides(); + + for (int i = 0, row = slideList.size(); i < row; i++) { + + XSLFSlide slide = slideList.get(i); + + // 设置字体, 解决中文乱码 + for (XSLFShape shape : slide.getShapes()) { + if (shape instanceof XSLFTextShape) { + XSLFTextShape textShape = (XSLFTextShape) shape; + + for (XSLFTextParagraph textParagraph : textShape.getTextParagraphs()) { + for (XSLFTextRun textRun : textParagraph.getTextRuns()) { + textRun.setFontFamily("宋体"); + } + } + } + } + + BufferedImage bufferedImage = new BufferedImage((int)dimension.getWidth(), (int)dimension.getHeight(), BufferedImage.TYPE_INT_RGB); + + Graphics2D graphics2d = bufferedImage.createGraphics(); + + graphics2d.setPaint(Color.white); + graphics2d.setFont(new java.awt.Font("宋体", java.awt.Font.PLAIN, 12)); + + slide.draw(graphics2d); + + graphics2d.dispose(); + + Image image = Image.getInstance(bufferedImage, null); + //image.scalePercent(50f); + image.scalePercent(56f); + + // 写入单元格 + pdfPTable.addCell(new PdfPCell(image, true)); + document.add(image); + } + } catch (Exception e) { + e.printStackTrace(); + return false; + } finally { + close(document, pdfWriter); + closeOutput(outputStream); + closeInput(inputStream); + } + System.out.println("pptx转换完毕"); + return true; + } + + /** + * 功能描述:
+ * 通过文件名后缀来进行转换 + * + * @return {@link boolean} + * @Author: lx + * @Date: 2022/12/13 16:37 + */ + public static boolean convertToPDFByFileNameSuffix(String fileName, InputStream inputStream, OutputStream outputStream) { + + String fileSuffix = getFileSuffix(fileName).toUpperCase(); + + if (types.get(WORD).contains(fileSuffix)) { + return wordToPdfByAspose(inputStream, outputStream); + } + if (types.get(EXCEL).contains(fileSuffix)) { + return excelToPdf(inputStream, outputStream); + } + if (types.get(PPT).contains(fileSuffix)) { + return pptToPdf(inputStream, outputStream); + } + if (types.get(PPTX).contains(fileSuffix)) { + return pptxToPdf(inputStream, outputStream); + } +// if (types.get(IMG).contains(fileSuffix)) { +// return imgToPdf(inputStream, outputStream); +// } + if (types.get(OTHER).contains(fileSuffix)) { + return wordToPdfByAspose(inputStream, outputStream); + } + return false; + } + + /** + * 判断是否可以生成PDF文件 + * @param fileName + * @return + */ + public static boolean isCreatePdf(String fileName) { + return types.values().stream().anyMatch(item -> item.contains(getFileSuffix(fileName).toUpperCase())); + } + + /** + * 功能描述:
+ * 取文件名后缀 + * + * @param fileName + * @return {@link String} + * @Author: lx + * @Date: 2022/12/13 21:51 + */ + private static String getFileSuffix(String fileName) { + if (!fileName.contains(".")) { + throw new RuntimeException("非法的文件名,文件名必须要有文件类型!"); + } + String[] split = fileName.split("\\."); + return split[split.length - 1]; + } +} \ No newline at end of file diff --git a/src/main/java/com/sztzjy/admin-convert-pdf/src/main/resources/lib/aspose-cells-20.7-crack.jar b/src/main/java/com/sztzjy/admin-convert-pdf/src/main/resources/lib/aspose-cells-20.7-crack.jar new file mode 100644 index 0000000..9676f04 Binary files /dev/null and b/src/main/java/com/sztzjy/admin-convert-pdf/src/main/resources/lib/aspose-cells-20.7-crack.jar differ diff --git a/src/main/java/com/sztzjy/admin-convert-pdf/src/main/resources/lib/aspose-pdf-18.2.jar b/src/main/java/com/sztzjy/admin-convert-pdf/src/main/resources/lib/aspose-pdf-18.2.jar new file mode 100644 index 0000000..833df4f Binary files /dev/null and b/src/main/java/com/sztzjy/admin-convert-pdf/src/main/resources/lib/aspose-pdf-18.2.jar differ diff --git a/src/main/java/com/sztzjy/admin-convert-pdf/src/main/resources/lib/aspose-words-18.10-jdk16.jar b/src/main/java/com/sztzjy/admin-convert-pdf/src/main/resources/lib/aspose-words-18.10-jdk16.jar new file mode 100644 index 0000000..33057f9 Binary files /dev/null and b/src/main/java/com/sztzjy/admin-convert-pdf/src/main/resources/lib/aspose-words-18.10-jdk16.jar differ diff --git a/src/main/java/com/sztzjy/digital_credit/config/Constant.java b/src/main/java/com/sztzjy/digital_credit/config/Constant.java index 94dc499..cbbb35e 100644 --- a/src/main/java/com/sztzjy/digital_credit/config/Constant.java +++ b/src/main/java/com/sztzjy/digital_credit/config/Constant.java @@ -242,4 +242,15 @@ public class Constant { "收支情况:刘先生年收入180万元,年底有80万元分红,妻子年收入100万元,年底奖金50万元。家庭月日常生活支出 38000元,儿子教育费用6000元/月,每年衣物及礼金支出50000元,支付刘先生父母生活费50000元/年,旅游费用150000元/年,汽车使用费(包括保险)120000元/年,健身支出30000/年,家政保姆支出12万/年,交际娱乐支出12万/年。\n" + "刘先生持有两张信用卡,目前一张信用卡额度为20万,一张信用卡额度为50万,已用额度为10万,最近6个月平均使用额度为为65000元,首张信用卡发卡月份为2005年3月份。此外刘先生还有一笔对外担保,担保金额为100万元,担保本金余额50万。\n" + "刘先生养老保险金账户余额为208000元,医疗保险账户余额为140000元,住房公积金账户余额98000元,未出现过断缴情况"; + + + public static final String PERSONYXYSFX_MODULE = "个人影响因素分析"; + public static final String PERSONZXYHFX_MODULE = "个人征信优化分析"; + public static final String PERSONZXPJMX_MOXULE = "个人征信评级模型"; + + + public static final String QIYEYXYSFX_MODULE = "企业影响因素分析"; + public static final String QIYEZXYHFX_MODULE = "企业征信优化分析"; + public static final String QIYEZXPJMX_MOXULE = "企业征信评级模型"; + } diff --git a/src/main/java/com/sztzjy/digital_credit/controller/StuConceptBlockController.java b/src/main/java/com/sztzjy/digital_credit/controller/StuConceptBlockController.java new file mode 100644 index 0000000..56241a5 --- /dev/null +++ b/src/main/java/com/sztzjy/digital_credit/controller/StuConceptBlockController.java @@ -0,0 +1,198 @@ +package com.sztzjy.digital_credit.controller; + +import com.alibaba.fastjson.JSONObject; +import com.nimbusds.jose.shaded.gson.Gson; + +import com.sztzjy.digital_credit.annotation.AnonymousAccess; +import com.sztzjy.digital_credit.config.security.TokenProvider; +import com.sztzjy.digital_credit.entity.*; +import com.sztzjy.digital_credit.entity.dto.StuBlockProductWithDTO; +import com.sztzjy.digital_credit.entity.dto.StuLearningAssessmentDTO; +import com.sztzjy.digital_credit.entity.dto.StuLearningAssessmentScoreDTO; +import com.sztzjy.digital_credit.entity.dto.StuScoreDetailsDTO; +import com.sztzjy.digital_credit.mapper.StuResourcesMapper; +import com.sztzjy.digital_credit.service.StuConceptBlockService; +import com.sztzjy.digital_credit.util.ResultDataEntity; +import com.sztzjy.digital_credit.util.ResultEntity; +import com.sztzjy.digital_credit.util.file.IFileUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.FileSystemResource; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; + +@RestController +@Api(tags="区块链") +@RequestMapping("/api/stu/concept/block") +public class StuConceptBlockController { + + + @Resource + private StuConceptBlockService stuConceptBlockService; + + @Value("${file.path}") + private String filePath; + + + @Resource + private StuResourcesMapper stuResourcesMapper; + + + + @ApiOperation("区块链学习资源查看") + @PostMapping("/getBlockResources") + @AnonymousAccess + public ResultDataEntity getBlockResources(@RequestBody JSONObject jsonObject) { + String module = jsonObject.getString("module"); + if (module.isEmpty()) { + return new ResultDataEntity(HttpStatus.NO_CONTENT, "参数为空"); + } + List conceptBlockResources = stuConceptBlockService.getConceptBlockResources(module); + return new ResultDataEntity(HttpStatus.OK, conceptBlockResources); + } + + + @ApiOperation("区块链知识笔记查看") + @PostMapping("/getBlockKnowledgeNotes") + @AnonymousAccess + public ResultEntity getBlockKnowledgeNotes(String userId, String module) { + if (module.isEmpty() && userId.isEmpty()) { + return new ResultEntity("参数为空"); + } + StuKnowledgeNotes knowledgeNotes = stuConceptBlockService.getKnowledgeNotes(userId,module); + return new ResultEntity(knowledgeNotes); + } + + + + + + @PostMapping("/addKnowledgeNotes") + @ApiOperation("区块链知识笔记上传") + @AnonymousAccess + public ResultEntity addKnowledgeNotes(@RequestBody JSONObject jsonObject) { + StuKnowledgeNotes stuKnowledgeNotes = jsonObject.getObject("stuKnowledgeNotes", StuKnowledgeNotes.class); + if (stuKnowledgeNotes != null) { + stuConceptBlockService.addKnowledgeNotes(stuKnowledgeNotes); + return new ResultEntity("上传成功"); + } else { + return new ResultEntity("上传失败"); + } + + } + + + + @GetMapping("/downBlockKnowledge") + @ApiOperation("区块链知识笔记导出为pdf") + @AnonymousAccess + public void OutPdf(HttpServletResponse response,String context) { + + stuConceptBlockService.OutPdf(response,context); + + } + + + + + @GetMapping("/getReport") + @ApiOperation("获取实训报告详情") + @AnonymousAccess + public ResultDataEntity getReport(String userId, String module) { + + StuPracticalTrainingReport report = stuConceptBlockService.getReport(userId, module); + return new ResultDataEntity<>(HttpStatus.OK, report); + + } + + + + @PostMapping("/upload") + @ApiOperation("上传实训报告") + @AnonymousAccess + public ResultDataEntity upload(@RequestParam(required = false) @RequestPart MultipartFile file, + @RequestParam(required = false) String stuBlockProduct) { + + Gson gson = new Gson(); + StuBlockProductWithDTO stuBlockProductWithBLOBs = gson.fromJson(stuBlockProduct, StuBlockProductWithDTO.class); + StuPracticalTrainingReport report = stuConceptBlockService.upload(file, stuBlockProductWithBLOBs); + return new ResultDataEntity<>(HttpStatus.OK, report); + + } + + + /* + * @author whb + * @Date 2023/10/11 + * 下载报告 + */ + @GetMapping("/download") + @ApiOperation("下载实训报告") + @AnonymousAccess + public void download(@RequestParam String userId, String TOKEN, HttpServletResponse response, String module) { + TokenProvider.getJWTUser(TOKEN); + stuConceptBlockService.download(userId, response, module); + } + + + + @GetMapping("/getResource") + @ApiOperation("获取视频流") + @AnonymousAccess + public ResponseEntity streamVideo(@RequestParam String module, @RequestParam String name, HttpServletResponse response) { + + + StuResourcesExample example = new StuResourcesExample(); + example.createCriteria().andModuleEqualTo(module).andResourcesNameEqualTo(name); + List stuResources = stuResourcesMapper.selectByExample(example); + if (stuResources.size() > 0) { + StuResources stuResources1 = stuResources.get(0); + String url = stuResources1.getResourcesUrl(); + String videoPath = filePath + url; + File videoFile = new File(videoPath); + if ("mp4".equals(stuResources1.getResourcesType())) { + + + if (videoFile.exists()) { + Path path = Paths.get(videoPath); + FileSystemResource fileSystemResource = new FileSystemResource(videoFile); + return ResponseEntity.ok() + .contentType(MediaType.parseMediaType("video/mp4")) + .body(fileSystemResource); + } else { + return ResponseEntity.notFound().build(); + } + } else if ("pdf".equals(stuResources1.getResourcesType())) { + +// fileUtil.getPdf(response,name,url); + if (videoFile.exists()) { + Path path = Paths.get(videoPath); + FileSystemResource fileSystemResource = new FileSystemResource(videoFile); + return ResponseEntity.ok() + .contentType(MediaType.parseMediaType("application/pdf")) + .body(fileSystemResource); + + } else { + return ResponseEntity.notFound().build(); + } + + } + + } + return ResponseEntity.notFound().build(); + + } +} diff --git a/src/main/java/com/sztzjy/digital_credit/controller/tch/StuUserDto.java b/src/main/java/com/sztzjy/digital_credit/controller/tch/StuUserDto.java new file mode 100644 index 0000000..abeb134 --- /dev/null +++ b/src/main/java/com/sztzjy/digital_credit/controller/tch/StuUserDto.java @@ -0,0 +1,28 @@ +package com.sztzjy.digital_credit.controller.tch; + +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +public class StuUserDto { + private String userId; + + private String name; + + private String studentId; + + private String module; + + private String className; + +// private String schoolId; + + private String reportUrl; + + private Integer reportId; + + private Double rating; + +// private Integer reportStatus; +} diff --git a/src/main/java/com/sztzjy/digital_credit/controller/tch/TchConceptTechnologyAchievement.java b/src/main/java/com/sztzjy/digital_credit/controller/tch/TchConceptTechnologyAchievement.java new file mode 100644 index 0000000..72e2ee4 --- /dev/null +++ b/src/main/java/com/sztzjy/digital_credit/controller/tch/TchConceptTechnologyAchievement.java @@ -0,0 +1,374 @@ +package com.sztzjy.digital_credit.controller.tch; + +import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson.JSONObject; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; + +import com.sztzjy.digital_credit.annotation.AnonymousAccess; +import com.sztzjy.digital_credit.entity.*; +import com.sztzjy.digital_credit.entity.dto.StuScoreDetailsDTO; +import com.sztzjy.digital_credit.entity.tchdto.ScoreOverviewParametesDTO; +import com.sztzjy.digital_credit.entity.tchdto.TchConceptualWeight; +import com.sztzjy.digital_credit.entity.tchdto.TchManualRatingByTeacherDTO; +import com.sztzjy.digital_credit.mapper.*; +import com.sztzjy.digital_credit.service.StuUserService; +import com.sztzjy.digital_credit.util.ResultEntity; +import com.sztzjy.digital_credit.util.excel.FilePortUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.FileSystemResource; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.math.BigDecimal; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import com.sztzjy.digital_credit.config.Constant; + + +@RestController +@RequestMapping("/api/tch/achievement") +@Api(tags = "(征信画像个人征信企业征信综合案例)页面") +public class TchConceptTechnologyAchievement { + @Autowired + StuUserService userService; + @Autowired + StuUserMapper userMapper; + @Autowired + StuScoreDetailsMapper stuScoreDetailsMapper; + @Autowired + private TchModuleWeithMapper tchModuleWeithMapper; + @Autowired + StuPracticalTrainingReportMapper practicalTrainingReportMapper; + @Autowired + private TchPublicResourceWeightMapper tchPublicResourceWeightMapper; + + @Value("${file.path}") + private String filePath; + + + + @AnonymousAccess + @PostMapping("/getConceptTechnologyAchievementList") + @ApiOperation("成绩情况") + public ResultEntity getConceptAchievementList(@RequestBody ScoreOverviewParametesDTO parametes) { + + PageInfo pageInfo = userService.getCreditPortraitAchievementList(parametes); + return new ResultEntity(HttpStatus.OK, parametes.getModule()+"展示", pageInfo); + + } + + + + @GetMapping("/getGradeDetails") + @AnonymousAccess + @ApiOperation("成绩详情") + public ResultEntity getGradeDetails(@RequestParam String userId, @RequestParam String module, @RequestParam String schoolId) { + StuScoreDetailsExample example = new StuScoreDetailsExample(); + example.createCriteria().andUserIdEqualTo(userId).andModuleEqualTo(module); + List stuScoreDetails = stuScoreDetailsMapper.selectByExample(example); + + TchPublicResourceWeightExample weightExample = new TchPublicResourceWeightExample(); + weightExample.createCriteria().andSchoolIdEqualTo(schoolId).andModuleEqualTo(module); + List tchPublicResourceWeightList = tchPublicResourceWeightMapper.selectByExample(weightExample); + if (tchPublicResourceWeightList.isEmpty()){ + TchPublicResourceWeight tchPublicResourceWeight = new TchPublicResourceWeight(schoolId, module); + tchPublicResourceWeightMapper.insertSelective(tchPublicResourceWeight); + tchPublicResourceWeightList.add(tchPublicResourceWeight); + } + + List list = new ArrayList<>(); + for (int i = 0; i < stuScoreDetails.size(); i++) { + StuScoreDetailsDTO detailsDTO = new StuScoreDetailsDTO(stuScoreDetails.get(i), tchPublicResourceWeightList.get(0)); + list.add(detailsDTO); + } + return new ResultEntity(HttpStatus.OK, "成绩详情", list); + } + + + + + @AnonymousAccess + @ApiOperation("获取权重") + @GetMapping("/getWeight") + public ResultEntity getConceptTechnologyWeight(@RequestParam String schoolId) { + TchModuleWeithExample weightExample = new TchModuleWeithExample(); + weightExample.createCriteria().andSchoolIdEqualTo(schoolId); + + List tchModuleWeithList = tchModuleWeithMapper.selectByExample(weightExample); + if (tchModuleWeithList.isEmpty()) + { + TchModuleWeith tchModuleWeith = new TchModuleWeith(schoolId); + tchModuleWeithMapper.insertSelective(tchModuleWeith); + tchModuleWeithList.add(tchModuleWeith); + } + return new ResultEntity(HttpStatus.OK, "权重设置回显", tchModuleWeithList.get(0)); + } + + + + + @PostMapping("/setyWeight") + @AnonymousAccess + @ApiOperation("权重设置") + public ResultEntity setConceptTechnologyWeight(@RequestBody TchConceptualWeight weight) { + String schoolId = weight.getSchoolId(); + String module = weight.getModule(); + TchModuleWeithExample weightExample = new TchModuleWeithExample(); + weightExample.createCriteria().andSchoolIdEqualTo(schoolId); + List tchModuleWeithList = tchModuleWeithMapper.selectByExample(weightExample); + if (tchModuleWeithList.isEmpty()) + { + TchModuleWeith tchModuleWeith = new TchModuleWeith(schoolId); + tchModuleWeithMapper.insertSelective(tchModuleWeith); + tchModuleWeithList.add(tchModuleWeith); + } + TchModuleWeith tchModuleWeith = tchModuleWeithList.get(0); + + + if ("征信画像成绩".equals(module)) + { + //贷款案例权重 + tchModuleWeith.setLoanCasesWeight(weight.getLoanCasesWeight()); + //个人情况与违约权重 + tchModuleWeith.setPerSituationWeiht(weight.getPerSituationWeiht()); + //还款行为与违约权重 + tchModuleWeith.setRepaymentBehaviorWeiht(weight.getRepaymentBehaviorWeiht()); + tchModuleWeith.setSchoolId(schoolId); + + tchModuleWeithMapper.updateByPrimaryKeySelective(tchModuleWeith); + userService.totalRank(schoolId); + //征信画像成绩排序 + userService.creditPortraitRank(schoolId); + } + + if ("个人征信成绩".equals(module)) + { + //个人征信-影响因素与分析权重 + tchModuleWeith.setPerInfluenceFactorWeith(weight.getPerInfluenceFactorWeith()); + //个人征信-征信优化与分析权重 + tchModuleWeith.setPerCreditOptimizationWeith(weight.getPerCreditOptimizationWeith()); + //个人征信-征信评级模型权重 + tchModuleWeith.setPerCreditRatingWeith(weight.getPerCreditRatingWeith()); + tchModuleWeith.setSchoolId(schoolId); + + tchModuleWeithMapper.updateByPrimaryKeySelective(tchModuleWeith); + userService.totalRank(schoolId); + //个人征信成绩 + userService.personCreditRank(schoolId); + } + + if ("企业征信成绩".equals(module)) + { + //企业征信-影响因素与分析权重 + tchModuleWeith.setEntInfluenceFactorWeith(weight.getEntInfluenceFactorWeith()); + //企业征信-征信优化与分析权重 + tchModuleWeith.setEntCreditOptimizationWeith(weight.getEntCreditOptimizationWeith()); + //企业征信-征信评级模型权重 + tchModuleWeith.setEntCreditRatingWeith(weight.getEntCreditRatingWeith()); + tchModuleWeith.setSchoolId(schoolId); + + tchModuleWeithMapper.updateByPrimaryKeySelective(tchModuleWeith); + userService.totalRank(schoolId); + //企业征信成绩 + userService.corporateCreditRank(schoolId); + } + + if ("综合案例成绩".equals(module)) + { + //案例-用户画像权重 + tchModuleWeith.setCaseUserProfileWeith(weight.getCaseUserProfileWeith()); + //案例-个人征信权重 + tchModuleWeith.setCasePersonalCreditWeith(weight.getCasePersonalCreditWeith()); + //案例-企业征信权重 + tchModuleWeith.setCaseCorporateCreditWeith(weight.getCaseCorporateCreditWeith()); + tchModuleWeith.setSchoolId(schoolId); + + tchModuleWeithMapper.updateByPrimaryKeySelective(tchModuleWeith); + userService.totalRank(schoolId); + //征信画像成绩排序 + userService.comprehensiveCaseRank(schoolId); + } + + + return new ResultEntity(HttpStatus.OK, module+"权重设置成功"); + + } + + @AnonymousAccess + @GetMapping("/conceptTechnologyExport") + @ApiOperation("成绩导出") + public void conceptTechnologyExport(HttpServletResponse response, @RequestParam String schoolId,@RequestParam String module) { + //导出的表名 + String title = IdUtil.simpleUUID(); + //表中第一行表头字段 + String[] headers=null; + List listColumn = null; + Boolean flag = true; + if("征信画像成绩".equals(module)){ + headers = new String[]{"用户名", "学号", "班级", "贷款案例", "个人情况与违约","还款行为与违约","综合得分","排名"}; + listColumn = Arrays.asList("name", "studentId", "className","loanCasesScore","perSituationScore","repaymentBehaviorScore","creditPortraitScore","creditPortraitRank"); + } + else if("个人征信成绩".equals(module)){ + headers = new String[]{"用户名", "学号", "班级", "影响因素分析", "征信优化分析","征信评级模型","综合得分","排名"}; + listColumn = Arrays.asList("name", "studentId", "className","perInfluenceFactorScore","perCreditOptimizationSocre","perCreditRatingSocre","personalCreditScore","personalCreditRank"); + } + else if("企业征信成绩".equals(module)){ + headers = new String[]{"用户名", "学号", "班级", "影响因素分析", "征信优化分析","征信评级模型","综合得分","排名"}; + listColumn = Arrays.asList("name", "studentId", "className","entInfluenceFactorSocre","entCreditOptimizationSocre","entCreditRatingSocre","corporateCreditScore","corporateCreditRank"); + } + else if("综合案例成绩".equals(module)){ + headers = new String[]{"用户名", "学号", "班级", "征信画像案例成绩", "个人征信案例客观成绩", "个人征信案例主观成绩", "企业征信案例客观成绩","企业征信案例主观成绩","综合得分","排名"}; + listColumn = Arrays.asList("name", "studentId", "className","caseUserProfileSocre","casePersonalCreditObjScore","casePersonalCreditSubScore","caseCorporateCreditObjScore","caseCorporateCreditSubScore","comprehensiveCaseScore","comprehensiveCaseRank"); + } + //实际数据结果集 + List stuUsers = userService.selectViewList(schoolId,module); + //具体需要写入excel需要哪些字段,这些字段取自UserReward类,也就是上面的实际数据结果集的泛型 + + try { + FilePortUtil.exportExcel(response, title, headers, stuUsers, listColumn); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + + @AnonymousAccess + @ApiOperation("老师主观成绩手动评分") + @PostMapping("/manualRatingByTeacher") + public ResultEntity manualRatingByTeacher(@RequestParam TchManualRatingByTeacherDTO manualRatingByTeacherDTO) { + + userService.manualRatingByTeacher(manualRatingByTeacherDTO); + + return new ResultEntity(HttpStatus.OK, "评分成功"); + + } + + + @AnonymousAccess + @ApiOperation("获取所有实验报告") + @GetMapping("/getTrainingReportList") + public ResultEntity getTrainingReportList(@RequestParam String schoolId,@RequestParam String module,@RequestParam Integer index,@RequestParam Integer size){ + PageHelper.startPage(index, size); + StuPracticalTrainingReportExample example=new StuPracticalTrainingReportExample(); + StuPracticalTrainingReportExample.Criteria criteria = example.createCriteria(); + criteria.andSchoolIdEqualTo(schoolId); + if(Constant.CREDIT_PORTRAIT_SCORE.equals(module)){ + List list=new ArrayList<>(); + list.add(Constant.DKAL_MODULE); + list.add(Constant.GRQKYWY_MODULE); + list.add(Constant.HKXWYWY_MODULE); + criteria.andModuleIn(list); + }else if(Constant.PERSONAL_CREDIT_SCORE.equals(module)){ + List list=new ArrayList<>(); + list.add(Constant.PERSONYXYSFX_MODULE); + list.add(Constant.PERSONZXYHFX_MODULE); + list.add(Constant.PERSONZXPJMX_MOXULE); + criteria.andModuleIn(list); + }else if(Constant.CORPORATE_CREDIT_SCORE.equals(module)){ + + List list=new ArrayList<>(); + list.add(Constant.QIYEYXYSFX_MODULE); + list.add(Constant.QIYEZXYHFX_MODULE); + list.add(Constant.QIYEZXPJMX_MOXULE); + criteria.andModuleIn(list); + + } + List stuPracticalTrainingReports = practicalTrainingReportMapper.selectByExample(example); + PageInfo pageInfo=new PageInfo<>(stuPracticalTrainingReports); + List dtoList=new ArrayList<>(); + for (int i = 0; i < stuPracticalTrainingReports.size(); i++) { + StuPracticalTrainingReport report = stuPracticalTrainingReports.get(i); + String userid = report.getUserid(); + StuUser stuUser = userMapper.selectByPrimaryKey(userid); // //根据查询出来的userid 去user表中查询用户名、学号、班级 + if(stuUser==null){ + continue; + } + dtoList.add(new TchPracticalTrainingReportDto(stuUser,report)); + } + PageInfo pageInfo1=new PageInfo<>(dtoList); + pageInfo1.setTotal(pageInfo.getTotal()); + return new ResultEntity(HttpStatus.OK, module+"实训报告展示成功",pageInfo1); + } + + + @GetMapping("/getCurrencyScoreReport") + @ApiOperation("评阅界面") + @AnonymousAccess + public ResultEntity> getCurrencyScoreReport(@RequestParam String schoolId, + @RequestParam Integer index, + @RequestParam Integer size, + @RequestParam String module, + @ApiParam("姓名或者学号") @RequestParam(required = false) String name, + @RequestParam(required = false) String studentId, + @RequestParam(required = false) String className, + @ApiParam("模块") @RequestParam(required = false) String keyWord) { + return new ResultEntity<>(userService.getScoreReport(schoolId, index, size, module, name, studentId, className,keyWord)); + } + + + @GetMapping("/getReport") + @ApiOperation("获取单个学生报告接口") + @AnonymousAccess + public ResponseEntity getReport(@RequestParam String userId, @RequestParam String module, HttpServletResponse response) { + StuPracticalTrainingReportExample practicalTrainingReportExample = new StuPracticalTrainingReportExample(); + practicalTrainingReportExample.createCriteria().andUseridEqualTo(userId).andModuleEqualTo(module); + List stuPracticalTrainingReports = practicalTrainingReportMapper.selectByExample(practicalTrainingReportExample); + if (stuPracticalTrainingReports.isEmpty()) { + return null; + } + StuPracticalTrainingReport stuPracticalTrainingReport = stuPracticalTrainingReports.get(0); + String url = stuPracticalTrainingReport.getUrl(); + String videoPath = filePath + url; + File videoFile = new File(videoPath); + if (videoFile.exists()) { + Path path = Paths.get(videoPath); + FileSystemResource fileSystemResource = new FileSystemResource(videoFile); + return ResponseEntity.ok() + .contentType(MediaType.parseMediaType("application/pdf")) + .body(fileSystemResource); + } else { + return ResponseEntity.notFound().build(); + } + } + + + @PostMapping("/ratingAndComment") + @ApiOperation("老师输入评语和打分") + @AnonymousAccess + public void ratingAndComment(@RequestBody StuPracticalTrainingReport practicalTrainingReport) { + practicalTrainingReportMapper.updateByPrimaryKeySelective(practicalTrainingReport); + if (practicalTrainingReport.getRating() != null) { + StuScoreDetailsExample stuScoreDetailsExample = new StuScoreDetailsExample(); + stuScoreDetailsExample.createCriteria().andModuleEqualTo(practicalTrainingReport.getModule()).andUserIdEqualTo(practicalTrainingReport.getUserid()).andSerialNumberEqualTo(5); + List stuScoreDetails = stuScoreDetailsMapper.selectByExample(stuScoreDetailsExample); + if (!stuScoreDetails.isEmpty()) { + StuScoreDetails stuScoreDetails1 = stuScoreDetails.get(0); + stuScoreDetails1.setScoreProject(practicalTrainingReport.getRating()); + stuScoreDetailsMapper.updateByPrimaryKey(stuScoreDetails1); + } + + } + } + + + @AnonymousAccess + @GetMapping("/getClassNameBySchoolId") + @ApiOperation("班级下拉框") + public ResultEntity> getClassNameBySchoolId(@RequestParam String schoolId) { + return new ResultEntity>(userService.getClassNameBySchoolId(schoolId)); + } + +} diff --git a/src/main/java/com/sztzjy/digital_credit/controller/tch/TchGeneralViewController.java b/src/main/java/com/sztzjy/digital_credit/controller/tch/TchGeneralViewController.java index 811289e..b5863a9 100644 --- a/src/main/java/com/sztzjy/digital_credit/controller/tch/TchGeneralViewController.java +++ b/src/main/java/com/sztzjy/digital_credit/controller/tch/TchGeneralViewController.java @@ -13,6 +13,7 @@ import com.sztzjy.digital_credit.mapper.TchModuleWeithMapper; import com.sztzjy.digital_credit.service.StuUserService; import com.sztzjy.digital_credit.util.ResultEntity; import com.sztzjy.digital_credit.util.excel.FilePortUtil; +import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -26,6 +27,7 @@ import java.util.List; //教师端成绩总览 @RestController @RequestMapping("/api/tch/generalView") +@Api(tags = "教师端成绩总览") public class TchGeneralViewController { @Autowired StuUserService userService; diff --git a/src/main/java/com/sztzjy/digital_credit/controller/tch/TchPracticalTrainingReportDto.java b/src/main/java/com/sztzjy/digital_credit/controller/tch/TchPracticalTrainingReportDto.java new file mode 100644 index 0000000..31b69a7 --- /dev/null +++ b/src/main/java/com/sztzjy/digital_credit/controller/tch/TchPracticalTrainingReportDto.java @@ -0,0 +1,37 @@ +package com.sztzjy.digital_credit.controller.tch; + + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.sztzjy.digital_credit.entity.StuPracticalTrainingReport; +import com.sztzjy.digital_credit.entity.StuUser; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +@Data +public class TchPracticalTrainingReportDto { + private String userId;//用户id + private String name;//用户名 + private String studentId;//学号 + private String className;//班级 + private String module;//归属模块 + private String reportName;//报告名称 + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private Date uploadTime; //上传时间 + private Integer size;//报告大小 + private Double rating;//教师评分 + + public TchPracticalTrainingReportDto(StuUser stuUser, StuPracticalTrainingReport report) { + this.userId=stuUser.getUserId(); + this.name=stuUser.getName(); + this.studentId=stuUser.getStudentId(); + this.className=stuUser.getClassName(); + this.module=report.getModule(); + this.reportName=report.getReportName(); + this.uploadTime=report.getUploadTime(); + this.size=report.getSize(); + this.rating=report.getRating(); + } +} diff --git a/src/main/java/com/sztzjy/digital_credit/entity/StuPracticalTrainingReport.java b/src/main/java/com/sztzjy/digital_credit/entity/StuPracticalTrainingReport.java index c0d6a52..4f57984 100644 --- a/src/main/java/com/sztzjy/digital_credit/entity/StuPracticalTrainingReport.java +++ b/src/main/java/com/sztzjy/digital_credit/entity/StuPracticalTrainingReport.java @@ -2,7 +2,10 @@ package com.sztzjy.digital_credit.entity; import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; +import org.springframework.format.annotation.DateTimeFormat; + /** * * @author tz @@ -15,6 +18,8 @@ public class StuPracticalTrainingReport { @ApiModelProperty("报告名称") private String reportName; + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") @ApiModelProperty("上传时间") private Date uploadTime; diff --git a/src/main/java/com/sztzjy/digital_credit/entity/StuUser.java b/src/main/java/com/sztzjy/digital_credit/entity/StuUser.java index a1359fc..ed4569c 100644 --- a/src/main/java/com/sztzjy/digital_credit/entity/StuUser.java +++ b/src/main/java/com/sztzjy/digital_credit/entity/StuUser.java @@ -122,17 +122,24 @@ public class StuUser { public StuUser(StuUser stuUser, TchModuleWeith resultsOverviewWeight) { this.userId=stuUser.getUserId(); //征信画像 - BigDecimal creditPortraitScore =stuUser.getLoanCasesScore().add(stuUser.getPerSituationScore()).add(stuUser.getRepaymentBehaviorScore()).divide(BigDecimal.valueOf(3),2,BigDecimal.ROUND_HALF_UP).multiply(resultsOverviewWeight.getCreditPortraitWeith()).setScale(2,BigDecimal.ROUND_HALF_UP); + creditPortraitScore =((stuUser.getLoanCasesScore().multiply(resultsOverviewWeight.getLoanCasesWeight())).add(stuUser.getPerSituationScore().multiply(resultsOverviewWeight.getPerSituationWeiht())).add(stuUser.getRepaymentBehaviorScore().multiply(resultsOverviewWeight.getRepaymentBehaviorWeiht()))).setScale(2,BigDecimal.ROUND_HALF_UP); + + BigDecimal socre1 = creditPortraitScore.multiply(resultsOverviewWeight.getCreditPortraitWeith()).setScale(2,BigDecimal.ROUND_HALF_UP); //个人征信 - BigDecimal personalCreditScore=stuUser.getPerInfluenceFactorScore().add(stuUser.getPerCreditOptimizationSocre()).add(stuUser.getPerCreditRatingSocre()).divide(BigDecimal.valueOf(3),2,BigDecimal.ROUND_HALF_UP).multiply(resultsOverviewWeight.getPersonalCreditWeith()).setScale(2,BigDecimal.ROUND_HALF_UP); + personalCreditScore=((stuUser.getPerInfluenceFactorScore().multiply(resultsOverviewWeight.getPerInfluenceFactorWeith())).add(stuUser.getPerCreditOptimizationSocre().multiply(resultsOverviewWeight.getPerCreditOptimizationWeith())).add(stuUser.getPerCreditRatingSocre().multiply(resultsOverviewWeight.getPerCreditRatingWeith()))).setScale(2,BigDecimal.ROUND_HALF_UP); + + BigDecimal socre2 =personalCreditScore.multiply(resultsOverviewWeight.getPersonalCreditWeith()).setScale(2,BigDecimal.ROUND_HALF_UP); //企业征信 - BigDecimal corporateCreditScore=stuUser.getEntInfluenceFactorSocre().add(stuUser.getEntCreditOptimizationSocre()).add(stuUser.getEntCreditRatingSocre()).divide(BigDecimal.valueOf(3),2,BigDecimal.ROUND_HALF_UP).multiply(resultsOverviewWeight.getEnterpriseCreditWeith()).setScale(2,BigDecimal.ROUND_HALF_UP); + corporateCreditScore=((stuUser.getEntInfluenceFactorSocre().multiply(resultsOverviewWeight.getEntInfluenceFactorWeith())).add(stuUser.getEntCreditOptimizationSocre().multiply(resultsOverviewWeight.getEntCreditOptimizationWeith())).add(stuUser.getEntCreditRatingSocre().multiply(resultsOverviewWeight.getEntCreditRatingWeith()))).setScale(2,BigDecimal.ROUND_HALF_UP); + + BigDecimal socre3 = corporateCreditScore.multiply(resultsOverviewWeight.getEnterpriseCreditWeith()).setScale(2,BigDecimal.ROUND_HALF_UP); //综合案例 - BigDecimal comprehensiveCaseScore=stuUser.getCaseUserProfileSocre().add(stuUser.getCasePersonalCreditScore()).add(stuUser.getCaseCorporateCreditScore()).divide(BigDecimal.valueOf(3),2,BigDecimal.ROUND_HALF_UP).multiply(resultsOverviewWeight.getCaseStudyWeith()).setScale(2,BigDecimal.ROUND_HALF_UP); + comprehensiveCaseScore = ((stuUser.getCaseUserProfileSocre().multiply(resultsOverviewWeight.getCaseUserProfileWeith())).add(stuUser.getCasePersonalCreditScore().multiply(resultsOverviewWeight.getCasePersonalCreditWeith())).add(stuUser.getCaseCorporateCreditScore().multiply(resultsOverviewWeight.getCaseCorporateCreditWeith()))).setScale(2,BigDecimal.ROUND_HALF_UP); + BigDecimal socre4 = comprehensiveCaseScore.multiply(resultsOverviewWeight.getCaseStudyWeith()).setScale(2,BigDecimal.ROUND_HALF_UP); - this.totalScore= creditPortraitScore.add(personalCreditScore).add(corporateCreditScore) - .add(comprehensiveCaseScore).setScale(2,BigDecimal.ROUND_HALF_UP); + this.totalScore= socre1.add(socre2).add(socre3) + .add(socre4).setScale(2,BigDecimal.ROUND_HALF_UP); } diff --git a/src/main/java/com/sztzjy/digital_credit/entity/dto/StuBlockProductWithDTO.java b/src/main/java/com/sztzjy/digital_credit/entity/dto/StuBlockProductWithDTO.java new file mode 100644 index 0000000..39c6062 --- /dev/null +++ b/src/main/java/com/sztzjy/digital_credit/entity/dto/StuBlockProductWithDTO.java @@ -0,0 +1,37 @@ +package com.sztzjy.digital_credit.entity.dto; + +/** + * @author 17803 + * @date 2023-10-17 11:23 + */ + +public class StuBlockProductWithDTO { + private String module; + private String schoolId; + private String userId; + + + public String getSchoolId() { + return schoolId; + } + + public void setSchoolId(String schoolId) { + this.schoolId = schoolId == null ? null : schoolId.trim(); + } + + public String getModule() { + return module; + } + + public void setModule(String module) { + this.module = module == null ? null : module.trim(); + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId == null ? null : userId.trim(); + } +} diff --git a/src/main/java/com/sztzjy/digital_credit/entity/tchdto/ScoreOverviewParametesDTO.java b/src/main/java/com/sztzjy/digital_credit/entity/tchdto/ScoreOverviewParametesDTO.java index 5d8abcc..f8e99dd 100644 --- a/src/main/java/com/sztzjy/digital_credit/entity/tchdto/ScoreOverviewParametesDTO.java +++ b/src/main/java/com/sztzjy/digital_credit/entity/tchdto/ScoreOverviewParametesDTO.java @@ -22,6 +22,8 @@ public class ScoreOverviewParametesDTO { private Integer index; + private String module; + diff --git a/src/main/java/com/sztzjy/digital_credit/entity/tchdto/TchConceptualWeight.java b/src/main/java/com/sztzjy/digital_credit/entity/tchdto/TchConceptualWeight.java new file mode 100644 index 0000000..3bf5cd3 --- /dev/null +++ b/src/main/java/com/sztzjy/digital_credit/entity/tchdto/TchConceptualWeight.java @@ -0,0 +1,75 @@ +package com.sztzjy.digital_credit.entity.tchdto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author 17803 + * @date 2024-05-10 10:08 + */ + +@Data +public class TchConceptualWeight { + + @ApiModelProperty("模块权重ID") + private Integer id; + + @ApiModelProperty("学校ID") + private String schoolId; + + @ApiModelProperty("贷款案例权重") + private BigDecimal loanCasesWeight; + + @ApiModelProperty("个人情况与违约权重") + private BigDecimal perSituationWeiht; + + @ApiModelProperty("还款行为与违约权重") + private BigDecimal repaymentBehaviorWeiht; + + @ApiModelProperty("个人征信-影响因素与分析权重") + private BigDecimal perInfluenceFactorWeith; + + @ApiModelProperty("个人征信-征信优化与分析权重") + private BigDecimal perCreditOptimizationWeith; + + @ApiModelProperty("个人征信-征信评级模型权重") + private BigDecimal perCreditRatingWeith; + + @ApiModelProperty("企业征信-影响因素与分析权重") + private BigDecimal entInfluenceFactorWeith; + + @ApiModelProperty("企业征信-征信优化与分析权重") + private BigDecimal entCreditOptimizationWeith; + + @ApiModelProperty("企业征信-征信评级模型权重") + private BigDecimal entCreditRatingWeith; + + @ApiModelProperty("案例-用户画像权重") + private BigDecimal caseUserProfileWeith; + + @ApiModelProperty("案例-个人征信权重") + private BigDecimal casePersonalCreditWeith; + + @ApiModelProperty("案例-企业征信权重") + private BigDecimal caseCorporateCreditWeith; + + @ApiModelProperty("征信画像成绩权重") + private BigDecimal creditPortraitWeith; + + @ApiModelProperty("个人征信成绩权重") + private BigDecimal personalCreditWeith; + + @ApiModelProperty("企业征信成绩权重") + private BigDecimal enterpriseCreditWeith; + + @ApiModelProperty("综合案例成绩权重") + private BigDecimal caseStudyWeith; + + @ApiModelProperty("模块") + private String module; + + + +} diff --git a/src/main/java/com/sztzjy/digital_credit/entity/tchdto/TchGeneralViewDTO.java b/src/main/java/com/sztzjy/digital_credit/entity/tchdto/TchGeneralViewDTO.java index 74cb956..df53f12 100644 --- a/src/main/java/com/sztzjy/digital_credit/entity/tchdto/TchGeneralViewDTO.java +++ b/src/main/java/com/sztzjy/digital_credit/entity/tchdto/TchGeneralViewDTO.java @@ -120,33 +120,42 @@ public class TchGeneralViewDTO { } public TchGeneralViewDTO(StuUser stuUser, TchModuleWeith resultsOverviewWeight) { + + //这个DTO求的是×权重的成绩 并不写入数据库 + this.name=stuUser.getName(); this.studentId=stuUser.getStudentId(); this.className=stuUser.getClassName(); //征信画像 - this.creditPortraitScore=stuUser.getLoanCasesScore().add(stuUser.getPerSituationScore()).add(stuUser.getRepaymentBehaviorScore()).divide(BigDecimal.valueOf(3)).multiply(resultsOverviewWeight.getCreditPortraitWeith()).setScale(2,BigDecimal.ROUND_HALF_UP); + creditPortraitScore =((stuUser.getLoanCasesScore().multiply(resultsOverviewWeight.getLoanCasesWeight())).add(stuUser.getPerSituationScore().multiply(resultsOverviewWeight.getPerSituationWeiht())).add(stuUser.getRepaymentBehaviorScore().multiply(resultsOverviewWeight.getRepaymentBehaviorWeiht()))).setScale(2,BigDecimal.ROUND_HALF_UP); + this.creditPortraitWeith=resultsOverviewWeight.getCreditPortraitWeith(); if(stuUser.getCreditPortraitRank()!=null){ this.creditPortraitRank=stuUser.getCreditPortraitRank(); } //个人征信 - this.personalCreditScore=stuUser.getPerInfluenceFactorScore().add(stuUser.getPerCreditOptimizationSocre()).add(stuUser.getPerCreditRatingSocre()).divide(BigDecimal.valueOf(3)).multiply(resultsOverviewWeight.getPersonalCreditWeith()).setScale(2,BigDecimal.ROUND_HALF_UP); + this.personalCreditScore=((stuUser.getPerInfluenceFactorScore().multiply(resultsOverviewWeight.getPerInfluenceFactorWeith())).add(stuUser.getPerCreditOptimizationSocre().multiply(resultsOverviewWeight.getPerCreditOptimizationWeith())).add(stuUser.getPerCreditRatingSocre().multiply(resultsOverviewWeight.getPerCreditRatingWeith()))).setScale(2,BigDecimal.ROUND_HALF_UP); + + this.personalCreditWeith=resultsOverviewWeight.getPersonalCreditWeith(); if(stuUser.getPersonalCreditRank()!=null){ this.personalCreditRank=stuUser.getPersonalCreditRank(); } //企业征信 - this.corporateCreditScore=stuUser.getEntInfluenceFactorSocre().add(stuUser.getEntCreditOptimizationSocre()).add(stuUser.getEntCreditRatingSocre()).divide(BigDecimal.valueOf(3)).multiply(resultsOverviewWeight.getEnterpriseCreditWeith()).setScale(2,BigDecimal.ROUND_HALF_UP); + this.corporateCreditScore=((stuUser.getEntInfluenceFactorSocre().multiply(resultsOverviewWeight.getEntInfluenceFactorWeith())).add(stuUser.getEntCreditOptimizationSocre().multiply(resultsOverviewWeight.getEntCreditOptimizationWeith())).add(stuUser.getEntCreditRatingSocre().multiply(resultsOverviewWeight.getEntCreditRatingWeith()))).setScale(2,BigDecimal.ROUND_HALF_UP); + this.enterpriseCreditWeith=resultsOverviewWeight.getEnterpriseCreditWeith(); if(stuUser.getCorporateCreditRank()!=null){ this.corporateCreditRank=stuUser.getCorporateCreditRank(); } //综合案例 - this.comprehensiveCaseScore=stuUser.getCaseUserProfileSocre().add(stuUser.getCasePersonalCreditScore()).add(stuUser.getCaseCorporateCreditScore()).divide(BigDecimal.valueOf(3)).multiply(resultsOverviewWeight.getCaseStudyWeith()).setScale(2,BigDecimal.ROUND_HALF_UP); + this.comprehensiveCaseScore=((stuUser.getCaseUserProfileSocre().multiply(resultsOverviewWeight.getCaseUserProfileWeith())).add(stuUser.getCasePersonalCreditScore().multiply(resultsOverviewWeight.getCasePersonalCreditWeith())).add(stuUser.getCaseCorporateCreditScore().multiply(resultsOverviewWeight.getCaseCorporateCreditWeith()))).setScale(2,BigDecimal.ROUND_HALF_UP); + + this.caseStudyWeith=resultsOverviewWeight.getCaseStudyWeith(); if(stuUser.getComprehensiveCaseRank()!=null){ this.comprehensiveCaseRank=stuUser.getComprehensiveCaseRank(); diff --git a/src/main/java/com/sztzjy/digital_credit/entity/tchdto/TchManualRatingByTeacherDTO.java b/src/main/java/com/sztzjy/digital_credit/entity/tchdto/TchManualRatingByTeacherDTO.java new file mode 100644 index 0000000..ab64e53 --- /dev/null +++ b/src/main/java/com/sztzjy/digital_credit/entity/tchdto/TchManualRatingByTeacherDTO.java @@ -0,0 +1,26 @@ +package com.sztzjy.digital_credit.entity.tchdto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author 17803 + * @date 2024-05-10 14:54 + */ + +@Data +public class TchManualRatingByTeacherDTO { + + @ApiModelProperty("老师评分") + private BigDecimal score; + + @ApiModelProperty("用户ID") + private String userId; + + @ApiModelProperty("归属模块") + private String module; + + +} diff --git a/src/main/java/com/sztzjy/digital_credit/mapper/StuUserDtoMapper.java b/src/main/java/com/sztzjy/digital_credit/mapper/StuUserDtoMapper.java new file mode 100644 index 0000000..3f62ee9 --- /dev/null +++ b/src/main/java/com/sztzjy/digital_credit/mapper/StuUserDtoMapper.java @@ -0,0 +1,18 @@ +package com.sztzjy.digital_credit.mapper; + + +import com.sztzjy.digital_credit.controller.tch.StuUserDto; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface StuUserDtoMapper { + List selectByCondition(@Param("name") String name, + @Param("studentId") String studentId, + @Param("className") String className, + @Param("module") String module, + @Param("keyWord") String keyWord, + @Param("schoolId") String schoolId); +} \ No newline at end of file diff --git a/src/main/java/com/sztzjy/digital_credit/mapper/StuUserMapper.java b/src/main/java/com/sztzjy/digital_credit/mapper/StuUserMapper.java index 2b19932..ea949b4 100644 --- a/src/main/java/com/sztzjy/digital_credit/mapper/StuUserMapper.java +++ b/src/main/java/com/sztzjy/digital_credit/mapper/StuUserMapper.java @@ -80,4 +80,6 @@ public interface StuUserMapper { "s.user_id = r.user_id " + "SET s.comprehensive_case_rank = r.ranking WHERE school_id=#{schoolId}") void updateComprehensiveCaseRank(String schoolId); + + List getClassNameBySchoolId(String schoolId); } \ No newline at end of file diff --git a/src/main/java/com/sztzjy/digital_credit/service/StuConceptBlockService.java b/src/main/java/com/sztzjy/digital_credit/service/StuConceptBlockService.java new file mode 100644 index 0000000..08f0f25 --- /dev/null +++ b/src/main/java/com/sztzjy/digital_credit/service/StuConceptBlockService.java @@ -0,0 +1,49 @@ +package com.sztzjy.digital_credit.service; + + + +import com.sztzjy.digital_credit.entity.StuKnowledgeNotes; +import com.sztzjy.digital_credit.entity.StuPracticalTrainingReport; +import com.sztzjy.digital_credit.entity.StuResources; +import com.sztzjy.digital_credit.entity.dto.StuBlockProductWithDTO; +import com.sztzjy.digital_credit.entity.dto.StuLearningAssessmentDTO; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +public interface StuConceptBlockService { + + + + + + //区块链学习资源查看 + List getConceptBlockResources(String module); + + + + StuKnowledgeNotes getKnowledgeNotes(String userId, String module); + + + int addKnowledgeNotes(StuKnowledgeNotes stuKnowledgeNotes); + + + + StuPracticalTrainingReport upload(MultipartFile file, StuBlockProductWithDTO stuBlockProductWithBLOBs); + + void download(String id, HttpServletResponse response,String module); + + StuPracticalTrainingReport getReport(String userId, String module); + + /** + * 区块链知识笔记导出为pdf + + * @param response + + * @param context + * @return + */ + + void OutPdf( HttpServletResponse response, String context); + +} diff --git a/src/main/java/com/sztzjy/digital_credit/service/StuUserService.java b/src/main/java/com/sztzjy/digital_credit/service/StuUserService.java index f2f6e71..ad11913 100644 --- a/src/main/java/com/sztzjy/digital_credit/service/StuUserService.java +++ b/src/main/java/com/sztzjy/digital_credit/service/StuUserService.java @@ -1,9 +1,12 @@ package com.sztzjy.digital_credit.service; import com.github.pagehelper.PageInfo; +import com.sztzjy.digital_credit.controller.tch.StuUserDto; +import com.sztzjy.digital_credit.entity.StuUser; import com.sztzjy.digital_credit.entity.tchdto.ScoreOverviewParametesDTO; import com.sztzjy.digital_credit.entity.tchdto.TchGeneralViewDTO; import com.sztzjy.digital_credit.entity.tchdto.TchGeneralViewWeightDTO; +import com.sztzjy.digital_credit.entity.tchdto.TchManualRatingByTeacherDTO; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -54,4 +57,29 @@ public interface StuUserService { */ void comprehensiveCaseRank(@Param("schoolId") String schoolId); + + /** + * 成绩展示 + * @param parametes + * @return + */ + + PageInfo getCreditPortraitAchievementList(ScoreOverviewParametesDTO parametes); + + //实际数据结果集 + List selectViewList(String schoolId, String module); + + /** + * 手动评分 + * @param manualRatingByTeacherDTO + * @return + */ + + void manualRatingByTeacher(TchManualRatingByTeacherDTO manualRatingByTeacherDTO); + + + PageInfo getScoreReport(String schoolId, Integer index, Integer size, String module, String name, String studentId, String className, String keyWord); + + //班级下拉框 + List getClassNameBySchoolId(@Param("schoolId") String schoolId); } diff --git a/src/main/java/com/sztzjy/digital_credit/service/impl/StuConceptBlockServiceImpl.java b/src/main/java/com/sztzjy/digital_credit/service/impl/StuConceptBlockServiceImpl.java new file mode 100644 index 0000000..b33891e --- /dev/null +++ b/src/main/java/com/sztzjy/digital_credit/service/impl/StuConceptBlockServiceImpl.java @@ -0,0 +1,424 @@ +package com.sztzjy.digital_credit.service.impl; + + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.IdUtil; + +import com.sztzjy.digital_credit.entity.*; +import com.sztzjy.digital_credit.entity.dto.StuBlockProductWithDTO; +import com.sztzjy.digital_credit.mapper.*; +import com.sztzjy.digital_credit.service.StuConceptBlockService; +import com.sztzjy.digital_credit.util.ConvertUtil; +import com.sztzjy.digital_credit.util.PdfUtil; +import com.sztzjy.digital_credit.util.compute.ScoringUtil; +import com.sztzjy.digital_credit.util.file.IFileUtil; +import com.sztzjy.digital_credit.util.file.LocalFileUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; +import org.springframework.web.multipart.MultipartFile; +import util.convertPDF.PDFConvertUtil; + + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.UUID; + + + +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; + + +@Service +public class StuConceptBlockServiceImpl implements StuConceptBlockService { + @Resource + private TchPublicResourceWeightMapper tchPublicResourceWeightMapper; + + + @Autowired + private IFileUtil fileUtil; + @Resource + StuPracticalTrainingReportMapper stuPracticalTrainingReportMapper; + + + + + + @Resource + private StuScoreDetailsMapper stuScoreDetailsMapper; + + + + + @Resource + private StuResourcesMapper stuResourcesMapper; + + @Resource + StuKnowledgeNotesMapper stuKnowledgeNotesMapper; + + + + @Resource + IFileUtil localFileUtil; + + + @Value("${file.path}") + private String filePath; + + + //区块链学习资源查看 + @Override + public List getConceptBlockResources(String module) { + StuResourcesExample resourcesExample = new StuResourcesExample(); + resourcesExample.createCriteria().andModuleEqualTo(module); + List stuResources = stuResourcesMapper.selectByExample(resourcesExample); + return stuResources; + } + + + + /** + * 知识笔记查看 + * + * @param module 所属模块 + * @return + */ + @Override + public StuKnowledgeNotes getKnowledgeNotes(String userId, String module) { + StuKnowledgeNotesExample notesExample = new StuKnowledgeNotesExample(); + notesExample.createCriteria().andModuleEqualTo(module).andUserIdEqualTo(userId); + + List stuKnowledgeNotes = stuKnowledgeNotesMapper.selectByExample(notesExample); + if (stuKnowledgeNotes.size()>0) + { + return stuKnowledgeNotes.get(0); + } + return null; + } + + + + @Override + public int addKnowledgeNotes(StuKnowledgeNotes stuKnowledgeNotes) { + if (stuKnowledgeNotes.getNotesContent().isEmpty()) { + throw new RuntimeException("笔记内容不能为空"); + } + StuKnowledgeNotesExample notesExample = new StuKnowledgeNotesExample(); + notesExample.createCriteria().andModuleEqualTo(stuKnowledgeNotes.getModule()).andUserIdEqualTo(stuKnowledgeNotes.getUserId()); + List knowledgeNotesList = stuKnowledgeNotesMapper.selectByExample(notesExample); + if (knowledgeNotesList.size()>0) + { + + StuKnowledgeNotes KnowledgeNotes = knowledgeNotesList.get(0); + KnowledgeNotes.setNotesContent(stuKnowledgeNotes.getNotesContent()); + stuKnowledgeNotesMapper.updateByPrimaryKeySelective(KnowledgeNotes); + return 0; + }else { + stuKnowledgeNotes.setNotesId(UUID.randomUUID().toString().replaceAll("-","")); + int insert = stuKnowledgeNotesMapper.insert(stuKnowledgeNotes); + return insert; + } + + } + + + + + + /** + * 上传实验报告 + * + * @param file 文件 + * @return + */ + @Override + public StuPracticalTrainingReport upload(MultipartFile file, StuBlockProductWithDTO stuBlockProductWithBLOBs) { + + if (file.isEmpty()) { + throw new RuntimeException("文件不能为空"); + } + if (stuBlockProductWithBLOBs == null) { + throw new RuntimeException("模块或用户ID不能为空"); + } + + StuPracticalTrainingReportExample stuPracticalTrainingReportExample = new StuPracticalTrainingReportExample(); + stuPracticalTrainingReportExample.createCriteria().andUseridEqualTo(stuBlockProductWithBLOBs.getUserId()).andModuleEqualTo(stuBlockProductWithBLOBs.getModule()); + List stuPracticalTrainingReports = stuPracticalTrainingReportMapper.selectByExample(stuPracticalTrainingReportExample); + String originalFilename = file.getOriginalFilename(); + + if (stuPracticalTrainingReports.size()>0) + { + if (stuPracticalTrainingReports.get(0).getRating()!=null) + { + throw new RuntimeException("老师已评分,请勿再次提交报告"); + } + } + + + String name = originalFilename.substring(0, originalFilename.lastIndexOf(".")); + + + String fileExtension = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase(); + + + //上传实验报告后写入学习成绩 + TchPublicResourceWeightExample weightExample = new TchPublicResourceWeightExample(); + weightExample.createCriteria().andModuleEqualTo(stuBlockProductWithBLOBs.getModule()); + List weights = tchPublicResourceWeightMapper.selectByExample(weightExample); + String id = UUID.randomUUID().toString().replaceAll("-", ""); + + if (".pdf".equals(fileExtension)) { + //第一次上传 + if (stuPracticalTrainingReports.size() == 0) { + StuPracticalTrainingReport stuPracticalTrainingReport = new StuPracticalTrainingReport(); + + long fileSize = file.getSize() / 1024; + String url = localFileUtil.upload(file); + int i = UUID.randomUUID().hashCode(); + int info = i > 0 ? i : -i; + stuPracticalTrainingReport.setId(info); + stuPracticalTrainingReport.setReportName(name + ".pdf"); + stuPracticalTrainingReport.setModule(stuBlockProductWithBLOBs.getModule()); + stuPracticalTrainingReport.setSize((int) fileSize); + stuPracticalTrainingReport.setUploadTime(new Date()); + stuPracticalTrainingReport.setUrl(url); + stuPracticalTrainingReport.setUserid(stuBlockProductWithBLOBs.getUserId()); + stuPracticalTrainingReport.setSchoolId(stuBlockProductWithBLOBs.getSchoolId()); + stuPracticalTrainingReportMapper.insert(stuPracticalTrainingReport); + + + if (weights.isEmpty()) { + throw new RuntimeException("没有查询到实验报告权重信息"); + } + + + TchPublicResourceWeight tchConceptualTechnologyWeight = weights.get(0); + if (tchConceptualTechnologyWeight != null) { + //获取权重信息 + BigDecimal reportWeight = tchConceptualTechnologyWeight.getReportWeight(); + if (reportWeight != null) { + StuScoreDetails scoreDetails = new StuScoreDetails(); + scoreDetails.setUserId(stuBlockProductWithBLOBs.getUserId()); + scoreDetails.setModule(stuBlockProductWithBLOBs.getModule()); + scoreDetails.setScoreWeight(reportWeight.doubleValue()); + scoreDetails.setId(id); + scoreDetails.setLearningProjects("实训报告"); + scoreDetails.setSerialNumber(5); + scoreDetails.setCompletionStatus("已提交"); + stuScoreDetailsMapper.insert(scoreDetails); + } + } + return stuPracticalTrainingReport; + } + //多次上传 + StuPracticalTrainingReport TrainingReport = stuPracticalTrainingReports.get(0); +// String fileName = file.getOriginalFilename(); + long fileSize = file.getSize() / 1024; + String url = localFileUtil.upload(file); + TrainingReport.setReportName(name + ".pdf"); + TrainingReport.setSize((int) fileSize); + TrainingReport.setUploadTime(new Date()); + TrainingReport.setUrl(url); + + + + StuScoreDetailsExample stuScoreDetailsExample = new StuScoreDetailsExample(); + stuScoreDetailsExample.createCriteria().andUserIdEqualTo(stuBlockProductWithBLOBs.getUserId()).andModuleEqualTo(stuBlockProductWithBLOBs.getModule()); + List stuScoreDetails = stuScoreDetailsMapper.selectByExample(stuScoreDetailsExample); + if (stuScoreDetails.size() != 0) { + if (stuScoreDetails.get(0).getScoreWeight() != (weights.get(0).getReportWeight().doubleValue())) { + stuScoreDetails.get(0).setScoreWeight(weights.get(0).getReportWeight().doubleValue()); + stuScoreDetailsMapper.updateByPrimaryKeySelective(stuScoreDetails.get(0)); + } + } + stuPracticalTrainingReportMapper.updateByPrimaryKeySelective(TrainingReport); + return TrainingReport; + } else { + + //格式不为pdf,转换 + try { + BufferedInputStream inputStream = FileUtil.getInputStream(convertMultipartFileToFile(file)); + + + String s = IdUtil.simpleUUID(); + + File file1 = new File(filePath + "/pdf"); + if (!file1.exists()){ + file1.mkdir(); + } + + FileOutputStream fileOutputStream = new FileOutputStream(filePath+"/pdf/"+s+".pdf"); + + PDFConvertUtil.convertToPDFByFileNameSuffix(originalFilename, inputStream, fileOutputStream); + + FileInputStream fileInputStream = new FileInputStream(filePath+"/pdf/"+s+".pdf"); + + MultipartFile multipartFile = new MockMultipartFile( + "example.txt", // 文件名 + s + ".pdf", // 原始文件名 + "pdf", // 文件类型 + fileInputStream + ); + String upload = localFileUtil.upload(multipartFile); + fileInputStream.close(); + fileOutputStream.close(); + if (stuPracticalTrainingReports.size() == 0) { + StuPracticalTrainingReport stuPracticalTrainingReport = new StuPracticalTrainingReport(); + //文件大小 + long fileSize = multipartFile.getSize() / 1024; + int i = UUID.randomUUID().hashCode(); + int info = i > 0 ? i : -i; + stuPracticalTrainingReport.setId(info); + stuPracticalTrainingReport.setReportName(name + ".pdf"); + stuPracticalTrainingReport.setModule(stuBlockProductWithBLOBs.getModule()); + stuPracticalTrainingReport.setSize((int) fileSize); + stuPracticalTrainingReport.setUploadTime(new Date()); + stuPracticalTrainingReport.setUrl(upload); + stuPracticalTrainingReport.setUserid(stuBlockProductWithBLOBs.getUserId()); + stuPracticalTrainingReport.setSchoolId(stuBlockProductWithBLOBs.getSchoolId()); + stuPracticalTrainingReportMapper.insert(stuPracticalTrainingReport); + + + //上传实验报告后写入学习成绩 + + if (weights.isEmpty()) { + throw new RuntimeException("没有查询到实验报告权重信息"); + } + TchPublicResourceWeight tchConceptualTechnologyWeight = weights.get(0); + if (tchConceptualTechnologyWeight != null) { + //获取权重信息 + BigDecimal reportWeight = tchConceptualTechnologyWeight.getReportWeight(); + if (reportWeight != null) { + StuScoreDetails scoreDetails = new StuScoreDetails(); + scoreDetails.setUserId(stuBlockProductWithBLOBs.getUserId()); + scoreDetails.setModule(stuBlockProductWithBLOBs.getModule()); + scoreDetails.setScoreWeight(reportWeight.doubleValue()); + scoreDetails.setId(id); + scoreDetails.setLearningProjects("实训报告"); + scoreDetails.setSerialNumber(5); + scoreDetails.setCompletionStatus("已提交"); + stuScoreDetailsMapper.insert(scoreDetails); + } + } + + return stuPracticalTrainingReport; + } else { + StuPracticalTrainingReport TrainingReport = stuPracticalTrainingReports.get(0); + long fileSize = multipartFile.getSize() / 1024; + TrainingReport.setReportName(name + ".pdf"); + TrainingReport.setSize((int) fileSize); + TrainingReport.setUploadTime(new Date()); + TrainingReport.setUrl(upload); + + + StuScoreDetailsExample stuScoreDetailsExample = new StuScoreDetailsExample(); + stuScoreDetailsExample.createCriteria().andUserIdEqualTo(stuBlockProductWithBLOBs.getUserId()).andModuleEqualTo(stuBlockProductWithBLOBs.getModule()); + List stuScoreDetails = stuScoreDetailsMapper.selectByExample(stuScoreDetailsExample); + if (stuScoreDetails.size() != 0) { + if (stuScoreDetails.get(0).getScoreWeight() != (weights.get(0).getReportWeight().doubleValue())) { + stuScoreDetails.get(0).setScoreWeight(weights.get(0).getReportWeight().doubleValue()); + stuScoreDetailsMapper.updateByPrimaryKeySelective(stuScoreDetails.get(0)); + } + } + + stuPracticalTrainingReportMapper.updateByPrimaryKeySelective(TrainingReport); + return TrainingReport; + } + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + /* + * @author whb + * @Date 2023/10/11 + * + *下载报告 + */ + @Override + public void download(String id, HttpServletResponse response, String module) { + StuPracticalTrainingReportExample reportExample = new StuPracticalTrainingReportExample(); + reportExample.createCriteria().andModuleEqualTo(module).andUseridEqualTo(id); + + + + + List stuPracticalTrainingReport = stuPracticalTrainingReportMapper.selectByExample(reportExample); + + if (stuPracticalTrainingReport.size()>0) + { + Assert.isTrue(stuPracticalTrainingReport != null && stuPracticalTrainingReport.get(0).getUrl() != null, "报告不存在"); + + fileUtil.download(response, stuPracticalTrainingReport.get(0).getReportName(), stuPracticalTrainingReport.get(0).getUrl()); + }else { + throw new RuntimeException("报告不存在"); + } + + + } + + /** + * 获取实验报告 + * + * @param userId + * @param module + * @return + */ + @Override + public StuPracticalTrainingReport getReport(String userId, String module) { + + //获取实验报告 + StuPracticalTrainingReportExample export = new StuPracticalTrainingReportExample(); + export.createCriteria().andUseridEqualTo(userId).andModuleEqualTo(module); + + if (stuPracticalTrainingReportMapper.selectByExample(export).size() != 0) { + StuPracticalTrainingReport report = stuPracticalTrainingReportMapper.selectByExample(export).get(0); + + + return report; + } + return null; + } + + + + + @Override + public void OutPdf(HttpServletResponse response, String context) { + try { + + String s = IdUtil.simpleUUID(); + FileOutputStream fileOutputStream = new FileOutputStream(filePath+"/pdf/"+s+".pdf"); + PdfUtil.htmlStringToPdf(context,fileOutputStream); + fileUtil.download(response, s+".pdf", "/pdf/"+s+".pdf"); + + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } + } + + + public File convertMultipartFileToFile(MultipartFile multipartFile) throws IOException { + // 创建一个临时文件 + File tempFile = File.createTempFile("temp", null); + + // 将 MultipartFile 的内容写入临时文件 + multipartFile.transferTo(tempFile); + + return tempFile; + } + + +} diff --git a/src/main/java/com/sztzjy/digital_credit/service/impl/StuUserServiceImpl.java b/src/main/java/com/sztzjy/digital_credit/service/impl/StuUserServiceImpl.java index a1b8094..3c400ea 100644 --- a/src/main/java/com/sztzjy/digital_credit/service/impl/StuUserServiceImpl.java +++ b/src/main/java/com/sztzjy/digital_credit/service/impl/StuUserServiceImpl.java @@ -5,6 +5,7 @@ package com.sztzjy.digital_credit.service.impl;/** import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import com.sztzjy.digital_credit.controller.tch.StuUserDto; import com.sztzjy.digital_credit.entity.StuUser; import com.sztzjy.digital_credit.entity.StuUserExample; import com.sztzjy.digital_credit.entity.TchModuleWeith; @@ -12,11 +13,16 @@ import com.sztzjy.digital_credit.entity.TchModuleWeithExample; import com.sztzjy.digital_credit.entity.tchdto.ScoreOverviewParametesDTO; import com.sztzjy.digital_credit.entity.tchdto.TchGeneralViewDTO; import com.sztzjy.digital_credit.entity.tchdto.TchGeneralViewWeightDTO; +import com.sztzjy.digital_credit.entity.tchdto.TchManualRatingByTeacherDTO; +import com.sztzjy.digital_credit.mapper.StuUserDtoMapper; import com.sztzjy.digital_credit.mapper.StuUserMapper; import com.sztzjy.digital_credit.mapper.TchModuleWeithMapper; import com.sztzjy.digital_credit.service.StuUserService; +import com.sztzjy.digital_credit.util.PageUtil; +import com.sztzjy.digital_credit.util.ResultEntity; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -34,6 +40,9 @@ public class StuUserServiceImpl implements StuUserService { @Autowired private StuUserMapper userMapper; + @Autowired + private StuUserDtoMapper stuUserDtoMapper; + /** * 成绩总览展示(条件查询) @@ -49,10 +58,9 @@ public class StuUserServiceImpl implements StuUserService { TchModuleWeithExample tchModuleWeithExample = new TchModuleWeithExample(); tchModuleWeithExample.createCriteria().andSchoolIdEqualTo(parametes.getSchoolId()); List tchModuleWeithList = tchModuleWeithMapper.selectByExample(tchModuleWeithExample); - if (tchModuleWeithList.isEmpty()) - { + if (tchModuleWeithList.isEmpty()) { //创建默认权重数据 - TchModuleWeith tchModuleWeith=new TchModuleWeith(parametes.getSchoolId()); + TchModuleWeith tchModuleWeith = new TchModuleWeith(parametes.getSchoolId()); tchModuleWeithMapper.insert(tchModuleWeith); } @@ -130,8 +138,7 @@ public class StuUserServiceImpl implements StuUserService { tchModuleWeithExample.createCriteria().andSchoolIdEqualTo(schoolId); List tchModuleWeithList = tchModuleWeithMapper.selectByExample(tchModuleWeithExample); - if (tchModuleWeithList.isEmpty()) - { + if (tchModuleWeithList.isEmpty()) { TchModuleWeith tchModuleWeith = new TchModuleWeith(schoolId); tchModuleWeithMapper.insertSelective(tchModuleWeith); tchModuleWeithList.add(tchModuleWeith); @@ -144,7 +151,7 @@ public class StuUserServiceImpl implements StuUserService { List list = new ArrayList(); for (int i = 0; i < stuUsers.size(); i++) { //System.out.println(stuUsers.get(i).getUserId()); - StuUser stuUser=new StuUser(stuUsers.get(i),tchModuleWeithList.get(0)); + StuUser stuUser = new StuUser(stuUsers.get(i), tchModuleWeithList.get(0)); list.add(stuUser); } Collections.sort(list, new Comparator() { @@ -163,10 +170,11 @@ public class StuUserServiceImpl implements StuUserService { } /** - * 征信画像成绩排序 - * @param schoolId - * @return - */ + * 征信画像成绩排序 + * + * @param schoolId + * @return + */ @Override public void creditPortraitRank(String schoolId) { @@ -177,10 +185,11 @@ public class StuUserServiceImpl implements StuUserService { } /** - * 个人征信成绩排序 - * @param schoolId - * @return - */ + * 个人征信成绩排序 + * + * @param schoolId + * @return + */ @Override public void personCreditRank(String schoolId) { @@ -190,25 +199,134 @@ public class StuUserServiceImpl implements StuUserService { } /** - * 企业征信成绩排序 - * @param schoolId - * @return - */ + * 企业征信成绩排序 + * + * @param schoolId + * @return + */ @Override public void corporateCreditRank(String schoolId) { userMapper.updateCorporateCreditRank(schoolId); } /** - * 综合案例成绩排序 - * @param schoolId - * @return - */ + * 综合案例成绩排序 + * + * @param schoolId + * @return + */ @Override public void comprehensiveCaseRank(String schoolId) { userMapper.updateComprehensiveCaseRank(schoolId); } + @Override + public PageInfo getCreditPortraitAchievementList(ScoreOverviewParametesDTO parametes) { + PageHelper.startPage(parametes.getIndex(), parametes.getSize()); + StuUserExample example = new StuUserExample(); + StuUserExample.Criteria criteria = example.createCriteria(); + criteria.andSchoolIdEqualTo(parametes.getSchoolId()); + if (StringUtils.isNotBlank(parametes.getName())) { +// criteria.andNameEqualTo(viewShowDTO.getName()); + criteria.andNameLike("%" + parametes.getName() + "%"); + } + if (StringUtils.isNotBlank(parametes.getStudentId())) { +// criteria.andStudentIdEqualTo(viewShowDTO.getStudentId()); + criteria.andStudentIdLike("%" + parametes.getStudentId() + "%"); + } + if (StringUtils.isNotBlank(parametes.getClassName())) { + + criteria.andClassNameLike("%" + parametes.getClassName() + "%"); + } + + if (parametes.getModule().equals("征信画像成绩")) { + example.setOrderByClause("credit_portrait_rank"); + } else if (parametes.getModule().equals("个人征信成绩")) { + example.setOrderByClause("personal_credit_rank"); + } else if (parametes.getModule().equals("企业征信成绩")) { + example.setOrderByClause("corporate_credit_rank"); + } else if (parametes.getModule().equals("综合案例成绩")) { + example.setOrderByClause("comprehensive_case_rank"); + } + + List stuUsers = userMapper.selectByExample(example); + PageInfo pageInfo = new PageInfo<>(stuUsers); + return pageInfo; + } + + //实际数据结果集 + @Override + public List selectViewList(String schoolId, String module) { + + StuUserExample example = new StuUserExample(); + StuUserExample.Criteria criteria = example.createCriteria(); + criteria.andSchoolIdEqualTo(schoolId); + + if (module.equals("征信画像成绩")) { + example.setOrderByClause("credit_portrait_rank ASC"); + } else if (module.equals("个人征信成绩")) { + example.setOrderByClause("personal_credit_rank ASC"); + } else if (module.equals("企业征信成绩")) { + example.setOrderByClause("corporate_credit_rank ASC"); + } else if (module.equals("综合案例成绩")) { + example.setOrderByClause("comprehensive_case_rank ASC"); + } + List stuUsers = userMapper.selectByExample(example); + + + + return stuUsers; + } + + /** + * 手动评分 + * @param manualRatingByTeacherDTO + * @return + */ + + @Override + public void manualRatingByTeacher(TchManualRatingByTeacherDTO manualRatingByTeacherDTO) { + + + StuUser stuUser = userMapper.selectByPrimaryKey(manualRatingByTeacherDTO.getUserId()); + + //将老师评分手动写入对应分数 + if ("个人征信案例主观成绩".equals(manualRatingByTeacherDTO.getModule())){ + + stuUser.setCasePersonalCreditSubScore(manualRatingByTeacherDTO.getScore()); + + stuUser.setCasePersonalCreditScore(manualRatingByTeacherDTO.getScore().add(stuUser.getCasePersonalCreditObjScore())); + } + + if ("企业征信案例主观成绩".equals(manualRatingByTeacherDTO.getModule())){ + + stuUser.setCaseCorporateCreditSubScore(manualRatingByTeacherDTO.getScore()); + + stuUser.setCaseCorporateCreditScore(manualRatingByTeacherDTO.getScore().add(stuUser.getCaseCorporateCreditObjScore())); + + } + + //总分累加 + + + userMapper.updateByPrimaryKeySelective(stuUser); + + + } + + @Override + public PageInfo getScoreReport(String schoolId, Integer index, Integer size, String module, String name, String studentId, String className, String keyWord) { + ListuserDtoList= stuUserDtoMapper.selectByCondition(name,studentId,className,module,keyWord,schoolId); + PageInfo pageInfo = PageUtil.pageHelper(userDtoList, index, size); + return pageInfo; + } + + //班级下拉框 + @Override + public List getClassNameBySchoolId(String schoolId) { + return userMapper.getClassNameBySchoolId(schoolId); + } + } diff --git a/src/main/java/com/sztzjy/digital_credit/util/PdfUtil.java b/src/main/java/com/sztzjy/digital_credit/util/PdfUtil.java new file mode 100644 index 0000000..c6fd77a --- /dev/null +++ b/src/main/java/com/sztzjy/digital_credit/util/PdfUtil.java @@ -0,0 +1,49 @@ +package com.sztzjy.digital_credit.util; + + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.xhtmlrenderer.pdf.ITextFontResolver; +import org.xhtmlrenderer.pdf.ITextRenderer; + +import java.io.FileOutputStream; + + +/** + * 生成pdf的工具类 + * @author hyy + */ +public class PdfUtil { + private static final Logger logger = LoggerFactory.getLogger(PdfUtil.class); + + /** + * 基于 flying-saucer-pdf-itext5 + * html 字符串生成pdf + * @param content 带css样式的富文本内容 + * @return 返回生成的pdf本地路径 + */ + public static String htmlStringToPdf(String content, FileOutputStream fileOutputStream) { + content = content.replace(" "," ") + .replace("“","\"") + .replace("”","\""); +// String path = System.getProperty("user.dir") + "//" + name; + + try{ + ITextRenderer renderer = new ITextRenderer(); + + renderer.setDocumentFromString("" + content + ""); + //设置字符集(宋体),此处必须与模板中的一致,区分大小写,不能写成汉字"宋体" + ITextFontResolver fontResolver = renderer.getFontResolver(); + fontResolver.addFont("simsun.ttf", com.lowagie.text.pdf.BaseFont.IDENTITY_H, com.lowagie.text.pdf.BaseFont.NOT_EMBEDDED); + //展现和输出pdf + renderer.layout(); + renderer.createPDF(fileOutputStream); + renderer.finishPDF(); + return "success"; + } catch (Exception e) { + logger.error("生成pdf发生异常",e); + return null; + } + } + +} \ No newline at end of file diff --git a/src/main/resources/mappers/StuUserDtoMapper.xml b/src/main/resources/mappers/StuUserDtoMapper.xml new file mode 100644 index 0000000..91458fc --- /dev/null +++ b/src/main/resources/mappers/StuUserDtoMapper.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mappers/StuUserMapper.xml b/src/main/resources/mappers/StuUserMapper.xml index 35a95d1..b0f37f2 100644 --- a/src/main/resources/mappers/StuUserMapper.xml +++ b/src/main/resources/mappers/StuUserMapper.xml @@ -401,6 +401,7 @@ + update stu_user @@ -820,4 +821,11 @@ + + + \ No newline at end of file diff --git a/src/main/resources/simsun.ttf b/src/main/resources/simsun.ttf new file mode 100644 index 0000000..e0115ab Binary files /dev/null and b/src/main/resources/simsun.ttf differ