Files

149 lines
5.3 KiB
SQL
Raw Permalink Normal View History

2026-08-03 18:37:42 +08:00
-- +goose Up
CREATE TABLE tasks (
id TEXT PRIMARY KEY,
source TEXT NOT NULL CHECK (source IN ('MANUAL', 'EXCEL', 'ERP')),
source_ref TEXT,
title TEXT NOT NULL,
goods_id TEXT NOT NULL,
sku_color TEXT NOT NULL,
sku_size TEXT NOT NULL,
quantity INTEGER NOT NULL CHECK (quantity > 0 AND typeof(quantity) = 'integer'),
max_total_price TEXT NOT NULL CHECK (
max_total_price <> ''
AND max_total_price NOT GLOB '*[^0-9.]*'
AND length(max_total_price) - length(replace(max_total_price, '.', '')) <= 1
AND max_total_price <> '.'
AND (instr(max_total_price, '.') = 0 OR (
instr(max_total_price, '.') > 1
AND length(max_total_price) > instr(max_total_price, '.')
))
),
reference_asset_id TEXT,
status TEXT NOT NULL CHECK (status IN (
'DRAFT', 'PENDING', 'CLAIMED', 'RUNNING', 'WAITING_CONFIRMATION',
'PENDING_RETRIAL', 'AUTHORIZED', 'ORDERING', 'WAITING_PAYMENT',
'RECONCILIATION_REQUIRED', 'NEEDS_MANUAL', 'SUCCEEDED', 'CANCELED'
)),
version INTEGER NOT NULL DEFAULT 1 CHECK (version > 0 AND typeof(version) = 'integer'),
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
CREATE TABLE spec_trials (
id TEXT PRIMARY KEY,
task_id TEXT NOT NULL REFERENCES tasks(id),
attempt INTEGER NOT NULL CHECK (attempt > 0 AND typeof(attempt) = 'integer'),
product_title TEXT NOT NULL,
selected_color TEXT NOT NULL,
selected_size TEXT NOT NULL,
unit_price TEXT NOT NULL CHECK (
unit_price <> ''
AND unit_price NOT GLOB '*[^0-9.]*'
AND length(unit_price) - length(replace(unit_price, '.', '')) <= 1
AND unit_price <> '.'
AND (instr(unit_price, '.') = 0 OR (
instr(unit_price, '.') > 1
AND length(unit_price) > instr(unit_price, '.')
))
),
total_price TEXT NOT NULL CHECK (
total_price <> ''
AND total_price NOT GLOB '*[^0-9.]*'
AND length(total_price) - length(replace(total_price, '.', '')) <= 1
AND total_price <> '.'
AND (instr(total_price, '.') = 0 OR (
instr(total_price, '.') > 1
AND length(total_price) > instr(total_price, '.')
))
),
evidence_sha256 TEXT NOT NULL,
created_at TEXT NOT NULL,
UNIQUE (task_id, attempt),
UNIQUE (task_id, id)
);
CREATE TABLE order_authorizations (
id TEXT PRIMARY KEY,
task_id TEXT NOT NULL REFERENCES tasks(id),
spec_trial_id TEXT NOT NULL REFERENCES spec_trials(id),
version INTEGER NOT NULL CHECK (version > 0 AND typeof(version) = 'integer'),
goods_id TEXT NOT NULL,
sku_color TEXT NOT NULL,
sku_size TEXT NOT NULL,
quantity INTEGER NOT NULL CHECK (quantity > 0 AND typeof(quantity) = 'integer'),
authorized_unit_price TEXT NOT NULL CHECK (
authorized_unit_price <> ''
AND authorized_unit_price NOT GLOB '*[^0-9.]*'
AND length(authorized_unit_price) - length(replace(authorized_unit_price, '.', '')) <= 1
AND authorized_unit_price <> '.'
AND (instr(authorized_unit_price, '.') = 0 OR (
instr(authorized_unit_price, '.') > 1
AND length(authorized_unit_price) > instr(authorized_unit_price, '.')
))
),
total_price_cap TEXT NOT NULL CHECK (
total_price_cap <> ''
AND total_price_cap NOT GLOB '*[^0-9.]*'
AND length(total_price_cap) - length(replace(total_price_cap, '.', '')) <= 1
AND total_price_cap <> '.'
AND (instr(total_price_cap, '.') = 0 OR (
instr(total_price_cap, '.') > 1
AND length(total_price_cap) > instr(total_price_cap, '.')
))
),
note TEXT,
status TEXT NOT NULL CHECK (status IN (
'PENDING_DELIVERY', 'DELIVERED', 'ACKNOWLEDGED', 'EXECUTING', 'FENCED',
'CONSUMED', 'SUPERSEDED', 'EXPIRED'
)),
created_by TEXT NOT NULL,
created_at TEXT NOT NULL,
expires_at TEXT NOT NULL,
UNIQUE (task_id, version),
UNIQUE (task_id, id),
FOREIGN KEY (task_id, spec_trial_id) REFERENCES spec_trials(task_id, id)
);
CREATE TABLE order_submissions (
id TEXT PRIMARY KEY,
task_id TEXT NOT NULL REFERENCES tasks(id),
authorization_id TEXT NOT NULL REFERENCES order_authorizations(id),
command_id TEXT NOT NULL,
dry_run_id TEXT NOT NULL,
status TEXT NOT NULL CHECK (status IN (
'FENCED', 'SUBMITTED', 'RECONCILIATION_REQUIRED', 'MANUAL_RESOLVED'
)),
verified_unit_price TEXT NOT NULL CHECK (
verified_unit_price <> ''
AND verified_unit_price NOT GLOB '*[^0-9.]*'
AND length(verified_unit_price) - length(replace(verified_unit_price, '.', '')) <= 1
AND verified_unit_price <> '.'
AND (instr(verified_unit_price, '.') = 0 OR (
instr(verified_unit_price, '.') > 1
AND length(verified_unit_price) > instr(verified_unit_price, '.')
))
),
quantity_read INTEGER NOT NULL CHECK (quantity_read > 0 AND typeof(quantity_read) = 'integer'),
confirm_page_amount TEXT NOT NULL CHECK (
confirm_page_amount <> ''
AND confirm_page_amount NOT GLOB '*[^0-9.]*'
AND length(confirm_page_amount) - length(replace(confirm_page_amount, '.', '')) <= 1
AND confirm_page_amount <> '.'
AND (instr(confirm_page_amount, '.') = 0 OR (
instr(confirm_page_amount, '.') > 1
AND length(confirm_page_amount) > instr(confirm_page_amount, '.')
))
),
created_at TEXT NOT NULL,
resolved_at TEXT,
UNIQUE (authorization_id),
UNIQUE (command_id),
FOREIGN KEY (task_id, authorization_id) REFERENCES order_authorizations(task_id, id)
);
-- +goose Down
DROP TABLE order_submissions;
DROP TABLE order_authorizations;
DROP TABLE spec_trials;
DROP TABLE tasks;