feat: 会议提交剩余时间+解冻 + 会务/劳务材料批量下载 + 多角色人员/账号模块完善

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
郭庆泰
2026-08-25 06:53:18 +08:00
co-authored by Claude
parent 0c882ae846
commit 591a43fe61
126 changed files with 3789 additions and 1334 deletions
@@ -148,9 +148,10 @@ public class SysLoginService
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
throw new UserPasswordNotMatchException();
}
// 用户名不在指定范围内 错误
if (username.length() < UserConstants.USERNAME_MIN_LENGTH
|| username.length() > UserConstants.USERNAME_MAX_LENGTH)
// 用户名不在指定范围内 错误 (邮箱登录含 @ 不受 2-20 位限制)
if (!username.contains("@")
&& (username.length() < UserConstants.USERNAME_MIN_LENGTH
|| username.length() > UserConstants.USERNAME_MAX_LENGTH))
{
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
throw new UserPasswordNotMatchException();
@@ -38,6 +38,11 @@ public class UserDetailsServiceImpl implements UserDetailsService
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
{
SysUser user = userService.selectUserByUserName(username);
// 用户名查不到且输入含 @ → 视为邮箱登录 (邮箱+密码)
if (StringUtils.isNull(user) && username.contains("@"))
{
user = userService.selectUserByEmail(username);
}
if (StringUtils.isNull(user))
{
log.info("登录用户:{} 不存在.", username);
@@ -54,6 +59,17 @@ public class UserDetailsServiceImpl implements UserDetailsService
throw new ServiceException(MessageUtils.message("user.blocked"));
}
// 子账号专属: 主账号 (parent_user_id) 被禁用 → 拦截登录
if (user.getParentUserId() != null)
{
SysUser parent = userService.selectUserById(user.getParentUserId());
if (parent != null && UserStatus.DISABLE.getCode().equals(parent.getStatus()))
{
log.info("登录用户:{} 所属机构主账号已禁用.", username);
throw new ServiceException("您所属的机构已禁用");
}
}
passwordService.validate(user);
return createLoginUser(user);