-- 发票同步定时任务配置 -- 用于从旧系统同步发票信息到新系统 -- 1. 创建发票同步日志表 CREATE TABLE IF NOT EXISTS `sys_invoice_sync_log` ( `log_id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '同步日志ID', `sync_type` VARCHAR(50) NOT NULL COMMENT '同步类型(invoice_info-发票信息,invoice_status-发票状态)', `sync_start_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '同步开始时间', `sync_end_time` DATETIME DEFAULT NULL COMMENT '同步结束时间', `records_processed` INT(11) DEFAULT 0 COMMENT '处理记录数', `records_success` INT(11) DEFAULT 0 COMMENT '成功记录数', `records_failed` INT(11) DEFAULT 0 COMMENT '失败记录数', `error_message` TEXT DEFAULT NULL COMMENT '错误信息', `status` TINYINT(1) DEFAULT 0 COMMENT '状态(0-处理中,1-成功,2-失败)', PRIMARY KEY (`log_id`), INDEX `idx_sync_type` (`sync_type`), INDEX `idx_sync_start_time` (`sync_start_time`) ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='发票同步日志表'; -- 2. 插入发票同步定时任务配置 DELETE FROM sys_job WHERE job_name = 'InvoiceSyncJob'; INSERT INTO sys_job ( job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time ) VALUES ( 'InvoiceSyncJob', 'SYSTEM', 'sysInvoiceTask.syncInvoiceFromLegacySystem', '0 0/30 * * * ?', -- 每30分钟执行一次 '3', '1', '0', 'admin', NOW() ); -- 3. 同步发票信息的存储过程 DELIMITER $$ DROP PROCEDURE IF EXISTS sync_invoice_from_legacy$$ CREATE PROCEDURE sync_invoice_from_legacy() BEGIN DECLARE v_start_time DATETIME DEFAULT NOW(); DECLARE v_error_msg TEXT DEFAULT ''; DECLARE v_processed_count INT DEFAULT 0; DECLARE v_success_count INT DEFAULT 0; DECLARE v_failed_count INT DEFAULT 0; DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 v_error_msg = MESSAGE_TEXT; ROLLBACK; END; START TRANSACTION; -- 记录开始同步 INSERT INTO sys_invoice_sync_log (sync_type, sync_start_time, status) VALUES ('invoice_info', v_start_time, 0); SET @log_id = LAST_INSERT_ID(); -- 同步新的发票记录 INSERT INTO sys_invoice ( legacy_invoice_id, legacy_service_order_id, invoice_type, invoice_name, invoice_money, invoice_remarks, company_address, company_bank, company_bank_no, zip_code, mail_address, contact_name, contact_phone, contact_email, status, invoice_no, invoice_url, apply_time, audit_time, audit_remarks, sync_status ) SELECT i.InvoiceID as legacy_invoice_id, i.ServiceOrderIDPK as legacy_service_order_id, CASE WHEN i.InvoiceType = 1 THEN 1 -- 个人发票 WHEN i.InvoiceType = 2 THEN 2 -- 企业发票 ELSE 1 -- 默认个人发票 END as invoice_type, i.InvoiceName as invoice_name, CAST(i.InvoiceMoney AS DECIMAL(10,2)) as invoice_money, i.InvoiceMakeout as invoice_remarks, i.InvoiceCompanyAdd as company_address, i.InvoiceCompanyBank as company_bank, i.InvoiceCompanyBankNo as company_bank_no, i.InvoiceZipCode as zip_code, i.Invoice_strAdd as mail_address, i.Invoice_strName as contact_name, i.Invoice_strPhone as contact_phone, i.Invoice_strEmail as contact_email, CASE WHEN i.AuditStatus = 1 THEN 1 -- 已通过 WHEN i.AuditStatus = 2 THEN 2 -- 已驳回 ELSE 0 -- 待审核 END as status, i.InvoiceNo as invoice_no, COALESCE(i.InvoiceURL, i.EleCloud_PDF) as invoice_url, i.ApplicationTime as apply_time, i.AuditTime as audit_time, i.AuditMakeout as audit_remarks, 1 as sync_status -- 标记为已同步 FROM InvoiceData i WHERE i.InvoiceID NOT IN ( SELECT legacy_invoice_id FROM sys_invoice WHERE legacy_invoice_id IS NOT NULL ); SET v_processed_count = ROW_COUNT(); SET v_success_count = v_processed_count; -- 更新同步日志 UPDATE sys_invoice_sync_log SET sync_end_time = NOW(), records_processed = v_processed_count, records_success = v_success_count, records_failed = v_failed_count, error_message = v_error_msg, status = IF(v_error_msg = '', 1, 2) WHERE log_id = @log_id; COMMIT; END$$ DELIMITER ; -- 4. 同步发票状态的存储过程 DELIMITER $$ DROP PROCEDURE IF EXISTS sync_invoice_status_from_legacy$$ CREATE PROCEDURE sync_invoice_status_from_legacy() BEGIN DECLARE v_start_time DATETIME DEFAULT NOW(); DECLARE v_error_msg TEXT DEFAULT ''; DECLARE v_processed_count INT DEFAULT 0; DECLARE v_success_count INT DEFAULT 0; DECLARE v_failed_count INT DEFAULT 0; DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 v_error_msg = MESSAGE_TEXT; ROLLBACK; END; START TRANSACTION; -- 记录开始同步 INSERT INTO sys_invoice_sync_log (sync_type, sync_start_time, status) VALUES ('invoice_status', v_start_time, 0); SET @log_id = LAST_INSERT_ID(); -- 更新现有发票的状态信息 UPDATE sys_invoice si INNER JOIN InvoiceData i ON si.legacy_invoice_id = i.InvoiceID SET si.status = CASE WHEN i.AuditStatus = 1 THEN 1 -- 已通过 WHEN i.AuditStatus = 2 THEN 2 -- 已驳回 ELSE 0 -- 待审核 END, si.invoice_no = COALESCE(si.invoice_no, i.InvoiceNo), si.invoice_url = COALESCE(si.invoice_url, i.InvoiceURL, i.EleCloud_PDF), si.audit_time = i.AuditTime, si.audit_remarks = i.AuditMakeout, si.sync_status = 1 WHERE si.legacy_invoice_id IS NOT NULL AND ( si.status != CASE WHEN i.AuditStatus = 1 THEN 1 WHEN i.AuditStatus = 2 THEN 2 ELSE 0 END OR si.invoice_no IS NULL OR si.invoice_url IS NULL ); SET v_processed_count = ROW_COUNT(); SET v_success_count = v_processed_count; -- 更新同步日志 UPDATE sys_invoice_sync_log SET sync_end_time = NOW(), records_processed = v_processed_count, records_success = v_success_count, records_failed = v_failed_count, error_message = v_error_msg, status = IF(v_error_msg = '', 1, 2) WHERE log_id = @log_id; COMMIT; END$$ DELIMITER ; -- 5. 查询发票同步日志的视图 CREATE OR REPLACE VIEW v_invoice_sync_log AS SELECT l.log_id, l.sync_type, l.sync_start_time, l.sync_end_time, l.records_processed, l.records_success, l.records_failed, l.error_message, l.status, CASE l.status WHEN 0 THEN '处理中' WHEN 1 THEN '成功' WHEN 2 THEN '失败' ELSE '未知' END as status_name, TIMESTAMPDIFF(SECOND, l.sync_start_time, l.sync_end_time) as duration_seconds FROM sys_invoice_sync_log l ORDER BY l.sync_start_time DESC; -- 6. 手动执行发票信息同步 -- CALL sync_invoice_from_legacy(); -- 7. 手动执行发票状态同步 -- CALL sync_invoice_status_from_legacy();