From fce211073a3aef1230d6ed64cfc3fce14e7a7e01 Mon Sep 17 00:00:00 2001 From: zhouhefeng Date: Fri, 24 Apr 2026 13:39:30 +0800 Subject: [PATCH] commit --- .../ActivityBasicScopeController.java | 89 ++++++++ .../param/ActivityUserScopePageParam.java | 3 + .../activity/basic/template/UserTemp.java | 26 +++ .../module/activity/ActivityImportUser.vue | 203 ++++++++++++++++++ .../components/module/activity/UserScope.vue | 66 ++++-- 5 files changed, 375 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/budwk/app/zhgh/activity/basic/template/UserTemp.java create mode 100644 src/main/resources/static/components/module/activity/ActivityImportUser.vue diff --git a/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicScopeController.java b/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicScopeController.java index 0aa0ee6..8b1e5d1 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicScopeController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicScopeController.java @@ -2,43 +2,56 @@ package com.budwk.app.zhgh.activity.basic.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.dev33.satoken.stp.StpUtil; +import cn.hutool.json.JSONUtil; import cn.hutool.core.util.StrUtil; 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.result.Result; import com.budwk.app.base.service.BaseService; +import com.budwk.app.base.utils.CommonDownloadUtil; +import com.budwk.app.base.utils.EasyExcelUtil; import com.budwk.app.sys.models.Sys_role; 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.ActivityUserScope; import com.budwk.app.zhgh.activity.basic.param.ActivityUserScopePageParam; import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; +import com.budwk.app.zhgh.activity.basic.template.UserTemp; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ArrayUtils; +import org.apache.poi.ss.formula.functions.T; import org.apache.poi.ss.usermodel.Workbook; 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.util.cri.Static; +import org.nutz.integration.jedis.RedisService; 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.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.management.relation.Role; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; /** @@ -61,6 +74,9 @@ public class ActivityBasicScopeController { @Inject private Dao dao; + @Inject + private RedisService redisService; + @At("") @Ok("beetl:platform/zhgh/activity/basic/userScope/index.html") @SaCheckPermission("activity.basic.scope") @@ -349,6 +365,11 @@ public class ActivityBasicScopeController { } } + if (StrUtil.isNotBlank(activityUserScopePageParam.getExistsLoginNameRedisKey())) { + List loginNames = redisService.lrange(activityUserScopePageParam.getExistsLoginNameRedisKey(), 0, -1); + cnd.andEX("u.loginname", "IN", loginNames); + } + if (StrUtil.isAllNotBlank(activityUserScopePageParam.getStartJoinDate(), activityUserScopePageParam.getEndJoinDate())) { if (activityUserScopePageParam.getReverseSelection()) { cnd.andNot("u.arrivalAtSchoolDate", "between", new String[]{activityUserScopePageParam.getStartJoinDate(), activityUserScopePageParam.getEndJoinDate()}); @@ -375,5 +396,73 @@ public class ActivityBasicScopeController { } + @At + @Ok("void") + @SaCheckPermission("activity.basic.scope") + public void downloadImport(HttpServletResponse response) { + List entityList = new ArrayList<>(); + entityList.add(new ExcelExportEntity("工号", "loginname", 20)); + entityList.add(new ExcelExportEntity("姓名", "username", 20)); + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, new ArrayList<>()); + CommonDownloadUtil.download("人员导入模板.xlsx", workbook, response); + } + + @At + @SaCheckPermission("activity.basic.scope") + @AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"}) + public Result doImport(TempFile file) { + String matchUserLoginNamesKey = "ActivityBasicScopeController.doImport.time=" + System.currentTimeMillis(); + List ts = EasyExcelUtil.syncReadModel(file.getFile(), UserTemp.class, 0, 1); + List userImportList = JSONUtil.parseArray(JSONUtil.toJsonStr(ts)).toList(UserTemp.class); + List importLoginNames = userImportList.stream().map(UserTemp::getLoginname).filter(StrUtil::isNotBlank).collect(Collectors.toList()); + Set sysLoginNames = new HashSet<>(); + if (Lang.isNotEmpty(importLoginNames)) { + Sql userSql = Sqls.create("SELECT loginname FROM sys_user $condition"); + userSql.setCondition(Cnd.where("loginname", "IN", importLoginNames)); + List sysUserList = baseService.listMap(userSql); + sysLoginNames = sysUserList + .stream() + .map(item -> item.getString("loginname")) + .collect(Collectors.toSet()); + } + List existsLoginNames = new ArrayList<>(); + + for (UserTemp excelUser : userImportList) { + if (StrUtil.isNotBlank(excelUser.getLoginname()) && sysLoginNames.contains(excelUser.getLoginname())) { + existsLoginNames.add(excelUser.getLoginname()); + } else { + excelUser.setErrorInfo("系统查不到此人"); + } + } + + List errorExcelTempUsers = userImportList.stream().filter(v -> StrUtil.isNotBlank(v.getErrorInfo())).collect(Collectors.toList()); + NutMap nutMap = NutMap.NEW(); + nutMap.setv("totalCount", userImportList.size()); + nutMap.setv("successCount", existsLoginNames.size()); + nutMap.setv("errorCount", errorExcelTempUsers.size()); + nutMap.setv("errorList", errorExcelTempUsers.stream().map(v -> NutMap.NEW() + .addv("工号", v.getLoginname()) + .addv("姓名", v.getUsername()) + .addv("错误原因", v.getErrorInfo())).collect(Collectors.toList())); + nutMap.setv("existsLoginNameRedisKey", matchUserLoginNamesKey); + + if (Lang.isNotEmpty(existsLoginNames)) { + redisService.lpush(matchUserLoginNamesKey, existsLoginNames.toArray(new String[0])); + redisService.expire(matchUserLoginNamesKey, 60 * 3); + } + return Result.success(nutMap); + } + + @At + @SaCheckPermission("activity.basic.scope") + public Result clearSearchCnd(String existsLoginNameRedisKey) { + if (StrUtil.isNotBlank(existsLoginNameRedisKey)) { + redisService.del(existsLoginNameRedisKey); + } + return Result.success(); + } + } diff --git a/src/main/java/com/budwk/app/zhgh/activity/basic/param/ActivityUserScopePageParam.java b/src/main/java/com/budwk/app/zhgh/activity/basic/param/ActivityUserScopePageParam.java index 54c6b5a..3ca0131 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/basic/param/ActivityUserScopePageParam.java +++ b/src/main/java/com/budwk/app/zhgh/activity/basic/param/ActivityUserScopePageParam.java @@ -47,6 +47,9 @@ public class ActivityUserScopePageParam extends PageForm { private String props; + @ApiModelProperty(value = "导入XLSX核对成功人员缓存key") + private String existsLoginNameRedisKey; + @ApiModelProperty(value = "开始加入时间(会员)") private String startJoinDate; diff --git a/src/main/java/com/budwk/app/zhgh/activity/basic/template/UserTemp.java b/src/main/java/com/budwk/app/zhgh/activity/basic/template/UserTemp.java new file mode 100644 index 0000000..f2af348 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/basic/template/UserTemp.java @@ -0,0 +1,26 @@ +package com.budwk.app.zhgh.activity.basic.template; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode +@ContentRowHeight(20) +@HeadRowHeight(20) +@ColumnWidth(25) +public class UserTemp { + + @ExcelProperty("工号") + private String loginname; + + @ExcelProperty("姓名") + private String username; + + @ExcelIgnore + private String errorInfo; +} diff --git a/src/main/resources/static/components/module/activity/ActivityImportUser.vue b/src/main/resources/static/components/module/activity/ActivityImportUser.vue new file mode 100644 index 0000000..8aae3e5 --- /dev/null +++ b/src/main/resources/static/components/module/activity/ActivityImportUser.vue @@ -0,0 +1,203 @@ + + + + + diff --git a/src/main/resources/static/components/module/activity/UserScope.vue b/src/main/resources/static/components/module/activity/UserScope.vue index a8e5378..296b7c1 100644 --- a/src/main/resources/static/components/module/activity/UserScope.vue +++ b/src/main/resources/static/components/module/activity/UserScope.vue @@ -278,8 +278,12 @@ + + 导入XLSX设置分组 + 导出查询人员 - 设置为活动人员 + 设置为活动人员 @@ -342,10 +346,19 @@ - 取 消 + 取 消 确 定 + + + + @@ -360,9 +373,12 @@ module.exports = { clubOptions: [], settingLoading: false, setDialogVisible: false, - setGroupType: null, - setGroupId: null, - setGroupName: null, + importDialogVisible: false, + formData: { + setGroupType: null, + setGroupId: null, + setGroupName: null + }, personTypeOptions: [], userStateOptions: [], activityGroupList: [], @@ -448,10 +464,40 @@ module.exports = { } }, components: { - "user-cnd": httpVueLoader("/components/plugins/UserCnd.vue") + "user-cnd": httpVueLoader("/components/plugins/UserCnd.vue"), + "activity-import-user": httpVueLoader("/components/module/activity/ActivityImportUser.vue?v=" + new Date().getTime()) }, methods: { + getDefaultFormData() { + return { + setGroupType: null, + setGroupId: null, + setGroupName: null + } + }, + openSetDialog() { + this.$set(this, "formData", this.getDefaultFormData()) + this.$set(this, "setDialogVisible", true) + this.$nextTick(() => { + if (this.$refs.setForm) { + this.$refs.setForm.clearValidate() + } + }) + }, + closeSetDialog() { + this.$set(this, "setDialogVisible", false) + }, + flush(existsLoginNameRedisKey) { + this.$set(this.pageForm, "existsLoginNameRedisKey", existsLoginNameRedisKey) + this.doSearch() + }, + openImportDialog() { + this.$set(this, "importDialogVisible", true) + }, + clearImportDialog() { + this.$set(this, "importDialogVisible", false) + }, doExportUser() { let props = {} this.tableColumns.forEach((v) => { @@ -575,16 +621,12 @@ module.exports = { Object.assign(pageForm, this.formData) const resp = await $.post("/platform/activity/basic/scope/doSetActivityUser", {data: JSON.stringify(pageForm)}) if (resp.code === 0) { - this.setDialogVisible = false + this.$set(this, "setDialogVisible", false) // this.userScopeDialog = false await this.getActivityGroup() this.doSearch() this.$message.success(resp.msg) - this.formData = { - setGroupType: null, - setGroupId: null, - setGroupName: null - } + this.$set(this, "formData", this.getDefaultFormData()) } else { this.$message.error(resp.msg) }