-- ============================================================= -- OA 报销:费用明细支持「发票挂靠」(已建表环境执行) -- -- 背景:一张发票(例如 200 元油票/邮费票)常常需要分多次报销才能报满。 -- 现在每条费用明细可以挂靠一张「仍有余额的发票」,并记录本次使用金额。 -- -- 设计:不新建发票表,发票本体仍是明细行 receipt_file_ids 指向的附件。 -- 票面金额取 receipt_amounts(OCR 识别或人工填写),余额由后端实时聚合: -- 余额 = 票面金额 - 上传该票的明细占用 - 其它明细挂靠占用 -- 明细被删除后占用自动释放,无需额外回滚,也不存在余额字段不一致问题。 -- -- 适用:已有 yz_backend_reimbursement_items 的环境。 -- 幂等:重复执行安全(information_schema 判断列是否存在)。 -- ============================================================= USE `go-platform`; -- 1) 挂靠的发票文件 ID(0 = 未挂靠) SET @ddl := ( SELECT IF( EXISTS ( SELECT 1 FROM `information_schema`.`COLUMNS` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'yz_backend_reimbursement_items' AND `COLUMN_NAME` = 'invoice_file_id' ), 'SELECT ''invoice_file_id 已存在,跳过'' AS msg', 'ALTER TABLE `yz_backend_reimbursement_items` ADD COLUMN `invoice_file_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT ''挂靠的发票文件ID(yz_system_files.id,0=未挂靠)'' AFTER `receipt_amounts`' ) ); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 2) 本条明细本次使用的发票金额 SET @ddl := ( SELECT IF( EXISTS ( SELECT 1 FROM `information_schema`.`COLUMNS` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'yz_backend_reimbursement_items' AND `COLUMN_NAME` = 'invoice_use_amount' ), 'SELECT ''invoice_use_amount 已存在,跳过'' AS msg', 'ALTER TABLE `yz_backend_reimbursement_items` ADD COLUMN `invoice_use_amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT ''本条明细挂靠使用的发票金额'' AFTER `invoice_file_id`' ) ); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 3) 辅助索引:按挂靠发票快速聚合(重复执行前先判断) SET @ddl := ( SELECT IF( EXISTS ( SELECT 1 FROM `information_schema`.`STATISTICS` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'yz_backend_reimbursement_items' AND `INDEX_NAME` = 'idx_reimb_invoice' ), 'SELECT ''idx_reimb_invoice 已存在,跳过'' AS msg', 'ALTER TABLE `yz_backend_reimbursement_items` ADD INDEX `idx_reimb_invoice` (`reimbursement_id`, `invoice_file_id`)' ) ); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 4) 核对结果 SHOW FULL COLUMNS FROM `yz_backend_reimbursement_items` WHERE `Field` IN ('invoice_file_id', 'invoice_use_amount');