# 2026-09-26 统一执行记录(充电授权 + VIN 额度分配权限) > 执行环境:`221.182.45.100:8066`(Mycat 2.0,MySQL 5.7.33 兼容) > 执行时间:2026-09-26 23:06 ~ 23:17 > 目标逻辑库:`charging_pile_other` ## 一、执行结论 | 脚本 | 结果 | |---|---| | `20260926_charge_authorization.sql` | **无需执行**:`t_charge_authorization` 表已存在,结构与最新脚本完全一致(含 `partner_ids`、`uk_company_id`、全部最新注释) | | `20260926_charge_authorization_partner_ids.sql` | **无需执行**:`partner_ids` 列已存在,执行会报 `Duplicate column name` | | `20260926_vin_menu_repair.sql`(本次新建) | **已执行生效**:补齐 VIN 码管理菜单(父菜单 / 列表 / 6 个按钮) | | `20260926_vin_allocate_auth.sql` | **已执行生效**:额度分配按钮 `menu_id=315`,已授予管理员角色 | ## 二、执行中发现并修复的问题 1. **VIN 码管理菜单整体缺失**:`charging_pile_other.sys_menu` 中原无任何 VIN 相关菜单(`path LIKE '%vinManagement%'` 计数 = 0)。 根因:`20260901_vin_management.sql` 第 18 行起使用 `SET @变量 := (SELECT ...)`,**Mycat 2.0 不支持用户变量**,导致该脚本菜单部分静默不生效(建表部分正常)。 2. 受此影响,`20260926_vin_allocate_auth.sql` 首次执行**影响 0 行**(父菜单 `/vinManagement/list` 不存在,INSERT ... SELECT 无匹配行)。 3. 新增 `20260926_vin_menu_repair.sql`(纯子查询、无用户变量、全部幂等)补齐菜单后重跑权限脚本,生效。 4. 幂等性回归时发现 repair 脚本第 9 条(角色授权)`OR`/`AND` 优先级缺括号,重复执行报 `Duplicate entry '1-307' for key 'sys_role_menu.PRIMARY'`,已修复(菜单范围整体加括号)。 ## 三、当前库上状态(回查证据) `charging_pile_other.sys_menu` 新增记录: | menu_id | parent_id | 名称 | 类型 | perms | |---|---|---|---|---| | 307 | 0 | VIN码管理 | M | /vinManagement | | 308 | 307 | VIN码管理 | C | /vinManagement/list | | 309 | 308 | 新增 | F | /vinManagement/add | | 310 | 308 | 编辑 | F | /vinManagement/edit | | 311 | 308 | 删除 | F | /vinManagement/delete | | 312 | 308 | 启停 | F | /vinManagement/status | | 313 | 308 | 导入 | F | /vinManagement/import | | 314 | 308 | 导出 | F | /vinManagement/export | | 315 | 308 | 额度分配 | F | /vinManagement/allocate | `charging_pile_other.sys_role_menu`:以上 9 条菜单均已授予 `role_id = 1`(管理员)。 其他确认项: - `t_charge_authorization`:表存在、0 行数据(待后台配置)。 - `t_vin_management`(charging_pile_account):含 `company_id` / `fleet_id` / `init_quota` / `app_user_id`,20260924 额度脚本已生效。 - `t_fleet`、`t_group_company`(charging_pile_other):存在,字段齐备。 ## 四、幂等性验证 三个脚本各重复执行一次(`mysql -e "source ..."`): - `20260926_vin_menu_repair.sql` → EXIT=0,无错误 - `20260926_vin_allocate_auth.sql` → EXIT=0,无错误 - `20260926_charge_authorization.sql` → EXIT=0,无错误 - 回查计数:VIN 菜单 9 条、管理员授权 9 条(未产生重复数据) ## 五、执行后的功能验证(部署后) 1. 后端部署:`ruoyi-api-other` + `ruoyi-other`(充电授权)、`ruoyi-api-account` + `ruoyi-account`(VIN 额度分配);前端部署最新产物。 2. 公司管理 → 公司概况 → "充电授权":合作商多选 → 站点按合作商过滤 → 保存 → 重开弹窗回显;穿梭框"加入右侧"应生效。 3. VIN 码管理:左侧菜单与列表页"额度分配"按钮应可见可用(依赖本次菜单补齐)。 ## 六、执行方式备查 ```bash # 判断(只读) mysql -h -P8066 -uroot -p --default-character-set=utf8mb4 -e "SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA='charging_pile_other' AND TABLE_NAME='t_charge_authorization'" # 执行(Mycat 建议先复制为英文文件名,再逐脚本 source) mysql -h -P8066 -uroot -p --default-character-set=utf8mb4 -e "source <绝对路径>/20260926_vin_menu_repair.sql" ``` - 执行顺序:`20260926_vin_menu_repair.sql` → `20260926_vin_allocate_auth.sql`(额度分配按钮依赖 VIN码管理列表菜单)。 - `20260926_charge_authorization.sql` 与 `20260926_charge_authorization_partner_ids.sql` 为二选一分支;表已存在时两者都无需执行。 - Mycat 上避免 `SET @变量` / `PREPARE`,统一使用子查询写法(本目录脚本已按此改造)。 - 脚本均为 UTF-8,客户端建议 `--default-character-set=utf8mb4`;`ALTER TABLE` 属 DDL 不可回滚,生产执行前先备份。 ## 七、追加执行:余额预警配置建表(2026-09-27 00:1x,估算) | 脚本 | 结果 | |---|---| | `20260926_balance_warning.sql`(本次新建) | **已执行生效**:`charging_pile_other.t_company_balance_warning` 创建成功 | - 执行环境:`221.182.45.100:8066`(Mycat 2.0,`--default-character-set=utf8mb4`;脚本先复制为英文临时名再 `source`,并校验 `$LASTEXITCODE`;临时文件与回查导出已清理) - 回查证据:`SHOW CREATE TABLE charging_pile_other.t_company_balance_warning` 与脚本一致(`company_warn_amount` / `sub_warn_amount` decimal(12,2)、`notify_object` / `notify_type` tinyint、`create_time` / `update_time` / `del_flag`、唯一键 `uk_company_id`、中文列注释无乱码),表内 0 行(待后台配置) - 幂等性:`CREATE TABLE IF NOT EXISTS`,重复执行无副作用(生产可随部署直接重跑) - 部署后验证:公司管理 → 公司概况 → "预警配置"按钮打开弹窗,保存后重开弹窗回显(需部署 `ruoyi-api-other` + `ruoyi-other` 新版本与前端产物) ## 八、追加执行:子账户预警线改为允许 NULL(2026-09-27 01:00 ~ 01:15,估算) | 脚本 | 结果 | |---|---| | `20260927_balance_warning_sub_amount_nullable.sql`(本次新建) | **已执行生效**:`t_company_balance_warning.sub_warn_amount` 由 `NOT NULL` 改为 `NULL DEFAULT NULL` | - 背景:共享模式(`t_group_company.account_mode = 1`)公司下无子账户,"子账户预警线"不展示也不提交;原列 `NOT NULL` 会导致共享模式保存失败,故放宽为可空(存 NULL 表示不适用)。 - 执行环境:`221.182.45.100:8066`(Mycat 2.0,`--default-character-set=utf8mb4`;脚本复制为英文临时名后 `source`,逐条校验 `$LASTEXITCODE`;临时文件已清理) - 回查证据:`information_schema.COLUMNS` 显示 `sub_warn_amount IS_NULLABLE=YES`、注释「子账户预警线(元,共享模式下不适用,存NULL)」;`SHOW CREATE TABLE` 与脚本一致(`company_warn_amount` 仍为 `NOT NULL`,唯一键 `uk_company_id` 保留),中文注释无乱码 - 幂等性:`ALTER TABLE ... MODIFY COLUMN` 语句本身可重复执行,本次连续执行两次均 EXIT=0、结构不变 - 代码侧配套(同批改动):后端 save 在共享模式忽略该字段并落库 NULL、分配模式仍必填;detail 在共享模式不回显;前端弹窗共享模式隐藏该输入项且提交 null - 注意:`TCompanyBalanceWarning.subWarnAmount` 已加 `@TableField(updateStrategy = FieldStrategy.IGNORED)`,否则 MyBatis-Plus 默认策略会忽略 null,共享模式切换后旧子账户预警线不会被清空(该列可空是此策略生效的前提) ## 九、追加执行:公司登录账号/密码字段 + 内置公司角色(2026-09-28 11:06 ~ 11:16,精确) > 背景:`TGroupCompany` 实体(ruoyi-api-other)新增 `account`/`password` 字段后,公司列表报 `Unknown column 'account' in 'field list'`(`TGroupCompanyMapper` 全字段 SELECT)。 > > 脚本 `20260928_company_account_role.sql` 此前未生效,两层原因:① 原脚本用 `SET @变量 := (SELECT ...)` + `PREPARE/EXECUTE` 条件化 DDL,Mycat 2.0 不支持用户变量 → 静默失效(与 20260901 VIN 脚本同坑);② 脚本缺 `USE` 选库语句,`-e "source ..."` 直接报 `ERROR 1105 (HY000): please use schema`。 | 脚本 | 结果 | |---|---| | `20260928_company_account_role.sql`(本次改造为 Mycat 兼容) | **已执行生效**:`t_group_company` 补 `account`/`password` 列;`sys_role` 新增 `role_id=74`「公司/company」(data_scope=5);`sys_user.roleType` 注释更新为含 `5=公司` | - 改造内容:第 1 部分删除 `SET @变量`/`PREPARE`,改为两条直接 `ALTER TABLE ... ADD COLUMN ... AFTER`(非幂等,重复执行报 `Duplicate column name` 属预期,脚本头已注明);文件开头补 `USE charging_pile_other;` 语句;第 2、3 部分(`sys_role` 幂等 `INSERT ... WHERE NOT EXISTS` / `UPDATE`、`sys_user` MODIFY 注释)写法保持,均无用户变量。 - 执行环境:`221.182.45.100:8066`(Mycat 2.0,`--default-character-set=utf8mb4`,客户端指定默认库 `charging_pile_other`,脚本复制为 `C:\...\Temp\company_account_role.sql` 后 `-e "source ..."`,EXIT=0) - 回查证据:`information_schema.COLUMNS` 显示 `account varchar(255)` / `password varchar(255)` 位于 `contact_phone` 之后、中文注释无乱码;`sys_role` 新增行 `role_id=74, role_name=公司, role_key=company, data_scope=5, status=0, del_flag=0`;`sys_user.roleType` 注释=「角色类型 1=平台 2=合作商 3=门店 4=修理厂 5=公司」;**原报错 SQL 原样重放成功**(`SELECT ... account,password ... FROM t_group_company WHERE del_flag=0 ORDER BY id DESC LIMIT 5` 返回 1 行公司数据) - 幂等性:`sys_role`/`sys_user` 段抽取为独立脚本连续执行两次,均 EXIT=0 且 `role_key='company'` 行数恒为 1(全表角色 21 行,无重复插入);`ALTER` 段以 `--force` 重跑报 `Duplicate column name 'account'`(Mycat 遇错即停后续语句,未产生副作用) - 回归测试:后端 `mvn -B -pl ruoyi-service/ruoyi-other -am test-compile` SUCCESS(18 个测试源文件编译通过);surefire 2.22.2 定向 `TGroupCompanyServiceImplTest` **6/6 通过**(0 失败 0 错误) - 代码侧配套(无需改动):`TGroupCompanyServiceImpl` 新增/编辑/删除公司与 `sys_user`(roleType=5、role_key=company)的同步逻辑、前端公司页「登录账号」必填项此前已实现,本次仅补齐数据库结构。 - 待办提醒:现有 1 行公司(喜望公司)`account`/`password` 为 NULL;前端编辑公司时「登录账号」为只读禁用态,补录账号需业务侧确认放开前端或后台补数据;`sys_role` 新角色的菜单权限需在「角色管理」中配置(脚本不涉及)。