Browse Source

feat: 填写结果导出

dev
wangqing 5 years ago
parent
commit
01f0c9875a
  1. 7
      pom.xml
  2. 4
      tduck-api/pom.xml
  3. 4
      tduck-api/src/main/java/com/tduck/cloud/api/annotation/Login.java
  4. 40
      tduck-api/src/main/java/com/tduck/cloud/api/web/controller/UserProjectResultController.java
  5. 10
      tduck-project/src/main/java/com/tduck/cloud/project/service/UserProjectResultService.java
  6. 39
      tduck-project/src/main/java/com/tduck/cloud/project/service/impl/UserProjectResultEntityImpl.java
  7. 64
      tduck-project/src/main/java/com/tduck/cloud/project/vo/ExportProjectResultVO.java

7
pom.xml

@ -32,6 +32,7 @@
<captcha.version>1.2.4</captcha.version>
<fastjson.version>1.2.75</fastjson.version>
<tencentcloud.version>4.0.11</tencentcloud.version>
<poi.version>5.0.0</poi.version>
</properties>
<modules>
@ -154,6 +155,12 @@
<artifactId>tencentcloud-sdk-java</artifactId>
<version>${tencentcloud.version}</version><!-- 注:这里只是示例版本号,请获取并替换为 最新的版本号 -->
</dependency>
<!-- POI excel-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

4
tduck-api/pom.xml

@ -60,6 +60,10 @@
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</dependency>
</dependencies>
<build>

4
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)

40
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<UserProjectSettingEntity> 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));
}

10
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<UserProjectResultEnti
* @return
*/
Page listByQueryConditions(QueryProjectResultRequest request);
/**
* 导出excel
*
* @param request
* @return
*/
ExportProjectResultVO exportProjectResult(QueryProjectResultRequest request);
}

39
tduck-project/src/main/java/com/tduck/cloud/project/service/impl/UserProjectResultEntityImpl.java

@ -1,24 +1,32 @@
package com.tduck.cloud.project.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.tduck.cloud.common.constant.CommonConstants;
import com.tduck.cloud.common.entity.BaseEntity;
import com.tduck.cloud.common.util.AddressUtils;
import com.tduck.cloud.common.util.RedisUtils;
import com.tduck.cloud.project.entity.UserProjectItemEntity;
import com.tduck.cloud.project.entity.UserProjectResultEntity;
import com.tduck.cloud.project.entity.enums.ProjectItemTypeEnum;
import com.tduck.cloud.project.mapper.UserProjectResultMapper;
import com.tduck.cloud.project.request.QueryProjectResultRequest;
import com.tduck.cloud.project.service.UserProjectItemService;
import com.tduck.cloud.project.service.UserProjectResultService;
import com.tduck.cloud.project.vo.ExportProjectResultVO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
import static com.tduck.cloud.project.constant.ProjectRedisKeyConstants.PROJECT_RESULT_NUMBER;
@ -43,7 +51,6 @@ public class UserProjectResultEntityImpl extends ServiceImpl<UserProjectResultMa
Sets.newHashSet(ProjectItemTypeEnum.SELECT, ProjectItemTypeEnum.RADIO, ProjectItemTypeEnum.CHECKBOX, ProjectItemTypeEnum.CASCADER);
@Override
public void saveProjectResult(UserProjectResultEntity entity) {
String projectKey = entity.getProjectKey();
@ -61,4 +68,32 @@ public class UserProjectResultEntityImpl extends ServiceImpl<UserProjectResultMa
.ge(ObjectUtil.isNotNull(request.getBeginDateTime()), UserProjectResultEntity::getCreateTime, request.getBeginDateTime())
.orderByDesc(BaseEntity::getCreateTime));
}
@Override
public ExportProjectResultVO exportProjectResult(QueryProjectResultRequest request) {
//问题列表
String projectKey = request.getProjectKey();
List<UserProjectItemEntity> userProjectItemEntityList = userProjectItemService.listByProjectKey(projectKey);
// excel 标题列
List<ExportProjectResultVO.ExcelHeader> titleList = userProjectItemEntityList.stream()
.map(item -> new ExportProjectResultVO.ExcelHeader(item.getFormItemId(), item.getLabel()))
.collect(Collectors.toList());
//结果
List<UserProjectResultEntity> resultEntityList = this.list(Wrappers.<UserProjectResultEntity>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<Map<String, Object>> resultList = resultEntityList.stream().map(item -> {
Map<String, Object> processData = item.getProcessData();
processData.put(BaseEntity.Fields.createTime, item.getCreateTime());
processData.put(UserProjectResultEntity.Fields.submitAddress, item.getSubmitAddress());
return processData;
}).collect(Collectors.toList());
List<ExportProjectResultVO.ExcelHeader> allHeaderList = new ArrayList<ExportProjectResultVO.ExcelHeader>() {{
addAll(ExportProjectResultVO.DEFAULT_HEADER_NAME);
addAll(titleList);
}};
return new ExportProjectResultVO(allHeaderList, resultList);
}
}

64
tduck-project/src/main/java/com/tduck/cloud/project/vo/ExportProjectResultVO.java

@ -0,0 +1,64 @@
package com.tduck.cloud.project.vo;
import com.google.common.collect.Lists;
import com.tduck.cloud.common.entity.BaseEntity;
import com.tduck.cloud.project.entity.UserProjectResultEntity;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
* @author : wangqing
* @description : 导出excel result
* @create : 2021/03/18 16:18
**/
@Data
@AllArgsConstructor
public class ExportProjectResultVO {
/**
* 字段默认前缀
*/
public final static String FIELD_DEFAULT_PREFIX = "field";
/**
* 默认字段
*/
public final static List<ExcelHeader> DEFAULT_HEADER_NAME = Lists.newArrayList(
new ExcelHeader(BaseEntity.Fields.createTime, "提交时间"),
new ExcelHeader(UserProjectResultEntity.Fields.submitAddress, "提交地址"));
/**
* 标题
*/
private List<ExcelHeader> titleList;
/**
* 结果列表
*/
private List<Map<String, Object>> resultList;
/**
* excel表头标题
*/
@Data
public static class ExcelHeader {
private String fieldKey;
private String title;
public ExcelHeader(String fieldKey, String title) {
this.fieldKey = FIELD_DEFAULT_PREFIX + fieldKey;
this.title = title;
}
}
}
Loading…
Cancel
Save