diff --git a/pom.xml b/pom.xml
index 4a118e4..79330ba 100644
--- a/pom.xml
+++ b/pom.xml
@@ -32,6 +32,7 @@
1.2.4
1.2.75
4.0.11
+ 5.0.0
@@ -154,6 +155,12 @@
tencentcloud-sdk-java
${tencentcloud.version}
+
+
+ org.apache.poi
+ poi-ooxml
+ ${poi.version}
+
diff --git a/tduck-api/pom.xml b/tduck-api/pom.xml
index adb83f4..28959bb 100644
--- a/tduck-api/pom.xml
+++ b/tduck-api/pom.xml
@@ -60,6 +60,10 @@
com.alibaba
fastjson
+
+ org.apache.poi
+ poi-ooxml
+
diff --git a/tduck-api/src/main/java/com/tduck/cloud/api/annotation/Login.java b/tduck-api/src/main/java/com/tduck/cloud/api/annotation/Login.java
index c12f2fc..91864e2 100644
--- a/tduck-api/src/main/java/com/tduck/cloud/api/annotation/Login.java
+++ b/tduck-api/src/main/java/com/tduck/cloud/api/annotation/Login.java
@@ -3,9 +3,9 @@ package com.tduck.cloud.api.annotation;
import java.lang.annotation.*;
/**
- * app登录效验
+ * 登录验证 在需要登录才能调用的接口使用
*
- * @author Mark sunlightcs@gmail.com
+ * @author smalljop
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
diff --git a/tduck-api/src/main/java/com/tduck/cloud/api/web/controller/UserProjectResultController.java b/tduck-api/src/main/java/com/tduck/cloud/api/web/controller/UserProjectResultController.java
index a48caab..b647ca0 100644
--- a/tduck-api/src/main/java/com/tduck/cloud/api/web/controller/UserProjectResultController.java
+++ b/tduck-api/src/main/java/com/tduck/cloud/api/web/controller/UserProjectResultController.java
@@ -2,14 +2,18 @@ package com.tduck.cloud.api.web.controller;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
+import cn.hutool.core.io.IoUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
+import cn.hutool.poi.excel.ExcelUtil;
+import cn.hutool.poi.excel.ExcelWriter;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Sets;
import com.tduck.cloud.api.annotation.Login;
import com.tduck.cloud.api.annotation.NoRepeatSubmit;
@@ -31,6 +35,7 @@ import com.tduck.cloud.project.request.QueryProjectResultRequest;
import com.tduck.cloud.project.request.SortProjectItemRequest;
import com.tduck.cloud.project.service.*;
import com.tduck.cloud.project.util.SortUtils;
+import com.tduck.cloud.project.vo.ExportProjectResultVO;
import com.tduck.cloud.project.vo.OperateProjectItemVO;
import com.tduck.cloud.project.vo.UserProjectDetailVO;
import com.tduck.cloud.project.vo.UserProjectThemeVo;
@@ -46,8 +51,11 @@ import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket;
import org.springframework.web.bind.annotation.*;
+import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotBlank;
+import java.io.IOException;
import java.sql.Struct;
import java.util.List;
import java.util.Map;
@@ -97,6 +105,7 @@ public class UserProjectResultController {
*/
@PostMapping("/create")
@NoRepeatSubmit
+ @Login
public Result createProjectResult(@RequestBody UserProjectResultEntity entity, HttpServletRequest request) {
Result userProjectSettingStatus = userProjectSettingService.getUserProjectSettingStatus(entity.getProjectKey(), HttpUtils.getIpAddr(request));
if (StrUtil.isNotBlank(userProjectSettingStatus.getMsg())) {
@@ -112,6 +121,36 @@ public class UserProjectResultController {
return Result.success();
}
+ /**
+ * 填写结果excel导出
+ *
+ * @param request
+ * @return
+ */
+ @GetMapping("/export")
+ public void exportProjectResult(QueryProjectResultRequest request, HttpServletResponse response) throws IOException {
+ ExportProjectResultVO exportProjectResultVO = projectResultService.exportProjectResult(request);
+ // 通过工具类创建writer,默认创建xls格式
+ ExcelWriter writer = ExcelUtil.getWriter();
+ //自定义标题别名
+ exportProjectResultVO.getTitleList().forEach(item -> {
+ writer.addHeaderAlias(item.getFieldKey(), item.getTitle());
+ });
+ // 一次性写出内容,使用默认样式,强制输出标题
+ writer.write(exportProjectResultVO.getResultList(), true);
+ //out为OutputStream,需要写出到的目标流
+ //response为HttpServletResponse对象
+ response.setContentType("application/vnd.ms-excel;charset=utf-8");
+ //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
+ response.setHeader("Content-Disposition", "attachment;filename=test.xls");
+ ServletOutputStream out = response.getOutputStream();
+ writer.flush(out, true);
+ // 关闭writer,释放内存
+ writer.close();
+ //此处记得关闭输出Servlet流
+ IoUtil.close(out);
+ }
+
/**
* 结果分页
@@ -120,6 +159,7 @@ public class UserProjectResultController {
* @return
*/
@GetMapping("/page")
+ @Login
public Result queryProjectResults(QueryProjectResultRequest request) {
return Result.success(projectResultService.listByQueryConditions(request));
}
diff --git a/tduck-project/src/main/java/com/tduck/cloud/project/service/UserProjectResultService.java b/tduck-project/src/main/java/com/tduck/cloud/project/service/UserProjectResultService.java
index 9865a82..4e8292a 100644
--- a/tduck-project/src/main/java/com/tduck/cloud/project/service/UserProjectResultService.java
+++ b/tduck-project/src/main/java/com/tduck/cloud/project/service/UserProjectResultService.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tduck.cloud.project.entity.UserProjectResultEntity;
import com.tduck.cloud.project.request.QueryProjectResultRequest;
+import com.tduck.cloud.project.vo.ExportProjectResultVO;
/**
* 项目表单项(ProjectResult)表服务接口
@@ -28,4 +29,13 @@ public interface UserProjectResultService extends IService userProjectItemEntityList = userProjectItemService.listByProjectKey(projectKey);
+ // excel 标题列
+ List titleList = userProjectItemEntityList.stream()
+ .map(item -> new ExportProjectResultVO.ExcelHeader(item.getFormItemId(), item.getLabel()))
+ .collect(Collectors.toList());
+ //结果
+ List resultEntityList = this.list(Wrappers.lambdaQuery()
+ .eq(UserProjectResultEntity::getProjectKey, request.getProjectKey())
+ .le(ObjectUtil.isNotNull(request.getEndDateTime()), UserProjectResultEntity::getCreateTime, request.getEndDateTime())
+ .ge(ObjectUtil.isNotNull(request.getBeginDateTime()), UserProjectResultEntity::getCreateTime, request.getBeginDateTime())
+ .orderByDesc(BaseEntity::getCreateTime));
+ List