AutoRpa/state_center/sql/schema.sql

206 lines
11 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 采购主链 RPA 一期 · 状态中心建库脚本
-- 库里只存"流程状态 + 对码累积别名 + 证据",不存对码表本身(对码表在 Oracle,直连查)。
-- 目标库:MySQL 8
CREATE DATABASE IF NOT EXISTS rpa_center DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE rpa_center;
-- ============================================================
-- job:一次流程实例 = 同供应商 + 同订单日期 + 同来源 = 一条合同
-- ============================================================
CREATE TABLE IF NOT EXISTS job (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
job_id VARCHAR(64) NOT NULL UNIQUE COMMENT '对外流程单号',
business_key VARCHAR(160) NOT NULL COMMENT '来源+供应商+订单日期,幂等用',
parent_job_id VARCHAR(64) NULL COMMENT '重跑/加单来源',
source_type VARCHAR(16) NOT NULL COMMENT 'YYC医药城/XYY小药药/OFFLINE线下单',
order_date DATE NOT NULL COMMENT '订单日期=合同签约日期',
supplier_name VARCHAR(128) NOT NULL COMMENT '供应商/商家',
order_no_list_json JSON NULL COMMENT '该批订单号数组',
contract_template VARCHAR(16) NULL COMMENT 'FORMAT格式/NON_FORMAT非格式承兑',
need_pdf_upload TINYINT NOT NULL DEFAULT 0 COMMENT '医药城=1,小药药=0',
planner_name VARCHAR(64) NULL COMMENT '计划员',
current_node_code VARCHAR(64) NOT NULL COMMENT '当前节点',
status VARCHAR(24) NOT NULL COMMENT 'PENDING/RUNNING/WAITING_USER/WAITING_EXTERNAL/SUCCESS/FAILED_RETRYABLE/FAILED_MANUAL/CANCELLED',
mapping_version VARCHAR(64) NULL COMMENT '绑定的对码累积版本',
needs_source_add TINYINT NOT NULL DEFAULT 0 COMMENT '对码后判定是否缺货源,决定是否走 SOURCE_ADD 条件节点',
executor_platform VARCHAR(16) NULL COMMENT '默认执行平台,如 ISRPA',
contract_system_no VARCHAR(64) NULL COMMENT '合同系统编号(钥匙1)',
rebate_order_no VARCHAR(64) NULL COMMENT '返利中心总单号',
m5_order_no VARCHAR(64) NULL COMMENT 'M5采购订单号',
receipt_notice_no VARCHAR(64) NULL COMMENT '收货通知单号',
current_role VARCHAR(16) NULL COMMENT '当前责任角色',
current_assignee VARCHAR(64) NULL COMMENT '当前责任人',
auto_save_enabled TINYINT NOT NULL DEFAULT 0 COMMENT 'M5自动保存开关,一期=0',
next_check_at DATETIME NULL COMMENT '等待态(如合同审批)下次检查时间,调度器扫这个',
wait_check_count INT NOT NULL DEFAULT 0 COMMENT '当前等待态已检查次数,超上限升级OPS',
created_by VARCHAR(64) NOT NULL,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
finished_at DATETIME NULL,
KEY idx_business_status (business_key, status),
KEY idx_supplier_date (supplier_name, order_date),
KEY idx_status (status),
KEY idx_next_check (status, next_check_at),
KEY idx_created_at (created_at)
) COMMENT='流程实例主表';
-- ============================================================
-- order_item:订单明细行(对码前的原始数据)
-- ============================================================
CREATE TABLE IF NOT EXISTS order_item (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
job_id VARCHAR(64) NOT NULL,
order_no VARCHAR(64) NOT NULL COMMENT '订单号(贯穿追溯)',
parent_order_no VARCHAR(64) NULL COMMENT '父订单号(加单/拆单)',
raw_product_name VARCHAR(255) NOT NULL COMMENT '平台品名',
platform_product_code VARCHAR(64) NULL COMMENT '平台产品编码',
spec VARCHAR(128) NULL COMMENT '规格(对码痛点:15×2 vs 30片)',
manufacturer VARCHAR(255) NULL COMMENT '厂家(含进口英文)',
approval_no VARCHAR(64) NULL COMMENT '国药准字/批准文号',
qty DECIMAL(14,2) NOT NULL COMMENT '数量',
unit_price DECIMAL(14,4) NULL COMMENT '单价',
source_row_no INT NULL COMMENT '原始Excel行号',
created_at DATETIME NOT NULL,
KEY idx_job (job_id),
KEY idx_order_no (order_no)
) COMMENT='订单明细行';
-- ============================================================
-- product_match:对码结果(核心难点落库)
-- ============================================================
CREATE TABLE IF NOT EXISTS product_match (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
job_id VARCHAR(64) NOT NULL,
order_item_id BIGINT NOT NULL COMMENT '对应订单行',
match_key VARCHAR(512) NOT NULL COMMENT '四要素拼接键:通用名+批准文号+规格+厂家',
match_status VARCHAR(16) NOT NULL COMMENT 'EXACT精确/ALIAS别名命中/MULTI一对多/NONE未命中(无FUZZY)',
goods_id VARCHAR(64) NULL COMMENT '命中的M5货品ID(来自Oracle)',
goods_code VARCHAR(64) NULL COMMENT '货品编码',
base_unit VARCHAR(32) NULL COMMENT '基本单位',
candidates_json JSON NULL COMMENT '一对多候选列表(供H5选择)',
source_add_needed TINYINT NOT NULL DEFAULT 0 COMMENT '是否需M5新增货源',
confirmed_by VARCHAR(64) NULL COMMENT '人工确认人',
confirmed_at DATETIME NULL,
mapping_version VARCHAR(64) NULL COMMENT '使用的对码累积版本',
created_at DATETIME NOT NULL,
UNIQUE KEY uniq_job_order_item (job_id, order_item_id),
KEY idx_job (job_id),
KEY idx_status (match_status)
) COMMENT='对码结果';
-- ============================================================
-- job_node:节点执行(每节点每次尝试一行,不覆盖历史)
-- ============================================================
CREATE TABLE IF NOT EXISTS job_node (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
job_id VARCHAR(64) NOT NULL,
node_code VARCHAR(64) NOT NULL COMMENT 'ORDER_FETCH/PRODUCT_MATCH/...',
executor_type VARCHAR(16) NOT NULL DEFAULT 'RPA' COMMENT '执行方:STATE_CENTER编排/RPA执行/HUMAN人工挂起',
attempt_no INT NOT NULL DEFAULT 1 COMMENT '第几次尝试',
status VARCHAR(24) NOT NULL COMMENT '节点状态',
executor_platform VARCHAR(16) NULL COMMENT '实际执行平台',
executor_run_id VARCHAR(64) NULL COMMENT '平台侧任务号',
started_at DATETIME NULL,
ended_at DATETIME NULL,
duration_ms BIGINT NULL,
error_code VARCHAR(64) NULL,
error_summary VARCHAR(500) NULL,
role_at_failure VARCHAR(16) NULL,
output_json JSON NULL COMMENT '节点输出(业务编号等)',
callback_idempotency_key VARCHAR(128) NULL COMMENT '回调幂等键',
created_at DATETIME NOT NULL,
UNIQUE KEY uniq_job_node_attempt (job_id, node_code, attempt_no),
KEY idx_status (status)
) COMMENT='节点执行记录';
-- ============================================================
-- user_task:人工待办
-- ============================================================
CREATE TABLE IF NOT EXISTS user_task (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
task_id VARCHAR(64) NOT NULL UNIQUE,
job_id VARCHAR(64) NOT NULL,
node_code VARCHAR(64) NOT NULL,
order_item_id BIGINT NULL COMMENT '对应订单行(对码类待办用)',
product_match_id BIGINT NULL COMMENT '对应对码结果行(对码类待办精确关联,confirm 时按它关闭)',
role_code VARCHAR(16) NOT NULL COMMENT 'PLANNER/PURCHASER/QC/OPS',
assignee_user_id VARCHAR(64) NULL,
title VARCHAR(255) NOT NULL,
reason_type VARCHAR(32) NOT NULL COMMENT 'MATCH_MULTI/MATCH_NONE/SOURCE_ADD/OCR_LOW_CONF/REBATE_DUP/QC_MISSING/CONTRACT_DISABLED',
reason_user_friendly VARCHAR(500) NULL COMMENT '人话说明',
why_me_text VARCHAR(255) NULL COMMENT '为什么派给你',
editable_fields_json JSON NULL COMMENT '白名单字段',
action_schema_json JSON NULL COMMENT '允许动作',
comparison_snapshot_json JSON NULL COMMENT '原值/建议/当前对比',
candidates_json JSON NULL COMMENT '一对多对码候选',
status VARCHAR(16) NOT NULL DEFAULT 'OPEN' COMMENT 'OPEN/SUBMITTED/CANCELLED/EXPIRED',
submit_token VARCHAR(64) NULL COMMENT '防重复提交',
submitted_action VARCHAR(24) NULL,
submitted_payload_json JSON NULL,
submitted_result_json JSON NULL COMMENT '提交结果,同 submit_token 重放时返回',
submitted_by VARCHAR(64) NULL,
submitted_at DATETIME NULL,
due_at DATETIME NULL COMMENT '超时升级',
created_at DATETIME NOT NULL,
KEY idx_job (job_id),
KEY idx_role_status (role_code, status),
KEY idx_product_match (product_match_id)
) COMMENT='人工待办';
-- ============================================================
-- mapping_config:对码累积别名 + 供应商对照等映射(版本化)
-- 注意:这不是对码表的拷贝!对码表在 Oracle。
-- 这里存的是"平台奇葩写法 → 货品ID"的人工确认记录,以及供应商对照。
-- ============================================================
CREATE TABLE IF NOT EXISTS mapping_config (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
config_type VARCHAR(24) NOT NULL COMMENT 'PRODUCT对码别名/SUPPLIER供应商对照/SETTLEMENT/PAYMENT_TERM/PLANNER_ROUTE',
config_key VARCHAR(512) NOT NULL COMMENT '对码时=四要素拼接键或平台写法',
source_value VARCHAR(512) NULL COMMENT '来源值',
target_value VARCHAR(512) NULL COMMENT '目标值(对码=货品ID+编码+单位JSON)',
extra_json JSON NULL,
version_no VARCHAR(64) NULL COMMENT '版本号',
is_active TINYINT NOT NULL DEFAULT 1,
effective_from DATETIME NULL,
effective_to DATETIME NULL,
updated_by VARCHAR(64) NULL,
updated_at DATETIME NOT NULL,
KEY idx_type_key (config_type, config_key),
KEY idx_type_key_active (config_type, config_key, is_active, updated_at, id),
KEY idx_active (is_active)
) COMMENT='映射/对码累积别名(非对码表拷贝)';
-- ============================================================
-- job_artifact:证据元数据(文件落对象存储,这里存元数据)
-- ============================================================
CREATE TABLE IF NOT EXISTS job_artifact (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
job_id VARCHAR(64) NOT NULL,
node_code VARCHAR(64) NULL,
attempt_no INT NULL,
artifact_type VARCHAR(32) NOT NULL COMMENT 'SOURCE_EXCEL/SOURCE_IMAGE/OCR_JSON/CONTRACT_PDF/MERGED_PDF/SCREENSHOT/TEMPLATE/LOG',
storage_path VARCHAR(500) NOT NULL,
file_hash VARCHAR(128) NULL,
visible_roles VARCHAR(128) NULL COMMENT '可见角色',
is_masked TINYINT NOT NULL DEFAULT 0 COMMENT '脱敏标记',
created_at DATETIME NOT NULL,
KEY idx_job (job_id)
) COMMENT='证据元数据';
-- ============================================================
-- job_event:事件流(审计留痕)
-- ============================================================
CREATE TABLE IF NOT EXISTS job_event (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
job_id VARCHAR(64) NOT NULL,
event_type VARCHAR(32) NOT NULL COMMENT 'JOB_CREATED/NODE_STARTED/NODE_SUCCESS/NODE_FAILED/TASK_CREATED/TASK_SUBMITTED/MANUAL_HANDOFF/JOB_FINISHED',
node_code VARCHAR(64) NULL,
operator_type VARCHAR(16) NOT NULL COMMENT 'SYSTEM/ROBOT/USER',
operator VARCHAR(64) NULL,
detail_json JSON NULL,
created_at DATETIME NOT NULL,
KEY idx_job (job_id),
KEY idx_type (event_type)
) COMMENT='事件流';