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) );