diff --git a/backend/src/main/java/com/budwk/app/module/activity/controller/ActScoreEnterController.java b/backend/src/main/java/com/budwk/app/module/activity/controller/ActScoreEnterController.java index 0e68f3c..838ad36 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/controller/ActScoreEnterController.java +++ b/backend/src/main/java/com/budwk/app/module/activity/controller/ActScoreEnterController.java @@ -1,5 +1,10 @@ package com.budwk.app.module.activity.controller; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.result.Result; @@ -10,6 +15,9 @@ import com.budwk.app.module.activity.vo.page.ActScoreEnterPageForm; import com.budwk.app.module.activity.vo.page.ActSignInUserPageForm; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; @@ -23,10 +31,11 @@ import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -139,4 +148,61 @@ public class ActScoreEnterController { } + @At + @Ok("void") + @SaCheckPermission("activity.scoreEnter") + public void doExport(Long activityId, HttpServletResponse response) { + try { + Activity activity = activityService.fetch(activityId); + + Sql sql = Sqls.create(""" + SELECT + groupName, + id + FROM + `act_group` + WHERE + activityId = @activityId + """).setParam("activityId", activityId); + List listMap = activityService.listMap(sql); + List itemList = activityService.dao().query(ActivityItem.class, Cnd.where(ActivityItem::getActivityId, "=", activityId).asc(ActivityItem::getSort)); + ActivityItem activityItem = new ActivityItem(); + activityItem.setName("总分"); + activityItem.setId(0L); + itemList.add(activityItem); + List scoreList = dao.query(ActItemGroupScore.class, Cnd.where(ActItemGroupScore::getActivityId, "=", activityId)); + + listMap.stream().forEach(group -> { + itemList.forEach(item -> { + if (item.getId() == 0) { + BigDecimal totalScore = scoreList.stream().filter(score -> score.getGroupId().equals(group.getLong("id")) && score.getScore() != null).map(ActItemGroupScore::getScore).reduce(BigDecimal::add).orElse(new BigDecimal(0)); + group.put("totalScore", totalScore); + } else { + ActItemGroupScore itemGroupScore = scoreList.stream().filter(score -> + score.getGroupId().equals(group.getLong("id")) + && score.getItemId().equals(item.getId())).findFirst().orElse(null); + group.put(item.getName() + "score", itemGroupScore.getScore()); + group.put(item.getName() + "ranking", itemGroupScore.getRanking()); + } + }); + }); + Map map = new HashMap(); + map.put("mapList", listMap); + map.put("title", activity.getTitle()); + map.put("itemList", itemList); + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment;filename=" + new String((activity.getTitle() + "评分表.xlsx").getBytes(StandardCharsets.UTF_8), "ISO8859-1")); + TemplateExportParams params = new TemplateExportParams("templates/scoreEnter.xlsx"); + params.setColForEach(true); + Workbook workbook = ExcelExportUtil.exportExcel(params, map); + workbook.write(response.getOutputStream()); + workbook.close(); + } catch (Exception e) { + e.printStackTrace(); + } + + + } + + } diff --git a/backend/src/main/resources/templates/scoreEnter.xlsx b/backend/src/main/resources/templates/scoreEnter.xlsx new file mode 100644 index 0000000..7d16646 Binary files /dev/null and b/backend/src/main/resources/templates/scoreEnter.xlsx differ diff --git a/backend/src/main/resources/views/platform/activity/scoreEnter/index.html b/backend/src/main/resources/views/platform/activity/scoreEnter/index.html index 35fe63a..d6042fe 100644 --- a/backend/src/main/resources/views/platform/activity/scoreEnter/index.html +++ b/backend/src/main/resources/views/platform/activity/scoreEnter/index.html @@ -35,10 +35,12 @@ layout("/layouts/platform_1.html"){
搜索
- + + 导出 + @@ -49,19 +51,20 @@ layout("/layouts/platform_1.html"){ - + + - - 保存 - + @@ -86,6 +89,9 @@ layout("/layouts/platform_1.html"){ } }, methods: { + doExport() { + window.open("/platform/activity/scoreEnter/doExport?activityId=" + this.pageForm.activityId ) + }, // 格式化名称 formatName(name) { if (!name) return "" @@ -127,6 +133,7 @@ layout("/layouts/platform_1.html"){ } = await $.get("/platform/activity/scoreEnter/list-item/" + this.pageForm.activityId) if (code === 0) { this.itemOptions = data + this.itemOptions.push({id: "all", "name": "总积分"}) } else { this.$message.error(msg) } @@ -160,20 +167,32 @@ layout("/layouts/platform_1.html"){ groupName: group.groupName } this.itemOptions.forEach((item) => { - let data = this.itemScoreList.find(s => s.groupId === group.id && s.itemId === item.id); - if (data) { + if (item.id === "all") { + let data = this.itemScoreList.filter(s => s.groupId === group.id); + const sum = data.map(d => d.score).reduce((total, value) => { + return total + (value || 0); + }, 0); row[item.id] = { id: data.id, - totalScore: data.score ? data.score : null, - totalRank: data.ranking ? data.ranking : null + totalScore: sum, } } else { - row[item.id] = { - totalScore: null, - totalRank: null + let data = this.itemScoreList.find(s => s.groupId === group.id && s.itemId === item.id); + if (data) { + row[item.id] = { + id: data.id, + totalScore: data.score ? data.score : null, + totalRank: data.ranking ? data.ranking : null + } + } else { + row[item.id] = { + totalScore: null, + totalRank: null + } } } + }) return row }) @@ -187,12 +206,12 @@ layout("/layouts/platform_1.html"){ activityId: this.pageForm.activityId, data: JSON.stringify(this.tableData) } - const {code,data,msg} = await $.post("/platform/activity/scoreEnter/save-score", formData) + const {code, data, msg} = await $.post("/platform/activity/scoreEnter/save-score", formData) if (code === 0) { await this.listItemScore() this.buildTableData() this.$message.success("保存成功") - }else{ + } else { this.$message.error(msg) } console.log(this.tableData)