于相涌/robot_optimize
YXY 1 year ago
parent b2ac57f652
commit a81f7cacf1

@ -34,12 +34,42 @@
<jwt.version>0.9.1</jwt.version>
<flowable.version>6.7.2</flowable.version>
<swagger.bootstrap-ui.version>1.9.6</swagger.bootstrap-ui.version>
<itextpdf.version>6.7.2</itextpdf.version>
<xmlworker.version>6.7.2</xmlworker.version>
<itext-asian.version>6.7.2</itext-asian.version>
<flying-saucer-pdf.version>6.7.2</flying-saucer-pdf.version>
<freemarker.version>6.7.2</freemarker.version>
</properties>
<!-- 依赖声明 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
<version>9.0.3</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<!-- SpringBoot的依赖配置-->
<dependency>
<groupId>org.springframework.boot</groupId>

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

@ -0,0 +1,83 @@
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<style type="text/css">
body {
font-family: SimSun;
}
.mybody h1 {
font-size: 24px;
text-align: center;
line-height: 30px;
padding: 20px 0;
padding-top: 30px;
}
.content_class {
box-shadow: none;
line-height: 30px;
margin: 0px 10%;
height: auto !important;
padding: 0px 75px 100px 75px !important;
}
.sign {
margin-left: 70%;
}
</style>
</head>
<body>
<div class="mybody">
<h1>课程反馈表</h1>
<div class="content_class">
<table border="1" width="500" cellspacing="0" cellpadding="0">
<tr>
<td>专业 Program</td>
<td>${program!}</td>
<td>学生姓名 Name</td>
<td>${studentName!}</td>
</tr>
<tr>
<td>上课时间</td>
<td>${startClassTime!}</td>
<td rowspan="2">授课老师 Tutor</td>
<td rowspan="2">${tutor!}</td>
</tr>
<tr>
<td>下课时间</td>
<td>${endClassTime!}</td>
</tr>
<tr colspan="4">
<td>作业完成情况 <br />
Feedback</td>
<td colspan="4">${feedback!}</td>
</tr>
<tr colspan="4">
<td>课堂表现 <br />
Performance</td>
<td colspan="4">${performance!}</td>
</tr>
<tr colspan="4">
<td>课堂内容 <br />
Content</td>
<td colspan="4">${content!}</td>
</tr>
<tr colspan="4">
<td>课后作业 <br />
Work</td>
<td colspan="4">${work!}</td>
</tr>
</table>
<span class="sign">学生签字:</span>
</div>
</div>
</body>
</html>

@ -136,6 +136,28 @@
<artifactId>hutool-all</artifactId>
<version>5.8.11</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
</dependencies>
</project>

@ -0,0 +1,68 @@
package com.ruoyi.common.utils;
import cn.hutool.core.io.resource.ClassPathResource;
import cn.hutool.core.io.resource.Resource;
import com.itextpdf.text.pdf.BaseFont;
import freemarker.template.Configuration;
import freemarker.template.Template;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ResourceUtils;
import org.xhtmlrenderer.pdf.ITextRenderer;
import java.io.File;
import java.io.OutputStream;
import java.io.StringWriter;
import java.util.Locale;
/**
* @author yuxiangyong
* @create 2023-05-21 10:38
*/
@Slf4j
public class PdfUtils {
private final static String TEMPLATE_BASE_PATH = "/template/";//存放文件模板的地址
private final static String IMG_BASE_PATH = "/photo/";//存放图片文件的地址logo图片、机构公章等
private final static String DEFAULT_FONT = "font/simsun.ttc";//默认字体资源文件([宋体][simsun.ttc]
private final static String ENCODING = "UTF-8";//指定编码
/**
* pdf
* @param templateCode
* @param data freemarker
* @param out pdf
*/
public static void createPDF(String templateCode, Object data, OutputStream out, String imgName) {
try {
// 创建一个FreeMarker实例, 负责管理FreeMarker模板的Configuration实例
Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
String path = ResourceUtils.getURL("classpath:").getPath();
// 指定FreeMarker模板文件的位置
cfg.setDirectoryForTemplateLoading(new File(path + TEMPLATE_BASE_PATH));
ITextRenderer renderer = new ITextRenderer();
// 设置 css中 的字体样式(暂时仅支持宋体和黑体)
String fontPath = path + DEFAULT_FONT;
renderer.getFontResolver().addFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
// 设置模板的编码格式
cfg.setEncoding(Locale.CHINA, ENCODING);
// 获取模板文件 template.ftl
Template template = cfg.getTemplate(templateCode, ENCODING);
StringWriter writer = new StringWriter();
// 将数据输出到html中
template.process(data, writer);
writer.flush();
String html = writer.toString();
// 把html代码传入渲染器中
renderer.setDocumentFromString(html);
renderer.layout();
renderer.createPDF(out, false);
renderer.finishPDF();
out.flush();
out.close();
} catch (Exception e) {
log.error("PDF导出异常", e);
}
}
}

