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
|
-- 创建数据库
CREATE DATABASE IF NOT EXISTS bank_reg_report CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE bank_reg_report;
-- 分支机构表
CREATE TABLE branch (
id INT AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(20) NOT NULL,
name VARCHAR(100) NOT NULL
);
-- 客户表(简化)
CREATE TABLE customer (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
id_no VARCHAR(50),
industry varchar(50) DEFAULT '未知',
risk_level varchar(20) DEFAULT '未知'
);
-- 账户/存款表(用于存款汇总)
CREATE TABLE account (
id INT AUTO_INCREMENT PRIMARY KEY,
branch_id INT,
customer_id INT,
account_type ENUM('DEPOSIT','LOAN','OTHER') DEFAULT 'DEPOSIT',
balance DECIMAL(18,2) DEFAULT 0,
created_at DATETIME DEFAULT NOW(),
FOREIGN KEY (branch_id) REFERENCES branch(id),
FOREIGN KEY (customer_id) REFERENCES customer(id)
);
-- 贷款表(用于贷款敞口)
CREATE TABLE loan (
id INT AUTO_INCREMENT PRIMARY KEY,
branch_id INT,
customer_id INT,
original_amount DECIMAL(18,2),
outstanding_amount DECIMAL(18,2),
loan_type VARCHAR(50),
status VARCHAR(20),
created_at DATETIME DEFAULT NOW(),
FOREIGN KEY (branch_id) REFERENCES branch(id),
FOREIGN KEY (customer_id) REFERENCES customer(id)
);
-- 交易表(用于可疑交易统计)
CREATE TABLE transaction_log (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
branch_id INT,
customer_id INT,
amount DECIMAL(18,2),
txn_type VARCHAR(50),
txn_time DATETIME,
channel VARCHAR(50),
description VARCHAR(255),
FOREIGN KEY (branch_id) REFERENCES branch(id)
);
-- 报表存储结果表:每个报表类型通用一张(这里简单)
CREATE TABLE report_store (
id INT AUTO_INCREMENT PRIMARY KEY,
report_code VARCHAR(50) NOT NULL,
branch_id INT,
data_key VARCHAR(100),
data_value TEXT,
period DATE,
created_at DATETIME DEFAULT NOW(),
updated_at DATETIME DEFAULT NOW() ON UPDATE NOW()
);
-- 报表提交记录表
CREATE TABLE report_submission (
id INT AUTO_INCREMENT PRIMARY KEY,
report_code VARCHAR(50),
period DATE,
branch_id INT,
status ENUM('DRAFT','SUBMITTED','APPROVED','REJECTED') DEFAULT 'DRAFT',
submitter VARCHAR(100),
submit_time DATETIME,
remark VARCHAR(255)
);
-- 示例数据
INSERT INTO branch (code,name) VALUES ('B001','总行'),('B002','分行A'),('B003','分行B');
INSERT INTO customer (name,id_no) VALUES ('张三','ID1001'),('李四','ID1002'),('王五','ID1003');
INSERT INTO account (branch_id,customer_id,account_type,balance) VALUES
(1,1,'DEPOSIT',1000000.00),(1,2,'DEPOSIT',500000.00),(2,3,'DEPOSIT',200000.00),
(2,1,'DEPOSIT',120000.00),(3,2,'DEPOSIT',300000.00);
INSERT INTO loan (branch_id,customer_id,original_amount,outstanding_amount,loan_type,status) VALUES
(1,1,500000,200000,'CORPORATE','ACTIVE'),(1,2,200000,100000,'RETAIL','ACTIVE'),
(2,3,300000,120000,'RETAIL','ACTIVE');
INSERT INTO transaction_log (branch_id,customer_id,amount,txn_type,txn_time,channel,description) VALUES
(1,1,150000,'TRANSFER',NOW(),'ONLINE','大额转账'),(2,3,50000,'WITHDRAW',NOW(),'ATM','取款'),(3,2,200000,'TRANSFER',NOW(),'ONLINE','大额转账');
-- 存储过程:计算余额汇总(Balance Summary)
DROP PROCEDURE IF EXISTS sp_calc_balance_summary;
DELIMITER $$
CREATE PROCEDURE sp_calc_balance_summary(IN p_period DATE, IN p_branch_id INT)
BEGIN
-- 返回分支当日/当月的存款总额和贷款余额总额,并将结果写入 report_store
DECLARE v_deposits DECIMAL(18,2) DEFAULT 0;
DECLARE v_loans DECIMAL(18,2) DEFAULT 0;
SELECT IFNULL(SUM(balance),0) INTO v_deposits FROM account WHERE branch_id = p_branch_id AND account_type='DEPOSIT';
SELECT IFNULL(SUM(outstanding_amount),0) INTO v_loans FROM loan WHERE branch_id = p_branch_id AND status='ACTIVE';
-- 写入 report_store: key=TOTAL_DEPOSITS, TOTAL_LOANS
INSERT INTO report_store(report_code,branch_id,data_key,data_value,period)
VALUES('BALANCE_SUMMARY', p_branch_id, 'TOTAL_DEPOSITS', CAST(v_deposits AS CHAR), p_period);
INSERT INTO report_store(report_code,branch_id,data_key,data_value,period)
VALUES('BALANCE_SUMMARY', p_branch_id, 'TOTAL_LOANS', CAST(v_loans AS CHAR), p_period);
-- 返回结果集(供直接查询)
SELECT v_deposits AS total_deposits, v_loans AS total_loans;
END$$
DELIMITER ;
-- 存储过程:计算贷款敞口(Loan Exposure)
DROP PROCEDURE IF EXISTS sp_calc_loan_exposure;
DELIMITER $$
CREATE PROCEDURE sp_calc_loan_exposure(IN p_period DATE, IN p_branch_id INT)
BEGIN
SELECT loan_type, COUNT(*) AS cnt, IFNULL(SUM(outstanding_amount),0) AS exposure
FROM loan WHERE branch_id = p_branch_id AND status='ACTIVE' GROUP BY loan_type;
END$$
DELIMITER ;
-- 存储过程:可疑交易统计(大额交易)
DROP PROCEDURE IF EXISTS sp_calc_suspicious_transactions;
DELIMITER $$
CREATE PROCEDURE sp_calc_suspicious_transactions(IN p_period DATE, IN p_branch_id INT, IN p_threshold DECIMAL(18,2))
BEGIN
SELECT customer_id, COUNT(*) AS txn_count, IFNULL(SUM(amount),0) AS total_amount
FROM transaction_log
WHERE branch_id = p_branch_id AND amount >= p_threshold
GROUP BY customer_id HAVING SUM(amount) >= p_threshold;
END$$
DELIMITER ;
-- 存储过程:保存/更新报表草稿
DROP PROCEDURE IF EXISTS sp_save_report_data;
DELIMITER $$
CREATE PROCEDURE sp_save_report_data(IN p_report_code VARCHAR(50), IN p_branch_id INT, IN p_period DATE, IN p_key VARCHAR(100), IN p_value TEXT)
BEGIN
DECLARE v_id INT;
SELECT id INTO v_id FROM report_store WHERE report_code = p_report_code AND branch_id = p_branch_id AND period = p_period AND data_key = p_key LIMIT 1;
IF v_id IS NULL THEN
INSERT INTO report_store(report_code,branch_id,data_key,data_value,period) VALUES(p_report_code,p_branch_id,p_key,p_value,p_period);
ELSE
UPDATE report_store SET data_value = p_value WHERE id = v_id;
END IF;
END$$
DELIMITER ;
-- 存储过程:提交报表
DROP PROCEDURE IF EXISTS sp_submit_report;
DELIMITER $$
CREATE PROCEDURE sp_submit_report(IN p_report_code VARCHAR(50), IN p_branch_id INT, IN p_period DATE, IN p_submitter VARCHAR(100))
BEGIN
INSERT INTO report_submission(report_code,period,branch_id,status,submitter,submit_time)
VALUES(p_report_code,p_period,p_branch_id,'SUBMITTED',p_submitter,NOW());
END$$
DELIMITER ;
-- 索引
CREATE INDEX idx_report_store_code ON report_store(report_code);
CREATE INDEX idx_report_submission ON report_submission(report_code);
COMMIT;
|