-- 采购主链 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='事件流';