@ -1,14 +1,17 @@
package com.ruoyi.flyingbook.controller;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.utils.PdfUtils;
import com.ruoyi.flyingbook.domain.edi.EdiResponseVo;
import com.ruoyi.flyingbook.domain.edi.SyncToTableRequest;
import com.ruoyi.flyingbook.domain.template.CourseFeedbackTemplateDto;
import com.ruoyi.flyingbook.edi.EdiOperateService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
@Slf4j
@ -21,9 +24,20 @@ public class EdiController extends BaseController {
/**
*
*/
@PostMapping("/sync2Table")
public EdiResponseVo sync2Table(@RequestBody SyncToTableRequest request) {
return ediOperateService.sync2Table(request);
// @PostMapping("/sync2Table")
// public EdiResponseVo sync2Table(@RequestBody SyncToTableRequest request) {
// return ediOperateService.sync2Table(request);
// }
@RequestMapping("sync2Table")
@ResponseBody
public void exportPdfDemo(HttpServletResponse response, @RequestParam("param")String param) throws Exception{
CourseFeedbackTemplateDto resultDTO = new CourseFeedbackTemplateDto();
resultDTO.setWatermark("");//设置图片,没有图片设置空即可
resultDTO.setTemplateUrl("COURSE_FEEDBACK");//参数
resultDTO.setProgram("aaaa");
resultDTO.setStudentName("aaaa");
PdfUtils.createPDF("COURSE_FEEDBACK.ftl",resultDTO,response.getOutputStream(),"");
}
}

@ -0,0 +1,30 @@
package com.ruoyi.flyingbook.domain.template;
import lombok.Data;
/**
* @author yuxiangyong
* @create 2023-05-21 10:56
*/
@Data
public class CourseFeedbackTemplateDto {
private String templateUrl;
private String watermark;
private String program;
private String studentName;
private String startClassTime;
private String endClassTime;
private String tutor;
private String feedback;
private String performance;
private String content;
private String work;
}

@ -28,6 +28,7 @@ import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StopWatch;
import javax.annotation.Resource;
import java.time.LocalDateTime;
@ -73,7 +74,7 @@ public class EdiOperateServiceImpl implements EdiOperateService {
vo.setSuccessFlag(Boolean.TRUE);
}catch (Exception e){
log.error("同步数据到飞书异常");
log.error("同步数据到飞书异常",e);
vo.setSuccessFlag(Boolean.FALSE);
vo.setErrorMessage(e.getMessage());
EventLog log = new EventLog(request.getEventId(), EventOperateType.SYNC_DATA_TO_TABLE.getCode(), JSONObject.toJSONString(request), null, e.getMessage());
@ -114,13 +115,19 @@ public class EdiOperateServiceImpl implements EdiOperateService {
*/
private void buildRequestBodyList(SyncToTableRequest request,List<EventLog> errorList){
//多维表格行记录
StopWatch stopWatch = new StopWatch("同步记录耗时");
stopWatch.start("total");
for (SyncTableRowDetailRequest rowDetail : request.getRowDetailList()) {
this.createRecord(rowDetail,request,errorList);
}
stopWatch.stop();
System.out.println(stopWatch.getTotalTimeSeconds());
}
private void createRecord(SyncTableRowDetailRequest rowDetail,SyncToTableRequest request,List<EventLog> errorList){
Map<String, Object> body = new HashMap<>();
StopWatch stopWatch = new StopWatch("同步记录耗时明细");
stopWatch.start("detail");
try {
List<LarkTableConfiguration> configurationList = request.getConfigurationList();
LarkCompanyRelation larkCompanyRelation = request.getLarkCompanyRelation();
@ -139,6 +146,9 @@ public class EdiOperateServiceImpl implements EdiOperateService {
log.error("同步行记录失败 request:{} larkRequest:{}",JSONObject.toJSONString(rowDetail),JSONObject.toJSONString(body));
EventLog log = new EventLog(request.getEventId(), EventOperateType.SYNC_DATA_TO_TABLE.getCode(), JSONObject.toJSONString(rowDetail), null, e.getMessage());
errorList.add(log);
}finally {
stopWatch.stop();
System.out.println(stopWatch.getTotalTimeSeconds());
}
}

Loading…
Cancel
Save