diff --git a/backend/futures_trade_record/sql/02_create_country_table.sql b/backend/futures_trade_record/sql/02_create_country_table.sql deleted file mode 100644 index 7b706d7..0000000 --- a/backend/futures_trade_record/sql/02_create_country_table.sql +++ /dev/null @@ -1,30 +0,0 @@ --- 切换到目标数据库 -\c postgres; - -CREATE OR REPLACE FUNCTION update_futures_trade_record_modified_column() -RETURNS TRIGGER AS $$ -BEGIN - NEW.updated_at = CURRENT_TIMESTAMP; - RETURN NEW; -END; -$$ LANGUAGE plpgsql VOLATILE; - -DO $$ -BEGIN - IF NOT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'futures_trade_record') THEN - CREATE TABLE "futures_trade_record" ( -- futures_trade_record是关键字,用双引号包裹 - id UUID DEFAULT gen_random_uuid_v7() PRIMARY KEY NOT NULL, - deleted BOOLEAN NOT NULL DEFAULT FALSE, - created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP - ); - CREATE TRIGGER update_futures_trade_record_updated_at - BEFORE UPDATE ON "futures_trade_record" - FOR EACH ROW - EXECUTE FUNCTION update_futures_trade_record_modified_column(); - - RAISE NOTICE 'Created futures_trade_record table and trigger'; - ELSE - RAISE NOTICE 'futures_trade_record table already exists'; - END IF; -END $$; \ No newline at end of file diff --git a/backend/futures_trade_record/sql/03_create_trade_record_table.sql b/backend/futures_trade_record/sql/03_create_trade_record_table.sql index eee7001..4a73af2 100644 --- a/backend/futures_trade_record/sql/03_create_trade_record_table.sql +++ b/backend/futures_trade_record/sql/03_create_trade_record_table.sql @@ -13,45 +13,77 @@ DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_trade_record = 'trade_record') THEN -- 创建交易记录表(根据业务场景命名为 trade_record,可按需修改) -CREATE TABLE trade_record ( - -- 主键 UUID,默认使用 PostgreSQL 内置函数生成唯一值 - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - - -- 开仓日期相关(整数类型,限制合理范围避免无效数据) - open_year INT NOT NULL CHECK (open_year > 1900 AND open_year <= EXTRACT(YEAR FROM CURRENT_DATE) + 1), - open_month INT NOT NULL CHECK (open_month BETWEEN 1 AND 12), - open_day INT NOT NULL CHECK (open_day BETWEEN 1 AND 31), - - -- 品种、合约、方向(字符串类型,根据业务长度调整 varchar 长度) - variety VARCHAR(50) NOT NULL, -- 品种(如:黄金、原油) - contract VARCHAR(50) NOT NULL, -- 合约(如:AU2406、CL2407) - direction VARCHAR(20) NOT NULL CHECK (direction IN ('多头', '空头', '买入', '卖出')), -- 限制合法方向值 - - -- 开仓相关数值(使用 numeric 类型替代 double,避免浮点数精度丢失,适合金融数据) - open_price NUMERIC(12, 6) NOT NULL, -- 开仓价格(精度:整数位6位+小数位6位,可按需调整) - open_commission NUMERIC(10, 6) NOT NULL DEFAULT 0.00, -- 开仓手续费(默认0) - - -- 平仓日期相关(允许 NULL,未平仓时为空) - close_year INT CHECK (close_year IS NULL OR (close_year > 1900 AND close_year <= EXTRACT(YEAR FROM CURRENT_DATE) + 1)), - close_month INT CHECK (close_month IS NULL OR close_month BETWEEN 1 AND 12), - close_day INT CHECK (close_day IS NULL OR close_day BETWEEN 1 AND 31), - - -- 平仓相关数值(允许 NULL,未平仓时为空;同样使用 numeric 保证精度) - close_price NUMERIC(12, 6), -- 平仓价格 - close_commission NUMERIC(10, 6) DEFAULT 0.00, -- 平仓手续费(默认0) - close_price_diff NUMERIC(12, 6), -- 平仓差价 - tick_price NUMERIC(12, 6), -- 跳点价格 - price_diff_profit NUMERIC(12, 6), -- 差价盈亏 - total_commission NUMERIC(10, 6) DEFAULT 0.00, -- 总手续费(开仓+平仓,可通过触发器自动计算) - close_profit NUMERIC(12, 6) -- 平仓盈亏 - deleted BOOLEAN NOT NULL DEFAULT FALSE, - created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP -); + CREATE TABLE trade_record ( + -- 主键 UUID,默认使用 PostgreSQL 内置函数生成唯一值 + id UUID DEFAULT gen_random_uuid_v7() PRIMARY KEY NOT NULL, + + -- 开仓日期相关(整数类型,限制合理范围避免无效数据) + open_year INT NOT NULL CHECK (open_year > 1900 AND open_year <= EXTRACT(YEAR FROM CURRENT_DATE) + 1), + open_month INT NOT NULL CHECK (open_month BETWEEN 1 AND 12), + open_day INT NOT NULL CHECK (open_day BETWEEN 1 AND 31), + + -- 品种、合约、方向(字符串类型,根据业务长度调整 varchar 长度) + variety VARCHAR(50) NOT NULL, -- 品种(如:黄金、原油) + contract VARCHAR(50) NOT NULL, -- 合约(如:AU2406、CL2407) + direction VARCHAR(20) NOT NULL CHECK (direction IN ('多头', '空头', '买入', '卖出')), -- 限制合法方向值 + + -- 开仓相关数值(使用 numeric 类型替代 double,避免浮点数精度丢失,适合金融数据) + open_price NUMERIC(12, 6) NOT NULL, -- 开仓价格(精度:整数位6位+小数位6位,可按需调整) + open_commission NUMERIC(10, 6) NOT NULL DEFAULT 0.00, -- 开仓手续费(默认0) + + -- 平仓日期相关(允许 NULL,未平仓时为空) + close_year INT CHECK (close_year IS NULL OR (close_year > 1900 AND close_year <= EXTRACT(YEAR FROM CURRENT_DATE) + 1)), + close_month INT CHECK (close_month IS NULL OR close_month BETWEEN 1 AND 12), + close_day INT CHECK (close_day IS NULL OR close_day BETWEEN 1 AND 31), + + -- 平仓相关数值(允许 NULL,未平仓时为空;同样使用 numeric 保证精度) + close_price NUMERIC(12, 6), -- 平仓价格 + close_commission NUMERIC(10, 6) DEFAULT 0.00, -- 平仓手续费(默认0) + variety_tick NUMERIC(12, 6), -- 品种跳点 + close_tick_diff NUMERIC(12, 6), -- 平仓跳点差价 + tick_price NUMERIC(12, 6), -- 跳点价格 + tick_diff_profit NUMERIC(12, 6), -- 平仓跳点差价盈亏 + total_commission NUMERIC(10, 6) DEFAULT 0.00, -- 总手续费(开仓+平仓,可通过触发器自动计算) + close_profit NUMERIC(12, 6) -- 平仓盈亏 + deleted BOOLEAN NOT NULL DEFAULT FALSE, + created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP + ); + CREATE TRIGGER update_trade_record_updated_at BEFORE UPDATE ON "trade_record" FOR EACH ROW EXECUTE FUNCTION update_trade_record_modified_column(); + + -- 按开仓日期查询索引 + CREATE INDEX idx_trade_open_date ON trade_record (open_year, open_month, open_day); + -- 按品种+合约查询索引 + CREATE INDEX idx_trade_variety_contract ON trade_record (variety, contract); + -- 按平仓状态查询索引(未平仓:close_year IS NULL) + CREATE INDEX idx_trade_close_status ON trade_record (close_year); + + --------------- 注释说明(增强可读性)------------- + COMMENT ON TABLE trade_record IS '交易记录表(存储开仓/平仓相关信息)'; + COMMENT ON COLUMN trade_record.id IS '主键UUID(全局唯一标识)'; + COMMENT ON COLUMN trade_record.open_year IS '开仓年份'; + COMMENT ON COLUMN trade_record.open_month IS '开仓月份'; + COMMENT ON COLUMN trade_record.open_day IS '开仓日期'; + COMMENT ON COLUMN trade_record.variety IS '交易品种(如:FG、RB)'; + COMMENT ON COLUMN trade_record.contract IS '交易合约(如:2401)'; + COMMENT ON COLUMN trade_record.direction IS '交易方向(多/空)'; + COMMENT ON COLUMN trade_record.open_price IS '开仓价格'; + COMMENT ON COLUMN trade_record.open_commission IS '开仓手续费'; + COMMENT ON COLUMN trade_record.close_year IS '平仓年份(未平仓为NULL)'; + COMMENT ON COLUMN trade_record.close_month IS '平仓月份(未平仓为NULL)'; + COMMENT ON COLUMN trade_record.close_day IS '平仓日期(未平仓为NULL)'; + COMMENT ON COLUMN trade_record.close_price IS '平仓价格(未平仓为NULL)'; + COMMENT ON COLUMN trade_record.close_commission IS '平仓手续费(未平仓为NULL)'; + COMMENT ON COLUMN trade_record.variety_tick IS '品种跳点'; + COMMENT ON COLUMN trade_record.close_tick_diff IS '平仓差价跳点((平仓价格-开仓价格)/品种最小跳点)'; + COMMENT ON COLUMN trade_record.tick_price IS '跳点价格(单个跳点对应的金额)'; + COMMENT ON COLUMN trade_record.tick_diff_profit IS '差价盈亏(基于平仓差价跳点计算的盈利/亏损)'; + COMMENT ON COLUMN trade_record.total_commission IS '总手续费(开仓+平仓,自动计算)'; + COMMENT ON COLUMN trade_record.close_profit IS '平仓盈亏(最终实际盈利/亏损)'; RAISE NOTICE 'created trade_record table and trigger'; ELSE diff --git a/backend/futures_trade_record/sql/04_create_code_table.sql b/backend/futures_trade_record/sql/04_create_code_table.sql deleted file mode 100644 index c62fcaf..0000000 --- a/backend/futures_trade_record/sql/04_create_code_table.sql +++ /dev/null @@ -1,32 +0,0 @@ --- 切换到目标数据库 -\c postgres; - -CREATE OR REPLACE FUNCTION update_code_modified_column() -RETURNS TRIGGER AS $$ -BEGIN - NEW.updated_at = CURRENT_TIMESTAMP; - RETURN NEW; -END; -$$ LANGUAGE plpgsql VOLATILE; - -DO $$ -BEGIN - IF NOT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'code') THEN - CREATE TABLE code ( - id UUID DEFAULT gen_random_uuid_v7() PRIMARY KEY NOT NULL, - futures_trade_record_id UUID NOT NULL, - code VARCHAR NOT NULL, - deleted BOOLEAN NOT NULL DEFAULT FALSE, - created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP - ); - CREATE TRIGGER update_code_updated_at - BEFORE UPDATE ON "code" - FOR EACH ROW - EXECUTE FUNCTION update_code_modified_column(); - - RAISE NOTICE 'Created code table and trigger'; - ELSE - RAISE NOTICE 'code table already exists'; - END IF; -END $$; \ No newline at end of file diff --git a/backend/futures_trade_record/sql/05_create_info_view.sql b/backend/futures_trade_record/sql/05_create_info_view.sql deleted file mode 100644 index 0a39682..0000000 --- a/backend/futures_trade_record/sql/05_create_info_view.sql +++ /dev/null @@ -1,38 +0,0 @@ -\c postgres; - -DO $$ -DECLARE - view_exists BOOLEAN; -BEGIN - -- 检查视图是否已存在 - SELECT EXISTS ( - SELECT 1 FROM information_schema.views - WHERE table_name = 'futures_trade_record_info_view' - ) INTO view_exists; - - -- 创建或更新视图 - CREATE OR REPLACE VIEW futures_trade_record_info_view AS - SELECT - u.id AS futures_trade_record_id, - n.name AS name, - c.code AS code, - u.deleted AS deleted - FROM - "futures_trade_record" u - JOIN - name n ON u.id = n.futures_trade_record_id - JOIN - code c ON u.id = c.futures_trade_record_id - WHERE - u.deleted = FALSE; - - -- 根据视图是否已存在输出不同提示 - IF view_exists THEN - RAISE NOTICE '视图 futures_trade_record_info_view 已更新'; - ELSE - RAISE NOTICE '视图 futures_trade_record_info_view 已创建'; - END IF; -EXCEPTION - WHEN OTHERS THEN - RAISE NOTICE '处理视图时发生错误: %', SQLERRM; -END $$;