wlzboy
2026-02-05 57e98ac3f59e9ca12d3fdbc6f89c9c0b1f86be4d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
-- 发票同步定时任务配置
-- 用于从旧系统同步发票信息到新系统
 
-- 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();