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 码管理:左侧菜单与列表页"额度分配"按钮应可见可用(依赖本次菜单补齐)。

六、执行方式备查

# 判断(只读)
mysql -h<host> -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<host> -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 新角色的菜单权限需在「角色管理」中配置(脚本不涉及)。

十、追加执行:公司优惠设置建表(2026-09-28,待执行)

脚本 结果
20260928_company_preferential.sql(本次新建) 待执行:charging_pile_other.t_company_preferential(公司管理-优惠设置)
  • 背景:公司管理新增「优惠设置」弹窗(1=不优惠 / 2=按比例优惠 / 3=按优惠单价收费),一个公司一条配置;充值弹窗的优惠方式配置已移除,改由该弹窗统一维护(充值记录表 t_company_recharge_record.preferential_type 保持库默认 1=不优惠,历史记录展示不受影响)。
  • 执行方式(Mycat 2.0,建议先复制为英文临时名再 source,并校验 $LASTEXITCODE):
    bash mysql -h<host> -P8066 -uroot -p --default-character-set=utf8mb4 -e "source <绝对路径>/company_preferential.sql"
  • 幂等性:CREATE TABLE IF NOT EXISTS,可随部署直接重跑;脚本无 SET @变量/PREPARE,且带 USE charging_pile_other;(避免 ERROR 1105 please use schema)。
  • 回查命令(执行后回填证据):
    bash mysql -h<host> -P8066 -uroot -p --default-character-set=utf8mb4 -e "SHOW CREATE TABLE charging_pile_other.t_company_preferential\G"
  • 部署后验证:公司管理 → 公司概况 → 「优惠设置」保存后重开弹窗回显、「账户模式」保存后概况账户模式同步刷新(需部署 ruoyi-api-other + ruoyi-other 新版本与前端产物)。
  • 代码侧配套(同批改动):新增实体 TCompanyPreferential(service_discount_rate / billing_template_id 采用 FieldStrategy.IGNORED,切换优惠方式时旧值可被清空)、CompanyPreferentialDTO、Mapper/Service/Controller(/other/company-preferential/detail|save)、接口 /other/group-company/account-mode;TGroupCompanyServiceImpl.addCompany 对未传账户模式的公司按共享模式(1)建档;前端添加/编辑企业弹窗已删除账户模式配置。
  • 未执行原因:本次授权范围为代码与脚本,测试库/生产库 DDL 需业务侧确认后再执行。