From 56cbae8ec294468bd1dd8668e521131b1b8318c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=A3=E4=BA=9B=E8=8A=B1=E5=84=BF?= <1156921458@qq.com> Date: Wed, 2 Jul 2025 19:22:58 +0800 Subject: [PATCH] .. --- .../app/base/model/ExcelImportError.java | 25 + .../budwk/app/base/model/ExcelImportRes.java | 29 + .../app/sys/controller/SysHomeController.java | 6 +- .../ActivityBasicScopeUserDataController.java | 6 +- .../controller/WelfareListController.java | 115 +- .../welfare/mode/WelfareUserImportExcel.java | 18 + .../module/activity/UserDataScope.vue | 18 +- .../plugins/sysImport/excelImport.vue | 994 ++++++++++++++++++ .../resources/views/layouts/platform.html | 1 + .../views/platform/sys/home/activity.js | 52 +- .../views/platform/sys/menu/quickEntry.js | 3 +- .../activity/culture/common/applyActivity.js | 159 +-- .../zhgh/welfare/welfareUser/index.html | 34 +- .../views/platform/zhghh5/sys/home/home.js | 38 +- 14 files changed, 1355 insertions(+), 143 deletions(-) create mode 100644 src/main/java/com/budwk/app/base/model/ExcelImportError.java create mode 100644 src/main/java/com/budwk/app/base/model/ExcelImportRes.java create mode 100644 src/main/java/com/budwk/app/zhgh/welfare/mode/WelfareUserImportExcel.java create mode 100644 src/main/resources/static/components/plugins/sysImport/excelImport.vue diff --git a/src/main/java/com/budwk/app/base/model/ExcelImportError.java b/src/main/java/com/budwk/app/base/model/ExcelImportError.java new file mode 100644 index 0000000..bdaf1b1 --- /dev/null +++ b/src/main/java/com/budwk/app/base/model/ExcelImportError.java @@ -0,0 +1,25 @@ +package com.budwk.app.base.model; + +import lombok.Getter; + +/** + * Excel导入错误信息 + */ +public class ExcelImportError { + + /** + * 行号 + */ + private int row; + + /** + * 错误信息 + */ + @Getter + private String errMsg; + + public void setErrInfo(String errMsg, int row) { + this.errMsg = errMsg; + this.row = row; + } +} diff --git a/src/main/java/com/budwk/app/base/model/ExcelImportRes.java b/src/main/java/com/budwk/app/base/model/ExcelImportRes.java new file mode 100644 index 0000000..5830ec3 --- /dev/null +++ b/src/main/java/com/budwk/app/base/model/ExcelImportRes.java @@ -0,0 +1,29 @@ +package com.budwk.app.base.model; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * Excel导入结果 + * @param + */ +@Data +public class ExcelImportRes { + + private int totalRecords = 0; + + private int successCount = 0; + + private int failedCount = 0; + + private List errorDetails = new ArrayList<>(); + + // 失败数+1 + public void addFailedCount() { + failedCount++; + System.out.println(failedCount); + } + +} diff --git a/src/main/java/com/budwk/app/sys/controller/SysHomeController.java b/src/main/java/com/budwk/app/sys/controller/SysHomeController.java index 65b5640..fad0dc2 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysHomeController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysHomeController.java @@ -176,9 +176,9 @@ public class SysHomeController { Date startDate = activity.getStartDate(); Date endDate = activity.getEndDate(); // 判断当前时间是否在活动范围内,不在就过滤掉 - if (!DateUtil.isIn(today, startDate, endDate)) { - continue; - } +// if (!DateUtil.isIn(today, startDate, endDate)) { +// continue; +// } Integer allowUserGroupId = activity.getAllowUserGroupId(); String allowUserSql = activity.getAllowUserSql(); activity.setAllowUserSql(null); diff --git a/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicScopeUserDataController.java b/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicScopeUserDataController.java index 89fb62d..323e7f8 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicScopeUserDataController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicScopeUserDataController.java @@ -11,10 +11,12 @@ import com.budwk.app.base.result.Result; import com.budwk.app.base.service.BaseService; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope; +import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; import org.nutz.dao.util.cri.Static; +import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.mvc.annotation.At; @@ -32,11 +34,9 @@ import org.nutz.mvc.annotation.Param; @Ok("json:full") public class ActivityBasicScopeUserDataController { - @Inject private BaseService baseService; - @At("") @Ok("beetl:platform/zhgh/activity/basic/userScopeData/index.html") @SaCheckPermission("activity.basic.user") @@ -126,6 +126,7 @@ public class ActivityBasicScopeUserDataController { @At @SLog(tag = "活动人员查询", msg = "删除活动人员") @SaCheckPermission("activity.basic.user") + @Aop(TransAop.READ_COMMITTED) public Result doDelete(@Param(value = "id") String id, @Param(value = "groupId") Integer groupId, @Param(value = "searchKeyword") String searchKeyword, @@ -158,6 +159,7 @@ public class ActivityBasicScopeUserDataController { cnd.and(new Static("userId in (" + sql + ")")); } baseService.dao().clear(ActivityUserScope.class, cnd); + baseService.dao().clear(ActivityUserScope.class, Cnd.where(ActivityUserScope::getUserId, "not in", Sqls.create("select id from sys_user"))); return Result.success(); } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareListController.java b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareListController.java index b7a08d0..963a999 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareListController.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareListController.java @@ -1,19 +1,21 @@ package com.budwk.app.zhgh.welfare.controller; +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.params.ExcelExportEntity; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; -import com.alibaba.excel.EasyExcel; import com.budwk.app.base.annotation.SLog; -import com.budwk.app.base.constant.RoleConstant; +import com.budwk.app.base.model.ExcelImportRes; 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.base.utils.CommonDownloadUtil; import com.budwk.app.base.utils.EasyExcelUtil; 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; +import com.budwk.app.zhgh.welfare.mode.WelfareUserImportExcel; import com.budwk.app.zhgh.welfare.mode.WelfareUserTemp; import com.budwk.app.zhgh.welfare.model.WelfareList; import com.budwk.app.zhgh.welfare.model.WelfareUserSelection; @@ -23,16 +25,15 @@ import com.budwk.app.zhgh.welfare.service.WelfareListService; import com.budwk.app.zhgh.welfare.service.WelfareProjectService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.formula.functions.T; +import org.apache.poi.ss.usermodel.Workbook; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Chain; import org.nutz.dao.Cnd; -import org.nutz.dao.Sqls; -import org.nutz.dao.sql.Sql; import org.nutz.ioc.aop.Aop; 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; @@ -44,22 +45,16 @@ import org.nutz.mvc.upload.UploadAdaptor; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; -import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; -/** - * @ClassName WelfareListController - * @Description TODO - * @Author zhf - * @Date 2024/8/13 18:28 - */ @IocBean @Ok("json:full") @At("/platform/welfare/list/mange") @Api(tags = "福利名单") +@Slf4j public class WelfareListController { @Inject @@ -120,7 +115,6 @@ public class WelfareListController { welfareListService.exportXlsx(pageForm, response); } - @At @SaCheckPermission("welfare.list.mange") @ApiOperation("编辑备注") @@ -132,18 +126,16 @@ public class WelfareListController { @At @Ok("void") @SaCheckPermission("welfare.list.mange") - public void downloadImport(HttpServletResponse response) { - try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();) { - EasyExcel.write(byteArrayOutputStream, WelfareUserTemp.class) - .sheet("福利名单导入模版") - .doWrite(ArrayList::new); - CommonDownloadUtil.download("福利名单导入模版.xlsx", byteArrayOutputStream.toByteArray(), response); - } catch (Exception e) { - e.printStackTrace(); - } + @ApiOperation("下载模版") + public void downloadTemplate(HttpServletResponse response) { + List entities = new ArrayList<>(); + entities.add(new ExcelExportEntity("工号", "loginname", 20)); + entities.add(new ExcelExportEntity("姓名", "username", 20)); + ExportParams exportParams = new ExportParams(); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entities, Collections.emptyList()); + CommonDownloadUtil.download("福利名单模版.xlsx", workbook, response); } - @At @Aop(TransAop.READ_COMMITTED) @SaCheckPermission("welfare.list.mange") @@ -193,4 +185,75 @@ public class WelfareListController { } return Result.success("导入成功"); } + + + @At + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("welfare.list.mange") + @AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"}) + @SLog(tag = "福利名单管理", msg = "导入福利名单") + public Result importByExcel(@Param("file") TempFile tempFile, @Param("projectId") String projectId) { + // 读取数据 + List excelList = ExcelImportUtil.importExcel(tempFile.getFile(), WelfareUserImportExcel.class, new ImportParams()); + + // 查询用户 + List loginNames = excelList.stream().map(WelfareUserImportExcel::getLoginName).filter(StrUtil::isNotBlank).collect(Collectors.toList()); + List sysUsers = welfareListService.dao().query(View_user.class, Cnd.where(View_user::getLoginname, "in", loginNames)); + + // 查询当前的福利会员 + List welfareLists = welfareListService.query(Cnd.where("projectId", "=", projectId)); + + // 创建结果集 + ExcelImportRes excelImportRes = new ExcelImportRes<>(); + excelImportRes.setTotalRecords(excelList.size()); + + + for (int i = 0; i < excelList.size(); i++) { + WelfareUserImportExcel excel = excelList.get(i); + if (StrUtil.isBlank(excel.getLoginName())) { + excel.setErrInfo("工号为空", i + 1); + continue; + } + + // 不能在excel里重复 + if (excelList.stream().filter(s -> s.getLoginName().equals(excel.getLoginName())).count() > 1) { + excel.setErrInfo("重复数据", i + 1); + } + + View_user user = sysUsers.stream().filter(s -> s.getLoginname().equals(excel.getLoginName())).findFirst().orElse(null); + if (user == null) { + excel.setErrInfo("无此用户", i + 1); + continue; + } + + if (welfareLists.stream().anyMatch(s -> s.getUserId().equals(user.getId()))) { + excel.setErrInfo("该用户已加入福利名单", i + 1); + continue; + } + + WelfareList wl = new WelfareList(); + wl.setProjectId(projectId); + wl.setUserId(user.getId()); + wl.setWelfareUnitId(user.getUnitId()); + wl.setWelfareUnitName(user.getUnitName()); + wl.setWelfareUnionId(user.getUnionId()); + wl.setWelfareUnionName(user.getUnionName()); + wl.setPersonType(user.getPersonType()); + wl.setPreparedBy(user.getPreparedBy()); + wl.setUserState(user.getUserState()); + try { + welfareListService.insert(wl); + } catch (Exception e) { + log.error("添加福利名单失败:{}", e.getMessage()); + excel.setErrInfo("添加失败", i + 1); + } + } + + // 添加错误记录 + excelImportRes.setErrorDetails(excelList.stream().filter(s -> StrUtil.isNotBlank(s.getErrMsg())).collect(Collectors.toList())); + excelImportRes.setFailedCount(excelImportRes.getErrorDetails().size()); + + return Result.success(excelImportRes); + } + } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/mode/WelfareUserImportExcel.java b/src/main/java/com/budwk/app/zhgh/welfare/mode/WelfareUserImportExcel.java new file mode 100644 index 0000000..3c4ebda --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/welfare/mode/WelfareUserImportExcel.java @@ -0,0 +1,18 @@ +package com.budwk.app.zhgh.welfare.mode; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import com.budwk.app.base.model.ExcelImportError; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class WelfareUserImportExcel extends ExcelImportError { + + @Excel(name = "工号") + private String loginName; + + @Excel(name = "姓名") + private String userName; + +} diff --git a/src/main/resources/static/components/module/activity/UserDataScope.vue b/src/main/resources/static/components/module/activity/UserDataScope.vue index 9bb2b56..962a621 100644 --- a/src/main/resources/static/components/module/activity/UserDataScope.vue +++ b/src/main/resources/static/components/module/activity/UserDataScope.vue @@ -127,10 +127,10 @@ - + 导出活动分组人员xlsx - + 删除{{ currentGroupName }} @@ -238,7 +238,7 @@ module.exports = { components: {}, methods: { viewGroupName() { - if (this.pageForm.groupId) { + if (this.pageForm?.groupId) { const group = this.activityGroupList.find((v) => v.groupId === this.pageForm.groupId) this.currentGroupName = group.groupName + "人员" return @@ -282,14 +282,16 @@ module.exports = { async getActivityGroup(id) { const resp = await $.get("/platform/activity/basic/scope/getActivityUserScopeGroup") this.activityGroupList = resp.data - if (id) { - if (this.activityGroupList.some((v) => v.groupId === id)) { - this.$set(this.pageForm, "groupId", id) + if (resp.data && resp.data.length > 0) { + if (id) { + if (this.activityGroupList.some((v) => v.groupId === id)) { + this.$set(this.pageForm, "groupId", id) + } else { + this.$set(this.pageForm, "groupId", resp.data[0].groupId) + } } else { this.$set(this.pageForm, "groupId", resp.data[0].groupId) } - } else { - this.$set(this.pageForm, "groupId", resp.data[0].groupId) } await this.doSearch() }, diff --git a/src/main/resources/static/components/plugins/sysImport/excelImport.vue b/src/main/resources/static/components/plugins/sysImport/excelImport.vue new file mode 100644 index 0000000..527afc3 --- /dev/null +++ b/src/main/resources/static/components/plugins/sysImport/excelImport.vue @@ -0,0 +1,994 @@ + + + + + diff --git a/src/main/resources/views/layouts/platform.html b/src/main/resources/views/layouts/platform.html index 156c9a5..219388f 100644 --- a/src/main/resources/views/layouts/platform.html +++ b/src/main/resources/views/layouts/platform.html @@ -430,6 +430,7 @@ Vue.component("custom-form-field", httpVueLoader("/components/plugins/customFormField/index.vue?v=" + new Date().getTime())) Vue.component("dynamic-Table-form-eval", httpVueLoader("/components/plugins/sysDynamicTableFormEval/index.vue?v=" + new Date().getTime())) Vue.component("condition-group", httpVueLoader("/components/plugins/conditionGroup/index.vue?v=" + new Date().getTime())) + Vue.component("excel-import", httpVueLoader("/components/plugins/sysImport/excelImport.vue?v=" + new Date().getTime())) diff --git a/src/main/resources/views/platform/sys/home/activity.js b/src/main/resources/views/platform/sys/home/activity.js index e88e045..206851d 100644 --- a/src/main/resources/views/platform/sys/home/activity.js +++ b/src/main/resources/views/platform/sys/home/activity.js @@ -3,28 +3,47 @@ const activity = {
最新活动
-
-
-
-
- +
+
+
+
+
+
-
-
- {{item.name}} -
-
开始时间:{{$moment(item.startDate).format('MM-DD HH:mm')}}
-
结束时间:{{$moment(item.endDate).format('MM-DD HH:mm')}}
+ + 已结束 + + + + 进行中 + +
+
+
+ {{item.name}}
-
- 查看 +
+ 开始时间:{{$moment(item.startDate).format('MM-DD HH:mm')}}
+
+ 结束时间:{{$moment(item.endDate).format('MM-DD HH:mm')}} +
+
+
+ 查看 +
+
@@ -63,5 +82,12 @@ const activity = { .home-activity .el-empty { padding: 40px 0 !important; } + + .home-activity .act-item-tag{ + position: absolute; + right: 0; + bottom: 0; + z-index: 1; + } ` } diff --git a/src/main/resources/views/platform/sys/menu/quickEntry.js b/src/main/resources/views/platform/sys/menu/quickEntry.js index 36b4727..66393f4 100644 --- a/src/main/resources/views/platform/sys/menu/quickEntry.js +++ b/src/main/resources/views/platform/sys/menu/quickEntry.js @@ -22,7 +22,8 @@ const SYS_MENU_QUICK_ENTRY_COMPONENT = { diff --git a/src/main/resources/views/platform/zhgh/activity/culture/common/applyActivity.js b/src/main/resources/views/platform/zhgh/activity/culture/common/applyActivity.js index b649176..c01e8f6 100644 --- a/src/main/resources/views/platform/zhgh/activity/culture/common/applyActivity.js +++ b/src/main/resources/views/platform/zhgh/activity/culture/common/applyActivity.js @@ -31,10 +31,10 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = { style="width: 100%;" v-model="formData.projectTypeCode"> + :key="item.id" + :label="item.name+' ('+item.code+')'" + :value="item.code" + v-for="item in projectTypeList"> @@ -68,10 +68,10 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = { reserve-keyword style="width: 100%" v-model="formData.userId"> + :key="item.userId" + :label="item.userName+'-'+item.loginName+'-'+item.unitName" + :value="item.userId" + v-for="item in userList"> @@ -84,48 +84,48 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = { - - - - - - - - - - - - - - + + + + + + + + + + + + + + + end-placeholder="结束日期" + range-separator="-" + start-placeholder="开始日期" + style="width: 100%" + type="daterange" + v-model="formData.time" + value-format="yyyy-MM-dd"> + :rules="[{required:[1,2].includes(formData.signUpMethod),message:'请选择报名日期',trigger:['change','blur']}]" + label="报名日期" + prop="applyTime2"> + end-placeholder="结束时间" + range-separator="-" + start-placeholder="开始时间" + style="width: 100%" + type="datetimerange" + v-model="formData.applyTime2" + value-format="yyyy-MM-dd HH:mm"> @@ -133,9 +133,9 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = { + maxlength="10" + placeholder="请填写活动人数" + v-model="formData.peopleNum"> @@ -156,8 +156,8 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
设置 + @click="$refs.drawerUserScope.userScopeDialog = true" + type="primary">设置
@@ -181,7 +181,9 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = { 总人数限制 - 分工会人数限制 + + 分工会人数限制 + 不限制 @@ -315,10 +317,10 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = { + :rows="7" + placeholder="请输入活动考核内容" + type="textarea" + v-model="formData.activityExamineContent"> @@ -428,16 +430,16 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = { + label="序号" type="index" + width="100"> + :label="column.label" + :prop="column.prop" + :key="column.prop" + :sortable="column.sortable" + v-for="column in userColumns"> + :disabled="!formData.time || Date.now() < Date.parse(formData.time[1])" + :rows="5" + placeholder="请输入活动内容" + type="textarea" + v-model="formData.activitySummary"> + class="mb20" + show-icon + style="margin-left: 130px" + title="活动结束后可输入活动总结" + type="info" + v-if="!formData.time || Date.now() < Date.parse(formData.time[1])"> - - - + +
确 定 @@ -484,12 +485,12 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = { - + @@ -501,11 +502,11 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = { style="width: 100%" v-model="formData.tissuePersonList"> + :disabled="userData.map(v=>v.userId).includes(item.userId)" + :key="item.userId" + :label="item.userName+'-'+item.loginName+'-'+item.unitName" + :value="item.userId" + v-for="item in userList"> diff --git a/src/main/resources/views/platform/zhgh/welfare/welfareUser/index.html b/src/main/resources/views/platform/zhgh/welfare/welfareUser/index.html index f1896da..1ab589e 100644 --- a/src/main/resources/views/platform/zhgh/welfare/welfareUser/index.html +++ b/src/main/resources/views/platform/zhgh/welfare/welfareUser/index.html @@ -99,11 +99,14 @@ layout("/layouts/platform.html"){ - + @@ -201,9 +204,22 @@ layout("/layouts/platform.html"){ + + + + +