feat: 会议材料上传/发票OCR识别/用户管理增强 + 日志降噪 + 薪亿通接口规范

- 会议/劳务材料支持直接上传与提交审核 (BizMeetingMaterial 等)
- 发票 OCR 识别增强 (InvoiceOcrService)
- 现场照片/证书批量导入覆盖式回填 (ExcelUtil/AttendeeImportVo/CameraQrUpload)
- 用户管理增强、超级管理员校验与权限拒绝处理 (SuperManagerChecker/AccessDeniedHandlerImpl)
- 日志级别调整为 info/warn (生产降噪)
- 新增薪亿通·个人票税接口规范文档 (自然人开票服务分册 + 轻量化对接分册)
- .gitignore 排除 key.txt/*.rdb/*.key/tmp/opt 等敏感与本地文件

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
2026-11-12 01:13:17 +00:00
co-authored by Claude Code
parent 44d4920777
commit 3f587fbd9f
39 changed files with 1544 additions and 192 deletions
@@ -239,6 +239,16 @@ public interface ISysUserService
*/
public int updateRoleType(Long userId, String roleType);
/**
* 切换合规人员(manager)的「全局管理员」标记 (复用 account_type: MAIN=全局管理员可见全量 / SUB=普通合规员只看本人创建).
* 仅对 role_type=manager 生效, 其它角色抛异常 (executor/sponsor 的 account_type 走「更换管理员」流程).
*
* @param userId 用户ID
* @param accountType 'MAIN' / 'SUB'
* @return 影响行数
*/
public int updateManagerAdmin(Long userId, String accountType);
/**
* 导入用户数据
*
@@ -231,6 +231,28 @@ public class SysUserServiceImpl implements ISysUserService
return userMapper.updateRoleType(userId, roleType);
}
/**
* 切换合规人员(manager)的「全局管理员」标记 (复用 account_type).
* 仅 manager 可切; parent_user_id 保持 NULL (manager 的 SUB 只是「受限」标记, 非真子账号).
* null 相当于 SUB (普通合规员), 兼容历史 null 数据.
*/
@Override
public int updateManagerAdmin(Long userId, String accountType)
{
SysUser target = userMapper.selectUserById(userId);
if (target == null)
{
throw new ServiceException("用户不存在");
}
if (!"manager".equals(target.getRoleType()))
{
throw new ServiceException("仅合规人员可切换全局管理员");
}
// 仅 MAIN 视为全局管理员; 其余 (null / SUB / '') 一律归一为 SUB
String effective = "MAIN".equals(accountType) ? "MAIN" : "SUB";
return userMapper.updateAccountType(userId, effective, null);
}
/**
* 校验手机号是否已注册
*/