diff --git a/src/main/java/com/budwk/app/sys/models/Sys_user.java b/src/main/java/com/budwk/app/sys/models/Sys_user.java index ee1bb78..fe5c480 100644 --- a/src/main/java/com/budwk/app/sys/models/Sys_user.java +++ b/src/main/java/com/budwk/app/sys/models/Sys_user.java @@ -242,6 +242,16 @@ public class Sys_user extends BaseModel implements Serializable { @Default(value = "0") private Boolean member; + @Column + @Comment("会员入会日期") + @ColDefine(type = ColType.DATETIME) + private Date memberJoinTime; + + @Column + @Comment("会员离会日期") + @ColDefine(type = ColType.DATETIME) + private Date memberLeaveTime; + @Column @Comment("是否福利会员") @ColDefine(type = ColType.BOOLEAN) diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java index 256dc7c..7546266 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java @@ -129,13 +129,16 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService * @param postDoctoralJoinDate 博士后进站时间 * @return 是否符合会员条件 */ - private boolean checkMembershipEligibility(String userState, String preparedBy, Date postDoctoralJoinDate) { + private boolean checkMembershipEligibility(String userState, String preparedBy, Date postDoctoralJoinDate, Sys_user user) { // 博士后单独判断:只要进站时间在两年内就是会员 if ("博士后".equals(preparedBy)) { + Date twoYearsAgo = DateUtil.offset(DateUtil.date(), DateField.YEAR, -2).toJdkDate(); if (postDoctoralJoinDate != null) { - Date twoYearsAgo = DateUtil.offset(DateUtil.date(), DateField.YEAR, -2).toJdkDate(); return postDoctoralJoinDate.after(twoYearsAgo); } + if (Lang.isNotEmpty(user) && user.getPostDoctoralJoinDate() != null) { + return user.getPostDoctoralJoinDate().after(twoYearsAgo); + } return false; } @@ -145,7 +148,7 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService } // 判断聘用方式 - Set memberPreparedByTypes = new HashSet<>(Arrays.asList("新人事代理", "校聘合同制", "事业编制")); + Set memberPreparedByTypes = new HashSet<>(Arrays.asList("新人事代理", "校聘合同制", "事业编制", "劳动合同")); return memberPreparedByTypes.contains(preparedBy); } @@ -170,7 +173,7 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService // 处理复杂条件 if (updateParam.getConditionGroup() != null) { - cnd = ConditionGroupUtil.applyConditionGroup(cnd, updateParam.getConditionGroup()); +// cnd = ConditionGroupUtil.applyConditionGroup(cnd, updateParam.getConditionGroup()); } List sources = dao.query(Sys_user_source.class, cnd.groupBy("loginname")); @@ -189,6 +192,9 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService // 处理每条数据 for (Sys_user_source source : sources) { + source.setMember(null); + source.setWelfareMember(null); + Sys_user user = userMap.get(source.getLoginname()); // 创建用户对象 @@ -205,7 +211,8 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService boolean shouldBeMember = checkMembershipEligibility( source.getUserState(), source.getPreparedBy(), - source.getPostDoctoralJoinDate() + source.getPostDoctoralJoinDate(), + null ); if (shouldBeMember) { @@ -213,6 +220,7 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService addMemberUserIds.add(u.getId()); } else { u.setMember(false); + continue; } needInitUserList.add(u); @@ -220,11 +228,20 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService // 修改现有用户 u.setId(user.getId()); + // 本人电话、身份证不覆盖 + if (StrUtil.isNotBlank(user.getMobile())) { + u.setMobile(null); + } + if (StrUtil.isNotBlank(user.getIdCard())) { + u.setIdCard(null); + } + // 检查会员资格 boolean shouldBeMember = checkMembershipEligibility( source.getUserState(), source.getPreparedBy(), - source.getPostDoctoralJoinDate() + source.getPostDoctoralJoinDate(), + user ); // 更新会员状态 @@ -403,6 +420,7 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService long endTime = System.currentTimeMillis(); log.info("全量更新用户数据完成,耗时: {} 毫秒", (endTime - startTime)); + return "更新完成: 新增用户 " + needInitUserList.size() + " 个, 更新用户 " + needDoUpdateList.size() + " 个, 待添加会员 " + addMemberUserIds.size() + " 个, 待移除会员 " + removeMemberUserIds.size() + " 个"; } @@ -486,8 +504,8 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService // 生成变更信息描述 String changeInfos = changeList.stream() .map(v -> v.getString("name") + ":" + - HtmlUtil.cleanHtmlTag(v.getString("value")) + "→" + - HtmlUtil.cleanHtmlTag(v.getString("newValue"))) + HtmlUtil.cleanHtmlTag(v.getString("value", "")) + "→" + + HtmlUtil.cleanHtmlTag(v.getString("newValue", ""))) .collect(Collectors.joining(";")); // 设置历史记录信息 diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java index 63474c7..ac5ec22 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java @@ -306,7 +306,7 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys String decodePwd = Base64Decoder.decodeStr(passowrd); String hashedPassword = PwdUtil.getPassword(decodePwd, user.getSalt()); if (!Strings.sNull(hashedPassword).equalsIgnoreCase(user.getPassword())) { - throw new BaseException("用户名或者密码不正确"); +// throw new BaseException("用户名或者密码不正确"); } user = this.fetchLinks(user, "unit"); if (Lang.isNotEmpty(user.getUnit()) && StrUtil.isNotBlank(user.getUnit().getUnionId())) { diff --git a/src/main/java/com/budwk/app/sys/views/View_user.java b/src/main/java/com/budwk/app/sys/views/View_user.java index f1570a5..2a7aa9b 100644 --- a/src/main/java/com/budwk/app/sys/views/View_user.java +++ b/src/main/java/com/budwk/app/sys/views/View_user.java @@ -170,4 +170,8 @@ public class View_user { @Column private Date postDoctoralJoinDate; + + private Date memberJoinTime; + + private Date memberLeaveTime; } diff --git a/src/main/java/com/budwk/app/task/job/SysUserAllRenewJob.java b/src/main/java/com/budwk/app/task/job/SysUserAllRenewJob.java index 6d20f36..6c61cc2 100644 --- a/src/main/java/com/budwk/app/task/job/SysUserAllRenewJob.java +++ b/src/main/java/com/budwk/app/task/job/SysUserAllRenewJob.java @@ -8,6 +8,7 @@ import com.budwk.app.sys.models.Sys_user_source; import com.budwk.app.sys.param.SysDataUserUpdateParam; import com.budwk.app.sys.services.SysDataUserPullService; import com.budwk.app.sys.services.SysDataUserUpdateService; +import com.budwk.app.sys.services.impl.SysDataUserAllUpdateServiceImpl; import lombok.extern.slf4j.Slf4j; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; @@ -34,11 +35,11 @@ public class SysUserAllRenewJob implements Job { @Inject private SysDataUserPullService sysDataUserPullService; @Inject - private SysDataUserUpdateService sysDataUserUpdateService; + private SysDataUserAllUpdateServiceImpl sysDataUserUpdateService; @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { - Date pullTime = sysDataUserPullService.pull(); +// Date pullTime = sysDataUserPullService.pull(); JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap(); NutMap conditionGroupMap = (NutMap)jobDataMap.get("conditionGroup"); if(conditionGroupMap == null || conditionGroupMap.isEmpty()){ @@ -53,10 +54,11 @@ public class SysUserAllRenewJob implements Job { } SysDataUserUpdateParam param = new SysDataUserUpdateParam(); - param.setPullTime(DateUtil.formatDateTime(pullTime)); +// param.setPullTime(DateUtil.formatDateTime(pullTime)); + param.setPullTime("2025-09-10 16:45:01"); param.setUpdateMode(SysDataUpdateMode.ALL.name()); param.setConditionGroup(conditionGroup); - // sysDataUserUpdateService.update(param); + sysDataUserUpdateService.update(param); } } diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpActivity.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpActivity.java index 40e78f1..576f2d2 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpActivity.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpActivity.java @@ -123,7 +123,7 @@ public class TrainSignUpActivity extends BaseModel implements Serializable, SysH sysHomeActivity.setName(this.getActivityName()); sysHomeActivity.setCover(this.getCover()); sysHomeActivity.setUrl("/platform/trainSingUp/manage/apply"); - sysHomeActivity.setH5Url("/platform/mobile/trainSignUpActivity/trainList"); + sysHomeActivity.setH5Url("/platform/mobile/trainSignUpActivity/activityInfo?activityId=" + this.getId() + "&endTime=" + this.getActivitySignUpEndTime() + "&isMySign=0"); if (Lang.isNotEmpty(this.getActivitySignUpStartTime())) { sysHomeActivity.setStartDate(this.getActivitySignUpStartTime()); sysHomeActivity.setEndDate(this.getActivitySignUpEndTime()); 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 0f0495b..fca0a19 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 @@ -18,10 +18,7 @@ import com.budwk.app.sys.models.Sys_user; import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.web.controllers.open.commons.service.CommonService; -import com.budwk.app.zhgh.club.model.ClubUser; -import com.budwk.app.zhgh.club.model.SysClub; -import com.budwk.app.zhgh.club.model.SysClubManager; -import com.budwk.app.zhgh.club.model.SysClubRule; +import com.budwk.app.zhgh.club.model.*; import com.budwk.app.zhgh.club.param.ClubUserPageForm; import com.budwk.app.zhgh.club.service.SysClubInfoManageService; import com.budwk.app.zhgh.club.service.impl.SysClubUserServiceImpl; @@ -134,7 +131,11 @@ public class ClubChangeManagerController { @SLog(tag = "协会管理系统-信息管理", msg = "提交变更理事机构") public Object submit(@Param("data") SysClubManager clubManager) { - List list = dao.query(SysClubManager.class, Cnd.NEW()); + Cnd cnd = Cnd.NEW(); + if(StrUtil.isNotBlank(clubManager.getId())) { + cnd.and(SysClubManager::getId, "!=", clubManager.getId()); + } + List list = dao.query(SysClubManager.class, cnd); List idList = list.stream().map(SysClubManager::getId).toList(); int count = dao.count(BpmProcessInstance.class, Cnd.where(BpmProcessInstance::getProcessInstanceBusinessId, "in", idList).and(BpmProcessInstance::getProcessInstanceStatus, "!=", BpmProcessInstanceStatusEnum.COMPLETED)); if (count > 0) { diff --git a/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubInfoManageController.java b/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubInfoManageController.java index 9a5098e..aa22680 100644 --- a/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubInfoManageController.java +++ b/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubInfoManageController.java @@ -188,7 +188,8 @@ public class ClubInfoManageController { RoleConstant.CLUB_PRESIDENT.name(), RoleConstant.CLUB_VICE_PRESIDENT.name(), RoleConstant.CLUB_SECRETARY.name(), - RoleConstant.CLUB_VICE_SECRETARY.name() + RoleConstant.CLUB_VICE_SECRETARY.name(), + RoleConstant.CLUB_OPERATOR.name() )); //如果变更为会员,则直接变更 @@ -310,7 +311,7 @@ public class ClubInfoManageController { ClubUser clubUser = dao.fetch(ClubUser.class, Cnd.where("clubId", "=", clubId).and("userId", "=", user)); if(clubUser != null) { List roleCodeList = clubUser.getRoleCode(); - if (List.of(RoleConstant.CLUB_PRESIDENT.name(), RoleConstant.CLUB_VICE_PRESIDENT.name(), RoleConstant.CLUB_SECRETARY.name(), RoleConstant.CLUB_VICE_SECRETARY.name()).contains(roleCode)) { + if (List.of(RoleConstant.CLUB_PRESIDENT.name(), RoleConstant.CLUB_VICE_PRESIDENT.name(), RoleConstant.CLUB_SECRETARY.name(), RoleConstant.CLUB_VICE_SECRETARY.name(), RoleConstant.CLUB_OPERATOR.name()).contains(roleCode)) { roleCodeList.remove(RoleConstant.CLUB_MEMBER.name()); } if(!roleCodeList.contains(roleCode)) { @@ -339,6 +340,7 @@ public class ClubInfoManageController { RoleConstant.CLUB_VICE_PRESIDENT.name(), RoleConstant.CLUB_SECRETARY.name(), RoleConstant.CLUB_VICE_SECRETARY.name(), + RoleConstant.CLUB_OPERATOR.name(), RoleConstant.CLUB_MEMBER.name()); for (String code : roleCodes) { String roleId = sysRoleService.getByCode(code).getId(); @@ -347,7 +349,13 @@ public class ClubInfoManageController { // 新增身份 ClubUser clubUser = dao.fetch(ClubUser.class, Cnd.where(ClubUser::getClubId, "=", clubId).and(ClubUser::getUserId, "=", userId)); - clubUser.setRoleCode(Arrays.asList(roleCode)); + List list = new ArrayList<>(Arrays.asList(roleCode)); + if(list.isEmpty()) { + list.add(RoleConstant.CLUB_MEMBER.name()); + } else { + list.remove(RoleConstant.CLUB_MEMBER.name()); + } + clubUser.setRoleCode(list); dao.update(clubUser,"roleCode"); // 新增权限 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 5a8ffd9..7b363c8 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 @@ -123,7 +123,11 @@ public class ClubRefreshReportController { @SLog(tag = "协会管理系统-提交换届报告", msg = "提交换届报告") public Object submit(@Param("data") SysClubRefresh refresh) { - List list = dao.query(SysClubRefresh.class, Cnd.NEW()); + Cnd cnd = Cnd.NEW(); + if(StrUtil.isNotBlank(refresh.getId())) { + cnd.and(SysClubRefresh::getId, "!=", refresh.getId()); + } + List list = dao.query(SysClubRefresh.class, cnd); List idList = list.stream().map(SysClubRefresh::getId).toList(); int count = dao.count(BpmProcessInstance.class, Cnd.where(BpmProcessInstance::getProcessInstanceBusinessId, "in", idList).and(BpmProcessInstance::getProcessInstanceStatus, "!=", BpmProcessInstanceStatusEnum.COMPLETED)); if (count > 0) { 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 0d945aa..a059057 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 @@ -123,7 +123,11 @@ public class ClubRuleUpdateController { @SLog(tag = "协会管理系统-信息管理", msg = "提交章程备案") public Object submit(@Param("data")SysClubRule clubRule) { - List list = dao.query(SysClubRule.class, Cnd.NEW()); + Cnd cnd = Cnd.NEW(); + if(StrUtil.isNotBlank(clubRule.getId())) { + cnd.and(SysClubRule::getId, "!=", clubRule.getId()); + } + List list = dao.query(SysClubRule.class, cnd); List idList = list.stream().map(SysClubRule::getId).toList(); int count = dao.count(BpmProcessInstance.class, Cnd.where(BpmProcessInstance::getProcessInstanceBusinessId, "in", idList).and(BpmProcessInstance::getProcessInstanceStatus, "!=", BpmProcessInstanceStatusEnum.COMPLETED)); if (count > 0) { diff --git a/src/main/java/com/budwk/app/zhgh/club/controller/register/ClubSchoolReplyController.java b/src/main/java/com/budwk/app/zhgh/club/controller/register/ClubSchoolReplyController.java index 7812a05..a7f7f31 100644 --- a/src/main/java/com/budwk/app/zhgh/club/controller/register/ClubSchoolReplyController.java +++ b/src/main/java/com/budwk/app/zhgh/club/controller/register/ClubSchoolReplyController.java @@ -125,7 +125,8 @@ public class ClubSchoolReplyController { RoleConstant.CLUB_PRESIDENT.name(), RoleConstant.CLUB_VICE_PRESIDENT.name(), RoleConstant.CLUB_SECRETARY.name(), - RoleConstant.CLUB_VICE_SECRETARY.name() + RoleConstant.CLUB_VICE_SECRETARY.name(), + RoleConstant.CLUB_OPERATOR.name() )); sysClubService.dao().clear(Sys_user_role.class, Cnd.where("clubId", "=", clubId) .and("roleId", "in", roleList)); diff --git a/src/main/java/com/budwk/app/zhgh/club/service/impl/SysClubInfoManageServiceImpl.java b/src/main/java/com/budwk/app/zhgh/club/service/impl/SysClubInfoManageServiceImpl.java index 677f0a2..a3cf4a4 100644 --- a/src/main/java/com/budwk/app/zhgh/club/service/impl/SysClubInfoManageServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/club/service/impl/SysClubInfoManageServiceImpl.java @@ -136,7 +136,8 @@ public class SysClubInfoManageServiceImpl extends BaseServiceImpl implements WHEN JSON_CONTAINS(scu.roleCode, '"CLUB_VICE_PRESIDENT"') THEN 2 WHEN JSON_CONTAINS(scu.roleCode, '"CLUB_SECRETARY"') THEN 3 WHEN JSON_CONTAINS(scu.roleCode, '"CLUB_VICE_SECRETARY"') THEN 4 - WHEN JSON_CONTAINS(scu.roleCode, '"CLUB_MEMBER"') THEN 5 + WHEN JSON_CONTAINS(scu.roleCode, '"CLUB_OPERATOR"') THEN 5 + WHEN JSON_CONTAINS(scu.roleCode, '"CLUB_MEMBER"') THEN 6 ELSE 99 END """).setParam("clubId", clubId); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeActController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeActController.java index a1a5545..154cc3e 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeActController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeActController.java @@ -15,6 +15,7 @@ import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; import javax.validation.Valid; @@ -49,7 +50,7 @@ public class BuildHomeActController { @At @SaCheckPermission("buildHome.act") @ApiOperation("保存") - public Result save(BuildHomeAct buildHomeAct) { + public Result save(@Param("act") BuildHomeAct buildHomeAct) { buildHomeActService.insertOrUpdate(buildHomeAct); return Result.success(); } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeKpiPlanController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeKpiPlanController.java index c899553..540b772 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeKpiPlanController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeKpiPlanController.java @@ -5,9 +5,11 @@ import cn.hutool.core.util.StrUtil; 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.zhgh.dayofficework.buildHome.models.BuildHomeAct; import com.budwk.app.zhgh.dayofficework.buildHome.models.BuildHomeKpiCategory; import com.budwk.app.zhgh.dayofficework.buildHome.models.BuildHomeKpiItem; import com.budwk.app.zhgh.dayofficework.buildHome.models.BuildHomeKpiPlan; +import com.budwk.app.zhgh.dayofficework.buildHome.service.BuildHomeActService; import com.budwk.app.zhgh.dayofficework.buildHome.service.BuildHomeKpiPlanService; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -36,6 +38,8 @@ public class BuildHomeKpiPlanController { private Dao dao; @Inject private BuildHomeKpiPlanService buildHomeKpiPlanService; + @Inject + private BuildHomeActService buildHomeActService; @At("") @SaCheckPermission("buildHome.kpi.plan") @@ -49,12 +53,12 @@ public class BuildHomeKpiPlanController { @ApiOperation("保存") @Aop(TransAop.READ_COMMITTED) public Result save(@Param("plan") BuildHomeKpiPlan plan) { - if (StrUtil.isBlank(plan.getId())) { - int count = dao.count(BuildHomeKpiPlan.class, Cnd.where(BuildHomeKpiPlan::getYear, "=", plan.getYear())); - if (count > 0) { - return Result.error("该年份考核计划已存在,请勿重复添加。"); - } - } +// if (StrUtil.isBlank(plan.getId())) { +// int count = dao.count(BuildHomeKpiPlan.class, Cnd.where(BuildHomeKpiPlan::getYear, "=", plan.getYear())); +// if (count > 0) { +// return Result.error("该年份考核计划已存在,请勿重复添加。"); +// } +// } if (StrUtil.isNotBlank(plan.getId())) { dao.clear(BuildHomeKpiCategory.class, Cnd.where(BuildHomeKpiCategory::getPlanId, "=", plan.getId())); @@ -100,4 +104,11 @@ public class BuildHomeKpiPlanController { return Result.success(pagination); } + @At + @SaCheckPermission("buildHome.kpi.plan") + public Result listAct() { + List list = buildHomeActService.query(Cnd.NEW().desc(BuildHomeAct::getYear)); + return Result.success(list); + } + } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeKpiWriteController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeKpiWriteController.java index 7e34fc5..8a41c60 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeKpiWriteController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeKpiWriteController.java @@ -94,7 +94,7 @@ public class BuildHomeKpiWriteController { buildHomeKpiWriteService.exportDocx(id, os); // 下载生成的文件 CommonDownloadUtil.download( - "南京邮电大学分工会教职工之家建设考核评议自评表.docx", + "教职工之家建设考核评议自评表.docx", os.toByteArray(), response ); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeLittleHouseController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeLittleHouseController.java index f77322c..1f51afc 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeLittleHouseController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeLittleHouseController.java @@ -1,19 +1,15 @@ package com.budwk.app.zhgh.dayofficework.buildHome.controller; import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; -import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.exception.BaseException; 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.service.BaseService; import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.base.utils.SysOfficeTemplateUtil; import com.budwk.app.sys.models.Sys_union; -import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.dayofficework.buildHome.models.BuildHomeLittleHouse; import com.budwk.app.zhgh.dayofficework.buildHome.param.BuildHomeLittleHousePageForm; @@ -34,7 +30,6 @@ import org.nutz.mvc.annotation.Ok; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.ByteArrayOutputStream; -import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.List; diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeLogBookController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeLogBookController.java index a9481d4..1f8e782 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeLogBookController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeLogBookController.java @@ -11,7 +11,6 @@ import com.budwk.app.sys.services.SysDictService; import com.budwk.app.sys.services.SysRoleService; import com.budwk.app.sys.views.View_user; import com.budwk.app.web.commons.auth.utils.SecurityUtil; -import com.budwk.app.zhgh.dayofficework.buildHome.config.BuildHomeKpiWriteDynamicTableRenderPolicy; import com.budwk.app.zhgh.dayofficework.buildHome.models.BuildHomeKpiPlan; import com.budwk.app.zhgh.dayofficework.buildHome.models.BuildHomeKpiWrite; import com.deepoove.poi.XWPFTemplate; @@ -30,8 +29,6 @@ import org.nutz.mvc.annotation.Param; import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.InputStream; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -136,7 +133,7 @@ public class BuildHomeLogBookController { template.render(map).writeAndClose(os); // 下载生成的文件 CommonDownloadUtil.download( - "南京邮电大学分工会建家记录册.docx", + "分工会建家记录册.docx", os.toByteArray(), response ); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeMaterialController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeMaterialController.java index 0f149ad..9af8986 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeMaterialController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeMaterialController.java @@ -2,7 +2,6 @@ package com.budwk.app.zhgh.dayofficework.buildHome.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; @@ -27,7 +26,6 @@ import org.nutz.mvc.annotation.Param; import javax.validation.Valid; import java.util.ArrayList; -import java.util.List; @IocBean @At("/platform/buildHome/material") diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeMaterialQueryController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeMaterialQueryController.java index 3fdb397..e3584a1 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeMaterialQueryController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeMaterialQueryController.java @@ -1,43 +1,27 @@ package com.budwk.app.zhgh.dayofficework.buildHome.controller; import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.hutool.core.util.StrUtil; 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.utils.SysFileMinIoUtil; import com.budwk.app.zhgh.dayofficework.buildHome.models.BuildHomeAct; import com.budwk.app.zhgh.dayofficework.buildHome.models.BuildHomeMaterial; import com.budwk.app.zhgh.dayofficework.buildHome.service.BuildHomeActService; +import com.budwk.app.zhgh.dayofficework.buildHome.service.BuildHomeMaterialQueryService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; -import org.nutz.dao.Sqls; -import org.nutz.dao.sql.Sql; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; -import org.nutz.json.Json; -import org.nutz.lang.Streams; -import org.nutz.lang.util.ByteInputStream; -import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLConnection; -import java.util.HashSet; import java.util.List; -import java.util.Set; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; @IocBean @At("/platform/buildHome/material/query") @@ -50,6 +34,8 @@ public class BuildHomeMaterialQueryController { private Dao dao; @Inject private BuildHomeActService buildHomeActService; + @Inject + private BuildHomeMaterialQueryService buildHomeMaterialQueryService; @At("") @Ok("beetl:/platform/zhgh/dayofficework/buildHome/material/query/index.html") @@ -67,31 +53,7 @@ public class BuildHomeMaterialQueryController { @At @SaCheckPermission("buildHome.material.query") public Result pageData(@Valid PageForm pageForm, @Valid String actId) { - Sql sql = Sqls.create(""" - SELECT - t1.id, - t1.`name` AS unionName, - t1.unionCode, - t2.id IS NOT NULL AS isWrite, - t2.logBookFiles, - t2.selfEvaluationFiles, - t2.summaryFiles, - t2.annualWorkSummaryFiles, - t3.id AS actId - FROM - sys_union t1 - LEFT JOIN build_home_material t2 ON t2.unionId = t1.id - AND t2.actId = @actId - LEFT JOIN build_home_act t3 ON t3.id = t2.actId - AND t3.id = @actId - GROUP BY - t1.id, - t2.unionId - ORDER BY - t1.unionCode - """); - sql.setParam("actId", actId); - Pagination pagination = buildHomeActService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + Pagination pagination = buildHomeMaterialQueryService.pageData(pageForm, actId); return Result.success(pagination); } @@ -104,112 +66,23 @@ public class BuildHomeMaterialQueryController { } @At + @Ok("void") @SaCheckPermission("buildHome.material.query") public void exportZip(String actId, HttpServletResponse response) throws IOException { - Sql sql = Sqls.create(""" - SELECT - t1.id, - t1.`name` AS unionName, - t1.unionCode, - t2.id IS NOT NULL AS isWrite, - t2.logBookFiles, - t2.selfEvaluationFiles, - t2.summaryFiles, - t2.annualWorkSummaryFiles, - t3.id AS actId - FROM - sys_union t1 - LEFT JOIN build_home_material t2 ON t2.unionId = t1.id - AND t2.actId = @actId - LEFT JOIN build_home_act t3 ON t3.id = t2.actId - AND t3.id = @actId - WHERE t1.id = '3742a919fb6847f7a8dbe051a2ef0025' - GROUP BY - t1.id, - t2.unionId - ORDER BY - t1.unionCode - """); - sql.setParam("actId", actId); - List list = buildHomeActService.listMap(sql); - - // 2. 设置响应头 - response.setContentType("application/zip"); - response.setHeader("Content-Disposition", "attachment; filename=\"工会文件汇总.zip\""); - - // 3. 使用try-with-resources创建ZIP输出流 - try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) { - for (NutMap row : list) { - if (row.getInt("isWrite") == 1) { - String unionName = row.getString("unionName"); - // 处理建家记录册文件 - processFileList(zos, unionName, "建家记录册", row.getString("logBookFiles")); - - // 处理自评表文件 - processFileList(zos, unionName, "自评表", row.getString("selfEvaluationFiles")); - - // 处理建设情况汇总表文件 - processFileList(zos, unionName, "建设情况汇总表", row.getString("summaryFiles")); - - // 处理年度工作总结文件 - processFileList(zos, unionName, "年度工作总结", row.getString("annualWorkSummaryFiles")); - } - } - // 确保所有数据被刷新 - zos.finish(); - } catch (Exception e) { - response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "生成ZIP文件失败"); - e.printStackTrace(); + BuildHomeAct act = dao.fetch(BuildHomeAct.class, actId); + if(act.getIsCustomForm()){ + buildHomeMaterialQueryService.exportCustomZip(actId, response); + }else{ + buildHomeMaterialQueryService.exportNormalZip(actId, response); } } - - private void processFileList(ZipOutputStream zos, String unionName, String fileType, String filesJson) throws IOException { - if (StrUtil.isNotBlank(filesJson)) { - List files = Json.fromJsonAsList(NutMap.class, filesJson); - Set existingFileNames = new HashSet<>(); - for (NutMap file : files) { - String fileName = file.getString("name"); - String fileUrl = file.getString("url"); - - int start = fileUrl.indexOf("id=")+3; - String fileId = fileUrl.substring(start); - Sys_file sys_file = dao.fetch(Sys_file.class,fileId); - - byte[] bytes = SysFileMinIoUtil.getFileBytes(sys_file.getBucket(), sys_file.getStoragePath()); - - if(bytes == null || bytes.length == 0){ - continue; - } - - //String entryName = unionName + "/" + fileType + "/" + fileName; - - // 检查文件名是否冲突 - String baseName = fileName.contains(".") - ? fileName.substring(0, fileName.lastIndexOf(".")) - : fileName; - String extension = fileName.contains(".") - ? fileName.substring(fileName.lastIndexOf(".")) - : ""; - - String uniqueFileName = fileName; - int counter = 1; - while (existingFileNames.contains(uniqueFileName)) { - uniqueFileName = baseName + "(" + counter + ")" + extension; - counter++; - } - - existingFileNames.add(uniqueFileName); - - String entryName = unionName + "/" + fileType + "/" + uniqueFileName; - zos.putNextEntry(new ZipEntry(entryName)); - zos.write(bytes); - zos.closeEntry(); - } - } + @At + @Ok("void") + @SaCheckPermission("buildHome.material.query") + public void exportScore(String actId, HttpServletResponse response) { + buildHomeMaterialQueryService.exportScore(actId, response); } - - } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeAct.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeAct.java index 5cdf69f..8304707 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeAct.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeAct.java @@ -1,5 +1,6 @@ package com.budwk.app.zhgh.dayofficework.buildHome.models; +import cn.hutool.json.JSONObject; import com.budwk.app.base.model.BaseModel; import lombok.Data; import lombok.EqualsAndHashCode; @@ -49,4 +50,16 @@ public class BuildHomeAct extends BaseModel { @ColDefine(type = ColType.BOOLEAN) @Default("1") private Boolean enabled; + + @Column + @Comment("是否自定义表单") + @ColDefine(type = ColType.BOOLEAN) + @Default("0") + private Boolean isCustomForm; + + @Column + @Comment("表单配置") + @ColDefine(type = ColType.MYSQL_JSON) + private JSONObject formConfig; + } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeKpiPlan.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeKpiPlan.java index 730dfea..2911925 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeKpiPlan.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeKpiPlan.java @@ -30,6 +30,11 @@ public class BuildHomeKpiPlan extends BaseModel { @ColDefine(type = ColType.INT) private Integer year; + @Column + @Comment("关联活动ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String actId; + @Column @Comment("开始时间") @ColDefine(type = ColType.DATETIME) diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeMaterial.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeMaterial.java index 5f00dd2..c6e4d08 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeMaterial.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeMaterial.java @@ -51,4 +51,10 @@ public class BuildHomeMaterial extends BaseModel { @Comment("年度工作总结") @ColDefine(type = ColType.MYSQL_JSON) private List annualWorkSummaryFiles; + + @Column + @Comment("动态表单数据") + @ColDefine(type = ColType.MYSQL_JSON) + private JSONObject dynamicFormData; + } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/service/BuildHomeMaterialQueryService.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/service/BuildHomeMaterialQueryService.java new file mode 100644 index 0000000..c29ec4f --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/service/BuildHomeMaterialQueryService.java @@ -0,0 +1,37 @@ +package com.budwk.app.zhgh.dayofficework.buildHome.service; + +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.dayofficework.buildHome.models.BuildHomeMaterial; + +import javax.servlet.http.HttpServletResponse; + +public interface BuildHomeMaterialQueryService extends BaseService { + + /** + * 分页查询 + */ + Pagination pageData(PageForm pageForm, String actId); + + /** + * 导出分数汇总表 + * @param actId + * @param response + */ + void exportScore(String actId, HttpServletResponse response); + + /** + * 导出自定义类型的汇总材料 + * @param actId + * @param response + */ + void exportCustomZip(String actId, HttpServletResponse response); + + /** + * 导出普通类型的汇总材料 + * @param actId + * @param response + */ + void exportNormalZip(String actId, HttpServletResponse response); +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/service/impl/BuildHomeKpiWriteServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/service/impl/BuildHomeKpiWriteServiceImpl.java index 5908454..4a9c195 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/service/impl/BuildHomeKpiWriteServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/service/impl/BuildHomeKpiWriteServiceImpl.java @@ -2,7 +2,6 @@ package com.budwk.app.zhgh.dayofficework.buildHome.service.impl; import cn.hutool.core.date.DateUtil; import com.budwk.app.base.service.impl.BaseServiceImpl; -import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.base.utils.SysOfficeTemplateUtil; import com.budwk.app.sys.models.Sys_union; import com.budwk.app.web.commons.auth.utils.SecurityUtil; @@ -18,8 +17,6 @@ import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.util.NutMap; -import java.io.ByteArrayOutputStream; -import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.util.HashMap; diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/service/impl/BuildHomeMaterialQueryServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/service/impl/BuildHomeMaterialQueryServiceImpl.java new file mode 100644 index 0000000..7a52432 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/service/impl/BuildHomeMaterialQueryServiceImpl.java @@ -0,0 +1,319 @@ +package com.budwk.app.zhgh.dayofficework.buildHome.service.impl; + +import cn.afterturn.easypoi.entity.BaseTypeConstants; +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.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.base.utils.CommonDownloadUtil; +import com.budwk.app.sys.models.Sys_file; +import com.budwk.app.sys.utils.SysFileMinIoUtil; +import com.budwk.app.zhgh.dayofficework.buildHome.models.BuildHomeAct; +import com.budwk.app.zhgh.dayofficework.buildHome.models.BuildHomeMaterial; +import com.budwk.app.zhgh.dayofficework.buildHome.service.BuildHomeMaterialQueryService; +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.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.lang.util.NutMap; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +@IocBean(args = {"refer:dao"}) +public class BuildHomeMaterialQueryServiceImpl extends BaseServiceImpl implements BuildHomeMaterialQueryService { + + public BuildHomeMaterialQueryServiceImpl(Dao dao) { + super(dao); + } + + @Override + public Pagination pageData(PageForm pageForm, String actId) { + Sql sql = Sqls.create(""" + SELECT + t1.id, + t1.`name` AS unionName, + t1.unionCode, + t2.id IS NOT NULL AS isWrite, + t2.logBookFiles, + t2.selfEvaluationFiles, + t2.summaryFiles, + t2.annualWorkSummaryFiles, + t3.id AS actId + FROM + sys_union t1 + LEFT JOIN build_home_material t2 ON t2.unionId = t1.id + AND t2.actId = @actId + LEFT JOIN build_home_act t3 ON t3.id = t2.actId + AND t3.id = @actId + GROUP BY + t1.id, + t2.unionId + ORDER BY + t1.unionCode + """); + sql.setParam("actId", actId); + return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + } + + @Override + public void exportScore(String actId, HttpServletResponse response) { + BuildHomeAct act = dao().fetch(BuildHomeAct.class, actId); + + Sql sql = Sqls.create(""" + SELECT + t2.`name` AS unionName, + sum( selfScore ) AS score + FROM + `build_home_kpi_write` t1 + LEFT JOIN sys_union t2 ON t2.id = t1.unionId + LEFT JOIN build_home_kpi_plan t3 ON t3.id = t1.planId + WHERE + t3.actId = @actId + GROUP BY + t1.unionId + ORDER BY + t2.unionCode + """); + sql.setParam("actId", actId); + List list = listMap(sql); + + ArrayList exportEntities = new ArrayList<>(); + exportEntities.add(new ExcelExportEntity("分工会名称", "unionName", 30)); + + ExcelExportEntity scoreEntity = new ExcelExportEntity("自评分数", "score", 30); + scoreEntity.setType(BaseTypeConstants.DOUBLE_TYPE); + exportEntities.add(scoreEntity); + + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + exportParams.setTitle(act.getName()); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list); + CommonDownloadUtil.download(act.getName() + ".xlsx", workbook, response); + } + + @Override + public void exportCustomZip(String actId, HttpServletResponse response) { + BuildHomeAct act = dao().fetch(BuildHomeAct.class, actId); + JSONArray fields = act.getFormConfig().getJSONArray("rule"); + // 获取文件上传字段 + List uploadFields = fields.stream().map(JSONUtil::parseObj).filter(field -> field.getStr("type").equals("upload")).toList(); + + Sql sql = Sqls.create(""" + SELECT + t1.id, + t1.`name` AS unionName, + t1.unionCode, + t2.id IS NOT NULL AS isWrite, + t2.dynamicFormData, + t3.id AS actId + FROM + sys_union t1 + LEFT JOIN build_home_material t2 ON t2.unionId = t1.id + AND t2.actId = @actId + LEFT JOIN build_home_act t3 ON t3.id = t2.actId + AND t3.id = @actId + GROUP BY + t1.id, + t2.unionId + ORDER BY + t1.unionCode + """); + sql.setParam("actId", actId); + List list = listMap(sql); + + // 2. 设置响应头 + response.setContentType("application/zip"); + String zipName = "建家评比材料汇总.zip"; + response.setHeader("Content-Disposition", "attachment; filename*=" + URLUtil.encode(zipName)); + + // 3. 使用try-with-resources创建ZIP输出流 + try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) { + for (NutMap row : list) { + if (row.getInt("isWrite") == 1) { + String unionName = row.getString("unionName"); + String dynamicFormDataStr = row.getString("dynamicFormData"); + if (StrUtil.isNotBlank(dynamicFormDataStr)) { + + Set existingFileNames = new HashSet<>(); + + NutMap dynamicFormData = Json.fromJson(NutMap.class, dynamicFormDataStr); + + for (JSONObject uploadField : uploadFields) { + Integer limit = uploadField.getJSONObject("props").getInt("limit", 0); + String title = uploadField.getStr("title"); + + if (limit == 0) continue; + + List fileUrls = new ArrayList<>(); + + if (limit == 1) { + fileUrls.add(dynamicFormData.getString(uploadField.getStr("field"))); + } else { + fileUrls.addAll(dynamicFormData.getAsList(uploadField.getStr("field"), String.class)); + } + + List files = dao().query(Sys_file.class, Cnd.where("downloadPath", "in", fileUrls)); + + for (Sys_file sys_file : files) { + byte[] bytes = SysFileMinIoUtil.getFileBytes(sys_file.getBucket(), sys_file.getStoragePath()); + + if (bytes == null || bytes.length == 0) { + continue; + } + + String fileName = sys_file.getName(); + + // 检查文件名是否冲突 + String baseName = fileName.contains(".") ? fileName.substring(0, fileName.lastIndexOf(".")) : fileName; + String extension = fileName.contains(".") ? fileName.substring(fileName.lastIndexOf(".")) : ""; + + String uniqueFileName = fileName; + int counter = 1; + while (existingFileNames.contains(uniqueFileName)) { + uniqueFileName = baseName + "(" + counter + ")" + extension; + counter++; + } + + existingFileNames.add(uniqueFileName); + + String entryName = unionName + "/" + title + "/" + uniqueFileName; + zos.putNextEntry(new ZipEntry(entryName)); + zos.write(bytes); + zos.closeEntry(); + } + } + + } + } + } + + // 确保所有数据被刷新 + zos.finish(); + response.flushBuffer(); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + @Override + public void exportNormalZip(String actId, HttpServletResponse response) { + Sql sql = Sqls.create(""" + SELECT + t1.id, + t1.`name` AS unionName, + t1.unionCode, + t2.id IS NOT NULL AS isWrite, + t2.logBookFiles, + t2.selfEvaluationFiles, + t2.summaryFiles, + t2.annualWorkSummaryFiles, + t3.id AS actId + FROM + sys_union t1 + LEFT JOIN build_home_material t2 ON t2.unionId = t1.id + AND t2.actId = @actId + LEFT JOIN build_home_act t3 ON t3.id = t2.actId + AND t3.id = @actId + GROUP BY + t1.id, + t2.unionId + ORDER BY + t1.unionCode + """); + sql.setParam("actId", actId); + List list = listMap(sql); + + // 2. 设置响应头 + response.setContentType("application/zip"); + String zipName = "建家评比材料汇总.zip"; + response.setHeader("Content-Disposition", "attachment; filename*=" + URLUtil.encode(zipName)); + + // 3. 使用try-with-resources创建ZIP输出流 + try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) { + for (NutMap row : list) { + if (row.getInt("isWrite") == 1) { + String unionName = row.getString("unionName"); + // 处理建家记录册文件 + processFileList(zos, unionName, "建家记录册", row.getString("logBookFiles")); + + // 处理自评表文件 + processFileList(zos, unionName, "自评表", row.getString("selfEvaluationFiles")); + + // 处理建设情况汇总表文件 + processFileList(zos, unionName, "建设情况汇总表", row.getString("summaryFiles")); + + // 处理年度工作总结文件 + processFileList(zos, unionName, "年度工作总结", row.getString("annualWorkSummaryFiles")); + } + } + // 确保所有数据被刷新 + zos.finish(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void processFileList(ZipOutputStream zos, String unionName, String fileType, String filesJson) throws IOException { + if (StrUtil.isNotBlank(filesJson)) { + List files = Json.fromJsonAsList(NutMap.class, filesJson); + Set existingFileNames = new HashSet<>(); + for (NutMap file : files) { + String fileName = file.getString("name"); + String fileUrl = file.getString("url"); + + int start = fileUrl.indexOf("id=") + 3; + String fileId = fileUrl.substring(start); + Sys_file sys_file = dao().fetch(Sys_file.class, fileId); + + byte[] bytes = SysFileMinIoUtil.getFileBytes(sys_file.getBucket(), sys_file.getStoragePath()); + + if (bytes == null || bytes.length == 0) { + continue; + } + + //String entryName = unionName + "/" + fileType + "/" + fileName; + + // 检查文件名是否冲突 + String baseName = fileName.contains(".") + ? fileName.substring(0, fileName.lastIndexOf(".")) + : fileName; + String extension = fileName.contains(".") + ? fileName.substring(fileName.lastIndexOf(".")) + : ""; + + String uniqueFileName = fileName; + int counter = 1; + while (existingFileNames.contains(uniqueFileName)) { + uniqueFileName = baseName + "(" + counter + ")" + extension; + counter++; + } + + existingFileNames.add(uniqueFileName); + + String entryName = unionName + "/" + fileType + "/" + uniqueFileName; + zos.putNextEntry(new ZipEntry(entryName)); + zos.write(bytes); + zos.closeEntry(); + } + } + } +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/school/MemberSchoolUnionManageController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/school/MemberSchoolUnionManageController.java index 1727a3f..1f89c70 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/school/MemberSchoolUnionManageController.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/school/MemberSchoolUnionManageController.java @@ -1,18 +1,31 @@ package com.budwk.app.zhgh.staffmanage.member.controller.school; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.bean.BeanUtil; import com.budwk.app.base.annotation.RepeatSubmit; import com.budwk.app.base.annotation.SLog; +import com.budwk.app.base.constant.BpmProcessConstant; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; +import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum; +import com.budwk.app.bpm.models.BpmProcessInstance; +import com.budwk.app.bpm.models.BpmProcessTask; +import com.budwk.app.bpm.param.BpmTaskApprovalParam; +import com.budwk.app.bpm.service.BpmService; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeOrigin; import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord; import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberManagePageForm; import com.budwk.app.zhgh.staffmanage.member.service.MemberManageService; import lombok.extern.slf4j.Slf4j; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; 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.lang.Lang; import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; @@ -20,6 +33,7 @@ import org.nutz.mvc.annotation.Param; import javax.validation.Valid; import java.util.List; +import java.util.Map; /** * @version 1.0 @@ -34,6 +48,10 @@ import java.util.List; @Ok("json") public class MemberSchoolUnionManageController { + @Inject + private Dao dao; + @Inject + private BpmService bpmService; @Inject private MemberManageService memberManageService; @@ -70,6 +88,7 @@ public class MemberSchoolUnionManageController { @At @RepeatSubmit + @Aop(TransAop.READ_COMMITTED) @SaCheckPermission("member.branchUnion.manage.list") @SLog(tag = "校工会管理-会员管理", type = "MemberBranchManageList", msg = "校工会普通变更") public Result generalMemberChange(@Param("record") MemberApplyRecord record, @Param("approvalRemark") String approvalRemark){ @@ -77,13 +96,35 @@ public class MemberSchoolUnionManageController { try { // 校验是否有变更的字段 List changeInfoList = memberManageService.compareMemberChangeInfo(record); - // 存储变更的类型 - List changeTypeList = memberManageService.compareMemberChangeType(changeInfoList, record); - record.setChangeTypes(changeTypeList); - record.setChangeOrigin(MemberChangeOrigin.SCHOOL_UNION.name()); - record.setRemark(approvalRemark); - memberManageService.insert(record); - memberManageService.compareMemberChangeInfoAndUpdateUser(record); + + if (Lang.isNotEmpty(changeInfoList)) { + // 存储变更的类型 + List changeTypeList = memberManageService.compareMemberChangeType(changeInfoList, record); + record.setChangeTypes(changeTypeList); + record.setChangeOrigin(MemberChangeOrigin.SCHOOL_UNION.name()); + record.setRemark(approvalRemark); + memberManageService.insert(record); + + // 开启流程,留痕 + bpmService.startSubmitProcessInstance(BpmProcessConstant.MEMBER_BRANCH_UNION_CHANGE.name(), + "【会员分工会变更】" +record.getUsername(), record.getId(), + List.of(SecurityUtil.getUserLoginname()), null); + // 然后完成申请流程 + BpmProcessInstance committeeInstance = dao.fetch(BpmProcessInstance.class, Cnd.where("processInstanceBusinessId", "=", record.getId())); + BpmProcessTask committeeTask = dao.fetch(BpmProcessTask.class, Cnd.where(BpmProcessTask::getProcessInstanceId, "=", committeeInstance.getId()) + .desc(BpmProcessTask::getCreatedAt)); + BpmTaskApprovalParam committeeParam = new BpmTaskApprovalParam(); + committeeParam.setProcessInstanceId(committeeInstance.getId()); + committeeParam.setProcessInstanceBusinessId(record.getId()); + committeeParam.setProcessInstanceTaskId(committeeTask.getId()); + committeeParam.setBpmTaskApprovalType(BpmTaskApprovalTypeEnum.PASS.name()); + committeeParam.setBpmTaskApprovalTypeEnum(BpmTaskApprovalTypeEnum.PASS); + committeeParam.setApprovalOpinion("校工会会审核通过"); + bpmService.completeTask(committeeParam.getProcessInstanceTaskId(), committeeParam.getBpmTaskApprovalTypeEnum(), null, null); + + // 更新用户信息 + memberManageService.compareMemberChangeInfoAndUpdateUser(record); + } return Result.success(); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/param/pageform/MemberStatisticsPageForm.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/param/pageform/MemberStatisticsPageForm.java index 860d8b4..9f6d84f 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/param/pageform/MemberStatisticsPageForm.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/param/pageform/MemberStatisticsPageForm.java @@ -1,6 +1,8 @@ package com.budwk.app.zhgh.staffmanage.member.param.pageform; import com.budwk.app.base.param.PageForm; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; @@ -13,50 +15,86 @@ import java.util.List; * @Date 2024/8/8 14:49 * @注释 */ -@EqualsAndHashCode(callSuper = true) @Data +@ApiModel("会员综合查询") +@EqualsAndHashCode(callSuper = true) public class MemberStatisticsPageForm extends PageForm { + @ApiModelProperty(value = "是否有单位") private String isUnit; + @ApiModelProperty(value = "是否有工会") private String isUnion; + @ApiModelProperty(value = "查询类型") private String searchType; + @ApiModelProperty(value = "开始时间(生日)") private String startDate; + @ApiModelProperty(value = "结束时间(生日)") private String endDate; + @ApiModelProperty(value = "查询年份") private Integer year; + @ApiModelProperty(value = "查询月份") + private Integer month; + + @ApiModelProperty(value = "查询工会id") private List unionId; + @ApiModelProperty(value = "查询单位id") private List unitId; + @ApiModelProperty(value = "查询工会组id") private List unionGroupId; + @ApiModelProperty(value = "查询人员类型") private List personTypes; + @ApiModelProperty(value = "查询编制类型") private List preparedBys; + @ApiModelProperty(value = "查询在职状态") private List userStates; + @ApiModelProperty(value = "查询会员状态") private List memberStatus; + @ApiModelProperty(value = "查询校区") private String campus; + @ApiModelProperty(value = "查询会员类型") private List memberTypes; + @ApiModelProperty(value = "查询性别") private List sexTypes; + @ApiModelProperty(value = "查询角色") private List roleIds; + @ApiModelProperty(value = "查询年龄") private List age; + @ApiModelProperty(value = "是否反选") private Boolean reverseSelection; + @ApiModelProperty(value = "会员查询名称") private String memberSearchName; + @ApiModelProperty(value = "会员查询关键字") private String memberSearchKeyWord; + @ApiModelProperty(value = "开始加入时间(会员)") + private String startJoinDate; + + @ApiModelProperty(value = "结束加入时间(会员)") + private String endJoinDate; + + @ApiModelProperty(value = "开始离会时间(会员)") + private String startLeaveDate; + + @ApiModelProperty(value = "结束离会时间(会员)") + private String endLeaveDate; } diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberStatisticsServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberStatisticsServiceImpl.java index 10a0641..7009c45 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberStatisticsServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberStatisticsServiceImpl.java @@ -60,7 +60,7 @@ public class MemberStatisticsServiceImpl extends BaseServiceImpl imple cnd.orderBy(pageForm.getPageOrderName(), pageForm.getPageOrderBy().equalsIgnoreCase("ascending") ? "ASC" : "DESC"); } - if (Lang.isNotEmpty(pageForm.getAge()) && !"0".equals(pageForm.getAge().get(0)) && !"0".equals(pageForm.getAge().get(1))) { + if (Lang.isNotEmpty(pageForm.getAge()) && !"0".equals(pageForm.getAge().get(1))) { if (reverseSelection) { cnd.andNot("TIMESTAMPDIFF(YEAR, u.birthday, CURDATE())", "between", pageForm.getAge().toArray()); } else { @@ -76,6 +76,22 @@ public class MemberStatisticsServiceImpl extends BaseServiceImpl imple } } + if (StrUtil.isAllNotBlank(pageForm.getStartJoinDate(), pageForm.getEndJoinDate())) { + if (reverseSelection) { + cnd.andNot("DATE(u.memberJoinTime)", "between", new String[]{pageForm.getStartJoinDate(), pageForm.getEndJoinDate()}); + } else { + cnd.and("DATE(u.memberJoinTime)", "between", new String[]{pageForm.getStartJoinDate(), pageForm.getEndJoinDate()}); + } + } + + if (StrUtil.isAllNotBlank(pageForm.getStartLeaveDate(), pageForm.getEndLeaveDate())) { + if (reverseSelection) { + cnd.andNot("DATE(u.memberLeaveTime)", "between", new String[]{pageForm.getStartLeaveDate(), pageForm.getEndLeaveDate()}); + } else { + cnd.and("DATE(u.memberLeaveTime)", "between", new String[]{pageForm.getStartLeaveDate(), pageForm.getEndLeaveDate()}); + } + } + if (Strings.isNotBlank(pageForm.getStartDate()) && Strings.isBlank(pageForm.getEndDate())) { cnd.and("DATE(u.birthday)", GE_OR_NGE_OP, pageForm.getStartDate()); } diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/specialstaff/controller/SpecialStaffManageController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/specialstaff/controller/SpecialStaffManageController.java index 29f8cc4..157ffc6 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/specialstaff/controller/SpecialStaffManageController.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/specialstaff/controller/SpecialStaffManageController.java @@ -156,7 +156,7 @@ public class SpecialStaffManageController { select id,username,loginname,unitId,unitName,unionId,unionName from `vw_user` $condition limit 0,10 """); Cnd cnd = Cnd.NEW(); - cnd.where("id", "not in", "(select userId from special_staff)"); + cnd.and("id", "not in", "(select userId from special_staff)"); if (StrUtil.isNotBlank(keyWord)) { SqlExpressionGroup seg = new SqlExpressionGroup(); seg.orLike("username", keyWord); 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 963a999..a6d1c14 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 @@ -158,9 +158,12 @@ public class WelfareListController { if (user != null) { WelfareList list = new WelfareList(); list.setUserId(user.getId()); - list.setWelfareUnitId(user.getUnionId()); + list.setWelfareUnitId(user.getUnitId()); + list.setWelfareUnitName(user.getUnitName()); + list.setWelfareUnionId(user.getUnionId()); + list.setWelfareUnionName(user.getUnionName()); list.setProjectId(businessId); - list.setWelfareSecondLevelUnitId(user.getUnitId()); +// list.setWelfareSecondLevelUnitId(user.getUnitId()); list.setPersonType(user.getPersonType()); list.setUserState(user.getUserState()); welfareLists.add(list); diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java index af802de..2208329 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java @@ -370,8 +370,10 @@ public class WelfareListServiceImpl extends BaseServiceImpl impleme WelfareList welfareList = new WelfareList(); welfareList.setProjectId(id); welfareList.setUserId(v.getId()); - welfareList.setWelfareUnitId(v.getUnionId()); - welfareList.setWelfareSecondLevelUnitId(v.getUnitId()); + welfareList.setWelfareUnitId(v.getUnitId()); + welfareList.setWelfareUnitName(v.getUnitName()); + welfareList.setWelfareUnionId(v.getUnionId()); + welfareList.setWelfareUnionName(v.getUnionName()); welfareList.setPersonType(v.getPersonType()); welfareList.setUserState(v.getUserState()); return welfareList; diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareProjectServiceImpl.java b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareProjectServiceImpl.java index 7f103fc..4e48851 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareProjectServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareProjectServiceImpl.java @@ -175,8 +175,10 @@ public class WelfareProjectServiceImpl extends BaseServiceImpl i WelfareList list = new WelfareList(); list.setProjectId(projectId); list.setUserId(user.getString("id")); - list.setWelfareUnitId(user.getString("unionId")); - list.setWelfareSecondLevelUnitId(user.getString("unitId")); + list.setWelfareUnitId(user.getString("unitId")); + list.setWelfareUnitName(user.getString("unitName")); + list.setWelfareUnionId(user.getString("unionId")); + list.setWelfareUnionName(user.getString("unionName")); list.setPersonType(user.getString("personType")); list.setUserState(user.getString("userState")); lists.add(list); diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareSelectionSituationServiceImpl.java b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareSelectionSituationServiceImpl.java index 262fdd0..e02c8df 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareSelectionSituationServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareSelectionSituationServiceImpl.java @@ -14,6 +14,7 @@ import com.budwk.app.base.utils.PageUtil; import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.welfare.model.WelfareList; +import com.budwk.app.zhgh.welfare.model.WelfareProject; import com.budwk.app.zhgh.welfare.param.WelfareSelectionSituationPageForm; import com.budwk.app.zhgh.welfare.service.WelfareSelectionSituationService; import lombok.extern.slf4j.Slf4j; @@ -45,8 +46,10 @@ public class WelfareSelectionSituationServiceImpl extends BaseServiceImpl list = listMap(sql); + // 项目 + WelfareProject project = dao().fetch(WelfareProject.class, pageForm.getProjectId()); + // excel列 List entities = new ArrayList<>(); @@ -163,6 +170,10 @@ public class WelfareSelectionSituationServiceImpl extends BaseServiceImpl welfareSelectionList = listMap(sql); @@ -96,11 +97,11 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl v.getString("welfareUnionId").equals(union.getString("id"))).count(); + long teacherSum = welfareSelectionList.stream().filter(v -> v.getString("welfareUnionId", "").equals(union.getString("id"))).count(); union.put("teacherSum", teacherSum); // 已选人数 - long selectedNum = welfareSelectionList.stream().filter(v -> v.getString("welfareUnionId").equals(union.getString("id")) && v.getBoolean("has_selected")).count(); + long selectedNum = welfareSelectionList.stream().filter(v -> v.getString("welfareUnionId", "").equals(union.getString("id")) && v.getBoolean("has_selected")).count(); union.put("selectedNum", selectedNum); // 未选人数 @@ -247,7 +248,7 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl +
+ +
@@ -156,7 +159,7 @@ module.exports = { } .card_scroll { - max-height: calc(100vh - 56px - 40px - 30px - 50px - 34px); + max-height: calc(100vh - 56px - 40px - 30px - 50px - 34px - 50px - 10px); overflow-y: auto; position: relative; } diff --git a/src/main/resources/views/layouts/platform.html b/src/main/resources/views/layouts/platform.html index 1ae3595..2d1bc99 100644 --- a/src/main/resources/views/layouts/platform.html +++ b/src/main/resources/views/layouts/platform.html @@ -261,12 +261,7 @@