-- 刷卡充电 V0.2 定稿:卡片密码配置、充电期间锁定、订单结算幂等扣款(允许负余额) -- 目标库:charging_pile_account(t_charging_card、t_charging_card_balance_record) -- 适用:MySQL(含 Mycat 代理下的 MySQL 8 后端)。Mycat 对 PREPARE/INFORMATION_SCHEMA 变量支持不稳定时, -- 可直接执行下方「直接 DDL 小节」并回查。 -- 脚本幂等:字段/索引已存在则自动跳过,可重复执行。 USE `charging_pile_account`; -- ============ 1. t_charging_card 新增 password / charging_flag / charging_order_code ============ SET @has_password_col := ( SELECT COUNT(1) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'charging_pile_account' AND TABLE_NAME = 't_charging_card' AND COLUMN_NAME = 'password' ); SET @add_password_sql := IF( @has_password_col = 0, 'ALTER TABLE `t_charging_card` ADD COLUMN `password` varchar(100) DEFAULT NULL COMMENT ''卡密码(BCrypt密文,空=未配置不校验)'' AFTER `card_no`', 'SELECT 1' ); PREPARE add_password_stmt FROM @add_password_sql; EXECUTE add_password_stmt; DEALLOCATE PREPARE add_password_stmt; SET @has_charging_flag_col := ( SELECT COUNT(1) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'charging_pile_account' AND TABLE_NAME = 't_charging_card' AND COLUMN_NAME = 'charging_flag' ); SET @add_charging_flag_sql := IF( @has_charging_flag_col = 0, 'ALTER TABLE `t_charging_card` ADD COLUMN `charging_flag` tinyint NOT NULL DEFAULT 0 COMMENT ''充电锁定:0未充电,1充电中锁定'' AFTER `status`', 'SELECT 1' ); PREPARE add_charging_flag_stmt FROM @add_charging_flag_sql; EXECUTE add_charging_flag_stmt; DEALLOCATE PREPARE add_charging_flag_stmt; SET @has_charging_order_code_col := ( SELECT COUNT(1) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'charging_pile_account' AND TABLE_NAME = 't_charging_card' AND COLUMN_NAME = 'charging_order_code' ); SET @add_charging_order_code_sql := IF( @has_charging_order_code_col = 0, 'ALTER TABLE `t_charging_card` ADD COLUMN `charging_order_code` varchar(64) DEFAULT NULL COMMENT ''充电锁定订单号'' AFTER `charging_flag`', 'SELECT 1' ); PREPARE add_charging_order_code_stmt FROM @add_charging_order_code_sql; EXECUTE add_charging_order_code_stmt; DEALLOCATE PREPARE add_charging_order_code_stmt; -- ============ 2. t_charging_card_balance_record 新增充电订单号(扣款幂等键)与唯一索引 ============ SET @has_record_order_col := ( SELECT COUNT(1) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'charging_pile_account' AND TABLE_NAME = 't_charging_card_balance_record' AND COLUMN_NAME = 'charging_order_code' ); SET @add_record_order_sql := IF( @has_record_order_col = 0, 'ALTER TABLE `t_charging_card_balance_record` ADD COLUMN `charging_order_code` varchar(64) DEFAULT NULL COMMENT ''关联订单号(刷卡充电订单结算扣款,幂等键)'' AFTER `remark`', 'SELECT 1' ); PREPARE add_record_order_stmt FROM @add_record_order_sql; EXECUTE add_record_order_stmt; DEALLOCATE PREPARE add_record_order_stmt; SET @has_record_uk := ( SELECT COUNT(1) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = 'charging_pile_account' AND TABLE_NAME = 't_charging_card_balance_record' AND INDEX_NAME = 'uk_order_code' ); SET @add_record_uk_sql := IF( @has_record_uk = 0, 'ALTER TABLE `t_charging_card_balance_record` ADD UNIQUE KEY `uk_order_code` (`charging_order_code`)', 'SELECT 1' ); PREPARE add_record_uk_stmt FROM @add_record_uk_sql; EXECUTE add_record_uk_stmt; DEALLOCATE PREPARE add_record_uk_stmt; -- ========== 直接 DDL 小节(Mycat 下如上面 PREPARE 报错,可按序手工执行以下四条) ========== -- ALTER TABLE `charging_pile_account`.`t_charging_card` -- ADD COLUMN `password` varchar(100) DEFAULT NULL COMMENT '卡密码(BCrypt密文,空=未配置不校验)' AFTER `card_no`; -- ALTER TABLE `charging_pile_account`.`t_charging_card` -- ADD COLUMN `charging_flag` tinyint NOT NULL DEFAULT 0 COMMENT '充电锁定:0未充电,1充电中锁定' AFTER `status`; -- ALTER TABLE `charging_pile_account`.`t_charging_card` -- ADD COLUMN `charging_order_code` varchar(64) DEFAULT NULL COMMENT '充电锁定订单号' AFTER `charging_flag`; -- ALTER TABLE `charging_pile_account`.`t_charging_card_balance_record` -- ADD COLUMN `charging_order_code` varchar(64) DEFAULT NULL COMMENT '关联订单号(刷卡充电订单结算扣款,幂等键)' AFTER `remark`; -- ALTER TABLE `charging_pile_account`.`t_charging_card_balance_record` -- ADD UNIQUE KEY `uk_order_code` (`charging_order_code`);