diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/IPersonnelService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/IPersonnelService.java index 237697d..e2b8a15 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/IPersonnelService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/IPersonnelService.java @@ -95,6 +95,12 @@ public interface IPersonnelService { @ApiOperation(value = "账号唯一检查") void checkSysUserOnly(SysUser user); + @ApiOperation(value = "重置密码检查") + Integer checkSysUserResetPassword(SysUser user); + + @ApiOperation(value = "岗位关系检查") + void checkSysPositionRef(Long positionId); + @ApiOperation(value = "刷新组织冗余") void refreshRefSysUserOrganizeRdd(Long organizeIds); @@ -114,6 +120,7 @@ public interface IPersonnelService { @ApiOperation(value = "刷新用户岗位") void refreshRefSysUserInfoPosition(Long userInfoId, Long[] positionIds); + @ApiOperation(value = "刷新用户岗位") void refreshRefSysUserInfoPositionRdd(Long positionId); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/AuthController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/AuthController.java index ba939a3..0ff772b 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/AuthController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/AuthController.java @@ -140,7 +140,9 @@ public class AuthController extends CoreBaseController { for (SysMenu sysMenu : menus) { if(sysMenu.getMenuType().equals(CommonEnumUtil.METHOD_LEVEL.METHOD.getValue()) && menu.getId().longValue() == sysMenu.getParentId().longValue()){ - menu.getChildList().add(sysMenu); + if(!menu.getChildList().contains(sysMenu)){ + menu.getChildList().add(sysMenu); + } } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysEnumController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysEnumController.java index bb06701..adafc4f 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysEnumController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysEnumController.java @@ -154,4 +154,11 @@ public class SysEnumController extends CoreBaseController{ return new ResultBean(true, "操作成功", Arrays.asList(CommonEnumUtil.USER_INFO_STATUS.values())); } + + @GetMapping("/sys-config-value-type") + @ApiOperation(value = "系统参数值类型", notes = "用户状态") + public ResultBean getSysConfigValueType(){ + return new ResultBean(true, "操作成功", + Arrays.asList(ImppEnumUtil.SYS_CONFIG_VALUE_TYPE.values())); + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java index f84d41f..cb91230 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java @@ -355,6 +355,10 @@ public class SysUserController extends CoreBaseController{ try { SysUser user = sysUserService.getSysUserById(Long.parseLong(id)); if(user != null){ + Integer num = personnelService.checkSysUserResetPassword(user); + num = CommonConstWords.LOCK_USER_RESET_PASSWORD - num; + + String password = RandomStringUtils.random(6, true, false); user.setUserLoginPassword(EncryptTool.hexMD5(password)); sysUserService.updateSysUser(user); @@ -377,7 +381,9 @@ public class SysUserController extends CoreBaseController{ LOGGER.info("系统提示:{} 使用密码重置功能帮{}重置了{}账号的密码,新密码是:{}", getSessionUser().getUserName(),user.getUserName(),user.getUserLoginName(),password); - return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + + String result = "操作成功,【"+user.getUserName()+"】账号今日重置密码次数剩余" +num+ "次"; + return ResultBean.success(result).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }else{ return ResultBean.success("操作失败") .setCode(ResourceEnumUtil.MESSAGE.FAIL.getCode()) @@ -396,7 +402,6 @@ public class SysUserController extends CoreBaseController{ @ApiOperation(value = "发送验证码",notes = "发送邮件验证码") public ResultBean getEmailVerification(String email){ try { - SysUser user = sysUserService.getSysUserByEmail(email); if(user != null){ String verification = RandomStringUtils.random(6, true, false); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SystemLoginService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SystemLoginService.java index 3d967f8..b661388 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SystemLoginService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SystemLoginService.java @@ -109,7 +109,7 @@ public class SystemLoginService implements ISystemLoginService { redisCore.deleteKey(redisKey); sysUserRDao.update(user); }else{ - redisCore.putObject(redisKey,num,24 * 60 * 60); + redisCore.putObject(redisKey,num,CommonConstWords.REDIS_TIME_DAY_ONE); } return num; } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreTreeService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreTreeService.java index 242128b..6e6bc54 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreTreeService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreTreeService.java @@ -103,8 +103,18 @@ public class CoreTreeService implements ICoreTreeService { @Override @ApiOperation(value = "父节点检查",notes = "检查岗位的父节点是否是当前节点的子节点") public void doValidatorSysPositionParentId(SysPosition position) { - findSysPositionChildrenTreePack(position,0); - validatorSysPositionParentId(position.getChildList(),position.getParentId()); + if(position != null){ + if(position.getParentId().longValue() == position.getId().longValue()){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("上级岗位不能为当前岗位") + .setErrorSolution("请重新操作") + .build(); + } + findSysPositionChildrenTreePack(position,0); + validatorSysPositionParentId(position.getChildList(),position.getParentId()); + } } @Override diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/PersonnelServiceService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/PersonnelServiceService.java index 077041e..21a4f45 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/PersonnelServiceService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/PersonnelServiceService.java @@ -2,7 +2,7 @@ package cn.estsh.i3plus.core.apiservice.serviceimpl.busi; import cn.estsh.i3plus.core.api.iservice.busi.IPersonnelService; import cn.estsh.i3plus.core.apiservice.util.HqlModelPack; -import cn.estsh.i3plus.platform.common.tool.TimeTool; +import cn.estsh.i3plus.platform.common.util.CommonConstWords; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; @@ -15,14 +15,18 @@ import cn.estsh.i3plus.pojo.platform.sqlpack.CoreHqlPack; import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.exception.ImppExceptionEnum; +import cn.estsh.impp.framework.boot.util.ImppRedis; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateFormatUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.ArrayList; +import java.util.Date; import java.util.List; /** @@ -67,6 +71,8 @@ public class PersonnelServiceService implements IPersonnelService { @Autowired private SysPositionRepository positionRDao; + @Resource(name="redisCore") + protected ImppRedis redisCore; @Override public SysUser saveSysUser(SysUser user) { @@ -334,6 +340,67 @@ public class PersonnelServiceService implements IPersonnelService { } } + @Override + @ApiOperation(value = "重置密码检查") + public Integer checkSysUserResetPassword(SysUser user) { + LOGGER.debug("平台用户岗位 SysUser user:{}", user); + Integer num = 0; + if(user != null){ + String day = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.format(new Date()); + String redisKey = CommonConstWords.REDIS_PREFIX_USER_RESET_PASSWORD + "-" + day + "-" + user.getId(); + Object redisValue = redisCore.getObject(redisKey); + num = redisValue == null ? 1 : Integer.parseInt(redisValue.toString()) + 1; + + if(num > CommonConstWords.LOCK_USER_RESET_PASSWORD){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.USER_PERMISSION_RUN_OUT.getCode()) + .setErrorDetail("重置密码次数已使用完毕") + .setErrorSolution("请明日再次使用") + .build(); + } + redisCore.putObject(redisKey,num,CommonConstWords.REDIS_TIME_DAY_ONE); + } + return num; + } + + @Override + public void checkSysPositionRef(Long positionId) { + LOGGER.debug("平台岗位 SysPosition positionId:{}", positionId); + + if(positionId != null){ + long positionCount = positionRDao.findByPropertyCount("parentId",positionId); + if (positionCount >= 1) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("存在相关岗位信息无法删除!") + .setErrorSolution("请先删除子集信息在操作") + .build(); + } + + long refPositionCount = refUserPositionRDao.findByPropertyCount("positionId",positionId); + if (refPositionCount >= 1) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("存在用户关系引用信息无法删除!") + .setErrorSolution("请先删除用户关系信息再操作") + .build(); + } + + long refUserInfoCount = userInfoRDao.findByPropertyCount("positionId",positionId); + if (refUserInfoCount >= 1) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("存在用户信息无法删除!") + .setErrorSolution("请先删除用户引用信息再操作") + .build(); + } + } + } + /************************************ 用户唯一检查 ****************************************/ /** @@ -630,6 +697,52 @@ public class PersonnelServiceService implements IPersonnelService { @Override public void refreshRefSysUserInfoPositionRdd(Long positionId) { + List result = new ArrayList<>(); // 需要更新的用户ID 集合 + + // 更新关系表中数据 + if(positionId != null){ + SysPosition position = positionRDao.getById(positionId); + if(position != null){ + List list = refUserPositionRDao.findByProperty("positionId", position.getId()); + if(list != null && list.size() > 0){ + + // 更新关系表中的冗余信息 + refUserPositionRDao.updateByProperties( + "positionId",position.getId(), + "positionNameRdd", position.getName()); + + // 更新父节点冗余信息 + positionRDao.updateByProperties("parentId",position.getId(), + "parentNameRdd",position.getName()); + + for (SysRefUserPosition ref : list) { + result.add(ref.getUserId()); + } + } + } + } + // 删除关系表中数据 + refUserPositionRDao.deleteByProperty("positionId", positionId); + + // 获取需要更新的用户 + StringBuffer strWhere = new StringBuffer(); + List nameList = null; + HqlPack.getInPack(StringUtils.join(result, ","), "userId", strWhere); + List infoList = userInfoRDao.findByHqlWhere(strWhere.toString()); + + // 更新用户的冗余信息 + if(infoList != null && infoList.size() > 0){ + for (SysUserInfo info : infoList) { + List list = refUserPositionRDao.findByProperty("userId", info.getId()); + if (list != null) { + for (SysRefUserPosition ref : list) { + nameList.add(ref.getPositionNameRdd()); + } + } + info.setPositionNamesRdd(StringUtils.join(nameList, ",")); + userInfoRDao.save(info); + } + } } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysPositionService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysPositionService.java index d90808a..b0275d7 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysPositionService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysPositionService.java @@ -1,5 +1,6 @@ package cn.estsh.i3plus.core.apiservice.serviceimpl.busi; +import cn.estsh.i3plus.core.api.iservice.busi.IPersonnelService; import cn.estsh.i3plus.core.api.iservice.busi.ISysPositionService; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; @@ -40,6 +41,9 @@ public class SysPositionService implements ISysPositionService { @Autowired private SysUserRepository sysUserRDao; + @Autowired + private IPersonnelService personnelService; + @Override @ApiOperation(value = "新增岗位信息") public SysPosition insertSysPosition(SysPosition position) { @@ -105,45 +109,31 @@ public class SysPositionService implements ISysPositionService { LOGGER.info("岗位信息 POSITION position:{}", position); positionRDao.update(position); // 修改冗余信息 - positionRDao.updateByProperties("parentId",position.getId(), - "parentNameRdd",position.getName()); + personnelService.refreshRefSysUserInfoPositionRdd(position.getId()); } @Override @ApiOperation(value = "删除岗位信息",notes = "根据ID 删除岗位信息") public void deleteSysPositionById(Long id) { - // 查询是否存在子级 LOGGER.info("岗位信息 POSITION id:{}", id); - long positionCount = positionRDao.findByPropertyCount("parentId",id); - if (positionCount >= 1) { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) - .setErrorDetail("存在相关岗位信息无法删除!") - .setErrorSolution("请先删除子集信息在操作") - .build(); - } + personnelService.checkSysPositionRef(id); - // 删除岗位信息 - LOGGER.info("岗位信息 POSITION id:{}", id); positionRDao.deleteById(id); + personnelService.refreshRefSysUserInfoPositionRdd(id); } @Override @ApiOperation(value = "删除岗位信息",notes = "根据ID 批量删除岗位信息") public void deleteSysPositionByIds(Long[] ids) { LOGGER.info("岗位信息 POSITION ids:{}", ids); - long positionCount = positionRDao.findByHqlWhereCount(CoreHqlPack.packHqlIds("parentId",ids)); - // 判断是否有子节点 - if (positionCount <= 0) { - positionRDao.deleteByIds(ids); - }else { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) - .setErrorDetail("存在相关岗位信息无法删除!") - .setErrorSolution("请重新操作") - .build(); + // 检查是否存在引用关系 + for (Long id : ids) { + personnelService.checkSysPositionRef(id); + } + positionRDao.deleteByIds(ids); + + for (Long id : ids) { + personnelService.refreshRefSysUserInfoPositionRdd(id); } } diff --git a/modules/i3plus-core-apiservice/src/main/resources/init/sys-config.xlsx b/modules/i3plus-core-apiservice/src/main/resources/init/sys-config.xlsx index 2eea674..4b31a23 100644 Binary files a/modules/i3plus-core-apiservice/src/main/resources/init/sys-config.xlsx and b/modules/i3plus-core-apiservice/src/main/resources/init/sys-config.xlsx differ