USE baiyue_firstleg; SET NAMES utf8mb4; CREATE TABLE IF NOT EXISTS fl_fee_item ( id BIGINT UNSIGNED NOT NULL COMMENT '费用项目ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '平台公共费用项目作用域,固定为0;物理字段名沿用 tenant_id', category VARCHAR(64) NOT NULL COMMENT '费用分类', trade_scope VARCHAR(20) NOT NULL COMMENT 'DOMESTIC国内、INTERNATIONAL国际', fee_code VARCHAR(50) NOT NULL COMMENT '稳定费用编码;平台公共主数据固定编码', supplier_category VARCHAR(16) NULL COMMENT 'PAYABLE供应商类别约束;为空时可选任意ACTIVE供应商', fee_type_name VARCHAR(128) NOT NULL COMMENT '费用类型名称', default_price DECIMAL(12,2) NULL COMMENT '默认价格CNY;仅选费带入,实际费用可修改', pickup_payable TINYINT(1) NOT NULL DEFAULT 0 COMMENT '提柜应付是否参与', pickup_receivable TINYINT(1) NOT NULL DEFAULT 0 COMMENT '提柜应收是否参与', warehouse_payable TINYINT(1) NOT NULL DEFAULT 0 COMMENT '仓储应付是否参与', warehouse_receivable TINYINT(1) NOT NULL DEFAULT 0 COMMENT '仓储应收是否参与', allocation_fee TINYINT(1) NOT NULL DEFAULT 0 COMMENT '平摊费用是否参与', description VARCHAR(500) NULL COMMENT '说明', status VARCHAR(16) NOT NULL DEFAULT 'ACTIVE' COMMENT '状态:ACTIVE启用、DISABLED停用', created_by BIGINT NULL COMMENT '创建人ID;系统初始化时可为空', created_by_name VARCHAR(64) NULL COMMENT '创建人名称快照', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', updated_by BIGINT NULL COMMENT '最后修改人ID;系统初始化时可为空', updated_by_name VARCHAR(64) NULL COMMENT '最后修改人名称快照', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '最后更新时间', deleted TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除标记:0未删除、1已删除', version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', PRIMARY KEY (id), UNIQUE KEY uk_fee_item_code (fee_code), KEY idx_fee_item_query (tenant_id, trade_scope, category, status, deleted), KEY idx_fee_item_name (tenant_id, fee_type_name, deleted) ) ENGINE=InnoDB COMMENT='平台公共费用项目主数据'; CREATE TABLE IF NOT EXISTS fl_inbound_fee_detail ( id BIGINT UNSIGNED NOT NULL COMMENT '入库费用明细ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID(客户隔离键);费用明细引用平台公共费用项目', inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID', fee_item_id BIGINT UNSIGNED NOT NULL COMMENT '绑定费用项目ID', inbound_code VARCHAR(40) NOT NULL COMMENT '入仓码快照', direction VARCHAR(16) NOT NULL COMMENT 'RECEIVABLE应收、PAYABLE应付', supplier_id BIGINT UNSIGNED NULL COMMENT '应付Warehouse供应商ID快照;应收为空', supplier_name VARCHAR(200) NULL COMMENT '应付Warehouse供应商名称快照;应收为空', supplier_category VARCHAR(16) NULL COMMENT '费用项目供应商类别快照;应收为空', settlement_mode VARCHAR(16) NULL COMMENT '仅PAYABLE:ON_ACCOUNT账期应付、DIRECT_PAID业务已付;RECEIVABLE为空', paid_at DATETIME(3) NULL COMMENT 'DIRECT_PAID业务已付时间', payment_method VARCHAR(32) NULL COMMENT 'DIRECT_PAID付款方式', payment_reference_no VARCHAR(128) NULL COMMENT 'DIRECT_PAID付款流水号', payment_voucher_file_ids JSON NULL COMMENT 'DIRECT_PAID付款凭证File ID数组', business_date DATE NOT NULL COMMENT '业务发生日', fee_category_snapshot VARCHAR(64) NOT NULL COMMENT '费用分类快照', trade_scope_snapshot VARCHAR(20) NOT NULL COMMENT '国内国际快照', fee_type_name_snapshot VARCHAR(128) NOT NULL COMMENT '费用类型名称快照', channel_code VARCHAR(64) NULL COMMENT '渠道编码快照', channel_name VARCHAR(128) NULL COMMENT '渠道名称快照', destination_code VARCHAR(32) NULL COMMENT '目的仓编码快照', destination_name VARCHAR(128) NULL COMMENT '目的仓名称快照', package_count INT NULL COMMENT '件数快照', actual_gross_weight_kg DECIMAL(18,4) NULL COMMENT '仓库实测毛重快照,单位千克', actual_volume_cbm DECIMAL(18,6) NULL COMMENT '实际体积快照,单位立方米', volume_weight_kg DECIMAL(18,4) NULL COMMENT '材积重快照,单位千克', chargeable_weight_kg DECIMAL(18,4) NULL COMMENT '费用计算采用的计费重量,单位千克', chargeable_volume_cbm DECIMAL(18,6) NULL COMMENT '费用计算采用的计费体积,单位立方米', unit_price DECIMAL(18,4) NOT NULL COMMENT '费用单价;计价单位由对应费用项目规则确定', currency CHAR(3) NOT NULL COMMENT '金额币种三字码,如CNY', amount DECIMAL(18,2) NOT NULL COMMENT '该费用明细金额,币种由currency字段指定', remark VARCHAR(500) NULL COMMENT '备注', review_status VARCHAR(16) NOT NULL DEFAULT 'PENDING' COMMENT '审核状态:PENDING待审核、APPROVED已通过、REJECTED已驳回', reviewer_id BIGINT NULL COMMENT '审核人ID', reviewer_name VARCHAR(64) NULL COMMENT '审核人名称快照', reviewed_at DATETIME(3) NULL COMMENT '审核时间', review_reason VARCHAR(500) NULL COMMENT '审核驳回原因', created_by BIGINT NULL COMMENT '创建人或系统主体ID', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', updated_by BIGINT NULL COMMENT '最后修改人或系统主体ID', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '最后更新时间', deleted TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除标记:0未删除、1已删除', version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', PRIMARY KEY (id), KEY idx_inbound_fee_detail (tenant_id, inbound_id, business_date, deleted), KEY idx_inbound_fee_review (tenant_id, review_status, business_date, deleted), KEY idx_inbound_fee_item (tenant_id, fee_item_id, deleted), CONSTRAINT chk_inbound_fee_settlement CHECK ( (direction='RECEIVABLE' AND settlement_mode IS NULL AND paid_at IS NULL AND payment_method IS NULL AND payment_reference_no IS NULL AND payment_voucher_file_ids IS NULL) OR (direction='PAYABLE' AND settlement_mode='ON_ACCOUNT' AND paid_at IS NULL AND payment_method IS NULL AND payment_reference_no IS NULL AND payment_voucher_file_ids IS NULL) OR (direction='PAYABLE' AND settlement_mode='DIRECT_PAID' AND paid_at IS NOT NULL AND payment_method IN ('ONLINE','BANK_TRANSFER','CASH','OTHER') AND (payment_reference_no IS NOT NULL OR JSON_LENGTH(payment_voucher_file_ids)>0)) ), CONSTRAINT fk_inbound_fee_detail_order FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id), CONSTRAINT fk_inbound_fee_detail_item FOREIGN KEY (fee_item_id) REFERENCES fl_fee_item (id) ) ENGINE=InnoDB COMMENT='入库单应收应付费用明细'; -- 费用项目是平台公共主数据;费用明细仍按客户隔离。 SET @fee_tenant_comment = '平台公共费用项目作用域,固定为0;物理字段名沿用 tenant_id'; SET @ddl = IF( (SELECT COUNT(*) FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'fl_fee_item' AND column_name = 'tenant_id' AND column_comment = @fee_tenant_comment) = 1, 'SELECT 1', 'ALTER TABLE fl_fee_item MODIFY COLUMN tenant_id BIGINT UNSIGNED NOT NULL COMMENT ''平台公共费用项目作用域,固定为0;物理字段名沿用 tenant_id''' ); PREPARE statement FROM @ddl; EXECUTE statement; DEALLOCATE PREPARE statement; SET @fee_tenant_comment = '客户ID(客户隔离键);费用明细引用平台公共费用项目'; SET @ddl = IF( (SELECT COUNT(*) FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'fl_inbound_fee_detail' AND column_name = 'tenant_id' AND column_comment = @fee_tenant_comment) = 1, 'SELECT 1', 'ALTER TABLE fl_inbound_fee_detail MODIFY COLUMN tenant_id BIGINT UNSIGNED NOT NULL COMMENT ''客户ID(客户隔离键);费用明细引用平台公共费用项目''' ); PREPARE statement FROM @ddl; EXECUTE statement; DEALLOCATE PREPARE statement;