diff --git a/.gitignore b/.gitignore
index 4878bf8..ed7fa90 100644
--- a/.gitignore
+++ b/.gitignore
@@ -48,4 +48,6 @@ gen
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
-/upload/**
\ No newline at end of file
+/upload/**
+
+*.doc*
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 8c66414..da6b13f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -78,6 +78,28 @@
spring-boot-starter-log4j2
+
+ fr.opensagres.xdocreport
+ fr.opensagres.poi.xwpf.converter.core
+ 2.0.2
+
+
+ commons-io
+ commons-io
+ 2.8.0
+
+
+ fr.opensagres.xdocreport
+ fr.opensagres.xdocreport.itext.extension
+ 2.0.2
+
+
+ fr.opensagres.xdocreport
+ fr.opensagres.poi.xwpf.converter.pdf
+ 2.0.2
+
+
+
org.springframework.boot
spring-boot-starter-aop
diff --git a/src/main/java/com/example/survey/config/AuthFilterConfig.java b/src/main/java/com/example/survey/config/AuthFilterConfig.java
index c10d604..8b30299 100644
--- a/src/main/java/com/example/survey/config/AuthFilterConfig.java
+++ b/src/main/java/com/example/survey/config/AuthFilterConfig.java
@@ -76,9 +76,7 @@ public class AuthFilterConfig implements Filter {
}
String token = request.getHeader("Authorization");
- if (uri.startsWith("/record/record2word")) {
- token = request.getParameter("token");
- }
+
if (token == null) {
log.error("请求无token");
diff --git a/src/main/java/com/example/survey/controller/ProjectController.java b/src/main/java/com/example/survey/controller/ProjectController.java
index eca0daf..e77226d 100644
--- a/src/main/java/com/example/survey/controller/ProjectController.java
+++ b/src/main/java/com/example/survey/controller/ProjectController.java
@@ -2,6 +2,7 @@ package com.example.survey.controller;
import com.example.survey.dto.project.AddRecordDTO;
import com.example.survey.dto.project.CreateProjectDTO;
+import com.example.survey.dto.project.DeleteProjectDTO;
import com.example.survey.dto.project.DeleteRecordDTO;
import com.example.survey.dto.project.ModifyProjectDTO;
@@ -64,6 +65,13 @@ public class ProjectController {
return new ResultVO(ResultEnum.SUCCESS);
}
+
+ @DeleteMapping("/project")
+ public ResultVO deleteProject(@RequestBody DeleteProjectDTO deleteProjectDTO){
+ projectService.deleteProject(deleteProjectDTO);
+ return new ResultVO(ResultEnum.SUCCESS);
+ }
+
@DeleteMapping("/record")
public ResultVO deleteRecord(@RequestBody DeleteRecordDTO deleteRecordDTO){
projectService.deleteRecord(deleteRecordDTO);
diff --git a/src/main/java/com/example/survey/controller/RecordController.java b/src/main/java/com/example/survey/controller/RecordController.java
index 3a8b69d..32801e5 100644
--- a/src/main/java/com/example/survey/controller/RecordController.java
+++ b/src/main/java/com/example/survey/controller/RecordController.java
@@ -97,8 +97,16 @@ public class RecordController {
}
@GetMapping("/record2word")
- public void record2word(@RequestParam("uuid") String uuid, HttpServletResponse response) {
- recordService.record2word(uuid, response);
+ public ResultVO record2word(@RequestParam("uuid") String uuid) {
+ recordService.record2word(uuid);
+ ResultVO resultVO = new ResultVO(ResultEnum.SUCCESS);
+ return resultVO;
+ }
+
+ @GetMapping("/report")
+ public void report(@RequestParam("uuid") String uuid, HttpServletResponse response) {
+ // recordService.record2word(uuid, response);
+
}
@PutMapping("/metaData")
diff --git a/src/main/java/com/example/survey/dao/ProjectDao.java b/src/main/java/com/example/survey/dao/ProjectDao.java
index bb75278..0e2dca5 100644
--- a/src/main/java/com/example/survey/dao/ProjectDao.java
+++ b/src/main/java/com/example/survey/dao/ProjectDao.java
@@ -55,4 +55,6 @@ public interface ProjectDao {
long countProject(String name, long date_gt, long date_lt);
+ void deleteProject(String name);
+
}
diff --git a/src/main/java/com/example/survey/dao/impl/ProjectDaoImpl.java b/src/main/java/com/example/survey/dao/impl/ProjectDaoImpl.java
index 6746883..8c69963 100644
--- a/src/main/java/com/example/survey/dao/impl/ProjectDaoImpl.java
+++ b/src/main/java/com/example/survey/dao/impl/ProjectDaoImpl.java
@@ -84,4 +84,12 @@ public class ProjectDaoImpl implements ProjectDao {
return mongoTemplate.count(query, Project.class);
}
+ @Override
+ public void deleteProject(String name) {
+ Query query = new Query();
+ query.addCriteria(Criteria.where("name").is(name));
+ mongoTemplate.remove(query, Project.class);
+
+ }
+
}
diff --git a/src/main/java/com/example/survey/dto/project/DeleteProjectDTO.java b/src/main/java/com/example/survey/dto/project/DeleteProjectDTO.java
new file mode 100644
index 0000000..03ce9f0
--- /dev/null
+++ b/src/main/java/com/example/survey/dto/project/DeleteProjectDTO.java
@@ -0,0 +1,12 @@
+package com.example.survey.dto.project;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author Pope
+ */
+@Data
+public class DeleteProjectDTO {
+ private String name;
+}
diff --git a/src/main/java/com/example/survey/enumeration/AuthEnum.java b/src/main/java/com/example/survey/enumeration/AuthEnum.java
index 759da2c..ac71bf3 100644
--- a/src/main/java/com/example/survey/enumeration/AuthEnum.java
+++ b/src/main/java/com/example/survey/enumeration/AuthEnum.java
@@ -20,6 +20,10 @@ public enum AuthEnum {
add("/project/projectState : PUT");
add("/project/project : PUT");
add("/project/project : POST");
+ add("/project/project : DELETE");
+ add("/project/record : DELETE");
+ add("/project/record : PUT");
+
add("/respondent/respondent : POST");
add("/respondent/respondent : PUT");
@@ -33,8 +37,10 @@ public enum AuthEnum {
add("/record/record : PUT");
add("/record/record : DELETE");
add("/record/review : PUT");
+ add("/record/metaData : PUT");
add("/record/file : POST");
-
+ add("/record/record2word : GET");
+
add("/user/userList : GET");
add("/user/user : POST");
add("/user/user : DELETE");
@@ -65,15 +71,23 @@ public enum AuthEnum {
QUERY_PROJECT("查询项目的权限", new HashSet() {{
add("/project/projectList : GET");
add("/project/respondentCount : GET");
+ add("/record/record2word : GET");
+
}}),
MODIFY_PROJECT("修改项目的权限", new HashSet() {{
add("/project/projectState : PUT");
add("/project/project : PUT");
-
+ add("/project/record : DELETE");
+ add("/project/record : PUT");
}}),
CREATE_PROJECT("创建项目的权限", new HashSet() {{
add("/project/project : POST");
}}),
+ DELETE_PROJECT("删除项目的权限", new HashSet() {{
+ add("/project/project : DELETE");
+ }}),
+
+
/**
* 调查对象
@@ -107,6 +121,9 @@ public enum AuthEnum {
MODIFY_RECORD("修改流调记录的权限", new HashSet() {{
add("/record/record : PUT");
}}),
+ RECORD_METADATA("修改流调记录元数据的权限", new HashSet() {{
+ add("/record/metaData : PUT");
+ }}),
DELETE_RECORD("删除流调记录的权限", new HashSet() {{
add("/record/record : DELETE");
}}),
diff --git a/src/main/java/com/example/survey/service/ProjectService.java b/src/main/java/com/example/survey/service/ProjectService.java
index 48fcbee..57be3d7 100644
--- a/src/main/java/com/example/survey/service/ProjectService.java
+++ b/src/main/java/com/example/survey/service/ProjectService.java
@@ -2,6 +2,7 @@ package com.example.survey.service;
import com.example.survey.dto.project.AddRecordDTO;
import com.example.survey.dto.project.CreateProjectDTO;
+import com.example.survey.dto.project.DeleteProjectDTO;
import com.example.survey.dto.project.DeleteRecordDTO;
import com.example.survey.dto.project.ModifyProjectDTO;
@@ -56,6 +57,7 @@ public interface ProjectService {
*/
long countProject(String name, long date_gt, long date_lt);
+ void deleteProject(DeleteProjectDTO projectDTO);
void addRecord(AddRecordDTO addRecordDTO);
diff --git a/src/main/java/com/example/survey/service/RecordService.java b/src/main/java/com/example/survey/service/RecordService.java
index 559b68c..1916a3a 100644
--- a/src/main/java/com/example/survey/service/RecordService.java
+++ b/src/main/java/com/example/survey/service/RecordService.java
@@ -99,9 +99,11 @@ public interface RecordService {
* @param projectName 项目名
* @param response 响应
*/
- void record2word(String idNumber, HttpServletResponse response);
+ boolean record2word(String idNumber);
+ void report(String uuid, HttpServletResponse response);
+
/**
* 修改流调记录所绑定元数据
*
diff --git a/src/main/java/com/example/survey/service/impl/ProjectServiceImpl.java b/src/main/java/com/example/survey/service/impl/ProjectServiceImpl.java
index 87d2e7f..72506cf 100644
--- a/src/main/java/com/example/survey/service/impl/ProjectServiceImpl.java
+++ b/src/main/java/com/example/survey/service/impl/ProjectServiceImpl.java
@@ -6,6 +6,7 @@ import com.example.survey.dao.RecordDao;
import com.example.survey.dao.UserDao;
import com.example.survey.dto.project.AddRecordDTO;
import com.example.survey.dto.project.CreateProjectDTO;
+import com.example.survey.dto.project.DeleteProjectDTO;
import com.example.survey.dto.project.DeleteRecordDTO;
import com.example.survey.dto.project.ModifyProjectDTO;
@@ -13,6 +14,7 @@ import com.example.survey.entity.MetaData;
import com.example.survey.entity.Project;
import com.example.survey.entity.Record;
import com.example.survey.entity.User;
+import com.example.survey.enumeration.MetaDataTypeEnum;
import com.example.survey.enumeration.ProjectStateEnum;
import com.example.survey.enumeration.ResultEnum;
import com.example.survey.exception.MetaDataException;
@@ -127,7 +129,10 @@ public class ProjectServiceImpl implements ProjectService {
t.add(project.getName());
record.setProjectList(t);
recordDao.saveRecord(record);
- project.setCount(project.getCount() + 1);
+ if(record.getMetaDataType().equals(MetaDataTypeEnum.RECORD_TEMP.getValue())) {
+ project.setCount(project.getCount() + 1);
+ }
+
projectDao.saveProject(project);
}
}
@@ -156,11 +161,23 @@ public class ProjectServiceImpl implements ProjectService {
t.remove(project.getName());
record.setProjectList(t);
recordDao.saveRecord(record);
- project.setCount(project.getCount() - 1);
+ if(record.getMetaDataType().equals(MetaDataTypeEnum.RECORD_TEMP.getValue())) {
+ project.setCount(project.getCount() - 1);
+ }
+
projectDao.saveProject(project);
}
}
+ @Override
+ public void deleteProject(DeleteProjectDTO projectDTO) {
+ if(!projectDao.existProject(projectDTO.getName()))
+ {
+ throw new ProjectException(ResultEnum.NOT_EXIST_PROJECT);
+ }
+ projectDao.deleteProject(projectDTO.getName());
+ }
+
}
diff --git a/src/main/java/com/example/survey/service/impl/RecordServiceImpl.java b/src/main/java/com/example/survey/service/impl/RecordServiceImpl.java
index f14c740..063230f 100644
--- a/src/main/java/com/example/survey/service/impl/RecordServiceImpl.java
+++ b/src/main/java/com/example/survey/service/impl/RecordServiceImpl.java
@@ -4,11 +4,13 @@ import com.example.survey.dao.*;
import com.example.survey.dto.record.*;
import com.example.survey.entity.*;
import com.example.survey.entity.inner.Operation;
+import com.example.survey.enumeration.MetaDataTypeEnum;
import com.example.survey.enumeration.RecordStateEnum;
import com.example.survey.enumeration.ResultEnum;
import com.example.survey.exception.*;
import com.example.survey.service.RecordService;
+import com.example.survey.util.ThreadWordUtil;
import com.example.survey.util.WordUtil;
import com.example.survey.vo.RecordDetailVO;
import com.example.survey.vo.RecordVO;
@@ -52,6 +54,9 @@ public class RecordServiceImpl implements RecordService {
@Value("${file.url}")
private String url;
+ @Autowired
+ private ThreadWordUtil threadWordUtil;
+
@Override
public void reviewRecord(ReviewRecordDTO reviewRecordDTO) {
if (!userDao.existUser(reviewRecordDTO.getReviewerPhone())) {
@@ -255,9 +260,23 @@ public class RecordServiceImpl implements RecordService {
}
@Override
- public void record2word(String uuid, HttpServletResponse response) {
+ public boolean record2word(String uuid) {
Record record = recordDao.getRecord(uuid);
+ if(!record.getMetaDataType().equals(MetaDataTypeEnum.REPORT_TEMP.getValue())) {
+ throw new RecordException(ResultEnum.NOT_EXIST_RECORD);
+ }
+ if(record.getState().equals(RecordStateEnum.REVIEWED.getValue())) {
+ return true;
+ }
+
+ threadWordUtil.setRecord(record);
+ threadWordUtil.setThreadName(record.getUuid() + ":" + String.valueOf(System.currentTimeMillis()));
+ // ThreadWordUtil wordUtil = new ThreadWordUtil();
+ // wordUtil.setRecord(record);
+ // wordUtil.setThreadName(record.getUuid() + ":" + String.valueOf(System.currentTimeMillis()));
+ threadWordUtil.start();
+ return true;
}
@Override
@@ -288,4 +307,10 @@ public class RecordServiceImpl implements RecordService {
recordDao.saveRecord(record);
}
+ @Override
+ public void report(String uuid, HttpServletResponse response) {
+ // TODO Auto-generated method stub
+
+ }
+
}
diff --git a/src/main/java/com/example/survey/util/CustomXWPFDocument.java b/src/main/java/com/example/survey/util/CustomXWPFDocument.java
new file mode 100644
index 0000000..5ce49f6
--- /dev/null
+++ b/src/main/java/com/example/survey/util/CustomXWPFDocument.java
@@ -0,0 +1,111 @@
+package com.example.survey.util;
+
+import org.apache.poi.openxml4j.opc.OPCPackage;
+
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.apache.poi.xwpf.usermodel.XWPFParagraph;
+import org.apache.xmlbeans.XmlException;
+import org.apache.xmlbeans.XmlToken;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
+import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;
+
+import fr.opensagres.poi.xwpf.converter.core.IXWPFConverter;
+import fr.opensagres.poi.xwpf.converter.pdf.PdfConverter;
+import fr.opensagres.poi.xwpf.converter.pdf.PdfOptions;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ *
+ * ———————————————— 版权声明:本文为CSDN博主「BlogTonycsdn」的原创文章,遵循 CC 4.0 BY-SA
+ * 版权协议,转载请附上原文出处链接及本声明。
+ * 原文链接:https://blog.csdn.net/liyuzhuang/article/details/78094349 支持word2007+
+ * 插入图片
+ *
+ * @author liyuzhuang
+ *
+ */
+public class CustomXWPFDocument extends XWPFDocument {
+ public CustomXWPFDocument(InputStream in) throws IOException {
+ super(in);
+ }
+
+ public CustomXWPFDocument(OPCPackage pkg) throws IOException {
+ super(pkg);
+ }
+
+ public void createPicture(String blipId, int id, int width, int height, XWPFParagraph paragraph) {
+ final int EMU = 9525;
+ width *= EMU;
+ height *= EMU;
+
+ CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();
+
+ String picXml = "" + ""
+ + " "
+ + " "
+ + " " + " "
+ + " " + " " + " "
+ + " "
+ + " " + " " + " "
+ + " " + " " + " "
+ + " " + " " + " " + " "
+ + " " + " " + " "
+ + " " + " " + "";
+
+ // CTGraphicalObjectData graphicData =
+ // inline.addNewGraphic().addNewGraphicData();
+ XmlToken xmlToken = null;
+ try {
+ xmlToken = XmlToken.Factory.parse(picXml);
+ } catch (XmlException xe) {
+ xe.printStackTrace();
+ }
+ inline.set(xmlToken);
+ // graphicData.set(xmlToken);
+
+ inline.setDistT(0);
+ inline.setDistB(0);
+ inline.setDistL(0);
+ inline.setDistR(0);
+
+ CTPositiveSize2D extent = inline.addNewExtent();
+ extent.setCx(width);
+ extent.setCy(height);
+
+ CTNonVisualDrawingProps docPr = inline.addNewDocPr();
+ docPr.setId(id);
+ docPr.setName("Picture " + id);
+ docPr.setDescr("Generated");
+ }
+
+ public void convertToPDF(String output) throws IOException {
+ OutputStream out = null;
+ try{
+ throw(new Exception());
+ /**
+ * 格式错误 不能使用
+ */
+ // PdfOptions pdfOptions = PdfOptions.create().fontEncoding("UTF-8");
+ // out = new FileOutputStream(output + ".pdf");
+ // IXWPFConverter converter = PdfConverter.getInstance();
+ // converter.convert(this, out, pdfOptions);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ out = new FileOutputStream(output);
+ this.write(out);
+ }
+ finally {
+ if(out != null) {
+ out.close();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/example/survey/util/DownloadUtil.java b/src/main/java/com/example/survey/util/DownloadUtil.java
new file mode 100644
index 0000000..5510398
--- /dev/null
+++ b/src/main/java/com/example/survey/util/DownloadUtil.java
@@ -0,0 +1,27 @@
+package com.example.survey.util;
+
+import java.io.BufferedOutputStream;
+import java.io.FileInputStream;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.UUID;
+
+import javax.servlet.http.HttpServletResponse;
+
+public class DownloadUtil {
+ public static void downloadFile(String path, HttpServletResponse response) throws IOException {
+ response.addHeader("Content-Disposition", "attachment;filename=" + UUID.randomUUID().toString() + ".docx");
+ FileInputStream inputStream = new FileInputStream(path);
+ int count =0;
+ byte[] by = new byte[1024];
+
+ OutputStream out = response.getOutputStream();
+ while((count=inputStream.read(by))!=-1){
+ out.write(by, 0, count);//将缓冲区的数据输出到浏览器
+ }
+ inputStream.close();
+ out.flush();
+ out.close();
+ }
+}
diff --git a/src/main/java/com/example/survey/util/ThreadWordUtil.java b/src/main/java/com/example/survey/util/ThreadWordUtil.java
new file mode 100644
index 0000000..36908ad
--- /dev/null
+++ b/src/main/java/com/example/survey/util/ThreadWordUtil.java
@@ -0,0 +1,60 @@
+package com.example.survey.util;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.example.survey.dao.RecordDao;
+import com.example.survey.entity.Record;
+import com.example.survey.enumeration.RecordStateEnum;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import lombok.Data;
+
+@Data
+@Component
+public class ThreadWordUtil implements Runnable {
+
+ private Record record;
+ private Thread t;
+ private String threadName;
+
+
+ @Value("${file.path}")
+ private String path;
+
+ @Autowired
+ private RecordDao recordDao;
+
+ @Override
+ public void run() {
+ if(record != null) {
+ String templatePath = this.path + record.getMetaData().getName() + ".docx";
+ String outputPath = this.path + record.getUuid() + ".docx";
+ try{
+ Map values = record.getValues();
+ values.put("submit", record.getOperationList().get(0).getUser().getUsername());
+ values.put("review", record.getOperationList().get(0).getUser().getUsername());
+
+ WordUtil wordUtil = new WordUtil(values, templatePath, outputPath);
+ wordUtil.export2word();
+ record.setState(RecordStateEnum.REVIEWED.getValue());
+ recordDao.saveRecord(record);
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+
+ public void start() {
+ if (t == null) {
+ t = new Thread(this, threadName);
+ t.start();
+ }
+ }
+
+}
diff --git a/src/main/java/com/example/survey/util/WordUtil.java b/src/main/java/com/example/survey/util/WordUtil.java
index 610cd5e..ae754a0 100644
--- a/src/main/java/com/example/survey/util/WordUtil.java
+++ b/src/main/java/com/example/survey/util/WordUtil.java
@@ -1,81 +1,232 @@
package com.example.survey.util;
-import com.deepoove.poi.XWPFTemplate;
-import com.deepoove.poi.config.Configure;
-import com.deepoove.poi.config.ConfigureBuilder;
-import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
-import com.example.survey.entity.MetaData;
-import com.example.survey.entity.Record;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.poi.ooxml.POIXMLDocument;
+import org.apache.poi.openxml4j.opc.OPCPackage;
+import org.apache.poi.xwpf.usermodel.Document;
+import org.apache.poi.xwpf.usermodel.XWPFParagraph;
+import org.apache.poi.xwpf.usermodel.XWPFRun;
+import org.apache.poi.xwpf.usermodel.XWPFTable;
+import org.apache.poi.xwpf.usermodel.XWPFTableCell;
+import org.apache.poi.xwpf.usermodel.XWPFTableRow;
+import org.apache.xmlbeans.XmlCursor;
+import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.reflect.Method;
import java.util.*;
+import java.util.Map.Entry;
/**
* @author Pope
*/
+// @Component
public class WordUtil {
- public static void export2word(HttpServletResponse response, Map values, String templatePath) {
- response.addHeader("Content-Disposition", "attachment;filename=" + UUID.randomUUID().toString() + ".docx");
+ private CustomXWPFDocument document;
+ private HashMap key2methods;
+ private Map values;
+ private String outputPath;
- ConfigureBuilder configureBuilder = Configure.builder();
- HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
- for (String key : values.keySet()) {
- Object value = values.get(key);
- if (value instanceof List) {
- List