72 lines
2.9 KiB
SQL
72 lines
2.9 KiB
SQL
-- =============================================================
|
||
-- 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');
|