From 35e65076b07392ba936af5778f6dca6a0f5cba3f Mon Sep 17 00:00:00 2001 From: = <=> Date: Wed, 26 Aug 2026 14:27:42 +0800 Subject: [PATCH] commit --- .../app/flow/service/SchoolOaTodoService.java | 8 +++ .../service/impl/SchoolOaTodoServiceImpl.java | 12 ++++ .../app/sys/controller/SysRoleController.java | 10 +++ .../app/sys/services/SysRoleService.java | 8 +++ .../sys/services/impl/SysRoleServiceImpl.java | 63 +++++++++++++++++++ .../apply/ClubUserJoinApplyController.java | 10 +-- .../ClubChangeManagerController.java | 2 + .../ClubRefreshReportController.java | 36 ++++++++--- .../infoManage/ClubRuleUpdateController.java | 2 + .../register/ClubRegistApplyController.java | 6 +- .../statistics/ClubStatisticsController.java | 35 ++++++++++- .../budwk/app/zhgh/club/model/SysClub.java | 3 + .../app/zhgh/club/service/SysClubService.java | 7 +++ .../club/service/impl/SysClubServiceImpl.java | 24 +++++++ .../WelfareSelectionSituationController.java | 2 +- .../WelfareUserChooseController.java | 4 ++ .../WelfareUserSelectController.java | 2 +- .../WelfareSelectionSituationService.java | 4 +- .../WelfareSelectionSituationServiceImpl.java | 18 +++--- .../views/platform/sys/role/index.html | 3 + .../club/infoManage/refreshReport/index.html | 10 ++- .../club/register/apply/clubRegisterForm.js | 3 + .../zhgh/club/register/apply/index.html | 17 ++++- .../platform/zhgh/club/statistics/index.html | 4 +- .../staffmanage/member/info/board/index.html | 7 ++- .../welfare/projectMange/welfareOption.js | 9 +-- .../zhgh/welfare/select/optionSelect.js | 10 +-- .../zhghh5/club/clubApproval/index.html | 2 +- .../club/schoolUnionApproval/index.html | 2 +- .../platform/zhghh5/welfare/select/index.html | 4 +- 30 files changed, 278 insertions(+), 49 deletions(-) diff --git a/src/main/java/com/budwk/app/flow/service/SchoolOaTodoService.java b/src/main/java/com/budwk/app/flow/service/SchoolOaTodoService.java index 9093a32..add1d53 100644 --- a/src/main/java/com/budwk/app/flow/service/SchoolOaTodoService.java +++ b/src/main/java/com/budwk/app/flow/service/SchoolOaTodoService.java @@ -56,6 +56,14 @@ public interface SchoolOaTodoService { */ void createWelfareReminderTodos(String projectId, String title, String pcUrl, String appUrl, String creatorId, List receiverIds); + /** + * 将用户已完成福利选择对应的学校OA提醒待办改为已办。 + * + * @param projectId 福利项目ID + * @param userId 完成选择的用户ID + */ + void completeWelfareReminderTodo(String projectId, String userId); + /** * 删除用户已完成福利选择对应的学校OA提醒待办。 * diff --git a/src/main/java/com/budwk/app/flow/service/impl/SchoolOaTodoServiceImpl.java b/src/main/java/com/budwk/app/flow/service/impl/SchoolOaTodoServiceImpl.java index 5b029dd..c5b265b 100644 --- a/src/main/java/com/budwk/app/flow/service/impl/SchoolOaTodoServiceImpl.java +++ b/src/main/java/com/budwk/app/flow/service/impl/SchoolOaTodoServiceImpl.java @@ -224,6 +224,18 @@ public class SchoolOaTodoServiceImpl implements SchoolOaTodoService { } } + @Override + public void completeWelfareReminderTodo(String projectId, String userId) { + if (!isSchoolOaEnabled("完成福利选择提醒待办", null, null) || StrUtil.hasBlank(projectId, userId)) { + return; + } + String uniqueId = buildWelfareReminderUniqueId(projectId, userId); + String updateUrl = requireConfig("school-oa.todo.update-url").replace("{uniqueId}", uniqueId); + String responseBody = sendTodoRequest(updateUrl, "学校OA福利选择提醒待办完成失败", "学校OA福利选择提醒待办完成异常"); + log.info("学校OA福利选择提醒待办完成成功,projectId={},userId={},uniqueId={},response={}", + projectId, userId, uniqueId, responseBody); + } + @Override public void deleteWelfareReminderTodo(String projectId, String userId) { if (!isSchoolOaEnabled("删除福利选择提醒待办", null, null) || StrUtil.hasBlank(projectId, userId)) { diff --git a/src/main/java/com/budwk/app/sys/controller/SysRoleController.java b/src/main/java/com/budwk/app/sys/controller/SysRoleController.java index f468276..3c90c87 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysRoleController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysRoleController.java @@ -63,6 +63,16 @@ public class SysRoleController { } + @At("/doSettingMemberRole") + @Ok("json") + @SaCheckPermission("sys.manager.role") + @SLog(tag = "系统管理-角色", msg = "同步会员角色") + @ApiOperation("同步会员角色") + public Result doSettingMemberRole() { + NutMap result = sysRoleService.syncMemberRole(); + return Result.success("同步完成,新增" + result.getInt("addedCount") + "个,移除" + result.getInt("removedCount") + "个"); + } + @At("/tree") @Ok("json") @SaCheckLogin diff --git a/src/main/java/com/budwk/app/sys/services/SysRoleService.java b/src/main/java/com/budwk/app/sys/services/SysRoleService.java index f8cb5d8..ffe38f6 100644 --- a/src/main/java/com/budwk/app/sys/services/SysRoleService.java +++ b/src/main/java/com/budwk/app/sys/services/SysRoleService.java @@ -6,6 +6,7 @@ import com.budwk.app.base.service.BaseService; import com.budwk.app.sys.models.Sys_menu; import com.budwk.app.sys.models.Sys_role; import com.budwk.app.sys.models.Sys_unit; +import org.nutz.lang.util.NutMap; import java.util.List; @@ -121,6 +122,13 @@ public interface SysRoleService extends BaseService { */ Sys_role getByCode(RoleConstant roleConstant); + /** + * 根据用户表中的会员标记核对并同步会员角色关系。 + * + * @return 同步新增、删除和会员总数 + */ + NutMap syncMemberRole(); + /** * 清空缓存 */ diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysRoleServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysRoleServiceImpl.java index 4015352..3334d52 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysRoleServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysRoleServiceImpl.java @@ -10,6 +10,8 @@ import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.sys.models.Sys_menu; import com.budwk.app.sys.models.Sys_role; import com.budwk.app.sys.models.Sys_unit; +import com.budwk.app.sys.models.Sys_user; +import com.budwk.app.sys.models.Sys_user_role; import com.budwk.app.sys.services.SysMenuService; import com.budwk.app.sys.services.SysRoleService; import com.budwk.app.sys.services.SysUserService; @@ -20,12 +22,16 @@ import org.nutz.ioc.aop.Aop; 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 org.nutz.plugins.wkcache.annotation.CacheDefaults; import org.nutz.plugins.wkcache.annotation.CacheRemoveAll; import org.nutz.plugins.wkcache.annotation.CacheResult; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * Created by wizzer on 2016/12/22. @@ -262,6 +268,63 @@ public class SysRoleServiceImpl extends BaseServiceImpl implements Sys return getByCode(roleConstant.name()); } + @Override + @Aop(TransAop.READ_COMMITTED) + public NutMap syncMemberRole() { + Sys_role memberRole = getByCode(RoleConstant.MEMBER); + Set memberUserIds = dao().query(Sys_user.class, Cnd.where(Sys_user::getMember, "=", true)).stream() + .map(Sys_user::getId) + .filter(Strings::isNotBlank) + .collect(Collectors.toSet()); + + List memberRoleRelations = dao().query(Sys_user_role.class, + Cnd.where(Sys_user_role::getRoleId, "=", memberRole.getId())); + Set existingMemberRoleUserIds = memberRoleRelations.stream() + .map(Sys_user_role::getUserId) + .filter(memberUserIds::contains) + .collect(Collectors.toCollection(HashSet::new)); + + List roleRelationsToAdd = memberUserIds.stream() + .filter(userId -> !existingMemberRoleUserIds.contains(userId)) + .map(userId -> { + Sys_user_role userRole = new Sys_user_role(); + userRole.setUserId(userId); + userRole.setRoleId(memberRole.getId()); + return userRole; + }) + .toList(); + if (!roleRelationsToAdd.isEmpty()) { + dao().insert(roleRelationsToAdd); + } + + List invalidUserIds = memberRoleRelations.stream() + .map(Sys_user_role::getUserId) + .filter(userId -> !memberUserIds.contains(userId)) + .filter(Strings::isNotBlank) + .distinct() + .toList(); + int removedCount = (int) memberRoleRelations.stream() + .filter(roleRelation -> !memberUserIds.contains(roleRelation.getUserId())) + .count(); + if (memberUserIds.isEmpty()) { + if (!memberRoleRelations.isEmpty()) { + dao().clear(Sys_user_role.class, Cnd.where(Sys_user_role::getRoleId, "=", memberRole.getId())); + } + } else if (!invalidUserIds.isEmpty()) { + // 会员角色只保留在 sys_user.member = 1 的用户上,同时清理已删除用户的孤立关系。 + dao().clear(Sys_user_role.class, + Cnd.where(Sys_user_role::getRoleId, "=", memberRole.getId()) + .and(Sys_user_role::getUserId, "in", invalidUserIds)); + } + + clearCache(); + sysUserService.clearCache(); + return NutMap.NEW() + .addv("memberCount", memberUserIds.size()) + .addv("addedCount", roleRelationsToAdd.size()) + .addv("removedCount", removedCount); + } + @CacheRemoveAll public void clearCache() { diff --git a/src/main/java/com/budwk/app/zhgh/club/controller/apply/ClubUserJoinApplyController.java b/src/main/java/com/budwk/app/zhgh/club/controller/apply/ClubUserJoinApplyController.java index a197f99..3ddead8 100644 --- a/src/main/java/com/budwk/app/zhgh/club/controller/apply/ClubUserJoinApplyController.java +++ b/src/main/java/com/budwk/app/zhgh/club/controller/apply/ClubUserJoinApplyController.java @@ -120,9 +120,10 @@ public class ClubUserJoinApplyController { @SLog(tag = "协会管理系统-申请入会", msg = "申请协会入会") public Result submit(ClubUserApply clubUserApply) { ClubUserApply userApply = dao.fetch(ClubUserApply.class, Cnd.where("userId", "=", clubUserApply.getUserId()).and("clubId", "=", clubUserApply.getClubId()).and("mode", "=", 1).desc(ClubUserApply::getApplyDate)); - if (ObjectUtil.isNotEmpty(userApply) && StrUtil.isBlank(userApply.getId())) { + // 新建申请时,已有同协会的草稿或进行中的申请都不能再次提交;编辑当前草稿时允许继续提交。 + if (ObjectUtil.isNotEmpty(userApply) && !StrUtil.equals(userApply.getId(), clubUserApply.getId())) { ProcessInstance processInstance = dao.fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", userApply.getId())); - if (!List.of(ProcessInstanceStateEnum.REJECT.getCode(),ProcessInstanceStateEnum.FINISHED.getCode()).contains(processInstance.getState())) { + if (processInstance == null || !List.of(ProcessInstanceStateEnum.REJECT.getCode(),ProcessInstanceStateEnum.FINISHED.getCode()).contains(processInstance.getState())) { return Result.error("您有该协会的申请记录尚未完成,请到我的申请里查看!"); } } @@ -173,11 +174,12 @@ public class ClubUserJoinApplyController { } if (ObjectUtil.isNotEmpty(clubUser)) { - return Result.error(99, "请勿重复申请!"); + return Result.error(99, "您已经是该协会成员,请勿重复申请!"); } ProcessInstance processInstance = dao.fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", userApply.getId())); - if (!List.of(ProcessInstanceStateEnum.REJECT.getCode(),ProcessInstanceStateEnum.FINISHED.getCode()).contains(processInstance.getState())) { + // 仅保存的申请还没有流程实例,也应按未完成申请处理,避免空指针并防止重复创建草稿。 + if (processInstance == null || !List.of(ProcessInstanceStateEnum.REJECT.getCode(),ProcessInstanceStateEnum.FINISHED.getCode()).contains(processInstance.getState())) { return Result.error(99, "您有该协会的申请记录尚未完成,请到我的申请里查看!"); } return Result.success(); diff --git a/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubChangeManagerController.java b/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubChangeManagerController.java index be0f016..ae306ff 100644 --- a/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubChangeManagerController.java +++ b/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubChangeManagerController.java @@ -111,6 +111,8 @@ public class ClubChangeManagerController { } else { cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); } + // 按理事机构变更申请主表主键分组,避免流程任务处理人关联导致同一申请重复显示。 + cnd.groupBy("info.id"); sql.setCondition(cnd); Pagination pagination = infoManageService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); List listMap = pagination.getList(NutMap.class); diff --git a/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubRefreshReportController.java b/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubRefreshReportController.java index 739810c..9c9f801 100644 --- a/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubRefreshReportController.java +++ b/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubRefreshReportController.java @@ -106,6 +106,8 @@ public class ClubRefreshReportController { } else { cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); } + // 按换届报告申请主表主键分组,避免流程任务处理人关联导致同一申请重复显示。 + cnd.groupBy("info.id"); sql.setCondition(cnd); Pagination pagination = clubInfoManageService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); return Result.success(pagination); @@ -117,18 +119,34 @@ public class ClubRefreshReportController { @SLog(tag = "协会管理系统-信息管理", msg = "提交换届报告") public Object submit(@Param("data") SysClubRefresh clubRefresh) { - Cnd cnd = Cnd.NEW(); - if(StrUtil.isNotBlank(clubRefresh.getId())) { - cnd.and(SysClubRefresh::getId, "!=", clubRefresh.getId()); - } + if (clubRefresh == null || StrUtil.isBlank(clubRefresh.getClubId())) { + return Result.error("请选择协会!"); + } + SysClub club = clubInfoManageService.dao().fetch(SysClub.class, clubRefresh.getClubId()); + if (club == null) { + return Result.error("协会不存在,请刷新后重试!"); + } + + // 仅检查当前用户在当前协会的其他换届报告,避免不同协会的未完成流程相互影响。 + Cnd cnd = Cnd.where(SysClubRefresh::getClubId, "=", clubRefresh.getClubId()) + .and(SysClubRefresh::getUserId, "=", SecurityUtil.getUserId()); + if (StrUtil.isNotBlank(clubRefresh.getId())) { + // 编辑已有申请时排除当前记录,避免当前流程被误判为重复申请。 + cnd.and(SysClubRefresh::getId, "!=", clubRefresh.getId()); + } List list = dao.query(SysClubRefresh.class, cnd); - List idList = list.stream().map(SysClubRefresh::getId).toList(); - int count = dao.count(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", idList).and(ProcessInstance::getState, "not in", List.of(ProcessInstanceStateEnum.FINISHED.getCode(), ProcessInstanceStateEnum.REJECT.getCode()))); - if (count > 0) { - return Result.error("您有该协会的申请记录尚未完成,请核对!"); + if (!list.isEmpty()) { + List idList = list.stream().map(SysClubRefresh::getId).toList(); + int count = dao.count(ProcessInstance.class, + Cnd.where(ProcessInstance::getBusinessNo, "in", idList) + .and(ProcessInstance::getState, "not in", List.of( + ProcessInstanceStateEnum.FINISHED.getCode(), + ProcessInstanceStateEnum.REJECT.getCode()))); + if (count > 0) { + return Result.error("您有该协会的申请记录尚未完成,请核对!"); + } } - SysClub club = clubInfoManageService.dao().fetch(SysClub.class, clubRefresh.getClubId()); clubRefresh.setUserId(SecurityUtil.getUserId()); clubRefresh.setUserName(SecurityUtil.getUserUsername()); clubRefresh.setLastFiles(club.getReplaceReport()); diff --git a/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubRuleUpdateController.java b/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubRuleUpdateController.java index ef62fa4..41f551f 100644 --- a/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubRuleUpdateController.java +++ b/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubRuleUpdateController.java @@ -107,6 +107,8 @@ public class ClubRuleUpdateController { } else { cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); } + // 按章程修订申请主表主键分组,避免流程任务或处理人关联导致同一申请重复显示。 + cnd.groupBy("info.id"); sql.setCondition(cnd); Pagination pagination = clubInfoManageService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); return Result.success(pagination); diff --git a/src/main/java/com/budwk/app/zhgh/club/controller/register/ClubRegistApplyController.java b/src/main/java/com/budwk/app/zhgh/club/controller/register/ClubRegistApplyController.java index cf30153..50b72a1 100644 --- a/src/main/java/com/budwk/app/zhgh/club/controller/register/ClubRegistApplyController.java +++ b/src/main/java/com/budwk/app/zhgh/club/controller/register/ClubRegistApplyController.java @@ -86,9 +86,10 @@ public class ClubRegistApplyController { @Aop(TransAop.READ_COMMITTED) @SaCheckPermission("club.register.apply") @SLog(tag = "协会管理系统-协会注册", msg = "提交注册协会") - public Result submit(@Param("club") SysClub club, + public Result submit(@Valid @Param("club") SysClub club, @Param("::deleteIds") List deleteIds, @Param("::managePerson") List managePerson) { + sysClubService.validateManagePerson(managePerson); SysClub sysClub; if (StrUtil.isBlank(club.getId())) { sysClub = sysClubService.doAdd(club, managePerson); @@ -114,10 +115,11 @@ public class ClubRegistApplyController { @ApiOperation("重新提交申请") @Aop(TransAop.READ_COMMITTED) @SaCheckPermission("club.register.apply") - public Result submitAgain(@Param("club") SysClub club, + public Result submitAgain(@Valid @Param("club") SysClub club, @Param("::deleteIds") List deleteIds, @Param("::managePerson") List managePerson, @Param("taskId") Long taskId) { + sysClubService.validateManagePerson(managePerson); if (StrUtil.isBlank(club.getId())) { sysClubService.doAdd(club, managePerson); } else { diff --git a/src/main/java/com/budwk/app/zhgh/club/controller/statistics/ClubStatisticsController.java b/src/main/java/com/budwk/app/zhgh/club/controller/statistics/ClubStatisticsController.java index 9199e75..99dcd28 100644 --- a/src/main/java/com/budwk/app/zhgh/club/controller/statistics/ClubStatisticsController.java +++ b/src/main/java/com/budwk/app/zhgh/club/controller/statistics/ClubStatisticsController.java @@ -6,6 +6,7 @@ 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 cn.hutool.core.util.StrUtil; import cn.hutool.core.util.URLUtil; import cn.hutool.json.JSONObject; import com.budwk.app.base.constant.RoleConstant; @@ -50,9 +51,11 @@ import java.io.BufferedOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -290,9 +293,22 @@ public class ClubStatisticsController { response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + URLUtil.encode("上传资料数据.zip")); LinkedHashMap> fileList = new LinkedHashMap<>(); + Set exportedFilePaths = new HashSet<>(); //查询社团 List clubList = sysClubService.query(Cnd.NEW().andEX("id", "=", clubId)); + if (!clubList.isEmpty()) { + List clubIdList = clubList.stream().map(SysClub::getId).toList(); + // 资料导出只允许注册流程审核通过的协会,避免未通过审核的协会进入压缩包。 + Set passedClubIdSet = sysClubService.dao().query( + ProcessInstance.class, + Cnd.where(ProcessInstance::getBusinessNo, "in", clubIdList) + .and(ProcessInstance::getState, "=", ProcessInstanceStateEnum.FINISHED.getCode())) + .stream() + .map(ProcessInstance::getBusinessNo) + .collect(Collectors.toSet()); + clubList = clubList.stream().filter(item -> passedClubIdSet.contains(item.getId())).toList(); + } clubList.forEach(item -> { List file = new ArrayList<>(); file.addAll(Optional.ofNullable(item.getFiles()).orElseGet(ArrayList::new)); @@ -301,7 +317,6 @@ public class ClubStatisticsController { file.addAll(Optional.ofNullable(item.getManageFile()).orElseGet(ArrayList::new)); file.addAll(Optional.ofNullable(item.getYearPlanFile()).orElseGet(ArrayList::new)); file.addAll(Optional.ofNullable(item.getReplaceReport()).orElseGet(ArrayList::new)); - file.addAll(Optional.ofNullable(item.getRulesFile()).orElseGet(ArrayList::new)); fileList.put(item.getId(), file); }); @@ -329,13 +344,31 @@ public class ClubStatisticsController { ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream())); clubList.forEach(item -> { List sysFiles = fileList.get(item.getId()); + if (sysFiles == null || sysFiles.isEmpty()) { + return; + } sysFiles.forEach(f -> { try { + if (f == null) { + return; + } String fileName = f.getStr("name"); String filepath = f.getStr("url"); + if (StrUtil.isBlank(fileName) || StrUtil.isBlank(filepath) || !exportedFilePaths.add(filepath)) { + return; + } Sys_file file = sysClubService.dao().fetch(Sys_file.class, Cnd.where(Sys_file::getDownloadPath, "=", filepath)); + // 仅导出文件记录仍存在且能够读取的资料,避免失效附件进入压缩包。 + if (file == null) { + log.warn("协会上传资料对应的文件记录不存在,跳过导出:{}", filepath); + return; + } byte[] bytes = SysFileMinIoUtil.getFileBytes(file.getBucket(), file.getStoragePath()); + if (bytes == null) { + log.warn("协会上传资料读取失败,跳过导出:{}", filepath); + return; + } zipOutputStream.putNextEntry(new ZipEntry(item.getClubName() + "/" + System.currentTimeMillis() + fileName)); zipOutputStream.write(bytes); diff --git a/src/main/java/com/budwk/app/zhgh/club/model/SysClub.java b/src/main/java/com/budwk/app/zhgh/club/model/SysClub.java index 43db3b2..3f40ecb 100644 --- a/src/main/java/com/budwk/app/zhgh/club/model/SysClub.java +++ b/src/main/java/com/budwk/app/zhgh/club/model/SysClub.java @@ -82,6 +82,7 @@ public class SysClub extends BaseModel { @Column @Comment("成立时间") @ColDefine(type = ColType.VARCHAR, width = 50) + @NotEmpty(message = "成立时间不能为空") private String foundTime; @Column @@ -102,11 +103,13 @@ public class SysClub extends BaseModel { @Column @Comment("申请成立报告") @ColDefine(type = ColType.MYSQL_JSON) + @NotEmpty(message = "申请成立报告不能为空") private List establishReport; @Column @Comment("章程草案") @ColDefine(type = ColType.MYSQL_JSON) + @NotEmpty(message = "章程草案不能为空") private List rulesFile; @Column diff --git a/src/main/java/com/budwk/app/zhgh/club/service/SysClubService.java b/src/main/java/com/budwk/app/zhgh/club/service/SysClubService.java index fa7d090..8616e13 100644 --- a/src/main/java/com/budwk/app/zhgh/club/service/SysClubService.java +++ b/src/main/java/com/budwk/app/zhgh/club/service/SysClubService.java @@ -38,6 +38,13 @@ public interface SysClubService extends BaseService { SysClub doEdit(SysClub club, List deleteIds, List managePerson); + /** + * 校验协会提交时理事机构中的必填职务是否已选择人员。 + * + * @param managePerson 理事机构人员信息 + */ + void validateManagePerson(List managePerson); + /** * 下载协会申请成立报告模板。 * diff --git a/src/main/java/com/budwk/app/zhgh/club/service/impl/SysClubServiceImpl.java b/src/main/java/com/budwk/app/zhgh/club/service/impl/SysClubServiceImpl.java index b1f1043..5fda237 100644 --- a/src/main/java/com/budwk/app/zhgh/club/service/impl/SysClubServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/club/service/impl/SysClubServiceImpl.java @@ -251,6 +251,28 @@ public class SysClubServiceImpl extends BaseServiceImpl implements SysC return club; } + @Override + public void validateManagePerson(List managePerson) { + boolean hasPresident = false; + boolean hasSecretary = false; + if (ObjectUtil.isNotEmpty(managePerson)) { + for (NutMap person : managePerson) { + if (person == null || StrUtil.isBlank(person.getString("userId"))) { + continue; + } + if (RoleConstant.CLUB_PRESIDENT.name().equals(person.getString("roleCode"))) { + hasPresident = true; + } + if (RoleConstant.CLUB_SECRETARY.name().equals(person.getString("roleCode"))) { + hasSecretary = true; + } + } + } + if (!hasPresident || !hasSecretary) { + throw new BaseException("请填写协会理事机构中的会长和秘书长"); + } + } + @Override public Pagination minePageData(ClubUserPageForm pageForm) { Sql sql = Sqls.create(""" @@ -291,6 +313,8 @@ public class SysClubServiceImpl extends BaseServiceImpl implements SysC cnd.andEX("year(info.createTime)", "=", pageForm.getYear()); cnd.and("info.userId", "=", SecurityUtil.getUserId()); cnd.desc("createTime"); + // 按协会主表主键分组,避免流程任务或处理人关联导致同一申请返回多条记录。 + cnd.groupBy("info.id"); sql.setCondition(cnd); return listPageVO(pageForm, sql, ClubRegisterPageVo.class); } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareSelectionSituationController.java b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareSelectionSituationController.java index c7fb232..ac185c5 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareSelectionSituationController.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareSelectionSituationController.java @@ -94,7 +94,7 @@ public class WelfareSelectionSituationController { welfareUserSelection.setSelectTime(new Date()); } dao.insert(selections); - situationService.clearReminderTodo(projectId, userId); + situationService.completeReminderTodo(projectId, userId); return Result.success("选择成功"); } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareUserChooseController.java b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareUserChooseController.java index 356f3e0..76863af 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareUserChooseController.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareUserChooseController.java @@ -9,6 +9,7 @@ import com.budwk.app.base.service.BaseService; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.welfare.model.WelfareList; import com.budwk.app.zhgh.welfare.model.WelfareUserSelection; +import com.budwk.app.zhgh.welfare.service.WelfareSelectionSituationService; import io.swagger.annotations.ApiOperation; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Chain; @@ -41,6 +42,8 @@ public class WelfareUserChooseController { private Dao dao; @Inject private BaseService baseService; + @Inject + private WelfareSelectionSituationService situationService; @At("") @Ok("beetl:/platform/zhgh/welfare/userChoose/index.html") @@ -103,6 +106,7 @@ public class WelfareUserChooseController { Chain.make("isReceive", true), Cnd.where("projectId", "=", projectId) .and("userId", "=", SecurityUtil.getUserId())); + situationService.completeReminderTodo(projectId, SecurityUtil.getUserId()); return Result.success("选择成功"); } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareUserSelectController.java b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareUserSelectController.java index f6c7d81..28feebe 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareUserSelectController.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareUserSelectController.java @@ -106,7 +106,7 @@ public class WelfareUserSelectController { welfareUserSelection.setSelectTime(new Date()); } dao.insert(selections); - situationService.clearReminderTodo(projectId, SecurityUtil.getUserId()); + situationService.completeReminderTodo(projectId, SecurityUtil.getUserId()); return Result.success("选择成功"); } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareSelectionSituationService.java b/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareSelectionSituationService.java index 398007d..9577813 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareSelectionSituationService.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareSelectionSituationService.java @@ -34,11 +34,11 @@ public interface WelfareSelectionSituationService extends BaseService
+ + 同步会员角色 + 新建角色 diff --git a/src/main/resources/views/platform/zhgh/club/infoManage/refreshReport/index.html b/src/main/resources/views/platform/zhgh/club/infoManage/refreshReport/index.html index 55c5f1a..b5324a1 100644 --- a/src/main/resources/views/platform/zhgh/club/infoManage/refreshReport/index.html +++ b/src/main/resources/views/platform/zhgh/club/infoManage/refreshReport/index.html @@ -110,7 +110,10 @@ layout("/layouts/platform.html"){ id: '', taskId: '', clubList: [], - formData: {}, + formData: { + clubId: '', + files: [] + }, formRules: { clubId: [{ required: true, message: "必填", trigger: ["change", "blur"] }], files: [{ required: true, message: "必填", trigger: ["change", "blur"] }], @@ -123,7 +126,10 @@ layout("/layouts/platform.html"){ this.id = '' this.taskId = '' this.$refs.guava.edit(() => { - this.formData = {} + this.$set(this, "formData", { + clubId: '', + files: [] + }) }) }, onRevoke(row) { diff --git a/src/main/resources/views/platform/zhgh/club/register/apply/clubRegisterForm.js b/src/main/resources/views/platform/zhgh/club/register/apply/clubRegisterForm.js index 6fff093..43bf568 100644 --- a/src/main/resources/views/platform/zhgh/club/register/apply/clubRegisterForm.js +++ b/src/main/resources/views/platform/zhgh/club/register/apply/clubRegisterForm.js @@ -169,6 +169,9 @@ const CLUB_FORM_TEMPLATE = { formData: { clubName: "", clubType: "", + foundTime: "", + establishReport: [], + rulesFile: [], introduce: CLUB_DEFAULT_INTRODUCE }, formRules: { diff --git a/src/main/resources/views/platform/zhgh/club/register/apply/index.html b/src/main/resources/views/platform/zhgh/club/register/apply/index.html index 251e726..eed9cd8 100644 --- a/src/main/resources/views/platform/zhgh/club/register/apply/index.html +++ b/src/main/resources/views/platform/zhgh/club/register/apply/index.html @@ -64,7 +64,7 @@ layout("/layouts/platform.html"){ nextStep() { let valid = true this.$refs.clubFormRef.$refs.form.validateField( - ["clubName", "establishReport", "rulesFile"], + ["clubName", "clubType", "foundTime", "establishReport", "rulesFile"], (errMsg) => { if (!errMsg) { valid = false @@ -101,6 +101,19 @@ layout("/layouts/platform.html"){ async doHandle(type) { let formData = {} try { + const managePerson = this.$refs.clubManagerRef.managePerson + if (['onFinishTask', 'onSubmit'].includes(type)) { + const hasPresident = managePerson.some((item) => + item.roleCode === CLUB_ROLE_CONSTANT.CLUB_PRESIDENT && item.userId + ) + const hasSecretary = managePerson.some((item) => + item.roleCode === CLUB_ROLE_CONSTANT.CLUB_SECRETARY && item.userId + ) + if (!hasPresident || !hasSecretary) { + this.$message.warning({ title: "警告", message: "请填写协会理事机构中的会长和秘书长" }) + return + } + } /*let hz = this.$refs.clubManagerRef.managePerson.filter((o) => o.roleCode === CLUB_ROLE_CONSTANT.CLUB_PRESIDENT) if (hz.length !== 1) { this.$message.warning({ title: "警告", message: "会长需要1人" }) @@ -149,7 +162,7 @@ layout("/layouts/platform.html"){ } const resp = await this.$axios.post(url, { club: JSON.stringify(cloneData), - managePerson: this.$refs.clubManagerRef.managePerson, + managePerson: managePerson, deleteIds: JSON.stringify(this.deleteIds), taskId: GetQueryString("taskId") }) diff --git a/src/main/resources/views/platform/zhgh/club/statistics/index.html b/src/main/resources/views/platform/zhgh/club/statistics/index.html index 87a50d7..886ba9a 100644 --- a/src/main/resources/views/platform/zhgh/club/statistics/index.html +++ b/src/main/resources/views/platform/zhgh/club/statistics/index.html @@ -19,8 +19,8 @@ layout("/layouts/platform.html"){ - - + + diff --git a/src/main/resources/views/platform/zhgh/staffmanage/member/info/board/index.html b/src/main/resources/views/platform/zhgh/staffmanage/member/info/board/index.html index c29fa75..cfba968 100644 --- a/src/main/resources/views/platform/zhgh/staffmanage/member/info/board/index.html +++ b/src/main/resources/views/platform/zhgh/staffmanage/member/info/board/index.html @@ -464,7 +464,7 @@ layout("/layouts/platform.html"){ this.chartResizeObserver = new ResizeObserver(() => { this.handleChartResize() }) - ;["memberPercentageChart", "memberSexPercentageChart"].forEach((containerId) => { + ;["memberPercentageChart", "memberSexPercentageChart", "personTypeMemberChart"].forEach((containerId) => { const container = document.getElementById(containerId) if (container) { this.chartResizeObserver.observe(container) @@ -768,9 +768,12 @@ layout("/layouts/platform.html"){ if (chart.personTypeMemberChart) { chart.personTypeMemberChart.changeData(data) + this.handleChartResize() return } + // 首次进入页面时容器可能尚未完成布局,等待尺寸有效后再创建图表。 + this.waitChartContainerReady("personTypeMemberChart", () => { chart.personTypeMemberChart = new G2Plot.Column("personTypeMemberChart", { data, autoFit: true, @@ -854,6 +857,8 @@ layout("/layouts/platform.html"){ } }) chart.personTypeMemberChart.render() + this.handleChartResize() + }) } else { this.$message.warning(resp.msg) } diff --git a/src/main/resources/views/platform/zhgh/welfare/projectMange/welfareOption.js b/src/main/resources/views/platform/zhgh/welfare/projectMange/welfareOption.js index 712e5f1..e4a34a4 100644 --- a/src/main/resources/views/platform/zhgh/welfare/projectMange/welfareOption.js +++ b/src/main/resources/views/platform/zhgh/welfare/projectMange/welfareOption.js @@ -3,7 +3,8 @@ const welfareOption = {
- + +