This commit is contained in:
2025-05-13 21:01:11 +08:00
parent 80e9bb6521
commit adc530b2f1
3 changed files with 104 additions and 19 deletions
@@ -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<NutMap> listMap = activityService.listMap(sql);
List<ActivityItem> 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<ActItemGroupScore> 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<String, Object> map = new HashMap<String, Object>();
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();
}
}
}
Binary file not shown.
@@ -35,10 +35,12 @@ layout("/layouts/platform_1.html"){
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt-3">
<el-row type="flex" class="mb-3" style="justify-content: flex-end">
<el-button type="primary" size="small" @click="doExport">导出</el-button>
</el-row>
<el-table v-loading="tableLoading" show-overflow-tooltip :data="tableData" @cell-click="cellClick">
<el-table-column label="队伍" prop="groupName" fixed="left" width="100px"></el-table-column>
@@ -49,19 +51,20 @@ layout("/layouts/platform_1.html"){
</template>
<el-table-column label="成绩" :prop="item.id+item.name" min-width="50px">
<template slot-scope="scope">
<el-input v-model="scope.row[item.id]['totalScore']"></el-input>
{{scope.row[item.id]['totalScore']}}
</template>
</el-table-column>
<el-table-column label="名次" :prop="item.id+item.name" min-width="50px">
<el-table-column label="名次" :prop="item.id+item.name" min-width="50px" v-if="item.id!=='all'">
<template slot-scope="scope">
<el-input v-model="scope.row[item.id]['totalRank']"></el-input>
{{scope.row[item.id]['totalRank']}}
</template>
</el-table-column>
</el-table-column>
</el-table>
<el-row type="flex" justify="end" class="mt-3">
<el-button type="primary" @click="saveScore">保存</el-button>
</el-row>
<!-- <el-row type="flex" justify="end" class="mt-3">
<el-button type="primary" @click="saveScore">保存</el-button>
</el-row>-->
</el-card>
</div>
@@ -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)