This commit is contained in:
2025-04-25 17:46:06 +08:00
parent c2b817dbe5
commit e37753ade7
8 changed files with 347 additions and 1 deletions
@@ -1,5 +1,9 @@
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.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import com.budwk.app.base.page.Pagination;
@@ -9,9 +13,11 @@ import com.budwk.app.client.module.activity.vo.ClientActivitySignVO;
import com.budwk.app.module.activity.models.ActUser;
import com.budwk.app.module.activity.models.Activity;
import com.budwk.app.module.activity.service.ActUserService;
import com.budwk.app.module.activity.vo.page.ActSignInUserPageForm;
import com.budwk.app.module.activity.vo.page.ActUserPageForm;
import com.budwk.app.web.commons.slog.annotation.SLog;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
@@ -22,10 +28,14 @@ import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
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.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -190,4 +200,35 @@ public class ActUserController {
Pagination pagination = actUserService.listPageMap(1, 10, sql);
return Result.success(pagination);
}
@At
@Ok("void")
@SaCheckPermission("activity.user")
public void doExport(ActUserPageForm pageForm, HttpServletResponse response) {
try {
Activity activity = actUserService.dao().fetch(Activity.class, Cnd.NEW().and("id", "=", pageForm.getActivityId()));
Sql sql = actUserService.getSignUpSql(pageForm);
List<NutMap> nutMaps = actUserService.listMap(sql);
List<ExcelExportEntity> entityList = new ArrayList<>() {{
add(new ExcelExportEntity("报名号", "actUserNo", 20));
add(new ExcelExportEntity("姓名", "userName", 20));
add(new ExcelExportEntity("性别", "sex", 20));
add(new ExcelExportEntity("身份证号码", "idCard", 20));
add(new ExcelExportEntity("联系方式", "mobile", 20));
add(new ExcelExportEntity("职务", "position", 20));
add(new ExcelExportEntity("所属单位", "unitName", 20));
add(new ExcelExportEntity("报名时间", "signUpTime2", 20));
}};
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + new String((activity.getTitle() + "报名数据表.xlsx").getBytes(StandardCharsets.UTF_8), "ISO8859-1"));
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, nutMaps);
workbook.write(response.getOutputStream());
}catch (Exception e){
e.printStackTrace();
}
}
}
@@ -0,0 +1,133 @@
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.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.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.module.activity.models.Activity;
import com.budwk.app.module.activity.service.ActivitySignInQueryService;
import com.budwk.app.module.activity.vo.page.ActSignInUserPageForm;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
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.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
@IocBean
@At("/platform/activity/signInUserQuery")
@Slf4j
@Ok("json:full")
public class ActivitySignInQueryController {
@Inject
private ActivitySignInQueryService activitySignInQueryService;
@At("")
@SaCheckPermission("activity.signInUserQuery")
@Ok("beetl:/platform/activity/signInUserQuery/index.html")
public void index() {
}
@At()
@SaCheckPermission("activity.signInUserQuery")
public Result getActivityOptions(Integer year) {
return Result.success(activitySignInQueryService.dao().query(Activity.class, Cnd.NEW().andEX("YEAR(startTime)", "=", year)));
}
@At()
@SaCheckPermission("activity.signInUserQuery")
public Result pageData(ActSignInUserPageForm pageForm) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
au.*,
a.title
FROM
`act_user` au
LEFT JOIN activity a ON a.id = au.activityId
$condition
""");
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.or("au.userName", "LIKE", "%" + pageForm.getSearchKeyword() + "%");
group.or("au.unitName", "LIKE", "%" + pageForm.getSearchKeyword() + "%");
cnd.and(group);
}
cnd.and("au.activityId", "=", pageForm.getActivityId());
cnd.and("au.isSignIn", "=", 1);
cnd.asc("au.actUserNo");
sql.setCondition(cnd);
Pagination pagination = activitySignInQueryService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@Ok("void")
@SaCheckPermission("activity.signInUserQuery")
public void doExport(ActSignInUserPageForm pageForm, HttpServletResponse response) {
try {
Activity activity = activitySignInQueryService.dao().fetch(Activity.class, Cnd.NEW().and("id", "=", pageForm.getActivityId()));
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
au.*,
DATE_FORMAT(signInTime, '%Y-%m-%d %H:%i:%s') signInTime
FROM
`act_user` au
$condition
""");
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.or("au.userName", "LIKE", "%" + pageForm.getSearchKeyword() + "%");
group.or("au.unitName", "LIKE", "%" + pageForm.getSearchKeyword() + "%");
cnd.and(group);
}
cnd.and("au.activityId", "=", pageForm.getActivityId());
cnd.and("au.isSignIn", "=", 1);
cnd.asc("au.actUserNo");
sql.setCondition(cnd);
List<NutMap> nutMaps = activitySignInQueryService.listMap(sql);
List<ExcelExportEntity> entityList = new ArrayList<>() {{
add(new ExcelExportEntity("报名号", "actUserNo", 20));
add(new ExcelExportEntity("姓名", "userName", 20));
add(new ExcelExportEntity("性别", "sex", 20));
add(new ExcelExportEntity("职务", "position", 20));
add(new ExcelExportEntity("身份证号码", "idCard", 20));
add(new ExcelExportEntity("联系方式", "mobile", 20));
add(new ExcelExportEntity("参加单位名称", "unitName", 20));
add(new ExcelExportEntity("签到时间", "signUpTime2", 20));
}};
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + new String((activity.getTitle() + "签到数据表.xlsx").getBytes(StandardCharsets.UTF_8), "ISO8859-1"));
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, nutMaps);
workbook.write(response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,9 @@
package com.budwk.app.module.activity.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.module.activity.models.ActUser;
public interface ActivitySignInQueryService extends BaseService<ActUser> {
}
@@ -37,6 +37,7 @@ public class ActUserServiceImpl extends BaseServiceImpl<ActUser> implements ActU
Sql sql = Sqls.create("""
SELECT
u.*,
DATE_FORMAT(signUpTime, '%Y-%m-%d %H:%i:%s') signUpTime2,
act.`title` AS activityName
FROM
act_user u
@@ -0,0 +1,18 @@
package com.budwk.app.module.activity.service.impl;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.module.activity.models.ActUser;
import com.budwk.app.module.activity.models.Activity;
import com.budwk.app.module.activity.service.ActivityManageService;
import com.budwk.app.module.activity.service.ActivitySignInQueryService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.IocBean;
@IocBean(args = {"refer:dao"})
public class ActivitySignInQueryServiceImpl extends BaseServiceImpl<ActUser> implements ActivitySignInQueryService {
public ActivitySignInQueryServiceImpl(Dao dao) {
super(dao);
}
}
@@ -0,0 +1,25 @@
package com.budwk.app.module.activity.vo.page;
import com.budwk.app.base.page.PageForm;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author zhf
* @date 2025/4/25 09:56
* @description
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ActSignInUserPageForm extends PageForm {
// 活动ID
private Long activityId;
// 联系方式
private String phone;
// 所属单位
private String unitName;
}
@@ -0,0 +1,115 @@
<!--#
layout("/layouts/platform_1.html"){
#-->
<div id="app">
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度</div>
<div class="search-item-option">
<el-date-picker
:clearable="false"
placeholder="选择年"
style="width: 100%"
@change="getActivityOptions"
type="year"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属活动</div>
<div class="search-item-option">
<el-select v-model="pageForm.activityId" placeholder="请选择活动">
<el-option
v-for="item in activityOptions"
:key="item.id"
:label="item.title"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">姓名/单位</div>
<div class="search-item-option">
<el-input v-model="pageForm.searchKeyword" clearable placeholder="请输入姓名/单位"></el-input>
</div>
</div>
<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 icon="el-icon-plus" type="primary" size="small" @click="doExport">导出</el-button>
</el-row>
<el-table v-loading="tableLoading" show-overflow-tooltip :data="tableData">
<el-table-column label="序号" prop="index" header-align="center" align="center" width="50">
<template slot-scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column label="报名号" prop="actUserNo"></el-table-column>
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="性别" prop="sex"></el-table-column>
<el-table-column label="职务" prop="position"></el-table-column>
<el-table-column label="身份证号码" prop="idCard"></el-table-column>
<el-table-column label="联系方式" prop="mobile"></el-table-column>
<el-table-column label="参加单位名称" prop="unitName"></el-table-column>
<el-table-column label="签到时间" prop="signInTime"></el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</div>
<script>
new Vue({
el: "#app",
mixins: [initTableMixins],
components: {},
data() {
return {
pageForm: {
year: new Date().getFullYear() + ""
},
activityOptions: []
}
},
methods: {
doExport() {
window.open("/platform/activity/signInUserQuery/doExport?activityId=" + this.pageForm.activityId + "&searchKeyword=" + this.pageForm.searchKeyword)
},
getActivityOptions() {
$.post("/platform/activity/signInUserQuery/getActivityOptions", {year: this.pageForm.year}).then(res => {
if (res.code === 0) {
if (res.data && res.data.length > 0) {
this.$set(this.pageForm, "activityId", res.data[0].id)
} else {
this.$set(this.pageForm, "activityId", "")
}
this.activityOptions = res.data;
this.doSearch()
} else {
this.$message.error(res.msg);
}
})
},
},
created() {
this.getActivityOptions()
}
})
</script>
<!--#
}
#-->
@@ -46,8 +46,9 @@ layout("/layouts/platform_1.html"){
</el-card>
<el-card shadow="never" class="mt-3">
<el-row type="flex" class="mb-3">
<el-row type="flex" style="justify-content: flex-end" class="mb-3">
<el-button icon="el-icon-plus" type="primary" size="small" @click="openAddUser">添加报名人员</el-button>
<el-button icon="el-icon-plus" type="primary" size="small" @click="doExport">导出</el-button>
</el-row>
<el-table v-loading="tableLoading" show-overflow-tooltip :data="tableData">
<el-table-column label="序号" type="index" header-align="center" align="center"
@@ -267,6 +268,9 @@ layout("/layouts/platform_1.html"){
}
},
methods: {
doExport() {
window.open("/platform/activity/user/doExport?activityId=" + this.pageForm.activityId + "&searchKeyword=" + this.pageForm.searchKeyword)
},
openAddUser(){
if (!this.pageForm.activityId) {
this.$message.warning('请先选择活动')