You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
digital-rmb-backend/src/test/resources/schema.sql

1013 lines
52 KiB
SQL

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

CREATE TABLE IF NOT EXISTS sys_user (
user_id VARCHAR(36) PRIMARY KEY,
student_id VARCHAR(255) NULL,
password VARCHAR(255) NOT NULL,
user_name VARCHAR(100) NULL,
class_id VARCHAR(36) NULL,
class_name VARCHAR(100) NULL,
phone VARCHAR(100) NULL,
school_name VARCHAR(100) NULL,
school_id VARCHAR(36) NULL,
authorize_time DATE NULL,
authorize_end_time DATE NULL,
role_id TINYINT NULL,
create_time DATETIME NULL,
is_deleted TINYINT NOT NULL DEFAULT 0,
zy_user_id VARCHAR(50) NULL,
UNIQUE KEY uk_sys_user_student_id (student_id)
);
CREATE TABLE IF NOT EXISTS platform_user_snapshot (
platform_user_id VARCHAR(36) PRIMARY KEY,
account VARCHAR(64) NOT NULL,
display_name VARCHAR(64) NOT NULL,
source_updated_at TIMESTAMP NOT NULL,
synced_at TIMESTAMP NOT NULL,
school_id VARCHAR(64) NULL,
school_name VARCHAR(128) NULL,
college_id VARCHAR(64) NULL,
college_name VARCHAR(128) NULL,
major_id VARCHAR(64) NULL,
major_name VARCHAR(128) NULL,
class_id VARCHAR(64) NULL,
class_name VARCHAR(128) NULL,
student_id VARCHAR(64) NULL
);
CREATE TABLE IF NOT EXISTS auth_login_exchange_code (
code_hash CHAR(64) PRIMARY KEY,
platform_user_id VARCHAR(36) NOT NULL,
expires_at TIMESTAMP NOT NULL,
consumed_at TIMESTAMP NULL
);
CREATE TABLE IF NOT EXISTS auth_refresh_token (
token_hash CHAR(64) PRIMARY KEY,
platform_user_id VARCHAR(36) NOT NULL,
expires_at TIMESTAMP NOT NULL,
revoked_at TIMESTAMP NULL
);
CREATE TABLE IF NOT EXISTS stu_module_score_details (
id VARCHAR(64) NOT NULL,
moudule VARCHAR(100) NOT NULL,
learning_projects VARCHAR(100),
assessment_items VARCHAR(100),
scoring_criteria VARCHAR(100),
completion_status VARCHAR(100),
score_project DOUBLE,
user_id VARCHAR(64) NOT NULL,
total_score DECIMAL(10, 2) NOT NULL DEFAULT 100.00,
serial_number INT,
schedule DOUBLE,
deleted BOOLEAN NOT NULL DEFAULT FALSE,
PRIMARY KEY (id),
CONSTRAINT uk_user_moudule_serial UNIQUE (user_id, moudule, serial_number)
);
CREATE TABLE IF NOT EXISTS user_step_progress (
id BIGINT PRIMARY KEY,
user_id VARCHAR(36) NOT NULL,
school_id VARCHAR(64),
school_name VARCHAR(128),
class_id VARCHAR(64),
class_name VARCHAR(128),
module_code VARCHAR(64) NOT NULL,
step_code VARCHAR(32) NOT NULL,
step_name VARCHAR(128),
status TINYINT NOT NULL DEFAULT 0,
completed_at TIMESTAMP NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
created_by VARCHAR(64) NOT NULL,
updated_by VARCHAR(64) NOT NULL,
deleted BOOLEAN NOT NULL DEFAULT FALSE,
UNIQUE (user_id, module_code, step_code)
);
CREATE TABLE IF NOT EXISTS institution_sm2_key (
id BIGINT PRIMARY KEY,
key_id VARCHAR(64) NOT NULL,
key_name VARCHAR(64) NOT NULL,
key_owner VARCHAR(32) NOT NULL,
key_purpose VARCHAR(32) NOT NULL,
user_id VARCHAR(36) NOT NULL,
school_id BIGINT NOT NULL,
class_id BIGINT NOT NULL,
public_key VARCHAR(256) NOT NULL,
encrypted_private_key VARCHAR(512) NOT NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
created_by VARCHAR(64) NOT NULL,
updated_by VARCHAR(64) NOT NULL,
deleted BOOLEAN NOT NULL DEFAULT FALSE
);
CREATE TABLE IF NOT EXISTS control_system_signature (
id BIGINT PRIMARY KEY,
transaction_identifier_id BIGINT NOT NULL,
control_id VARCHAR(32) NOT NULL,
amount DECIMAL(18, 2) NOT NULL,
institution_identifier VARCHAR(32) NOT NULL,
transaction_identifier VARCHAR(80) NOT NULL,
original_text VARCHAR(256) NOT NULL,
digest CHAR(64),
signing_key_id VARCHAR(64),
signature VARCHAR(512),
control_signature VARCHAR(256),
response_message VARCHAR(2048),
status VARCHAR(32) NOT NULL,
user_id VARCHAR(36) NOT NULL,
school_id BIGINT NOT NULL,
class_id BIGINT NOT NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
created_by VARCHAR(64) NOT NULL,
updated_by VARCHAR(64) NOT NULL,
deleted BOOLEAN NOT NULL DEFAULT FALSE
);
CREATE TABLE IF NOT EXISTS quota_control_bit (
id BIGINT PRIMARY KEY,
control_signature_id BIGINT NOT NULL,
quota_id VARCHAR(32) NOT NULL,
amount DECIMAL(18, 2) NOT NULL,
institution_identifier VARCHAR(32) NOT NULL,
transaction_identifier VARCHAR(80) NOT NULL,
static_original_text VARCHAR(256),
static_segment VARCHAR(80),
random_value VARCHAR(16),
segment_timestamp CHAR(14),
dynamic_segment VARCHAR(64),
central_bank_signature_segment VARCHAR(512),
complete_control_bit VARCHAR(2048),
signing_key_id VARCHAR(64),
hash_algorithm VARCHAR(16),
bank_signature VARCHAR(512),
request_message VARCHAR(4096),
receive_status INT NOT NULL DEFAULT 1,
status VARCHAR(32) NOT NULL,
user_id VARCHAR(36) NOT NULL,
school_id BIGINT NOT NULL,
class_id BIGINT NOT NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
created_by VARCHAR(64) NOT NULL,
updated_by VARCHAR(64) NOT NULL,
deleted BOOLEAN NOT NULL DEFAULT FALSE
);
CREATE TABLE IF NOT EXISTS standard_currency_batch (
id BIGINT PRIMARY KEY,
quota_control_bit_id BIGINT NOT NULL,
batch_number VARCHAR(32) NOT NULL,
total_amount DECIMAL(18, 2) NOT NULL,
total_count INT NOT NULL,
denomination_summary VARCHAR(1024) NOT NULL,
prefix VARCHAR(8),
id_rule VARCHAR(128),
currency_status VARCHAR(16),
status VARCHAR(32) NOT NULL,
user_id VARCHAR(36) NOT NULL,
school_id BIGINT NOT NULL,
class_id BIGINT NOT NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
created_by VARCHAR(64) NOT NULL,
updated_by VARCHAR(64) NOT NULL,
deleted BOOLEAN NOT NULL DEFAULT FALSE
);
CREATE TABLE IF NOT EXISTS standard_currency (
id BIGINT PRIMARY KEY,
batch_id BIGINT NOT NULL,
sequence_number INT NOT NULL,
denomination DECIMAL(18, 2) NOT NULL,
random_check_code CHAR(6) NOT NULL,
currency_id VARCHAR(64) NOT NULL,
institution_identifier VARCHAR(32) NOT NULL,
bank_signature_segment VARCHAR(512) NOT NULL,
central_bank_signature_segment VARCHAR(512) NOT NULL,
complete_currency VARCHAR(2048) NOT NULL,
status VARCHAR(16) NOT NULL,
issuance_request_id CHAR(36),
reserved_at TIMESTAMP NULL,
reserved_by_user_id VARCHAR(36),
reserved_by VARCHAR(64),
issued_at TIMESTAMP NULL,
issued_by_user_id VARCHAR(36),
issued_by VARCHAR(64),
ownership_signature VARCHAR(512),
issued_complete_currency TEXT,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
created_by VARCHAR(64) NOT NULL,
updated_by VARCHAR(64) NOT NULL,
deleted BOOLEAN NOT NULL DEFAULT FALSE
);
CREATE TABLE IF NOT EXISTS issuance_source_currency_usage (
id BIGINT PRIMARY KEY,
source_currency_id BIGINT NOT NULL,
source_batch_id BIGINT NOT NULL,
issuance_request_id CHAR(36) NOT NULL,
status VARCHAR(16) NOT NULL,
reserved_at TIMESTAMP NOT NULL,
released_at TIMESTAMP NULL,
issued_at TIMESTAMP NULL,
audit_user_id VARCHAR(36) NOT NULL,
audit_username VARCHAR(64) NOT NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
CONSTRAINT uk_issuance_source_currency UNIQUE (source_currency_id),
INDEX idx_issuance_source_request (issuance_request_id, status)
);
CREATE TABLE IF NOT EXISTS institution_sm2_key_audit (
id BIGINT PRIMARY KEY,
key_record_id BIGINT NOT NULL,
key_id VARCHAR(64) NOT NULL,
operation VARCHAR(32) NOT NULL,
user_id VARCHAR(36) NOT NULL,
school_id BIGINT NOT NULL,
class_id BIGINT NOT NULL,
operation_detail VARCHAR(512) NOT NULL,
created_at TIMESTAMP NOT NULL,
created_by VARCHAR(64) NOT NULL,
deleted BOOLEAN NOT NULL DEFAULT FALSE,
CONSTRAINT fk_institution_key_audit_key
FOREIGN KEY (key_record_id) REFERENCES institution_sm2_key(id)
);
INSERT INTO sys_user (
user_id, student_id, password, user_name, class_id, class_name, school_id, school_name,
role_id, is_deleted, zy_user_id
)
VALUES (
'00000000-0000-0000-0000-000000000487',
'tzs001',
'$2a$10$ufcw5KFHtOmLzxAsV4C.MuIDOErMlw0iw5J5hc8OMzaTx0u9QYxG6',
'tzs001',
'2001',
'数字人民币测试班',
'1001',
'延安大学',
4,
0,
'487'
)
ON DUPLICATE KEY UPDATE
student_id = VALUES(student_id),
password = VALUES(password),
user_name = VALUES(user_name),
role_id = VALUES(role_id),
is_deleted = 0;
INSERT INTO platform_user_snapshot (
platform_user_id, account, display_name, source_updated_at, synced_at
)
VALUES (
'00000000-0000-0000-0000-000000000487',
'tzs001',
'tzs001',
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP
)
ON DUPLICATE KEY UPDATE
account = VALUES(account),
display_name = VALUES(display_name),
source_updated_at = CURRENT_TIMESTAMP,
synced_at = CURRENT_TIMESTAMP;
CREATE TABLE IF NOT EXISTS issuance_bank_inventory (
bank_code VARCHAR(32) PRIMARY KEY,
current_balance DECIMAL(20, 2) NOT NULL,
warning_threshold DECIMAL(20, 2) NOT NULL,
updated_at TIMESTAMP NOT NULL
);
CREATE TABLE IF NOT EXISTS issuance_request (
id CHAR(36) PRIMARY KEY,
request_no VARCHAR(64) NOT NULL UNIQUE,
bank_code VARCHAR(32) NOT NULL,
organization_id VARCHAR(64) NOT NULL,
total_amount DECIMAL(20, 2) NOT NULL,
currency VARCHAR(16) NOT NULL,
request_timestamp VARCHAR(32),
message_text TEXT,
digest CHAR(64),
signature TEXT,
signing_key_ref VARCHAR(64),
payload_json TEXT,
status VARCHAR(32) NOT NULL,
central_receive_status VARCHAR(32) NOT NULL,
central_received_at TIMESTAMP NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
created_by VARCHAR(64) NOT NULL,
updated_by VARCHAR(64) NOT NULL,
created_by_user_id VARCHAR(36) NOT NULL,
updated_by_user_id VARCHAR(36) NOT NULL,
deleted BOOLEAN NOT NULL DEFAULT FALSE
);
CREATE TABLE IF NOT EXISTS issuance_request_denomination (
request_id CHAR(36) NOT NULL,
denomination DECIMAL(10, 2) NOT NULL,
quantity INT NOT NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
created_by VARCHAR(64) NOT NULL,
updated_by VARCHAR(64) NOT NULL,
created_by_user_id VARCHAR(36) NOT NULL,
updated_by_user_id VARCHAR(36) NOT NULL,
PRIMARY KEY (request_id, denomination)
);
ALTER TABLE issuance_request
ALTER COLUMN created_by_user_id VARCHAR(36) NOT NULL;
ALTER TABLE issuance_request
ALTER COLUMN updated_by_user_id VARCHAR(36) NOT NULL;
ALTER TABLE issuance_request_denomination
ALTER COLUMN created_by_user_id VARCHAR(36) NOT NULL;
ALTER TABLE issuance_request_denomination
ALTER COLUMN updated_by_user_id VARCHAR(36) NOT NULL;
CREATE TABLE IF NOT EXISTS central_bank_issuance_receipt (
request_id CHAR(36) PRIMARY KEY,
request_no VARCHAR(64) NOT NULL,
payload_json TEXT NOT NULL,
received_at TIMESTAMP NOT NULL,
received_by_user_id VARCHAR(36) NOT NULL,
received_by VARCHAR(64) NOT NULL
);
CREATE TABLE IF NOT EXISTS central_bank_issuance_verification (
request_id CHAR(36) PRIMARY KEY,
h1_digest CHAR(64) NULL,
h2_digest CHAR(64) NULL,
digest_matched BOOLEAN NOT NULL,
signature_verified BOOLEAN NOT NULL,
status VARCHAR(16) NOT NULL,
failure_reason VARCHAR(512) NULL,
verified_at TIMESTAMP NOT NULL,
verified_by_user_id VARCHAR(36) NOT NULL,
verified_by VARCHAR(64) NOT NULL,
CONSTRAINT fk_central_bank_issuance_verification_receipt
FOREIGN KEY (request_id) REFERENCES central_bank_issuance_receipt(request_id)
);
CREATE TABLE IF NOT EXISTS central_bank_institution_account (
bank_code VARCHAR(32) PRIMARY KEY,
organization_id VARCHAR(64) NOT NULL,
reserve_account_no VARCHAR(64) NOT NULL,
reserve_account_name VARCHAR(128) NOT NULL,
status VARCHAR(16) NOT NULL,
opened_on DATE NOT NULL,
reserve_balance DECIMAL(20, 2) NOT NULL
);
CREATE TABLE IF NOT EXISTS central_bank_currency_vault (
currency VARCHAR(16) PRIMARY KEY,
available_balance DECIMAL(20, 2) NOT NULL
);
CREATE TABLE IF NOT EXISTS reserve_deduction_notification (
request_id CHAR(36) PRIMARY KEY, transaction_id VARCHAR(64) NOT NULL UNIQUE,
bank_code VARCHAR(32) NOT NULL, organization_id VARCHAR(64) NOT NULL,
reserve_account_no VARCHAR(64) NOT NULL, reserve_account_name VARCHAR(128) NOT NULL,
currency VARCHAR(16) NOT NULL, deduction_amount DECIMAL(20, 2) NOT NULL, status VARCHAR(32) NOT NULL,
sent_at TIMESTAMP NOT NULL, sent_by_user_id VARCHAR(36) NOT NULL, sent_by VARCHAR(64) NOT NULL,
received_at TIMESTAMP NULL, received_by_user_id VARCHAR(36) NULL, received_by VARCHAR(64) NULL,
submitted_at TIMESTAMP NULL, submitted_by_user_id VARCHAR(36) NULL, submitted_by VARCHAR(64) NULL,
CONSTRAINT fk_reserve_deduction_notification_receipt FOREIGN KEY (request_id) REFERENCES central_bank_issuance_receipt(request_id)
);
CREATE TABLE IF NOT EXISTS reserve_deduction_execution (
transaction_id VARCHAR(64) PRIMARY KEY, request_id CHAR(36) NOT NULL UNIQUE,
before_balance DECIMAL(20, 2) NOT NULL, deduction_amount DECIMAL(20, 2) NOT NULL,
after_balance DECIMAL(20, 2) NOT NULL, status VARCHAR(32) NOT NULL, executed_at TIMESTAMP NOT NULL,
executed_by_user_id VARCHAR(36) NOT NULL, executed_by VARCHAR(64) NOT NULL,
reversed_balance DECIMAL(20, 2) NULL, reversed_at TIMESTAMP NULL,
reversed_by_user_id VARCHAR(36) NULL, reversed_by VARCHAR(64) NULL,
CONSTRAINT fk_reserve_deduction_execution_notification FOREIGN KEY (request_id) REFERENCES reserve_deduction_notification(request_id)
);
CREATE TABLE IF NOT EXISTS digital_currency_production_batch (
batch_id VARCHAR(64) PRIMARY KEY, request_id CHAR(36) NOT NULL UNIQUE, deduction_transaction_id VARCHAR(64) NOT NULL UNIQUE,
organization_id VARCHAR(64) NOT NULL, currency VARCHAR(16) NOT NULL, total_amount DECIMAL(20, 2) NOT NULL,
status VARCHAR(32) NOT NULL, created_at TIMESTAMP NOT NULL, created_by_user_id VARCHAR(36) NOT NULL, created_by VARCHAR(64) NOT NULL,
quota_control_bit_id BIGINT, control_system_signature_id BIGINT, complete_control_bit TEXT, control_system_signature VARCHAR(512),
CONSTRAINT fk_digital_currency_production_batch_execution FOREIGN KEY (deduction_transaction_id) REFERENCES reserve_deduction_execution(transaction_id)
);
CREATE TABLE IF NOT EXISTS draft_digital_currency (
coin_id VARCHAR(96) PRIMARY KEY, batch_id VARCHAR(64) NOT NULL, sequence_no INT NOT NULL,
denomination DECIMAL(20, 2) NOT NULL, organization_id VARCHAR(64) NOT NULL, currency VARCHAR(16) NOT NULL,
status VARCHAR(32) NOT NULL, created_at TIMESTAMP NOT NULL, created_by_user_id VARCHAR(36) NOT NULL, created_by VARCHAR(64) NOT NULL,
source_currency_id BIGINT, source_currency_batch_id BIGINT, source_complete_currency TEXT,
complete_control_bit TEXT, control_system_signature VARCHAR(512), ownership_original_text TEXT,
ownership_signature VARCHAR(512), complete_currency TEXT, confirmed_at TIMESTAMP NULL,
confirmed_by_user_id VARCHAR(36), confirmed_by VARCHAR(64),
CONSTRAINT uk_draft_digital_currency_batch_sequence UNIQUE (batch_id, sequence_no),
CONSTRAINT fk_draft_digital_currency_batch FOREIGN KEY (batch_id) REFERENCES digital_currency_production_batch(batch_id)
);
CREATE TABLE IF NOT EXISTS digital_currency_ownership_confirmation (
request_id CHAR(36) PRIMARY KEY, batch_id VARCHAR(64) NOT NULL UNIQUE, status VARCHAR(32) NOT NULL,
confirmed_at TIMESTAMP NOT NULL, confirmed_by_user_id VARCHAR(36) NOT NULL, confirmed_by VARCHAR(64) NOT NULL,
signing_key_id VARCHAR(64) NOT NULL,
confirmation_original_text TEXT, confirmation_digest CHAR(64), central_bank_signature VARCHAR(512),
verified_at TIMESTAMP, verified_by_user_id VARCHAR(36), verified_by VARCHAR(64),
receipt_original_text TEXT, receipt_digest CHAR(64), receipt_signature VARCHAR(512),
receipt_signing_key_id VARCHAR(64), receipt_at TIMESTAMP,
CONSTRAINT fk_digital_currency_ownership_batch FOREIGN KEY (batch_id) REFERENCES digital_currency_production_batch(batch_id)
);
CREATE TABLE IF NOT EXISTS commercial_bank_currency (
currency_id VARCHAR(96) PRIMARY KEY, source_currency_id BIGINT NOT NULL UNIQUE, source_batch_id BIGINT NOT NULL,
issuance_request_id CHAR(36) NOT NULL, bank_code VARCHAR(32) NOT NULL, organization_id VARCHAR(64) NOT NULL,
denomination DECIMAL(20, 2) NOT NULL, currency VARCHAR(16) NOT NULL, complete_currency TEXT NOT NULL,
issuance_ownership_original_text TEXT NOT NULL, issuance_ownership_signature VARCHAR(512) NOT NULL,
status VARCHAR(16) NOT NULL, received_at TIMESTAMP NOT NULL, received_by_user_id VARCHAR(36) NOT NULL,
received_by VARCHAR(64) NOT NULL,
CONSTRAINT uk_commercial_bank_currency_request_source UNIQUE (issuance_request_id, source_currency_id)
);
CREATE TABLE IF NOT EXISTS digital_wallet (
wallet_id VARCHAR(96) PRIMARY KEY, user_id VARCHAR(36) NOT NULL UNIQUE, wallet_type VARCHAR(16) NOT NULL,
status VARCHAR(16) NOT NULL, balance DECIMAL(20,2) NOT NULL,
central_bank_confirmation_signature VARCHAR(512) NOT NULL, opened_at TIMESTAMP NOT NULL,
created_at TIMESTAMP NOT NULL, updated_at TIMESTAMP NOT NULL
);
CREATE TABLE IF NOT EXISTS wallet_certificate (
certificate_serial VARCHAR(64) PRIMARY KEY, wallet_id VARCHAR(96) NOT NULL UNIQUE,
public_key VARCHAR(256) NOT NULL, encrypted_private_key VARCHAR(512) NOT NULL,
filing_status VARCHAR(16) NOT NULL, central_bank_root_signature VARCHAR(512) NOT NULL,
status VARCHAR(16) NOT NULL, issued_at TIMESTAMP NOT NULL,
CONSTRAINT fk_wallet_certificate_wallet FOREIGN KEY(wallet_id) REFERENCES digital_wallet(wallet_id)
);
CREATE TABLE IF NOT EXISTS wallet_contract (
contract_id VARCHAR(96) PRIMARY KEY, wallet_id VARCHAR(96) NOT NULL UNIQUE, wallet_type VARCHAR(16) NOT NULL,
single_payment_limit DECIMAL(20,2) NOT NULL, daily_payment_limit DECIMAL(20,2) NOT NULL,
annual_payment_limit DECIMAL(20,2) NOT NULL, balance_limit DECIMAL(20,2) NOT NULL,
valid_until TIMESTAMP NULL, original_text TEXT NOT NULL, digest CHAR(64) NOT NULL, status VARCHAR(16) NOT NULL,
daily_used_amount DECIMAL(20,2) NOT NULL, daily_counter_date DATE NULL,
annual_used_amount DECIMAL(20,2) NOT NULL, annual_counter_year INT NULL,
created_at TIMESTAMP NOT NULL, updated_at TIMESTAMP NOT NULL,
CONSTRAINT fk_wallet_contract_wallet FOREIGN KEY(wallet_id) REFERENCES digital_wallet(wallet_id)
);
CREATE TABLE IF NOT EXISTS simulated_bank_account (
account_id VARCHAR(96) PRIMARY KEY, user_id VARCHAR(36) NOT NULL, bank_code VARCHAR(32) NOT NULL,
bank_name VARCHAR(128) NOT NULL, card_number VARCHAR(32) NOT NULL, card_last4 CHAR(4) NOT NULL, balance DECIMAL(20,2) NOT NULL,
frozen_amount DECIMAL(20,2) NOT NULL, status VARCHAR(16) NOT NULL, created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL, CONSTRAINT uk_simulated_bank_account_user_bank UNIQUE(user_id,bank_code)
);
CREATE TABLE IF NOT EXISTS wallet_bank_binding (
wallet_id VARCHAR(96) NOT NULL, bank_account_id VARCHAR(96) NOT NULL, status VARCHAR(16) NOT NULL,
bound_at TIMESTAMP NOT NULL, PRIMARY KEY(wallet_id,bank_account_id),
CONSTRAINT fk_wallet_bank_binding_wallet FOREIGN KEY(wallet_id) REFERENCES digital_wallet(wallet_id),
CONSTRAINT fk_wallet_bank_binding_account FOREIGN KEY(bank_account_id) REFERENCES simulated_bank_account(account_id)
);
CREATE TABLE IF NOT EXISTS corporate_wallet_application (
id BIGINT PRIMARY KEY COMMENT '主键ID(雪花算法生成)',
user_id VARCHAR(36) NOT NULL COMMENT '用户ID(关联登录用户)',
school_id BIGINT NOT NULL COMMENT '学校ID',
class_id BIGINT NOT NULL COMMENT '班级ID',
corp_name VARCHAR(200) COMMENT '企业名称(如:创新科技公司)',
credit_code VARCHAR(32) COMMENT '统一社会信用代码(如:91440101MA5XXXXXX)',
legal_person VARCHAR(100) COMMENT '法人代表姓名(如:张三)',
capital VARCHAR(32) COMMENT '注册资本,单位元,保留两位小数(如:10000000.00)',
business_scope VARCHAR(500) COMMENT '经营范围(如:软件开发、技术服务)',
apply_time VARCHAR(20) COMMENT '申请时间,格式yyyyMMddHHmmss(如:20260801100000)',
concatenated_message VARCHAR(1000) COMMENT '拼接原文,格式:CORP_OPEN|企业名称|信用代码|法人|资本|经营范围|申请时间',
application_id VARCHAR(64) COMMENT '申请编号(如:CORP_APP_20260801_001)',
application_message TEXT COMMENT '申请报文JSON字符串',
status VARCHAR(32) NOT NULL DEFAULT 'DRAFT' COMMENT '申请状态:DRAFT-草稿, SUBMITTED-已提交, APPROVED-已审核, ACTIVATED-已激活',
verify_id VARCHAR(64) COMMENT '审核编号(如:VERIFY_20260801_001)',
reviewer VARCHAR(100) COMMENT '审核人姓名(如:李经理)',
verify_time VARCHAR(20) COMMENT '审核时间,格式yyyyMMddHHmmss(如:20260801101000)',
extract_message VARCHAR(500) COMMENT '提取摘要原文,格式:统一社会信用代码|审核时间',
digest_algorithm VARCHAR(16) COMMENT '摘要算法名称(如:SM3)',
digest_value VARCHAR(128) COMMENT 'SM3哈希摘要值(十六进制大写)',
wallet_id VARCHAR(128) COMMENT '对公钱包ID(如:CORP_3A4B5C6D...)',
wallet_type VARCHAR(32) COMMENT '钱包类型(如:对公钱包)',
activate_time VARCHAR(20) COMMENT '钱包激活时间,格式yyyyMMddHHmmss',
created_at TIMESTAMP NOT NULL COMMENT '创建时间',
updated_at TIMESTAMP NOT NULL COMMENT '更新时间',
created_by VARCHAR(64) NOT NULL COMMENT '创建人',
updated_by VARCHAR(64) NOT NULL COMMENT '更新人',
deleted BOOLEAN NOT NULL DEFAULT FALSE COMMENT '逻辑删除标记:false-未删除, true-已删除'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='模块六-对公钱包开通申请表';
CREATE TABLE IF NOT EXISTS remote_wallet_application (
id BIGINT PRIMARY KEY COMMENT '主键ID',
user_id VARCHAR(36) NOT NULL COMMENT '用户ID',
school_id BIGINT NOT NULL COMMENT '学校ID',
class_id BIGINT NOT NULL COMMENT '班级ID',
corp_name VARCHAR(200) COMMENT '企业名称',
credit_code VARCHAR(32) COMMENT '统一社会信用代码',
legal_person VARCHAR(100) COMMENT '法人代表',
phone VARCHAR(20) COMMENT '手机号码',
apply_time VARCHAR(20) COMMENT '申请时间',
concatenated_message VARCHAR(1000) COMMENT '拼接原文',
application_id VARCHAR(64) COMMENT '申请编号',
face_recognition_status INTEGER COMMENT '人脸识别状态:1=未成功,2=已成功',
face_verify_time VARCHAR(20) COMMENT '人脸验证时间',
status VARCHAR(32) NOT NULL DEFAULT 'DRAFT' COMMENT '状态',
signing_extract_message VARCHAR(500) COMMENT '签约摘要原文',
signing_digest_algorithm VARCHAR(16) COMMENT '签约摘要算法',
signing_digest_value VARCHAR(128) COMMENT '签约摘要值',
sign_private_key VARCHAR(512) COMMENT '签名私钥',
signature VARCHAR(1024) COMMENT '签名值',
contract_id VARCHAR(64) COMMENT '合约编号',
sign_time VARCHAR(20) COMMENT '签约时间',
wallet_extract_message VARCHAR(500) COMMENT '钱包摘要原文',
wallet_digest_algorithm VARCHAR(16) COMMENT '钱包摘要算法',
wallet_digest_value VARCHAR(128) COMMENT '钱包摘要值',
wallet_id VARCHAR(128) COMMENT '钱包ID',
wallet_type VARCHAR(32) COMMENT '钱包类型',
activate_time VARCHAR(20) COMMENT '激活时间',
created_at TIMESTAMP NOT NULL COMMENT '创建时间',
updated_at TIMESTAMP NOT NULL COMMENT '更新时间',
created_by VARCHAR(64) NOT NULL COMMENT '创建人',
updated_by VARCHAR(64) NOT NULL COMMENT '更新人',
deleted BOOLEAN NOT NULL DEFAULT FALSE COMMENT '逻辑删除'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='模块六-对公钱包远程开立申请表';
CREATE TABLE IF NOT EXISTS wallet_application (
id BIGINT PRIMARY KEY,
user_id VARCHAR(36) NOT NULL,
school_id BIGINT NOT NULL,
class_id BIGINT NOT NULL,
user_name VARCHAR(100),
id_number VARCHAR(20),
phone VARCHAR(20),
input_phone VARCHAR(20),
input_id_number VARCHAR(20),
input_bank_card_number VARCHAR(30),
account_bank VARCHAR(100),
bank_card_number VARCHAR(30),
account_balance DECIMAL(20,2),
selected_bank VARCHAR(100),
wallet_type VARCHAR(20),
application_id VARCHAR(64),
status VARCHAR(32) NOT NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
created_by VARCHAR(64) NOT NULL,
updated_by VARCHAR(64) NOT NULL,
deleted BOOLEAN NOT NULL DEFAULT FALSE
);
CREATE TABLE IF NOT EXISTS wallet_identifier_generation (
id BIGINT PRIMARY KEY,
user_id VARCHAR(36) NOT NULL,
school_id BIGINT NOT NULL,
class_id BIGINT NOT NULL,
wallet_identifier VARCHAR(128),
cert_private_key VARCHAR(512),
cert_public_key VARCHAR(512),
cert_serial_number VARCHAR(64),
cert_issued_time VARCHAR(20),
status VARCHAR(32) NOT NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
created_by VARCHAR(64) NOT NULL,
updated_by VARCHAR(64) NOT NULL,
deleted BOOLEAN NOT NULL DEFAULT FALSE
);
CREATE TABLE IF NOT EXISTS central_wallet_registration (
id BIGINT PRIMARY KEY,
user_id VARCHAR(36) NOT NULL,
school_id BIGINT NOT NULL,
class_id BIGINT NOT NULL,
wallet_id VARCHAR(128),
cb_root_signature VARCHAR(512),
wallet_registered BOOLEAN NOT NULL DEFAULT FALSE,
sent BOOLEAN NOT NULL DEFAULT FALSE,
status VARCHAR(32) NOT NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
created_by VARCHAR(64) NOT NULL,
updated_by VARCHAR(64) NOT NULL,
deleted BOOLEAN NOT NULL DEFAULT FALSE
);
CREATE TABLE IF NOT EXISTS smart_contract_generation (
id BIGINT PRIMARY KEY,
user_id VARCHAR(36) NOT NULL,
school_id BIGINT NOT NULL,
class_id BIGINT NOT NULL,
wallet_id VARCHAR(128),
wallet_type VARCHAR(30),
single_payment_limit VARCHAR(30),
daily_payment_limit VARCHAR(30),
annual_payment_limit VARCHAR(30),
balance_ceiling VARCHAR(30),
validity VARCHAR(20),
contract_plaintext VARCHAR(1000),
contract_digest VARCHAR(128),
contract_id VARCHAR(64),
contract_effective_time VARCHAR(20),
sent BOOLEAN NOT NULL DEFAULT FALSE,
status VARCHAR(32) NOT NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
created_by VARCHAR(64) NOT NULL,
updated_by VARCHAR(64) NOT NULL,
deleted BOOLEAN NOT NULL DEFAULT FALSE
);
CREATE TABLE IF NOT EXISTS central_wallet_activation (
id BIGINT PRIMARY KEY,
user_id VARCHAR(36) NOT NULL,
school_id BIGINT NOT NULL,
class_id BIGINT NOT NULL,
wallet_id VARCHAR(128),
wallet_activated BOOLEAN NOT NULL DEFAULT FALSE,
wallet_register_status VARCHAR(32),
cb_final_signature VARCHAR(512),
final_time VARCHAR(20),
final_sent BOOLEAN NOT NULL DEFAULT FALSE,
status VARCHAR(32) NOT NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
created_by VARCHAR(64) NOT NULL,
updated_by VARCHAR(64) NOT NULL,
deleted BOOLEAN NOT NULL DEFAULT FALSE
);
CREATE TABLE IF NOT EXISTS currency_exchange_order (
id CHAR(36) PRIMARY KEY, request_no VARCHAR(96) NOT NULL UNIQUE, user_id VARCHAR(36) NOT NULL,
wallet_id VARCHAR(96) NOT NULL, bank_account_id VARCHAR(96) NOT NULL, bank_code VARCHAR(32) NOT NULL,
organization_id VARCHAR(64) NOT NULL, amount DECIMAL(20,2) NOT NULL, currency VARCHAR(16) NOT NULL,
request_timestamp VARCHAR(32) NOT NULL, message_text TEXT NOT NULL, signing_original_text TEXT NOT NULL, digest CHAR(64) NOT NULL,
wallet_signature VARCHAR(512), transfer_request_no VARCHAR(128), transfer_original_text TEXT, transfer_digest CHAR(64),
bank_signature VARCHAR(512), transfer_transaction_id VARCHAR(128) UNIQUE,
central_bank_signature VARCHAR(512), confirmation_original_text TEXT, confirmation_digest CHAR(64),
debit_voucher_no VARCHAR(128) UNIQUE,
bank_balance_before DECIMAL(20,2), bank_balance_after DECIMAL(20,2), wallet_balance_after DECIMAL(20,2),
coin_count INT NOT NULL DEFAULT 0, status VARCHAR(32) NOT NULL, created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL, completed_at TIMESTAMP, created_by VARCHAR(64) NOT NULL, updated_by VARCHAR(64) NOT NULL,
CONSTRAINT fk_exchange_wallet FOREIGN KEY(wallet_id) REFERENCES digital_wallet(wallet_id),
CONSTRAINT fk_exchange_bank_account FOREIGN KEY(bank_account_id) REFERENCES simulated_bank_account(account_id)
);
CREATE TABLE IF NOT EXISTS exchange_debit_record (
voucher_no VARCHAR(128) PRIMARY KEY, exchange_id CHAR(36) NOT NULL UNIQUE, bank_account_id VARCHAR(96) NOT NULL,
before_balance DECIMAL(20,2) NOT NULL, amount DECIMAL(20,2) NOT NULL, after_balance DECIMAL(20,2) NOT NULL,
status VARCHAR(32) NOT NULL, created_at TIMESTAMP NOT NULL, created_by VARCHAR(64) NOT NULL,
CONSTRAINT fk_exchange_debit_order FOREIGN KEY(exchange_id) REFERENCES currency_exchange_order(id)
);
CREATE TABLE IF NOT EXISTS exchange_coin_reservation (
exchange_id CHAR(36) NOT NULL, currency_id VARCHAR(96) NOT NULL, denomination DECIMAL(20,2) NOT NULL,
source_status VARCHAR(32) NOT NULL, status VARCHAR(32) NOT NULL, reserved_at TIMESTAMP NOT NULL,
reserved_by VARCHAR(64) NOT NULL, transferred_at TIMESTAMP, PRIMARY KEY(exchange_id,currency_id),
CONSTRAINT uk_exchange_reserved_currency UNIQUE(currency_id),
CONSTRAINT fk_exchange_reservation_order FOREIGN KEY(exchange_id) REFERENCES currency_exchange_order(id),
CONSTRAINT fk_exchange_reservation_currency FOREIGN KEY(currency_id) REFERENCES commercial_bank_currency(currency_id)
);
CREATE TABLE IF NOT EXISTS currency_ownership_transfer (
transaction_id VARCHAR(128) PRIMARY KEY, exchange_id CHAR(36) NOT NULL UNIQUE, from_owner VARCHAR(128) NOT NULL,
to_wallet_id VARCHAR(96) NOT NULL, amount DECIMAL(20,2) NOT NULL, coin_count INT NOT NULL,
confirmation_digest CHAR(64) NOT NULL, central_bank_signature VARCHAR(512) NOT NULL, status VARCHAR(32) NOT NULL,
confirmed_at TIMESTAMP NOT NULL, confirmed_by VARCHAR(64) NOT NULL,
CONSTRAINT fk_ownership_transfer_order FOREIGN KEY(exchange_id) REFERENCES currency_exchange_order(id)
);
CREATE TABLE IF NOT EXISTS central_bank_currency_ownership (
currency_id VARCHAR(96) PRIMARY KEY, owner_type VARCHAR(16) NOT NULL, owner_id VARCHAR(128) NOT NULL,
status VARCHAR(16) NOT NULL, lock_business_type VARCHAR(32) NULL, lock_business_id VARCHAR(96) NULL,
last_transaction_id VARCHAR(128) NULL, updated_at TIMESTAMP NOT NULL,
CONSTRAINT fk_currency_ownership_currency FOREIGN KEY(currency_id) REFERENCES commercial_bank_currency(currency_id),
INDEX idx_currency_ownership_available(owner_type,owner_id,status),
INDEX idx_currency_ownership_lock_business(lock_business_type,lock_business_id)
);
CREATE TABLE IF NOT EXISTS wallet_balance_ledger (
ledger_no VARCHAR(128) PRIMARY KEY, wallet_id VARCHAR(96) NOT NULL, exchange_id CHAR(36) NOT NULL UNIQUE,
direction VARCHAR(16) NOT NULL, amount DECIMAL(20,2) NOT NULL, balance_after DECIMAL(20,2) NOT NULL,
created_at TIMESTAMP NOT NULL, created_by VARCHAR(64) NOT NULL,
CONSTRAINT fk_wallet_ledger_wallet FOREIGN KEY(wallet_id) REFERENCES digital_wallet(wallet_id),
CONSTRAINT fk_wallet_ledger_exchange FOREIGN KEY(exchange_id) REFERENCES currency_exchange_order(id)
);
CREATE TABLE IF NOT EXISTS exchange_step_log (
id BIGINT AUTO_INCREMENT PRIMARY KEY, exchange_id CHAR(36) NOT NULL, step_code VARCHAR(16) NOT NULL,
step_name VARCHAR(128) NOT NULL, status VARCHAR(16) NOT NULL, output_text TEXT, operated_at TIMESTAMP NOT NULL,
operator_user_id VARCHAR(36) NOT NULL, operator_name VARCHAR(64) NOT NULL,
CONSTRAINT fk_exchange_step_order FOREIGN KEY(exchange_id) REFERENCES currency_exchange_order(id)
);
CREATE TABLE IF NOT EXISTS central_bank_issuance_business_review (
request_id CHAR(36) PRIMARY KEY, account_valid BOOLEAN NOT NULL, vault_sufficient BOOLEAN NOT NULL,
amount_consistent BOOLEAN NOT NULL, requested_amount DECIMAL(20, 2) NULL, verified_amount DECIMAL(20, 2) NULL,
status VARCHAR(32) NOT NULL, failure_reason VARCHAR(512) NULL, reviewed_at TIMESTAMP NOT NULL,
reviewed_by_user_id VARCHAR(36) NOT NULL, reviewed_by VARCHAR(64) NOT NULL,
bank_code VARCHAR(32) NULL, organization_id VARCHAR(64) NULL, reserve_account_no VARCHAR(64) NULL,
reserve_account_name VARCHAR(128) NULL, account_status VARCHAR(32) NULL, reserve_balance DECIMAL(20, 2) NULL,
currency VARCHAR(16) NULL, vault_available_balance DECIMAL(20, 2) NULL, denomination_summary VARCHAR(512) NULL,
CONSTRAINT fk_central_bank_issuance_business_review_receipt FOREIGN KEY (request_id) REFERENCES central_bank_issuance_receipt(request_id)
);
INSERT INTO issuance_bank_inventory (bank_code, current_balance, warning_threshold, updated_at)
VALUES ('BKCHCNBJ00001', 49950000.00, 50000000.00, CURRENT_TIMESTAMP)
ON DUPLICATE KEY UPDATE current_balance = VALUES(current_balance),
warning_threshold = VALUES(warning_threshold),
updated_at = CURRENT_TIMESTAMP;
INSERT INTO central_bank_institution_account (bank_code, organization_id, reserve_account_no, reserve_account_name, status, opened_on, reserve_balance)
VALUES ('BKCHCNBJ00001', 'ORG_3A4B5C6D7E8F', 'RESERVE_BKCHCNBJ00001', '北京商业银行准备金账户', 'NORMAL', '2020-01-01', 50000000000.00)
ON DUPLICATE KEY UPDATE bank_code = VALUES(bank_code);
INSERT INTO central_bank_currency_vault (currency, available_balance)
VALUES ('DC', 300000000.00)
ON DUPLICATE KEY UPDATE currency = VALUES(currency);
CREATE TABLE IF NOT EXISTS business_knowledge_category (
code VARCHAR(64) PRIMARY KEY, name VARCHAR(128) NOT NULL, sort_no INT NOT NULL, enabled BOOLEAN NOT NULL DEFAULT TRUE
);
CREATE TABLE IF NOT EXISTS business_knowledge_item (
code VARCHAR(64) PRIMARY KEY, category_code VARCHAR(64) NOT NULL, title VARCHAR(128) NOT NULL, summary VARCHAR(512) NOT NULL,
content TEXT NOT NULL, version VARCHAR(32) NOT NULL, sort_no INT NOT NULL, enabled BOOLEAN NOT NULL DEFAULT TRUE,
created_at TIMESTAMP NOT NULL, updated_at TIMESTAMP NOT NULL, created_by VARCHAR(64) NOT NULL, updated_by VARCHAR(64) NOT NULL,
CONSTRAINT fk_business_knowledge_item_category FOREIGN KEY (category_code) REFERENCES business_knowledge_category(code)
);
CREATE TABLE IF NOT EXISTS business_knowledge_module_step (
module_code VARCHAR(64) NOT NULL, step_code VARCHAR(32) NOT NULL, step_name VARCHAR(128) NOT NULL, step_summary VARCHAR(512) NOT NULL,
sort_no INT NOT NULL, PRIMARY KEY (module_code, step_code)
);
CREATE TABLE IF NOT EXISTS business_knowledge_step_relation (
id BIGINT AUTO_INCREMENT PRIMARY KEY, knowledge_code VARCHAR(64) NOT NULL, module_code VARCHAR(64) NOT NULL, step_code VARCHAR(32) NOT NULL,
relation_type VARCHAR(32) NOT NULL, sort_no INT NOT NULL, CONSTRAINT uk_business_knowledge_step_relation UNIQUE (knowledge_code, module_code, step_code),
CONSTRAINT fk_business_knowledge_relation_item FOREIGN KEY (knowledge_code) REFERENCES business_knowledge_item(code),
CONSTRAINT fk_business_knowledge_relation_step FOREIGN KEY (module_code, step_code) REFERENCES business_knowledge_module_step(module_code, step_code)
);
CREATE TABLE IF NOT EXISTS business_knowledge_import_log (
id BIGINT AUTO_INCREMENT PRIMARY KEY, version VARCHAR(32) NOT NULL, source VARCHAR(256) NOT NULL, item_count INT NOT NULL,
operator_user_id VARCHAR(36) NOT NULL, operator_name VARCHAR(64) NOT NULL, imported_at TIMESTAMP NOT NULL
);
INSERT INTO business_knowledge_category (code, name, sort_no, enabled) VALUES
('KEY_AND_ALGORITHM', '密钥与算法', 10, TRUE), ('SYSTEM_COMPONENT', '系统组件', 20, TRUE), ('CURRENCY_DATA', '数字货币数据', 30, TRUE)
ON DUPLICATE KEY UPDATE name = VALUES(name), sort_no = VALUES(sort_no), enabled = TRUE;
INSERT INTO business_knowledge_module_step (module_code, step_code, step_name, step_summary, sort_no) VALUES
('PBOC_CURRENCY_GENERATION', '01', '机构身份信息与密钥准备', '生成机构标识,并准备第一、第二 SM2 密钥及其公钥。', 10),
('PBOC_CURRENCY_GENERATION', '02', '生成数字货币请求', '提交申请金额、系统标识和时间戳。', 20),
('PBOC_CURRENCY_GENERATION', '03', '央行验证请求', '央行使用第一私钥验证申请报文。', 30),
('PBOC_CURRENCY_GENERATION', '04', '生成交易流水号', '央行生成并返回交易流水号。', 40),
('PBOC_CURRENCY_GENERATION', '05', '申请额度控制位', '机构使用第二私钥签名后申请额度控制位。', 50),
('PBOC_CURRENCY_GENERATION', '06', '央行校验摘要', '央行校验申请金额与控制位申请摘要。', 60),
('PBOC_CURRENCY_GENERATION', '07', '央行签名', '央行确认后使用第一私钥生成签名。', 70),
('PBOC_CURRENCY_GENERATION', '08', '返回额度控制位', '返回静态控制位、动态控制位和央行签名。', 80),
('PBOC_CURRENCY_GENERATION', '09', '生成币串', '使用账户信息、额度控制位及第二私钥生成币串。', 90),
('PBOC_CURRENCY_ISSUANCE', '01', '查看货币需求', '读取商业银行库存余额、预警阈值及建议补充金额。', 10),
('PBOC_CURRENCY_ISSUANCE', '02', '生成发行申请计划', '填写机构信息、申请总额、面额结构和时间戳,拼接请求原文。', 20),
('PBOC_CURRENCY_ISSUANCE', '03', '发行计划数字签名', '对请求原文执行 SM3 摘要,再以第二私钥进行 SM2 签名。', 30),
('PBOC_CURRENCY_ISSUANCE', '04', '发送标准报文', '将请求原文、摘要与签名打包并发送至央行。', 40),
('PBOC_CURRENCY_ISSUANCE', '05', '央行验证与业务核查', '央行校验 H1、H2 和签名,并保存账户、发行库和金额一致性的核查快照。', 50),
('PBOC_CURRENCY_ISSUANCE', '06', '准备金通知与 ACS 扣减', '央行发送通知,商业银行确认接收并提交申请后,由 ACS 扣减准备金。', 60),
('PBOC_CURRENCY_ISSUANCE', '07', '发行并确权数字货币', '按控制位和面额锁定生成模块已有待生效币串,央行以第一私钥确权并划转至商业银行库。', 70),
('WALLET_OPENING', '01', '开立数字钱包', '完成用户身份校验、钱包创建和钱包密钥绑定。', 10),
('CURRENCY_EXCHANGE', '01', '数字货币兑换', '在账户余额和数字人民币之间完成兑换及记账。', 10),
('CURRENCY_PAYMENT', '01', '数字货币支付', '完成付款方、收款方和交易报文的校验与清算。', 10)
ON DUPLICATE KEY UPDATE step_name = VALUES(step_name), step_summary = VALUES(step_summary), sort_no = VALUES(sort_no);
INSERT INTO business_knowledge_item (code, category_code, title, summary, content, version, sort_no, enabled, created_at, updated_at, created_by, updated_by) VALUES
('FIRST_PRIVATE_KEY', 'KEY_AND_ALGORITHM', '第一私钥', '由中国人民银行侧持有,用于验证和确权签名。', '第一私钥属于央行侧密钥材料。在生成数字货币阶段用于验证机构请求并对结果签名;在发行阶段用于最终确权。私钥不能返回前端或写入业务报文。', '1.0.0', 10, TRUE, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'SYSTEM', 'SYSTEM'),
('SECOND_PRIVATE_KEY', 'KEY_AND_ALGORITHM', '第二私钥', '由商业银行侧持有,用于对发行及额度控制位请求进行 SM2 签名。', '第二私钥由中国人民银行生成数字货币实验模块生成并保存。发行模块按当前用户、学校和班级身份直接调用密钥服务完成签名,不向前端返回私钥。', '1.0.0', 20, TRUE, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'SYSTEM', 'SYSTEM'),
('SM2', 'KEY_AND_ALGORITHM', 'SM2 算法', '国产椭圆曲线公钥密码算法,用于数字签名和验签。', 'SM2 用于用私钥对摘要签名,并由对应公钥验签。原型中第二私钥签发发行计划签名,第一私钥完成央行侧签名。', '1.0.0', 30, TRUE, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'SYSTEM', 'SYSTEM'),
('SM3', 'KEY_AND_ALGORITHM', 'SM3 算法', '国产密码杂凑算法,用于生成固定长度摘要。', 'SM3 对请求原文生成摘要值。摘要是 SM2 签名的输入,保证报文在传输和审核过程中的完整性。', '1.0.0', 40, TRUE, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'SYSTEM', 'SYSTEM'),
('BANK_FRONT_END', 'SYSTEM_COMPONENT', '银行前置机', '商业银行与央行系统之间的业务接入和报文转发节点。', '银行前置机负责组织标准报文、转发请求并接收央行处理结果,是实验流程中的系统接入节点。', '1.0.0', 10, TRUE, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'SYSTEM', 'SYSTEM'),
('ACS', 'SYSTEM_COMPONENT', 'ACS 系统', '央行发行处理链路中的业务处理系统。', '发行审核通过后,准备金扣减及发行数据需要进入 ACS 系统;ACS 处理结果参与后续数字货币生成和确权。', '1.0.0', 20, TRUE, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'SYSTEM', 'SYSTEM'),
('LIMIT_CONTROL_BIT', 'CURRENCY_DATA', '额度控制位', '用于约束数字货币发行额度和使用状态的控制数据。', '额度控制位包含静态控制位、动态控制位及央行签名。机构申请控制位时使用第二私钥签名,央行校验后返回控制位数据。', '1.0.0', 10, TRUE, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'SYSTEM', 'SYSTEM'),
('CURRENCY_STRING', 'CURRENCY_DATA', '币串', '按面额、额度控制位、账户信息和签名生成的数字货币数据。', '币串只在生成模块铸造。发行模块按面额锁定已有待生效币串,保留源币和生成批次关联,确权后将其从央行发行库划转至商业银行库。', '1.0.0', 20, TRUE, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'SYSTEM', 'SYSTEM')
ON DUPLICATE KEY UPDATE category_code = VALUES(category_code), title = VALUES(title),
summary = VALUES(summary), content = VALUES(content), version = VALUES(version),
sort_no = VALUES(sort_no), enabled = VALUES(enabled), updated_at = CURRENT_TIMESTAMP,
updated_by = VALUES(updated_by);
INSERT INTO business_knowledge_step_relation (knowledge_code, module_code, step_code, relation_type, sort_no) VALUES
('FIRST_PRIVATE_KEY', 'PBOC_CURRENCY_GENERATION', '03', 'VERIFY', 10), ('FIRST_PRIVATE_KEY', 'PBOC_CURRENCY_GENERATION', '07', 'SIGN', 10),
('SECOND_PRIVATE_KEY', 'PBOC_CURRENCY_GENERATION', '01', 'KEY', 10), ('SECOND_PRIVATE_KEY', 'PBOC_CURRENCY_GENERATION', '05', 'SIGN', 10),
('SECOND_PRIVATE_KEY', 'PBOC_CURRENCY_GENERATION', '08', 'VERIFY', 10), ('SECOND_PRIVATE_KEY', 'PBOC_CURRENCY_GENERATION', '09', 'SIGN', 10),
('SM2', 'PBOC_CURRENCY_GENERATION', '05', 'ALGORITHM', 20), ('LIMIT_CONTROL_BIT', 'PBOC_CURRENCY_GENERATION', '05', 'DATA', 30),
('LIMIT_CONTROL_BIT', 'PBOC_CURRENCY_GENERATION', '08', 'OUTPUT', 20), ('CURRENCY_STRING', 'PBOC_CURRENCY_GENERATION', '09', 'OUTPUT', 20),
('SM3', 'PBOC_CURRENCY_ISSUANCE', '03', 'ALGORITHM', 10), ('SM2', 'PBOC_CURRENCY_ISSUANCE', '03', 'ALGORITHM', 20),
('SECOND_PRIVATE_KEY', 'PBOC_CURRENCY_ISSUANCE', '03', 'KEY', 30), ('BANK_FRONT_END', 'PBOC_CURRENCY_ISSUANCE', '04', 'SYSTEM', 10),
('ACS', 'PBOC_CURRENCY_ISSUANCE', '06', 'SYSTEM', 10), ('LIMIT_CONTROL_BIT', 'PBOC_CURRENCY_ISSUANCE', '07', 'DATA', 10),
('CURRENCY_STRING', 'PBOC_CURRENCY_ISSUANCE', '07', 'OUTPUT', 20), ('FIRST_PRIVATE_KEY', 'PBOC_CURRENCY_ISSUANCE', '07', 'SIGN', 30)
ON DUPLICATE KEY UPDATE knowledge_code = VALUES(knowledge_code);
-- 模块六:密钥信息表
CREATE TABLE IF NOT EXISTS corporate_wallet_key_info (
id BIGINT PRIMARY KEY COMMENT '主键ID',
user_id VARCHAR(36) NOT NULL COMMENT '用户ID',
school_id BIGINT NOT NULL COMMENT '学校ID',
class_id BIGINT NOT NULL COMMENT '班级ID',
key_type VARCHAR(64) NOT NULL COMMENT '密钥类型',
holder VARCHAR(128) NOT NULL COMMENT '持有方',
key_algorithm VARCHAR(16) NOT NULL DEFAULT 'SM2' COMMENT '密码算法',
key_value TEXT NOT NULL COMMENT '完整值(十六进制)',
is_private_key BOOLEAN NOT NULL COMMENT '是否为私钥',
source VARCHAR(32) NOT NULL DEFAULT 'NEW' COMMENT '密钥来源',
created_at TIMESTAMP NOT NULL COMMENT '创建时间',
updated_at TIMESTAMP NOT NULL COMMENT '更新时间',
created_by VARCHAR(64) NOT NULL COMMENT '创建人',
updated_by VARCHAR(64) NOT NULL COMMENT '更新人',
deleted BOOLEAN NOT NULL DEFAULT FALSE COMMENT '逻辑删除'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='模块六-密钥信息表';
-- 模块六:工资发放批次表
CREATE TABLE IF NOT EXISTS salary_batch (
id BIGINT PRIMARY KEY COMMENT '主键ID',
user_id VARCHAR(36) NOT NULL COMMENT '用户ID',
school_id BIGINT NOT NULL COMMENT '学校ID',
class_id BIGINT NOT NULL COMMENT '班级ID',
batch_id VARCHAR(64) COMMENT '批次号',
corp_wallet_id VARCHAR(128) COMMENT '付款钱包ID',
operator_name VARCHAR(64) COMMENT '操作员姓名',
operator_timestamp VARCHAR(20) COMMENT '操作时间戳',
concatenated_message TEXT COMMENT '拼接原文',
digest_algorithm VARCHAR(16) COMMENT '摘要算法',
digest_value VARCHAR(128) COMMENT 'SM3摘要值',
signature TEXT COMMENT 'SM2签名值',
output_json TEXT COMMENT '输出JSON报文',
status VARCHAR(32) NOT NULL DEFAULT 'DRAFT' COMMENT '状态',
submit_time VARCHAR(20) COMMENT '发送时间',
reviewer_name VARCHAR(64) COMMENT '复核员姓名',
review_timestamp VARCHAR(20) COMMENT '审核时间戳',
review_concatenated_message TEXT COMMENT '拼接审核原文',
review_digest_algorithm VARCHAR(16) COMMENT '审核摘要算法',
review_digest_value VARCHAR(128) COMMENT '审核SM3摘要值',
review_signature TEXT COMMENT '审核SM2签名值',
review_output_json TEXT COMMENT '审核输出JSON',
single_limit_status INT COMMENT '单笔限额状态:1-通过, 2-未通过',
batch_limit_status INT COMMENT '批次限额状态:1-通过, 2-未通过',
daily_limit_status INT COMMENT '日累计限额状态:1-通过, 2-未通过',
review_result VARCHAR(32) COMMENT '审核结果:APPROVED-已批准, REJECTED-已拒绝',
confirm_message TEXT COMMENT '交易确认原文',
confirm_timestamp VARCHAR(20) COMMENT '确认时间戳',
confirm_digest_algorithm VARCHAR(16) COMMENT '确认摘要算法',
confirm_digest_value VARCHAR(128) COMMENT '确认SM3摘要值',
cb_signature TEXT COMMENT '央行SM2签名值',
confirm_output_json TEXT COMMENT '交易确认输出JSON',
created_at TIMESTAMP NOT NULL COMMENT '创建时间',
updated_at TIMESTAMP NOT NULL COMMENT '更新时间',
created_by VARCHAR(64) NOT NULL COMMENT '创建人',
updated_by VARCHAR(64) NOT NULL COMMENT '更新人',
deleted BOOLEAN NOT NULL DEFAULT FALSE COMMENT '逻辑删除'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='模块六-工资发放批次表';
-- 模块五:用户支付数字货币实验模块。
ALTER TABLE digital_wallet
ADD COLUMN IF NOT EXISTS frozen_amount DECIMAL(20,2) NOT NULL DEFAULT 0;
CREATE TABLE IF NOT EXISTS payment_order (
id CHAR(36) PRIMARY KEY,
payment_no VARCHAR(96) NOT NULL UNIQUE,
payer_user_id VARCHAR(36) NOT NULL,
payer_wallet_id VARCHAR(96) NOT NULL,
payer_bank_code VARCHAR(32) NOT NULL,
payer_organization_id VARCHAR(64) NOT NULL,
payee_user_id VARCHAR(36) NOT NULL,
payee_wallet_id VARCHAR(96) NOT NULL,
payee_bank_code VARCHAR(32) NOT NULL,
payee_organization_id VARCHAR(64) NOT NULL,
amount DECIMAL(20,2) NOT NULL,
payment_note VARCHAR(256) NOT NULL,
request_timestamp VARCHAR(32) NOT NULL,
payment_original_text TEXT NOT NULL,
payment_digest CHAR(64) NOT NULL,
payer_signature VARCHAR(512) NULL,
compliance_report TEXT NULL,
compliance_digest CHAR(64) NULL,
payer_bank_signature VARCHAR(512) NULL,
transaction_id VARCHAR(128) NULL UNIQUE,
clearing_no VARCHAR(128) NULL UNIQUE,
settlement_original_text TEXT NULL,
settlement_digest CHAR(64) NULL,
central_bank_signature VARCHAR(512) NULL,
coin_count INT NOT NULL DEFAULT 0,
payer_balance_after DECIMAL(20,2) NULL,
payee_balance_after DECIMAL(20,2) NULL,
status VARCHAR(32) NOT NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
completed_at TIMESTAMP NULL,
created_by VARCHAR(64) NOT NULL,
updated_by VARCHAR(64) NOT NULL,
FOREIGN KEY (payer_wallet_id) REFERENCES digital_wallet(wallet_id),
FOREIGN KEY (payee_wallet_id) REFERENCES digital_wallet(wallet_id)
);
CREATE TABLE IF NOT EXISTS training_task_step_progress (
user_id VARCHAR(36) NOT NULL,
module_code VARCHAR(64) NOT NULL,
step_code VARCHAR(32) NOT NULL,
completed_at TIMESTAMP NOT NULL,
PRIMARY KEY (user_id, module_code, step_code)
);
CREATE TABLE IF NOT EXISTS payment_coin_reservation (
payment_id CHAR(36) NOT NULL,
currency_id VARCHAR(96) NOT NULL,
denomination DECIMAL(20,2) NOT NULL,
source_status VARCHAR(32) NOT NULL,
status VARCHAR(32) NOT NULL,
reserved_at TIMESTAMP NOT NULL,
transferred_at TIMESTAMP NULL,
PRIMARY KEY (payment_id, currency_id),
FOREIGN KEY (payment_id) REFERENCES payment_order(id),
FOREIGN KEY (currency_id) REFERENCES commercial_bank_currency(currency_id)
);
CREATE TABLE IF NOT EXISTS payment_ownership_transfer (
transaction_id VARCHAR(128) PRIMARY KEY,
payment_id CHAR(36) NOT NULL UNIQUE,
from_wallet_id VARCHAR(96) NOT NULL,
to_wallet_id VARCHAR(96) NOT NULL,
amount DECIMAL(20,2) NOT NULL,
coin_count INT NOT NULL,
settlement_digest CHAR(64) NOT NULL,
central_bank_signature VARCHAR(512) NOT NULL,
status VARCHAR(32) NOT NULL,
confirmed_at TIMESTAMP NOT NULL,
confirmed_by VARCHAR(64) NOT NULL,
FOREIGN KEY (payment_id) REFERENCES payment_order(id)
);
CREATE TABLE IF NOT EXISTS payment_clearing_record (
clearing_no VARCHAR(128) PRIMARY KEY,
payment_id CHAR(36) NOT NULL UNIQUE,
payer_bank_code VARCHAR(32) NOT NULL,
payee_bank_code VARCHAR(32) NOT NULL,
amount DECIMAL(20,2) NOT NULL,
status VARCHAR(32) NOT NULL,
settled_at TIMESTAMP NOT NULL,
FOREIGN KEY (payment_id) REFERENCES payment_order(id)
);
CREATE TABLE IF NOT EXISTS payment_wallet_ledger (
ledger_no VARCHAR(128) PRIMARY KEY,
payment_id CHAR(36) NOT NULL,
wallet_id VARCHAR(96) NOT NULL,
direction VARCHAR(16) NOT NULL,
amount DECIMAL(20,2) NOT NULL,
balance_after DECIMAL(20,2) NOT NULL,
created_at TIMESTAMP NOT NULL,
created_by VARCHAR(64) NOT NULL,
UNIQUE KEY uk_payment_wallet_ledger (payment_id, wallet_id),
FOREIGN KEY (payment_id) REFERENCES payment_order(id),
FOREIGN KEY (wallet_id) REFERENCES digital_wallet(wallet_id)
);
CREATE TABLE IF NOT EXISTS payment_notification (
id CHAR(36) PRIMARY KEY,
payment_id CHAR(36) NOT NULL,
recipient_user_id VARCHAR(36) NOT NULL,
recipient_wallet_id VARCHAR(96) NOT NULL,
notification_type VARCHAR(32) NOT NULL,
content TEXT NOT NULL,
status VARCHAR(16) NOT NULL,
created_at TIMESTAMP NOT NULL,
UNIQUE KEY uk_payment_notification (payment_id, notification_type),
FOREIGN KEY (payment_id) REFERENCES payment_order(id)
);
CREATE TABLE IF NOT EXISTS payment_step_log (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
payment_id CHAR(36) NOT NULL,
step_code VARCHAR(16) NOT NULL,
step_name VARCHAR(128) NOT NULL,
status VARCHAR(16) NOT NULL,
output_text TEXT NULL,
operated_at TIMESTAMP NOT NULL,
operator_user_id VARCHAR(36) NOT NULL,
operator_name VARCHAR(64) NOT NULL,
FOREIGN KEY (payment_id) REFERENCES payment_order(id)
);
CREATE TABLE IF NOT EXISTS training_experiment_attempt (
id CHAR(36) PRIMARY KEY,
module_code VARCHAR(32) NOT NULL,
user_id VARCHAR(36) NOT NULL,
school_id BIGINT NOT NULL,
class_id BIGINT NOT NULL,
organization_id VARCHAR(64) NOT NULL DEFAULT '',
attempt_no INT NOT NULL,
status VARCHAR(32) NOT NULL,
current_step_code VARCHAR(16) NULL,
current_action_code VARCHAR(64) NULL,
business_id VARCHAR(96) NULL,
version BIGINT NOT NULL DEFAULT 0,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
completed_at TIMESTAMP NULL,
CONSTRAINT uk_experiment_attempt_no
UNIQUE (module_code, user_id, school_id, class_id, organization_id, attempt_no),
INDEX idx_experiment_attempt_current
(module_code, user_id, school_id, class_id, status, attempt_no)
);
CREATE TABLE IF NOT EXISTS training_experiment_action (
id CHAR(36) PRIMARY KEY,
attempt_id CHAR(36) NOT NULL,
step_code VARCHAR(16) NOT NULL,
action_code VARCHAR(64) NOT NULL,
status VARCHAR(32) NOT NULL,
request_fingerprint CHAR(64) NOT NULL,
output_json TEXT NULL,
error_code VARCHAR(32) NULL,
error_message VARCHAR(512) NULL,
started_at TIMESTAMP NOT NULL,
completed_at TIMESTAMP NULL,
updated_at TIMESTAMP NOT NULL,
version BIGINT NOT NULL DEFAULT 0,
CONSTRAINT uk_experiment_action UNIQUE (attempt_id, step_code, action_code),
INDEX idx_experiment_action_attempt (attempt_id, started_at),
CONSTRAINT fk_experiment_action_attempt
FOREIGN KEY (attempt_id) REFERENCES training_experiment_attempt(id)
);