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> resultList = resultEntityList.stream().map(item -> { + Map processData = item.getProcessData(); + processData.put(BaseEntity.Fields.createTime, item.getCreateTime()); + processData.put(UserProjectResultEntity.Fields.submitAddress, item.getSubmitAddress()); + return processData; + }).collect(Collectors.toList()); + List allHeaderList = new ArrayList() {{ + addAll(ExportProjectResultVO.DEFAULT_HEADER_NAME); + addAll(titleList); + }}; + return new ExportProjectResultVO(allHeaderList, resultList); + } } \ No newline at end of file diff --git a/tduck-project/src/main/java/com/tduck/cloud/project/vo/ExportProjectResultVO.java b/tduck-project/src/main/java/com/tduck/cloud/project/vo/ExportProjectResultVO.java new file mode 100644 index 0000000..1c13ce0 --- /dev/null +++ b/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 DEFAULT_HEADER_NAME = Lists.newArrayList( + new ExcelHeader(BaseEntity.Fields.createTime, "提交时间"), + new ExcelHeader(UserProjectResultEntity.Fields.submitAddress, "提交地址")); + + /** + * 标题 + */ + private List titleList; + + + /** + * 结果列表 + */ + private List> 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; + } + } + + +}