From 3d7a081eb3c2a51d41d4503b8ada8d5acc6b3d4f Mon Sep 17 00:00:00 2001 From: "@jyuhsin" <729757837@qq.com> Date: Mon, 13 Oct 2025 10:33:38 +0800 Subject: [PATCH] commit --- .../manage/TrainSignUpDataController.java | 360 ++++++++++++++++++ .../models/TrainSignUpUserData.java | 31 ++ .../platform/trainSingUp/data/index.html | 219 +++++++++++ 3 files changed, 610 insertions(+) create mode 100644 src/main/java/io/v/nutz/zhgh/trainSignUp/controller/manage/TrainSignUpDataController.java create mode 100644 src/main/java/io/v/nutz/zhgh/trainSignUp/models/TrainSignUpUserData.java create mode 100644 src/main/resources/views/platform/trainSingUp/data/index.html diff --git a/src/main/java/io/v/nutz/zhgh/trainSignUp/controller/manage/TrainSignUpDataController.java b/src/main/java/io/v/nutz/zhgh/trainSignUp/controller/manage/TrainSignUpDataController.java new file mode 100644 index 0000000..3cebf91 --- /dev/null +++ b/src/main/java/io/v/nutz/zhgh/trainSignUp/controller/manage/TrainSignUpDataController.java @@ -0,0 +1,360 @@ +package io.v.nutz.zhgh.trainSignUp.controller.manage; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.ExcelImportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.ImportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; +import cn.afterturn.easypoi.excel.export.ExcelExportService; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.wizzer.framework.base.Result; +import io.v.nutz.base.annontation.ViReturn; +import io.v.nutz.base.page.Pagination; +import io.v.nutz.base.query.PageForm; +import io.v.nutz.base.service.BaseService; +import io.v.nutz.base.utils.CommonDownloadUtil; +import io.v.nutz.base.utils.ViTool; +import io.v.nutz.sys.models.Sys_user; +import io.v.nutz.sys.models.User; +import io.v.nutz.zhgh.activityBudget.models.ActivityBudget; +import io.v.nutz.zhgh.activityBudget.template.ActivityBudgetTemp; +import io.v.nutz.zhgh.trainSignUp.constant.TrainCourseType; +import io.v.nutz.zhgh.trainSignUp.models.*; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.dao.sql.VarIndex; +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.AdaptBy; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; +import org.nutz.mvc.upload.TempFile; +import org.nutz.mvc.upload.UploadAdaptor; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @ClassName TrainSignUpDataController + * @Author JyuHsin + * @Date 2025/10/11 15:44 + * @Version 1.0 + * @Description TODO + */ +@Slf4j +@IocBean +@At("/platform/trainSignUp/data") +public class TrainSignUpDataController { + + @Inject + private Dao dao; + @Inject + private BaseService baseService; + + @At("") + @RequiresPermissions("trainSignUp.data") + @Ok("beetl:/platform/trainSingUp/data/index.html") + public void index() { + } + + @At + @ViReturn + @Ok("json:full") + @RequiresPermissions("trainSignUp.data") + public Object pageData(PageForm pageForm, + @Param(value = "activityId") String activityId, + @Param(value = "courseId") String courseId, + @Param(value = "unionId") String unionId, + @Param(value = "unitId") String unitId) { + Sql sql = Sqls.create(""" + select + td.*, + u.username as userName, + u.loginname as loginName, + u.unitname as unitName, + u.unionname as unionName, + count(td.userId) as count + from + train_sign_up_user_data td + left join user u on u.id = td.userId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("td.activityId", "=", activityId); + cnd.andEX("td.courseId", "=", courseId); + cnd.andEX("u.unionId", "=", unionId); + cnd.andEX("u.unitId", "=", unitId); + cnd.groupBy("td.userId"); + sql.setCondition(cnd); + return baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + } + + @At + @ViReturn + @Ok("json:full") + @RequiresPermissions("trainSignUp.data") + public Object view(String activityId, String userId) { + return dao.query(TrainSignUpUserData.class, Cnd.where("activityId", "=", activityId).and("userId", "=", userId).asc("signUpTime")); + } + + @At + @ViReturn + @Ok("json:full") + @RequiresPermissions("trainSignUp.data") + public Object selectActivity() { + return dao.query(TrainSignUpActivity.class, Cnd.where("isDisabled", "=", false).desc("activitySignUpStartTime")); + } + + @At + @ViReturn + @Ok("json:full") + @RequiresPermissions("trainSignUp.data") + public Object selectCourse(String activityId) { + return dao.query(TrainSignUpCourse.class, Cnd.where("activityId", "=", activityId).asc("orderNum")); + } + + @At + @ViReturn + @Ok("json:full") + @RequiresPermissions("trainSignUp.data") + public Object delete(String id) { + dao.delete(TrainSignUpUserData.class, id); + return null; + } + + @At + @RequiresPermissions("trainSignUp.data") + public void downLoad(String activityId, + String courseId, + HttpServletResponse response) throws IOException { + + TrainSignUpCourse course = dao.fetch(TrainSignUpCourse.class, courseId); + TrainSignUpType type = dao.fetch(TrainSignUpType.class, course.getCourseType()); + dao.fetchLinks(type, "^trainMobileSignColumnList$", Cnd.NEW().asc("columnIndex")); + + List exportEntities = new ArrayList<>(); + exportEntities.add(new ExcelExportEntity("姓名", "userName", 20)); + exportEntities.add(new ExcelExportEntity("工号(必填)", "loginName", 20)); + + if (Lang.isNotEmpty(type.getTrainMobileSignColumnList())) { + for (TrainMobileSignColumn column : type.getTrainMobileSignColumnList()) { + exportEntities.add(new ExcelExportEntity(column.getColumnName(), column.getColumnCode(), 20)); + } + } + + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment;filename=" + new String(("导入模板.xlsx").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1)); + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, new ArrayList<>()); + workbook.write(response.getOutputStream()); + } + + @At + @Ok("json:full") + @RequiresPermissions("trainSignUp.data") + @Aop(TransAop.READ_COMMITTED) + @AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"}) + public Object importData(@Param(value = "courseId") String courseId, + @Param(value = "file") TempFile file) throws IOException { + + TrainSignUpCourse course = dao.fetch(TrainSignUpCourse.class, courseId); + TrainSignUpType type = dao.fetch(TrainSignUpType.class, course.getCourseType()); + dao.fetchLinks(type, "^trainMobileSignColumnList$", Cnd.NEW().asc("columnIndex")); + + List userList = dao.query(Sys_user.class, Cnd.NEW()); + Map userMap = userList.stream().collect(Collectors.toMap(Sys_user::getLoginname, o -> o)); + + ImportParams params = new ImportParams(); + params.setTitleRows(0); + params.setHeadRows(1); + + List> list = ExcelImportUtil.importExcel(file.getFile(), Map.class, params); + + List errorInfos = new ArrayList<>(); + + List datas = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + + Map map = list.get(i); + map.put("index", i + 1); + + Sys_user sysUser = userMap.get(map.get("工号(必填)").toString()); + + if (ObjectUtil.isEmpty(map.get("工号(必填)"))) { + map.put("errorInfo", "工号不能为空"); + errorInfos.add(map); + continue; + } + if (ObjectUtil.isEmpty(sysUser)) { + map.put("errorInfo", "查询不到" + map.get("工号(必填)") + "的用户"); + errorInfos.add(map); + continue; + } + + TrainSignUpUserData userData = new TrainSignUpUserData(); + userData.setSource(2); + userData.setActivityId(course.getActivityId()); + userData.setCourseId(courseId); + userData.setUserId(sysUser.getId()); + userData.setMobile(sysUser.getMobile()); + userData.setSignUpTime(DateUtil.date()); + + List columnValues = new ArrayList<>(); + for (TrainMobileSignColumn column : type.getTrainMobileSignColumnList()) { + NutMap nutMap = new NutMap(); + nutMap.put("columnName", column.getColumnName()); + nutMap.put("columnValue", map.get(column.getColumnName()).toString()); + nutMap.put("columnCode", column.getColumnCode()); + nutMap.put("columnFormType", column.getColumnFormType()); + columnValues.add(nutMap); + } + + userData.setMobileColumnsValue(columnValues); + datas.add(userData); + } + + dao.insert(datas); + if (Lang.isNotEmpty(errorInfos)) { + NutMap nutMap = NutMap.NEW(); + nutMap.setv("totalCount", list.size()); + nutMap.setv("successCount", Math.max(datas.size() - errorInfos.size(), 0)); + nutMap.setv("errorCount", errorInfos.size()); + nutMap.setv("errorList", errorInfos.stream().map(v -> NutMap.NEW().addv("序号", v.get("index")).addv("错误原因", v.get("errorInfo"))).collect(Collectors.toList())); + return Result.success(nutMap); + } + return Result.success().addMsg("导入成功"); + } + + @At + @RequiresPermissions("trainSignUp.data") + public void doExport(String activityId, + String courseId, + HttpServletResponse response) throws IOException { + + List userList = dao.query(User.class, Cnd.NEW()); + Map userMap = userList.stream().collect(Collectors.toMap(User::getId, o -> o)); + + List list = dao.query(TrainSignUpUserData.class, Cnd.where("activityId", "=", activityId)); + Map> listMap = list.stream().collect(Collectors.groupingBy(TrainSignUpUserData::getCourseId)); + + List courseList = dao.query(TrainSignUpCourse.class, Cnd.where("activityId", "=", activityId)); + + List typeList = dao.query(TrainSignUpType.class, Cnd.NEW()); + dao.fetchLinks(typeList, "trainMobileSignColumnList", Cnd.NEW().asc("columnIndex")); + Map typeMap = typeList.stream().collect(Collectors.toMap(TrainSignUpType::getId, o -> o)); + + List> sheetsList = new ArrayList<>(); + + List> basicEntity = List.of( + Map.of("name", "姓名", "key", "userName"), + Map.of("name", "工号", "key", "loginName"), + Map.of("name", "单位", "key", "unitName"), + Map.of("name", "分工会", "key", "unionName"), + Map.of("name", "性别", "key", "sex"), + Map.of("name", "手机号", "key", "mobile") + ); + + List excelCommonExportEntity = basicEntity.stream().map(entity -> { + ExcelExportEntity excelExportEntity = new ExcelExportEntity(); + excelExportEntity.setKey(entity.get("key")); + excelExportEntity.setName(entity.get("name")); + excelExportEntity.setWidth(20); + excelExportEntity.setNeedMerge(true); + return excelExportEntity; + }).collect(Collectors.toCollection(ArrayList::new)); + + for (TrainSignUpCourse c : courseList) { + String k = c.getCourseName(); + List userData = listMap.get(c.getId()); + + ExportParams userExportParams = new ExportParams(); + userExportParams.setSheetName(k); + userExportParams.setType(ExcelType.HSSF); + + List currentEntities = new ArrayList<>(excelCommonExportEntity); + TrainSignUpType signUpType = typeMap.get(c.getCourseType()); + if (Lang.isNotEmpty(signUpType.getTrainMobileSignColumnList())) { + ExcelExportEntity familyEntity = new ExcelExportEntity("其他信息", "extraInfos", 20); + List signColumn = signUpType.getTrainMobileSignColumnList().stream().map(column -> { + ExcelExportEntity entity = new ExcelExportEntity(); + entity.setName(column.getColumnName()); + entity.setKey(column.getColumnCode()); + entity.setWidth(20); + if ("FILE".equals(column.getColumnFormType())) { + entity.setType(2); + entity.setExportImageType(2); + } + return entity; + }).collect(Collectors.toCollection(ArrayList::new)); + familyEntity.setList(signColumn); + currentEntities.add(familyEntity); + } + + Map> courseGroupUser = userData.stream().collect(Collectors.groupingBy(TrainSignUpUserData::getUserId)); + List courseUsers = new ArrayList<>(); + for (String userId : courseGroupUser.keySet()) { + User user = userMap.get(userId); + NutMap nutMap = new NutMap(); + nutMap.put("userName", user.getUsername()); + nutMap.put("loginName", user.getLoginname()); + nutMap.put("unitName", user.getUnitname()); + nutMap.put("unionName", user.getUnionname()); + nutMap.put("sex", user.getSex()); + nutMap.put("mobile", user.getMobile()); + + List users = courseGroupUser.get(userId); + List extraInfos = new ArrayList<>(); + for (TrainSignUpUserData sign : users) { + List columnsValue = sign.getMobileColumnsValue(); + if (Lang.isEmpty(columnsValue)) { + continue; + } + NutMap extraMap = new NutMap(); + for (NutMap map : columnsValue) { + if ("FILE".equals(map.getString("columnFormType"))) { + continue; + } + extraMap.put(map.getString("columnCode"), map.getString("columnValue")); + } + extraInfos.add(extraMap); + } + nutMap.put("extraInfos", extraInfos); + courseUsers.add(nutMap); + } + + Map userExportMap = new HashMap<>(); + userExportMap.put("name", k); + userExportMap.put("title", userExportParams); + userExportMap.put("entity", currentEntities); + userExportMap.put("data", courseUsers); + + sheetsList.add(userExportMap); + } + + Workbook workbook = new HSSFWorkbook(); + for (Map map : sheetsList) { + ExcelExportService service = new ExcelExportService(); + service.createSheetForMap(workbook, (ExportParams) map.get("title"), (List) map.get("entity"), (Collection) map.get("data")); + } + + CommonDownloadUtil.download("人员数据信息" + ".xlsx", workbook, response); + } +} diff --git a/src/main/java/io/v/nutz/zhgh/trainSignUp/models/TrainSignUpUserData.java b/src/main/java/io/v/nutz/zhgh/trainSignUp/models/TrainSignUpUserData.java new file mode 100644 index 0000000..82688e9 --- /dev/null +++ b/src/main/java/io/v/nutz/zhgh/trainSignUp/models/TrainSignUpUserData.java @@ -0,0 +1,31 @@ +package io.v.nutz.zhgh.trainSignUp.models; + +import lombok.Data; +import lombok.experimental.Accessors; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +import java.util.Date; + +/** + * @ClassName TrainSignUpUserData + * @Author JyuHsin + * @Date 2025/10/11 16:14 + * @Version 1.0 + * @Description TODO + */ +@Table +@Data +@Accessors(chain = true) +@TableIndexes({@Index(name = "INDEX_TRAIN_SIGN_UP_USER_COURSEID", fields = {"courseId"}, unique = false)}) +public class TrainSignUpUserData extends TrainSignUpUser{ + + @Name + @PrevInsert(uu32 = true) + private String id; + + @Column + @ColDefine(type = ColType.INT) + @Comment("数据来源(1.报名表,2.导入)") + private Integer source; +} diff --git a/src/main/resources/views/platform/trainSingUp/data/index.html b/src/main/resources/views/platform/trainSingUp/data/index.html new file mode 100644 index 0000000..4667010 --- /dev/null +++ b/src/main/resources/views/platform/trainSingUp/data/index.html @@ -0,0 +1,219 @@ + + + + +
+ + + + + + + + + + +
+ + + +