This commit is contained in:
@jyuhsin
2025-08-20 08:42:54 +08:00
parent 0b07ce45d0
commit b34a1945fc
76 changed files with 6696 additions and 156 deletions
@@ -154,6 +154,7 @@ public class FamilyActivityStatisticsController {
Sql sql = Sqls.create("""
SELECT
ts.*,
CONCAT(DATE_FORMAT(ac.courseStartTime, '%H:%i:%s'),'至',DATE_FORMAT(ac.courseEndTime, '%H:%i:%s')) AS courseTime,
u.username,
u.loginname,
u.sex,
@@ -162,6 +163,7 @@ public class FamilyActivityStatisticsController {
tsc.courseName
FROM
family_user ts
left join family_activity_course ac on ts.activityCourseId = ac.id
left join `vw_user` u on u.id = ts. userId
left join family_course tsc on tsc.id = ts.courseId
WHERE
@@ -183,7 +185,8 @@ public class FamilyActivityStatisticsController {
Map.of("name", "单位", "key", "unitName"),
Map.of("name", "分工会", "key", "unionName"),
Map.of("name", "性别", "key", "sex"),
Map.of("name", "手机号", "key", "newMobile")
Map.of("name", "手机号", "key", "newMobile"),
Map.of("name", "报名时段", "key", "courseTime")
);
List<ExcelExportEntity> excelCommonExportEntity = basicEntity.stream().map(entity -> {
@@ -71,6 +71,11 @@ public class FamilyUser implements Serializable {
@Comment("报名时间")
private Date signUpTime;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("活动课程时段id")
private String activityCourseId;
@Column
@ColDefine(type = ColType.MYSQL_JSON)
@Comment("手机端报名字段和值")
@@ -13,6 +13,8 @@ import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.family.models.*;
import com.budwk.app.zhgh.activity.family.service.FamilyActivityService;
import com.budwk.app.zhgh.activity.family.service.FamilyActivityStatisticsService;
import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpActivityCourse;
import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpUserCourse;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.async.Async;
import org.nutz.aop.interceptor.ioc.TransAop;
@@ -273,7 +275,22 @@ public class FamilyActivityServiceImpl extends BaseServiceImpl<FamilyActivity> i
familyUser.setSignUpTime(new Date());
dao().insert(familyUser);
asyncInsertUserCourse(familyUser.getActivityId(), familyUser.getCourseId(), userId);
if (StrUtil.isNotBlank(familyUser.getActivityCourseId())) {
TrainSignUpActivityCourse fetch = dao().fetch(TrainSignUpActivityCourse.class, familyUser.getActivityCourseId());
TrainSignUpUserCourse userCourse = new TrainSignUpUserCourse();
userCourse.setActivityId(familyUser.getActivityId());
userCourse.setCourseId(familyUser.getCourseId());
userCourse.setUserId(familyUser.getUserId());
userCourse.setCourseStartTime(fetch.getCourseStartTime());
userCourse.setCourseEndTime(fetch.getCourseEndTime());
userCourse.setAttend(false);
userCourse.setAttendTime(null);
userCourse.setActivityCourseId(fetch.getId());
dao().insert(userCourse);
} else {
asyncInsertUserCourse(familyUser.getActivityId(), familyUser.getCourseId(), userId);
}
}
@Async
@@ -143,7 +143,7 @@ public class FamilyActivityStatisticsServiceImpl extends BaseServiceImpl<FamilyU
u.unitname,
u.unionname,
u.sex,
u.mobile,
ifnull(tsuu.mobile, u.mobile) as mobile,
tsuu.signUpTime,
tsuu.state
FROM
@@ -35,7 +35,7 @@ public class FamilyUserServiceImpl extends BaseServiceImpl<FamilyBlackList> impl
u.id AS userId,
u.username,
u.loginname,
u.mobile,
ifnull(tsuu.mobile, u.mobile) as mobile,
u.unitname,
u.unionname,
tsuc.courseName,
@@ -1,12 +1,17 @@
package com.budwk.app.zhgh.activity.planSummary.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_file;
import com.budwk.app.sys.models.Sys_union;
import com.budwk.app.sys.utils.SysFileMinIoUtil;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.basic.models.ActivityBasicSettings;
@@ -21,13 +26,23 @@ import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* @ClassName YearPlanController
@@ -139,4 +154,66 @@ public class YearPlanController {
List<SysClub> list = dao.query(SysClub.class, cnd);
return Result.success(list);
}
@At
@Ok("void")
@SaCheckPermission("planSummary.yearPlan.manage")
public void downloadFiles(PageForm pageForm,
@Param(value = "year") Integer year,
@Param(value = "tissueIdByUnion") String tissueIdByUnion,
@Param(value = "tissueIdByClub") String tissueIdByClub,
@Param(value = "planName") String planName,
HttpServletResponse response) throws IOException {
Cnd cnd = Cnd.NEW();
cnd.andEX("YEAR(yp.planTime)", "=", year);
cnd.andEX("yp.tissueId", "=", tissueIdByUnion);
cnd.andEX("yp.tissueId", "=", tissueIdByClub);
cnd.and(Cnd.likeEX("yp.planName", planName));
List<NutMap> listMap = yearPlanService.queryData(cnd);
List<String> urlList = new ArrayList<>();
for (NutMap map : listMap) {
if(StrUtil.isNotBlank(map.getString("files"))) {
List<JSONObject> files = Json.fromJsonAsList(JSONObject.class, map.getString("files"));
ArrayList<String> list = files.stream().map(o -> o.getStr("url")).collect(Collectors.toCollection(ArrayList::new));
urlList.addAll(list);
}
}
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment;filename=" + URLUtil.encode("文件汇总.zip"));
try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) {
for (String url : urlList) {
String fileId = extractFileId(url);
if(StrUtil.isNotBlank(fileId)) {
Sys_file file = dao.fetch(Sys_file.class, fileId);
byte[] bytes = SysFileMinIoUtil.getFileBytes(file.getBucket(), file.getStoragePath());
if(bytes == null || bytes.length == 0){
continue;
}
String entryName = file.getName();
zos.putNextEntry(new ZipEntry(entryName));
zos.write(bytes);
zos.closeEntry();
}
}
} catch (Exception e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "生成ZIP文件失败");
e.printStackTrace();
}
}
public static String extractFileId(String url) {
if (url == null) return null;
Pattern pattern = Pattern.compile("[?&]id=([^&]*)");
Matcher matcher = pattern.matcher(url);
if (matcher.find()) {
return matcher.group(1);
}
return null;
}
}
@@ -2,13 +2,18 @@ package com.budwk.app.zhgh.activity.planSummary.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_dict;
import com.budwk.app.sys.models.Sys_file;
import com.budwk.app.sys.models.Sys_union;
import com.budwk.app.sys.utils.SysFileMinIoUtil;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
@@ -26,13 +31,22 @@ import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* @ClassName YearSummaryController
@@ -119,4 +133,68 @@ public class YearSummaryController {
yearSummaryService.delete(id);
return Result.success();
}
@At
@Ok("void")
@SaCheckPermission("planSummary.yearPlan.manage")
public void downloadFiles(PageForm pageForm,
@Param(value = "year") Integer year,
@Param(value = "tissueIdByUnion") String tissueIdByUnion,
@Param(value = "tissueIdByClub") String tissueIdByClub,
@Param(value = "summaryType") String summaryType,
@Param(value = "summaryFrom") String summaryFrom,
HttpServletResponse response) throws IOException {
Cnd cnd = Cnd.NEW();
cnd.andEX("YEAR(ys.cTime)", "=", year);
cnd.andEX("ys.tissueId", "=", tissueIdByUnion);
cnd.andEX("ys.tissueId", "=", tissueIdByClub);
cnd.andEX("ys.summaryType", "=", summaryType);
cnd.andEX("ys.summaryFrom", "=", summaryFrom);
List<NutMap> listMap = yearSummaryService.queryData(cnd);
List<String> urlList = new ArrayList<>();
for (NutMap map : listMap) {
if(StrUtil.isNotBlank(map.getString("files"))) {
List<JSONObject> files = Json.fromJsonAsList(JSONObject.class, map.getString("files"));
ArrayList<String> list = files.stream().map(o -> o.getStr("url")).collect(Collectors.toCollection(ArrayList::new));
urlList.addAll(list);
}
}
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment;filename=" + URLUtil.encode("文件汇总.zip"));
try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) {
for (String url : urlList) {
String fileId = extractFileId(url);
if(StrUtil.isNotBlank(fileId)) {
Sys_file file = dao.fetch(Sys_file.class, fileId);
byte[] bytes = SysFileMinIoUtil.getFileBytes(file.getBucket(), file.getStoragePath());
if(bytes == null || bytes.length == 0){
continue;
}
String entryName = file.getName();
zos.putNextEntry(new ZipEntry(entryName));
zos.write(bytes);
zos.closeEntry();
}
}
} catch (Exception e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "生成ZIP文件失败");
e.printStackTrace();
}
}
public static String extractFileId(String url) {
if (url == null) return null;
Pattern pattern = Pattern.compile("[?&]id=([^&]*)");
Matcher matcher = pattern.matcher(url);
if (matcher.find()) {
return matcher.group(1);
}
return null;
}
}
@@ -1,5 +1,6 @@
package com.budwk.app.zhgh.activity.planSummary.model;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -7,6 +8,8 @@ import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.List;
/**
* @ClassName Plan
* @Author JyuHsin
@@ -66,4 +69,9 @@ public class YearPlan extends BaseModel {
@Comment("活动类型")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String activityType;
@Column
@Comment("附件")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> files;
}
@@ -5,6 +5,9 @@ import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.planSummary.model.YearPlan;
import org.nutz.dao.Cnd;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* @ClassName YearPlanService
@@ -16,4 +19,6 @@ import org.nutz.dao.Cnd;
public interface YearPlanService extends BaseService<YearPlan> {
Pagination pageData(PageForm pageForm, Cnd cnd);
List<NutMap> queryData(Cnd cnd);
}
@@ -5,6 +5,9 @@ import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.planSummary.model.YearSummary;
import org.nutz.dao.Cnd;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* @ClassName YearSummaryService
@@ -16,4 +19,6 @@ import org.nutz.dao.Cnd;
public interface YearSummaryService extends BaseService<YearSummary> {
Pagination pageData(PageForm pageForm, Cnd cnd);
List<NutMap> queryData(Cnd cnd);
}
@@ -20,6 +20,7 @@ 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.Strings;
import org.nutz.lang.util.NutMap;
import java.util.List;
@@ -43,6 +44,17 @@ public class YearPlanServiceImpl extends BaseServiceImpl<YearPlan> implements Ye
@Override
public Pagination pageData(PageForm pageForm, Cnd cnd) {
Sql sql = buildSql(cnd);
return this.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
@Override
public List<NutMap> queryData(Cnd cnd) {
Sql sql = buildSql(cnd);
return this.listMap(sql);
}
private Sql buildSql(Cnd cnd) {
Sql sql = Sqls.create("""
SELECT
yp.*,
@@ -68,6 +80,6 @@ public class YearPlanServiceImpl extends BaseServiceImpl<YearPlan> implements Ye
}
cnd.desc("yp.planTime");
sql.setCondition(cnd);
return this.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return sql;
}
}
@@ -19,6 +19,7 @@ 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 java.util.List;
@@ -42,6 +43,17 @@ public class YearSummaryServiceImpl extends BaseServiceImpl<YearSummary> impleme
@Override
public Pagination pageData(PageForm pageForm, Cnd cnd) {
Sql sql = buildSql(cnd);
return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
@Override
public List<NutMap> queryData(Cnd cnd) {
Sql sql = buildSql(cnd);
return this.listMap(sql);
}
private Sql buildSql(Cnd cnd) {
Sql sql = Sqls.create("""
SELECT
ys.*,
@@ -66,6 +78,6 @@ public class YearSummaryServiceImpl extends BaseServiceImpl<YearSummary> impleme
}
cnd.desc("ys.cTime");
sql.setCondition(cnd);
return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return sql;
}
}
@@ -15,6 +15,7 @@ import com.budwk.app.zhgh.activity.family.models.FamilyCourse;
import com.budwk.app.zhgh.activity.family.models.FamilyUser;
import com.budwk.app.zhgh.activity.trainSignUp.models.*;
import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpActivityService;
import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpActivityStatisticsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Chain;
@@ -53,6 +54,8 @@ public class MTrainSignUpActivityController {
private TrainSignUpActivityService trainSignUpActivityService;
@Inject
private RedisService redisService;
@Inject
private TrainSignUpActivityStatisticsService statisticsService;
@At("/trainList")
@Ok("beetl:/platform/zhghh5/activity/trainSignUp/trainList/index.html")
@@ -152,16 +152,16 @@ public class TrainSignUpActivityStatisticsController {
Sql sql = Sqls.create("""
SELECT
ts.*,
CONCAT(DATE_FORMAT(ac.courseStartTime, '%H:%i:%s'),'至',DATE_FORMAT(ac.courseEndTime, '%H:%i:%s')) AS courseTime,
u.username,
u.loginname,
u.unitname,
u.unionname,
u.sex,
u.mobile,
ifnull(ts.mobile, u.mobile) as mobile,
u.birthday,
tsc.courseName
FROM
train_sign_up_user ts
train_sign_up_user ts
left join train_sign_up_activity_course ac on ts.activityCourseId = ac.id
left join `vw_user` u on u.id = ts. userId
left join train_sign_up_course tsc on tsc.id = ts.courseId
WHERE
@@ -180,11 +180,12 @@ public class TrainSignUpActivityStatisticsController {
List<ExcelExportEntity> excelCommonExportEntity = new ArrayList<>();
excelCommonExportEntity.add(new ExcelExportEntity("姓名", "username", 20));
excelCommonExportEntity.add(new ExcelExportEntity("工号", "loginname", 20));
excelCommonExportEntity.add(new ExcelExportEntity("单位", "unitname", 20));
excelCommonExportEntity.add(new ExcelExportEntity("分工会", "unionname", 20));
excelCommonExportEntity.add(new ExcelExportEntity("单位", "unitName", 20));
excelCommonExportEntity.add(new ExcelExportEntity("分工会", "unionName", 20));
excelCommonExportEntity.add(new ExcelExportEntity("性别", "sex", 20));
excelCommonExportEntity.add(new ExcelExportEntity("手机号", "mobile", 20));
excelCommonExportEntity.add(new ExcelExportEntity("生日", "birthday", 20));
excelCommonExportEntity.add(new ExcelExportEntity("报名时段", "courseTime", 20));
for (TrainSignUpCourse c : courseList) {
String k = c.getCourseName();
@@ -132,6 +132,5 @@ public class TrainSignUpActivity extends BaseModel implements Serializable, SysH
sysHomeActivity.setEnable(!this.isDisabled());
sysHomeActivity.setClassPath(this.getClass().getPackageName() + this.getClass().getName());
return sysHomeActivity;
}
}
@@ -70,6 +70,11 @@ public class TrainSignUpUser implements Serializable {
@Comment("报名时间")
private Date signUpTime;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("活动课程时段id")
private String activityCourseId;
@Column
@ColDefine(type = ColType.MYSQL_JSON)
@Comment("手机端报名字段和值")
@@ -278,7 +278,22 @@ public class TrainSignUpActivityServiceImpl extends BaseServiceImpl<TrainSignUpA
trainSignUpUser.setSignUpTime(new Date());
dao().insert(trainSignUpUser);
asyncInsertUserCourse(trainSignUpUser.getActivityId(), trainSignUpUser.getCourseId(), userId);
if (StrUtil.isNotBlank(trainSignUpUser.getActivityCourseId())) {
TrainSignUpActivityCourse fetch = dao().fetch(TrainSignUpActivityCourse.class, trainSignUpUser.getActivityCourseId());
TrainSignUpUserCourse userCourse = new TrainSignUpUserCourse();
userCourse.setActivityId(trainSignUpUser.getActivityId());
userCourse.setCourseId(trainSignUpUser.getCourseId());
userCourse.setUserId(trainSignUpUser.getUserId());
userCourse.setCourseStartTime(fetch.getCourseStartTime());
userCourse.setCourseEndTime(fetch.getCourseEndTime());
userCourse.setAttend(false);
userCourse.setAttendTime(null);
userCourse.setActivityCourseId(fetch.getId());
dao().insert(userCourse);
} else {
asyncInsertUserCourse(trainSignUpUser.getActivityId(), trainSignUpUser.getCourseId(), trainSignUpUser.getUserId());
}
}
@Async
@@ -18,6 +18,7 @@ import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
@@ -90,7 +91,8 @@ public class TrainSignUpActivityStatisticsServiceImpl extends BaseServiceImpl<Tr
tsuu.unitName,
ifnull(tsuu.mobile, u.mobile) as mobile,
tsuu.signUpTime,
tsuu.state
tsuu.state,
tsuu.mobileColumnsValue
FROM
train_sign_up_user tsuu
LEFT JOIN `vw_user` u ON u.id = tsuu.userId
@@ -100,7 +102,16 @@ public class TrainSignUpActivityStatisticsServiceImpl extends BaseServiceImpl<Tr
Cnd cnd = Cnd.NEW();
cnd.andEX("tsuu.courseId", "=", courseId);
sql.setCondition(cnd);
return listMap(sql);
List<NutMap> list = listMap(sql);
list.forEach(o -> {
List<NutMap> mobileColumnsValue = Json.fromJsonAsList(NutMap.class, o.getString("mobileColumnsValue"));
if(Lang.isNotEmpty(mobileColumnsValue)) {
mobileColumnsValue.forEach(m -> {
o.put(m.getString("columnCode"), m.getString("columnValue"));
});
}
});
return list;
}
@Override
@@ -125,7 +136,7 @@ public class TrainSignUpActivityStatisticsServiceImpl extends BaseServiceImpl<Tr
u.unitname,
u.unionname,
u.sex,
u.mobile,
ifnull(tsuu.mobile, u.mobile) as mobile,
tsuu.signUpTime,
tsuu.state
FROM
@@ -35,7 +35,7 @@ public class TrainSignUpUserServiceImpl extends BaseServiceImpl<TrainSignUpBlack
u.id AS userId,
u.username,
u.loginname,
u.mobile,
ifnull(tsuu.mobile, u.mobile) as mobile,
u.unitname,
u.unionname,
tsuc.courseName,