# 2026-07-18

## 生产日志报错分析（cms-api）

用户贴了一段 cms-api 容器日志，三类信息，结论如下：

1. **`Table 'modules.sys_user' doesn't exist`（真 bug，影响功能）**
   - 根因：部署的 MySQL 库名是 `modules`（`application-prod.yml`/`application-cms.yml` 中 `jdbc:mysql://.../modules`），而 `common.system.entity.User` 实体 `@TableName("sys_user")`，且 cms 模块多处使用 `UserService`（`CmsNavigationController`、`CmsArticleController`、`LeadReferralServiceImpl` 等）。`modules` 库里缺 `sys_user` 系统表 → 任何依赖查 `sys_user` 的请求抛 `SQLSyntaxErrorException` → 500。
   - 性质：数据库初始化/迁移遗漏，**不是代码逻辑 bug**（代码正确，库缺表）。仓库内无 `sys_user` 建表 SQL，说明系统基础表由外部初始化脚本/主 server 工程提供。
   - 修复方向：在 `modules` 库执行系统基础 schema（建 `sys_user` 等系统表）。需找到对应 init SQL。

2. **`参数类型转换异常: 参数名=id, 传入值=resolveDomain/getByDomain/submitForm/.../NaN`（噪音，不影响）**
   - 来源：`BaseController.handleMethodArgumentTypeMismatch`（`@ExceptionHandler(MethodArgumentTypeMismatchException)`），扫描器/爬虫用方法名字符串（resolveDomain、submitForm 等）和 NaN 探测 `id`(Integer) 参数，被拦截并返回友好错误。属公网 API 被扫描，无功能影响。建议：改用 logger 替代 `System.err.println`，必要时加限流/WAF。

3. **`定时任务需要查询所有租户的超时订单 list = 0`（正常，不影响）**
   - 来源：`OrderCancelServiceImpl.findExpiredUnpaidOrders` 的 `System.out.println`，表示当前无超时未支付订单。正常运维日志。

## 修复：sys_ 系统表改指 gxwebsoft_core schema

用户确认架构意图：系统表（sys_ 前缀）本就在中央库 `gxwebsoft_core`（与 `modules` 同实例 `1Panel-mysql-Bqdt`），pwl 模块 Mapper XML 早就在用 `gxwebsoft_core.sys_user`/`gxwebsoft_core.sys_dict_data`。原报错是实体 `@TableName("sys_xxx")` 默认落到数据源默认库 `modules` 导致表缺失。

已用脚本批量修改（精确、白名单防误伤）：
- 33 个实体 `@TableName("sys_xxx")` → `"gxwebsoft_core.sys_xxx"`（全部在 `common/system/entity`）。
- 19 个 Mapper XML 里 `FROM/JOIN` 后的 `sys_` 表名加 `gxwebsoft_core.` 前缀（31 处，全在 `common/system/mapper/xml`）。
- 其他模块（pwl/shop/app）对 sys_ 表的引用本来就是 `gxwebsoft_core.` 开头，未动。
- `MybatisPlusConfig` 无全局表前缀，无冲突。

校验：裸 `@TableName("sys_`=0、裸 `FROM/JOIN sys_`=0、重复前缀=0。`UserInfo`/`EmailRecord`/`Payment` 等 sys_ 实体也已覆盖。

注意点（已告知用户）：
- 需重新编译/重启 cms-api 容器生效。
- 确认 `modules` 库的连接账号对 `gxwebsoft_core` 有读写权限，且 `gxwebsoft_core` 里确实建齐了这些 sys_ 表。
- 多租户插件会给查询加 `tenant_id`，表结构/字段不变则行为不变。

## 生成 gxwebsoft_core 缺失系统表检查 SQL

从实体 `@TableName` 精确提取共 **31 张** `sys_` 表，生成 `docs/check_gxwebsoft_core_sys_tables.sql`。
含四种查法：① 只列缺失表（结果空=齐全）② 逐张 EXISTS/MISSING 状态 ③ 期望31/实际/缺失数量统计 ④ 确认 gxwebsoft_core 库存在+账号有权限。基于 `information_schema.tables` 比对，无副作用只读。
