-- ============================================================================ -- 开发环境初始化脚本 -- -- 执行时机:docker-entrypoint-initdb.d —— **仅在 MySQL 数据卷为空时的首次启动执行** -- 数据卷已存在时修改本文件不会生效,需要: -- docker compose -f docker/docker-compose.dev.yml down -v && up -d -- -- 内容 = db/migration/ 下**全部迁移**的最终结构(额外带 DROP,开发环境允许重置) -- 必须与 db/migration/V*.sql 的合集保持一致, -- 由 backend/tests/integration/test_schema_sync.py 自动校验,防止两份 DDL 漂移 -- -- 结尾写入 alembic_version 记录(**须等于当前 head**,否则开发库重建后 -- 执行 alembic upgrade head 会重复建表并报 1050 Table already exists) -- ============================================================================ SET NAMES utf8mb4; -- 删除顺序遵循外键依赖:先删子表 DROP TABLE IF EXISTS `tplus_sync_watermarks`; DROP TABLE IF EXISTS `tplus_sync_records`; DROP TABLE IF EXISTS `tplus_sync_errors`; DROP TABLE IF EXISTS `tplus_sync_batches`; DROP TABLE IF EXISTS `performance_ledgers`; DROP TABLE IF EXISTS `settlement_items`; DROP TABLE IF EXISTS `adjustment_orders`; DROP TABLE IF EXISTS `monthly_settlements`; DROP TABLE IF EXISTS `approval_steps`; DROP TABLE IF EXISTS `approval_orders`; DROP TABLE IF EXISTS `business_secondary_allocations`; DROP TABLE IF EXISTS `system_settings`; DROP TABLE IF EXISTS `param_values`; DROP TABLE IF EXISTS `param_change_batches`; DROP TABLE IF EXISTS `param_definitions`; DROP TABLE IF EXISTS `business_roles`; DROP TABLE IF EXISTS `operation_logs`; DROP TABLE IF EXISTS `role_permissions`; DROP TABLE IF EXISTS `user_roles`; DROP TABLE IF EXISTS `login_logs`; DROP TABLE IF EXISTS `permissions`; DROP TABLE IF EXISTS `users`; DROP TABLE IF EXISTS `roles`; DROP TABLE IF EXISTS `alembic_version`; -- 服务端字符集应为 utf8mb4 / utf8mb4_general_ci(与 compose 的启动参数一致) SELECT @@character_set_server AS charset, @@collation_server AS collation; -- --------------------------------------------------------------------------- -- 权限表 -- --------------------------------------------------------------------------- CREATE TABLE permissions ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, perm_code VARCHAR(128) NOT NULL COMMENT '权限编码,如 system:user:create', perm_name VARCHAR(64) NOT NULL COMMENT '权限名称', perm_type TINYINT NOT NULL COMMENT '类型:1菜单 2按钮 3接口' DEFAULT '1', parent_id BIGINT UNSIGNED COMMENT '父权限ID(permissions.id),顶级为空', sort_order INTEGER NOT NULL COMMENT '显示排序' DEFAULT '0', status TINYINT NOT NULL COMMENT '状态:1启用 0禁用' DEFAULT '1', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_permissions PRIMARY KEY (id), CONSTRAINT fk_permissions_parent_id FOREIGN KEY(parent_id) REFERENCES permissions (id) ON DELETE CASCADE, CONSTRAINT uk_permissions_perm_code UNIQUE (perm_code) )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='权限表' COLLATE utf8mb4_general_ci; -- --------------------------------------------------------------------------- -- 角色表 -- --------------------------------------------------------------------------- CREATE TABLE roles ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, role_code VARCHAR(32) NOT NULL COMMENT '角色编码:admin系统管理员 user普通用户', role_name VARCHAR(64) NOT NULL COMMENT '角色名称', description VARCHAR(255) COMMENT '角色说明', sort_order INTEGER NOT NULL COMMENT '显示排序' DEFAULT '0', status TINYINT NOT NULL COMMENT '状态:1启用 0禁用' DEFAULT '1', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_roles PRIMARY KEY (id), CONSTRAINT uk_roles_role_code UNIQUE (role_code) )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='角色表' COLLATE utf8mb4_general_ci; -- --------------------------------------------------------------------------- -- 系统用户表 -- --------------------------------------------------------------------------- CREATE TABLE users ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, username VARCHAR(64) NOT NULL COMMENT '登录用户名', password VARCHAR(100) NOT NULL COMMENT '密码哈希(BCrypt,固定60字符)', real_name VARCHAR(64) COMMENT '真实姓名', phone VARCHAR(20) COMMENT '手机号', email VARCHAR(128) COMMENT '邮箱', status TINYINT NOT NULL COMMENT '状态:1启用 0禁用' DEFAULT '1', token_version INTEGER NOT NULL COMMENT '令牌版本号:改密/禁用/强制下线时+1,使已签发Token立即失效' DEFAULT '1', last_login_time DATETIME COMMENT '最后登录时间', remark VARCHAR(255) COMMENT '备注', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_users PRIMARY KEY (id), CONSTRAINT uk_users_username UNIQUE (username) )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='系统用户表' COLLATE utf8mb4_general_ci; CREATE INDEX idx_users_phone ON users (phone); -- --------------------------------------------------------------------------- -- 登录日志表 -- --------------------------------------------------------------------------- CREATE TABLE login_logs ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, user_id BIGINT UNSIGNED COMMENT '用户ID(账号不存在时为空)', username VARCHAR(64) NOT NULL COMMENT '登录用户名(原样记录)', ip VARCHAR(45) COMMENT '客户端IP(45位兼容IPv6)', user_agent VARCHAR(255) COMMENT '客户端User-Agent(截断存储)', success TINYINT NOT NULL COMMENT '是否成功:1成功 0失败' DEFAULT '0', fail_reason VARCHAR(64) COMMENT '失败原因:验证码错误/用户名或密码错误/账号锁定/账号禁用', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, CONSTRAINT pk_login_logs PRIMARY KEY (id), CONSTRAINT fk_login_logs_user_id FOREIGN KEY(user_id) REFERENCES users (id) ON DELETE SET NULL )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='登录日志表' COLLATE utf8mb4_general_ci; CREATE INDEX idx_login_logs_create_time ON login_logs (create_time); CREATE INDEX idx_login_logs_username ON login_logs (username); -- --------------------------------------------------------------------------- -- 角色权限关联表 -- --------------------------------------------------------------------------- CREATE TABLE role_permissions ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, role_id BIGINT UNSIGNED NOT NULL COMMENT '角色ID(roles.id)', permission_id BIGINT UNSIGNED NOT NULL COMMENT '权限ID(permissions.id)', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, CONSTRAINT pk_role_permissions PRIMARY KEY (id), CONSTRAINT fk_role_permissions_permission_id FOREIGN KEY(permission_id) REFERENCES permissions (id) ON DELETE CASCADE, CONSTRAINT fk_role_permissions_role_id FOREIGN KEY(role_id) REFERENCES roles (id) ON DELETE CASCADE, CONSTRAINT uk_role_permissions_role_id_permission_id UNIQUE (role_id, permission_id) )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='角色权限关联表' COLLATE utf8mb4_general_ci; CREATE INDEX idx_role_permissions_permission_id ON role_permissions (permission_id); -- --------------------------------------------------------------------------- -- 用户角色关联表 -- --------------------------------------------------------------------------- CREATE TABLE user_roles ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, user_id BIGINT UNSIGNED NOT NULL COMMENT '用户ID(users.id)', role_id BIGINT UNSIGNED NOT NULL COMMENT '角色ID(roles.id)', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, CONSTRAINT pk_user_roles PRIMARY KEY (id), CONSTRAINT fk_user_roles_role_id FOREIGN KEY(role_id) REFERENCES roles (id) ON DELETE CASCADE, CONSTRAINT fk_user_roles_user_id FOREIGN KEY(user_id) REFERENCES users (id) ON DELETE CASCADE, CONSTRAINT uk_user_roles_user_id_role_id UNIQUE (user_id, role_id) )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='用户角色关联表' COLLATE utf8mb4_general_ci; CREATE INDEX idx_user_roles_role_id ON user_roles (role_id); -- --------------------------------------------------------------------------- -- 操作日志表(V2 迁移) -- --------------------------------------------------------------------------- CREATE TABLE operation_logs ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, user_id BIGINT UNSIGNED COMMENT '操作人ID(账号删除后置空)', username VARCHAR(64) NOT NULL COMMENT '操作人用户名(冗余存储便于追溯)', module VARCHAR(64) NOT NULL COMMENT '所属模块,如 用户管理', action VARCHAR(32) NOT NULL COMMENT '操作类型:新增/修改/删除/导出', summary VARCHAR(255) NOT NULL COMMENT '操作摘要(中文,供人阅读)', method VARCHAR(8) COMMENT 'HTTP 方法', path VARCHAR(255) COMMENT '请求路径', ip VARCHAR(45) COMMENT '客户端IP(45位兼容IPv6)', user_agent VARCHAR(255) COMMENT '客户端User-Agent(截断存储)', request_data TEXT COMMENT '请求参数(已脱敏)', success TINYINT NOT NULL COMMENT '是否成功:1成功 0失败' DEFAULT '0', error_message VARCHAR(500) COMMENT '失败原因(写入方须截断)', duration_ms INTEGER COMMENT '处理耗时(毫秒)', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, CONSTRAINT pk_operation_logs PRIMARY KEY (id), CONSTRAINT fk_operation_logs_user_id FOREIGN KEY(user_id) REFERENCES users (id) ON DELETE SET NULL )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='操作日志表' COLLATE utf8mb4_general_ci; CREATE INDEX idx_operation_logs_create_time ON operation_logs (create_time); CREATE INDEX idx_operation_logs_module ON operation_logs (module); CREATE INDEX idx_operation_logs_user_id ON operation_logs (user_id); CREATE INDEX idx_operation_logs_username ON operation_logs (username); -- --------------------------------------------------------------------------- -- 业务岗位角色表(V3 迁移) -- --------------------------------------------------------------------------- CREATE TABLE business_roles ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, role_code VARCHAR(32) NOT NULL COMMENT '岗位编码:salesperson营销员 sales_manager营销经理 info_officer信息员,创建后不可修改', role_name VARCHAR(64) NOT NULL COMMENT '岗位名称', calc_template VARCHAR(32) NOT NULL COMMENT '计提公式模板编码(以代码内模板注册表为准)', description VARCHAR(255) COMMENT '岗位说明', sort_order INTEGER NOT NULL COMMENT '显示排序' DEFAULT '0', status TINYINT NOT NULL COMMENT '状态:1启用 0禁用' DEFAULT '1', is_builtin TINYINT NOT NULL COMMENT '是否内置岗位:1内置(禁删禁停) 0自定义' DEFAULT '0', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_business_roles PRIMARY KEY (id), CONSTRAINT uk_business_roles_role_code UNIQUE (role_code) )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='业务岗位角色表(与登录角色roles区分,决定计提公式与参数)' COLLATE utf8mb4_general_ci; -- --------------------------------------------------------------------------- -- 计提参数定义表(V3 迁移) -- --------------------------------------------------------------------------- CREATE TABLE param_definitions ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, param_code VARCHAR(64) NOT NULL COMMENT '参数编码,如 salesperson.rate.slope', param_name VARCHAR(64) NOT NULL COMMENT '参数名称', param_group VARCHAR(32) NOT NULL COMMENT '参数分组:业务员个人户/经理分成/企业户/信息员/支付环节/产品阈值/月工资口径', value_type VARCHAR(16) NOT NULL COMMENT '值类型:DECIMAL/INT/BOOL/ENUM/TEXT', unit VARCHAR(16) COMMENT '展示单位:‰/%/元/天,无单位为空', dimension_type VARCHAR(32) NOT NULL COMMENT '维度类型:NONE/PRODUCT_CATEGORY/BUSINESS_ROLE' DEFAULT 'NONE', options_text VARCHAR(255) COMMENT '枚举选项(竖线分隔),仅 ENUM 使用', default_value VARCHAR(64) COMMENT '系统默认值(Fraction 可解析字符串)', value_min VARCHAR(64) COMMENT '取值下限(含),校验用', value_max VARCHAR(64) COMMENT '取值上限(含),校验用', description VARCHAR(255) COMMENT '口径说明(配置页展示)', sort_order INTEGER NOT NULL COMMENT '显示排序' DEFAULT '0', status TINYINT NOT NULL COMMENT '状态:1启用 0停用' DEFAULT '1', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_param_definitions PRIMARY KEY (id), CONSTRAINT uk_param_definitions_param_code UNIQUE (param_code) )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='计提参数定义表' COLLATE utf8mb4_general_ci; -- --------------------------------------------------------------------------- -- 参数变更批次表(V3 迁移) -- --------------------------------------------------------------------------- CREATE TABLE param_change_batches ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, version_no VARCHAR(32) NOT NULL COMMENT '版本号,如 P20261012-01', effective_date DATE NOT NULL COMMENT '生效日期(业务日期口径)', change_type TINYINT NOT NULL COMMENT '生效方式:1立即生效 2指定日期生效', remark VARCHAR(255) COMMENT '变更说明', operator_id BIGINT UNSIGNED COMMENT '操作人ID(账号删除后置空)', operator_name VARCHAR(64) NOT NULL COMMENT '操作人用户名(冗余固化)', item_count INTEGER NOT NULL COMMENT '变更参数项数' DEFAULT '0', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, CONSTRAINT pk_param_change_batches PRIMARY KEY (id), CONSTRAINT fk_param_change_batches_operator_id FOREIGN KEY(operator_id) REFERENCES users (id) ON DELETE SET NULL, CONSTRAINT uk_param_change_batches_version_no UNIQUE (version_no) )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='参数变更批次表' COLLATE utf8mb4_general_ci; -- --------------------------------------------------------------------------- -- 参数版本条目表(V3 迁移,append-only) -- --------------------------------------------------------------------------- CREATE TABLE param_values ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, param_id BIGINT UNSIGNED NOT NULL COMMENT '参数定义ID(param_definitions.id)', dimension_value VARCHAR(32) NOT NULL COMMENT '维度取值:NONE维度为空串;产品类别/岗位编码为具体值' DEFAULT '', effective_date DATE NOT NULL COMMENT '生效日期(按业务日期时点化取值)', value_text VARCHAR(64) NOT NULL COMMENT '参数值(Fraction 可解析字符串/枚举码/开关)', old_value_text VARCHAR(64) COMMENT '变更前值(留痕)', batch_id BIGINT UNSIGNED NOT NULL COMMENT '变更批次ID(param_change_batches.id)', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, CONSTRAINT pk_param_values PRIMARY KEY (id), CONSTRAINT fk_param_values_batch_id FOREIGN KEY(batch_id) REFERENCES param_change_batches (id) ON DELETE RESTRICT, CONSTRAINT fk_param_values_param_id FOREIGN KEY(param_id) REFERENCES param_definitions (id) ON DELETE RESTRICT )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='参数版本条目表(append-only,按生效日期时点化取值)' COLLATE utf8mb4_general_ci; CREATE INDEX idx_param_values_batch_id ON param_values (batch_id); CREATE INDEX idx_param_values_effective_date ON param_values (effective_date); CREATE INDEX idx_param_values_param_id_dimension_value_effective_date ON param_values (param_id, dimension_value, effective_date); -- --------------------------------------------------------------------------- -- 营销人员表(V4 迁移;T+ 同步不覆盖岗位与工资标准) -- --------------------------------------------------------------------------- CREATE TABLE personnel ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, personnel_name VARCHAR(64) NOT NULL COMMENT '姓名', business_role_id BIGINT UNSIGNED NOT NULL COMMENT '岗位角色ID(决定计提公式模板;T+同步不覆盖)', manager_id BIGINT UNSIGNED COMMENT '直属营销经理ID(NULL=经理本人或未分配;团队成员关系锚点)', phone VARCHAR(20) COMMENT '联系电话', hire_date DATE COMMENT '入职日期', is_probation TINYINT NOT NULL COMMENT '是否试用期:1是 0否(试用期绩效照算不发放)' DEFAULT '0', salary_standard DECIMAL(12, 2) COMMENT '月工资标准(元;T+同步不覆盖)', status TINYINT NOT NULL COMMENT '状态:1在职 0离职(离职人员不可再被业务/客户归属引用)' DEFAULT '1', remark VARCHAR(255) COMMENT '备注', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, source_no VARCHAR(64) COMMENT 'T+ 原始单据号(同步幂等去重锚点;唯一键待 IT 定键后升级)', t_plus_id VARCHAR(64) COMMENT 'T+ 系统内部标识', sync_batch_no VARCHAR(32) COMMENT '同步批次号(同步模块写入)', synced_at DATETIME COMMENT '最近同步时间', source_updated_at DATETIME COMMENT 'T+ 源数据更新时间(未确认时可为空)', CONSTRAINT pk_personnel PRIMARY KEY (id), CONSTRAINT fk_personnel_business_role_id FOREIGN KEY(business_role_id) REFERENCES business_roles (id) ON DELETE RESTRICT, CONSTRAINT fk_personnel_manager_id FOREIGN KEY(manager_id) REFERENCES personnel (id) ON DELETE RESTRICT )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='营销人员表(T+同步不覆盖岗位与工资标准)' COLLATE utf8mb4_general_ci; CREATE INDEX idx_personnel_business_role_id ON personnel (business_role_id); CREATE INDEX idx_personnel_manager_id ON personnel (manager_id); CREATE INDEX idx_personnel_source_no ON personnel (source_no); -- --------------------------------------------------------------------------- -- 产品辐射区域表(V4 迁移) -- --------------------------------------------------------------------------- CREATE TABLE personnel_regions ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, personnel_id BIGINT UNSIGNED NOT NULL COMMENT '人员ID(personnel.id)', region_name VARCHAR(128) NOT NULL COMMENT '区域名称(产品辐射地理范围)', remark VARCHAR(255) COMMENT '备注', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_personnel_regions PRIMARY KEY (id), CONSTRAINT fk_personnel_regions_personnel_id FOREIGN KEY(personnel_id) REFERENCES personnel (id) ON DELETE RESTRICT )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='产品辐射区域表' COLLATE utf8mb4_general_ci; CREATE INDEX idx_personnel_regions_personnel_id ON personnel_regions (personnel_id); -- --------------------------------------------------------------------------- -- 市场拓展计划表(V4 迁移) -- --------------------------------------------------------------------------- CREATE TABLE personnel_plans ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, personnel_id BIGINT UNSIGNED NOT NULL COMMENT '人员ID(personnel.id)', plan_period VARCHAR(32) NOT NULL COMMENT '计划期间(如 2026Q1、2026-05)', plan_content VARCHAR(500) NOT NULL COMMENT '计划内容', target_desc VARCHAR(255) COMMENT '指标说明(文字描述)', source_no VARCHAR(64) COMMENT 'T+ 原始条目号(预留)', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_personnel_plans PRIMARY KEY (id), CONSTRAINT fk_personnel_plans_personnel_id FOREIGN KEY(personnel_id) REFERENCES personnel (id) ON DELETE RESTRICT )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='市场拓展计划表' COLLATE utf8mb4_general_ci; CREATE INDEX idx_personnel_plans_personnel_id ON personnel_plans (personnel_id); -- --------------------------------------------------------------------------- -- 产品表(V4 迁移;类别锚定折算阈值参数,T+ 同步不覆盖产品类别) -- --------------------------------------------------------------------------- CREATE TABLE products ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, product_name VARCHAR(128) NOT NULL COMMENT '产品名称', spec_model VARCHAR(128) NOT NULL COMMENT '规格型号(空串而非 NULL:参与组合唯一键,MySQL 组合索引对 NULL 不去重)' DEFAULT '', unit VARCHAR(16) COMMENT '计量单位', stock_quantity DECIMAL(14, 2) COMMENT '数量(T+ 同步原样存储,语义待 IT 确认)', sale_price DECIMAL(14, 4) COMMENT '销售单价(元,T+ 同步)', product_category VARCHAR(32) NOT NULL COMMENT '产品类别:municipal_water市政水利 rail_transit轨道交通(决定折算阈值 30%/20%;T+同步不覆盖)', status TINYINT NOT NULL COMMENT '状态:1启用 0停用' DEFAULT '1', remark VARCHAR(255) COMMENT '备注', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, source_no VARCHAR(64) COMMENT 'T+ 原始单据号(同步幂等去重锚点;唯一键待 IT 定键后升级)', t_plus_id VARCHAR(64) COMMENT 'T+ 系统内部标识', sync_batch_no VARCHAR(32) COMMENT '同步批次号(同步模块写入)', synced_at DATETIME COMMENT '最近同步时间', source_updated_at DATETIME COMMENT 'T+ 源数据更新时间(未确认时可为空)', CONSTRAINT pk_products PRIMARY KEY (id), CONSTRAINT uk_products_name_spec UNIQUE (product_name, spec_model) )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='产品表(类别锚定折算阈值参数;T+同步不覆盖产品类别)' COLLATE utf8mb4_general_ci; CREATE INDEX idx_products_source_no ON products (source_no); -- --------------------------------------------------------------------------- -- 客户表(V4 迁移;公司名称+负责人为业务唯一标识,T+ 同步不覆盖客户分类) -- --------------------------------------------------------------------------- CREATE TABLE customers ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, company_name VARCHAR(128) NOT NULL COMMENT '公司名称', owner_name VARCHAR(64) NOT NULL COMMENT '客户负责人姓名(客户公司负责人的人名,非系统人员)', contact_person VARCHAR(64) COMMENT '联系人', contact_phone VARCHAR(20) COMMENT '联系电话', address VARCHAR(255) COMMENT '地址', industry VARCHAR(64) COMMENT '所属行业(自由文本)', customer_type VARCHAR(32) NOT NULL COMMENT '客户分类:personal个人户 manager_personal经理个人户 enterprise企业户(计提规则匹配锚点;T+同步不覆盖)' DEFAULT 'personal', owner_personnel_id BIGINT UNSIGNED COMMENT '归属负责营销人员ID(手动修改不回溯历史,变更留痕见 ownership_change_logs)', remark VARCHAR(255) COMMENT '备注', rating_score TINYINT COMMENT '评级总分(0-100,评级计算器保存;null=未评分;人工维护字段,T+ 同步不覆盖)', rating_time DATETIME COMMENT '最近评级时间(评级计算器保存评分时刷新;人工维护字段)', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, source_no VARCHAR(64) COMMENT 'T+ 原始单据号(同步幂等去重锚点;唯一键待 IT 定键后升级)', t_plus_id VARCHAR(64) COMMENT 'T+ 系统内部标识', sync_batch_no VARCHAR(32) COMMENT '同步批次号(同步模块写入)', synced_at DATETIME COMMENT '最近同步时间', source_updated_at DATETIME COMMENT 'T+ 源数据更新时间(未确认时可为空)', CONSTRAINT pk_customers PRIMARY KEY (id), CONSTRAINT uk_customers_company_owner UNIQUE (company_name, owner_name), CONSTRAINT fk_customers_owner_personnel_id FOREIGN KEY(owner_personnel_id) REFERENCES personnel (id) ON DELETE RESTRICT )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='客户表(公司名称+负责人为业务唯一标识;T+同步不覆盖客户分类)' COLLATE utf8mb4_general_ci; CREATE INDEX idx_customers_customer_type ON customers (customer_type); CREATE INDEX idx_customers_owner_personnel_id ON customers (owner_personnel_id); CREATE INDEX idx_customers_source_no ON customers (source_no); -- --------------------------------------------------------------------------- -- 归属变更记录表(V4 迁移,append-only;客户/业务归属变更留痕,不回溯历史) -- --------------------------------------------------------------------------- CREATE TABLE ownership_change_logs ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, owner_type TINYINT NOT NULL COMMENT '归属类型:1客户归属 2业务归属', customer_id BIGINT UNSIGNED COMMENT '客户ID(固化,owner_type=1 时非空)', business_id BIGINT UNSIGNED COMMENT '业务ID(固化,owner_type=2 时非空)', old_owner_personnel_id BIGINT UNSIGNED COMMENT '变更前负责营销人员ID(固化)', new_owner_personnel_id BIGINT UNSIGNED COMMENT '变更后负责营销人员ID(固化)', old_assistant_personnel_id BIGINT UNSIGNED COMMENT '变更前协助营销人员ID(固化,仅业务归属使用)', new_assistant_personnel_id BIGINT UNSIGNED COMMENT '变更后协助营销人员ID(固化,仅业务归属使用)', change_reason VARCHAR(255) COMMENT '变更原因', operator_id BIGINT UNSIGNED COMMENT '操作人ID(账号删除后置空)', operator_name VARCHAR(64) NOT NULL COMMENT '操作人用户名(冗余固化)', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, CONSTRAINT pk_ownership_change_logs PRIMARY KEY (id), CONSTRAINT fk_ownership_change_logs_operator_id FOREIGN KEY(operator_id) REFERENCES users (id) ON DELETE SET NULL )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='归属变更记录表(append-only;客户/业务归属变更留痕,不回溯历史)' COLLATE utf8mb4_general_ci; CREATE INDEX idx_ownership_change_logs_customer_id ON ownership_change_logs (customer_id); CREATE INDEX idx_ownership_change_logs_business_id ON ownership_change_logs (business_id); CREATE INDEX idx_ownership_change_logs_create_time ON ownership_change_logs (create_time); -- --------------------------------------------------------------------------- -- 字典数据:角色(与 V1 迁移中的初始化数据一致) -- --------------------------------------------------------------------------- INSERT INTO roles (role_code, role_name, description, sort_order) VALUES ('admin', '系统管理员', '全部权限,含计提参数与系数表配置', 1); INSERT INTO roles (role_code, role_name, description, sort_order) VALUES ('user', '普通用户', '业务操作', 2); -- 2026-10-15 复核审批补充需求:三个职能登录角色(与 V6 迁移种子一致; -- 内置保护由 role_service 的 BUILTIN_ROLE_CODES 白名单承担) INSERT INTO roles (role_code, role_name, description, sort_order) VALUES ('marketing_ops', '营销后勤', '提交与录入(审批链第一节点:月结/二次分配提交)', 3); INSERT INTO roles (role_code, role_name, description, sort_order) VALUES ('finance', '财务', '复核(审批链第二节点)', 4); INSERT INTO roles (role_code, role_name, description, sort_order) VALUES ('leader', '领导', '审核(审批链第三节点;全览只读)', 5); -- --------------------------------------------------------------------------- -- 字典数据:业务岗位与计提参数(与 V3 迁移种子一致;口径依据 2026-10-12 业务裁决) -- 显式指定 id:param_values 按 param_id 引用定义,与迁移种子保持同源一致 -- --------------------------------------------------------------------------- INSERT INTO business_roles (id, role_code, role_name, calc_template, description, sort_order, is_builtin) VALUES (1, 'salesperson', '营销员', 'TPL_SALESPERSON_DECAY', '业务员个人户:回款天数线性递减(10‰ − 天数×4/360‰,361 天起固定 4‰)', 1, 1), (2, 'sales_manager', '营销经理', 'TPL_MANAGER_SHARE', '经理绩效:∑本团队业务员绩效×12.5% + ∑全公司业务员绩效×5%', 2, 1), (3, 'info_officer', '信息员', 'TPL_INFO_SALES_FIXED', '信息员绩效:本人销售额×1‰', 3, 1); INSERT INTO param_change_batches (id, version_no, effective_date, change_type, remark, operator_name, item_count) VALUES (1, 'P20260101-00', '2026-01-01', 1, '初始版本(系统初始化种子,口径依据 2026-10-12 业务裁决与 2026-10-19 澄清答复)', 'system', 19); INSERT INTO param_definitions (id, param_code, param_name, param_group, value_type, unit, dimension_type, options_text, default_value, value_min, value_max, description, sort_order) VALUES (1, 'salesperson.rate.start', '业务员起始计提比例', '业务员个人户', 'DECIMAL', '‰', 'BUSINESS_ROLE', NULL, '10', '0', NULL, '回款当天能拿到的最高计提比例。回款每晚一天,按日递减斜率往下走,直到分界天数为止。', 1), (2, 'salesperson.rate.slope', '业务员日递减斜率', '业务员个人户', 'DECIMAL', '‰/天', 'BUSINESS_ROLE', NULL, '4/360', '0', NULL, '回款每延后一天,计提比例下降多少。按分数填写(如 4/360)可保持精确,填小数会引入四舍五入误差。', 2), (3, 'salesperson.rate.floor', '业务员计提下限', '业务员个人户', 'DECIMAL', '‰', 'BUSINESS_ROLE', NULL, '4', '0', NULL, '回款天数超过分界天数后,计提比例不再下降,固定按这个值计算,即最低计提比例。', 3), (4, 'salesperson.days.boundary', '线性递减分界天数', '业务员个人户', 'INT', '天', 'BUSINESS_ROLE', NULL, '360', '0', NULL, '回款天数在这个范围内按日递减;超过这个天数就固定按下限计提。默认 360 天。', 4), (5, 'manager.share.team', '经理本团队分成比例', '经理分成', 'DECIMAL', '%', 'BUSINESS_ROLE', NULL, '12.5', '0', '100', '经理按本团队业务员的绩效总额提取的分成比例,只统计自己带的业务员。', 5), (6, 'manager.share.company', '经理全公司分成比例', '经理分成', 'DECIMAL', '%', 'BUSINESS_ROLE', NULL, '5', '0', '100', '经理按全公司业务员的绩效总额提取的分成比例,与本团队分成叠加计算。', 6), (7, 'enterprise.rate', '企业户计提比例', '企业户', 'DECIMAL', '‰', 'PRODUCT_CATEGORY', NULL, '3', '0', NULL, '企业户客户的回款统一按这个比例计提,不看回款天数。2026-08-13 起由 2‰ 调整为 3‰。', 7), (8, 'info.rate', '信息员计提比例', '信息员', 'DECIMAL', '‰', 'BUSINESS_ROLE', NULL, '1', '0', NULL, '信息员的绩效按本人销售额乘这个比例计算,不随回款天数递减。', 8), (9, 'prepay.rate', '预付款计提比例', '支付环节', 'DECIMAL', '‰', 'NONE', NULL, '10', '0', NULL, '预付款到账即按这个比例计提绩效,不必等到全额回款。', 9), (10, 'barter.discount', '以物抵顶折算比例', '支付环节', 'DECIMAL', '%', 'NONE', NULL, '80', '0', '100', '以物抵顶的回款,按应发绩效的这个比例折算,即打折后的金额参与绩效。', 10), (11, 'payment.start.ratio', '支付起付比例', '支付环节', 'DECIMAL', '%', 'NONE', NULL, '60', '0', '100', '单项业务的回款累计达到销售额(不含运费)的这个比例后才开始发放绩效;达标之前只累计、不发放。', 11), (12, 'payment.weight.mode', '支付权重应用方式', '支付环节', 'ENUM', NULL, 'NONE', 'FULL|BALANCE', 'FULL', NULL, NULL, '选择支付权重乘在哪个基数上:当月全额 = 乘本月全部应发绩效;余额 = 只乘尚未发放的部分。', 12), (13, 'product.threshold', '折算毛利润额阈值', '产品阈值', 'DECIMAL', '%', 'PRODUCT_CATEGORY', NULL, '30', '0', '100', '折算毛利润额 = 销售额 ×(毛利润率 − 阈值),低于阈值的部分不参与绩效。市政水利默认 30%,轨道交通默认 20%。', 13), (14, 'salary.basic.mode', '月工资基本工资口径', '月工资口径', 'ENUM', NULL, 'BUSINESS_ROLE', 'INCLUDE|DEDUCT|EXCLUDE', 'INCLUDE', NULL, NULL, '算月工资时怎么处理基本工资:含基本工资 = 与绩效一起发;扣除基本工资 = 从绩效里扣掉已发的基本工资;不计 = 月工资只发绩效。', 14), (15, 'probation.annual.threshold', '试用期年累计结算阈值', '月工资口径', 'DECIMAL', '元', 'NONE', NULL, '18000', '0', NULL, '试用期绩效先不发放;年内累计超过这个金额的部分,年底一次性结算。', 15), (17, 'approval.secondary_allocation.enabled', '二次分配审批开关', '审批开关', 'BOOL', NULL, 'NONE', NULL, '1', NULL, NULL, '二次分配方案提交后是否要审批:开启 = 先经财务复核、再经领导审核,通过后才生效;关闭 = 提交即生效,系统自动记录各节点留痕。', 17), (18, 'approval.monthly_settlement.enabled', '月度结算审批开关', '审批开关', 'BOOL', NULL, 'NONE', NULL, '1', NULL, NULL, '月度结算提交后是否要审批:开启 = 先经财务复核、再经领导审核;关闭 = 生成即生效。月结涉及工资发放,默认开启。', 18), (19, 'approval.adjustment.enabled', '调整单审批开关', '审批开关', 'BOOL', NULL, 'NONE', NULL, '0', NULL, NULL, '调整单提交后是否要审批:开启 = 先经财务复核、再经领导审核;关闭 = 提交即生效。调整单是已锁定月份补发或扣减的唯一通道。', 19), (20, 'manager.personal.included', '经理个人户计入聚合基数', '经理分成', 'BOOL', NULL, 'NONE', NULL, '0', NULL, NULL, '经理提取团队分成时,是否把经理本人名下的业绩(经理个人户)也算进分成基数。默认不计入。', 20), -- 预警规则参数:工作台预警阈值,可按业务需要调整 (21, 'warning.enabled', '风险预警总开关', '预警规则', 'BOOL', NULL, 'NONE', NULL, '1', NULL, NULL, '工作台风险预警区块的总开关:关闭后不再扫描、也不展示预警条目。默认开启。', 21), (22, 'warning.receipt.overdue.days', '回款逾期天数阈值', '预警规则', 'INT', '天', 'NONE', NULL, '90', '1', NULL, '发货后超过这么多天仍未收到回款的发货批次,会出现在工作台的预警列表里。默认 90 天。', 22), (23, 'warning.approval.timeout.days', '审批超时天数阈值', '预警规则', 'INT', '天', 'NONE', NULL, '3', '1', NULL, '审批单提交后超过这么多天还没处理,会出现在工作台的预警列表里。默认 3 天。', 23); INSERT INTO param_values (id, param_id, dimension_value, effective_date, value_text, batch_id) VALUES (1, 1, 'salesperson', '2026-02-17', '10', 1), (2, 2, 'salesperson', '2026-02-17', '4/360', 1), (3, 3, 'salesperson', '2026-02-17', '4', 1), (4, 4, 'salesperson', '2026-02-17', '360', 1), (5, 5, 'sales_manager', '2026-08-13', '12.5', 1), (6, 6, 'sales_manager', '2026-08-13', '5', 1), (7, 7, '', '2026-02-17', '2', 1), (8, 7, '', '2026-08-13', '3', 1), (9, 8, 'info_officer', '2026-08-13', '1', 1), (10, 9, '', '2026-01-01', '10', 1), (11, 10, '', '2026-01-01', '80', 1), (12, 11, '', '2026-01-01', '60', 1), (13, 12, '', '2026-01-01', 'FULL', 1), (14, 13, 'municipal_water', '2026-02-17', '30', 1), (15, 13, 'rail_transit', '2026-02-17', '20', 1), (16, 14, 'salesperson', '2026-01-01', 'INCLUDE', 1), (17, 14, 'sales_manager', '2026-01-01', 'DEDUCT', 1), (18, 15, '', '2026-01-01', '18000', 1), -- 审批开关默认开启(澄清 #5/#7 答复 2026-10-19);试用期统一工资参数已撤 -- (#16 答复:按人员档案 personnel.salary_standard 逐人维护),本脚本直达终态 (20, 17, '', '2026-01-01', '1', 1), (21, 18, '', '2026-01-01', '1', 1), (22, 19, '', '2026-01-01', '0', 1), (25, 20, '', '2026-01-01', '0', 1), -- 预警规则参数生效值(M4 ⑧) (26, 21, '', '2026-10-19', '1', 1), (27, 22, '', '2026-10-19', '90', 1), (28, 23, '', '2026-10-19', '3', 1); -- --------------------------------------------------------------------------- -- 业务表(V5 迁移;业务编号自动生成,五项汇总冗余列由服务层事务内维护) -- --------------------------------------------------------------------------- CREATE TABLE businesses ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, business_no VARCHAR(32) NOT NULL COMMENT '业务编号,自动生成 YW{YYYYMMDD}-{4位当日序号}(报表合同编号)', customer_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID(customers.id)', business_date DATE COMMENT '业务日期(T+ 同步口径)', status TINYINT NOT NULL COMMENT '业务状态:1执行中 2已完成 3已终止(终态不可变更;T+同步不覆盖)' DEFAULT '1', owner_personnel_id BIGINT UNSIGNED COMMENT '负责营销人员ID(核算归属锚点;NULL=待指定,M3 核算前置校验非空;变更留痕不回溯)', assistant_personnel_id BIGINT UNSIGNED COMMENT '协助营销人员ID(一期核算不使用,对照表 #15;仅记录事实)', is_special TINYINT NOT NULL COMMENT '特殊业务标记:1是 0否(公司参与等)' DEFAULT '0', special_note VARCHAR(255) COMMENT '特殊业务说明', total_sale_amount DECIMAL(14, 2) COMMENT '销售额合计(明细行汇总冗余,服务层事务内维护,禁手工直改;不含运费口径)' DEFAULT '0', total_cost_amount DECIMAL(14, 2) COMMENT '成本合计(明细行汇总冗余,服务层事务内维护,禁手工直改)' DEFAULT '0', total_ship_amount DECIMAL(14, 2) COMMENT '发货金额合计(发货明细汇总冗余,服务层事务内维护,禁手工直改)' DEFAULT '0', total_received_amount DECIMAL(14, 2) COMMENT '回款合计(回款记录汇总冗余,服务层事务内维护;M3 起付判定直接消费)' DEFAULT '0', total_freight_amount DECIMAL(14, 2) COMMENT '运费合计(发货单汇总冗余,仅记录展示;不计入毛利润口径,对照表 #2)' DEFAULT '0', remark VARCHAR(255) COMMENT '备注', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, source_no VARCHAR(64) COMMENT 'T+ 原始单据号(同步幂等去重锚点;唯一键待 IT 定键后升级)', t_plus_id VARCHAR(64) COMMENT 'T+ 系统内部标识', sync_batch_no VARCHAR(32) COMMENT '同步批次号(同步模块写入)', synced_at DATETIME COMMENT '最近同步时间', source_updated_at DATETIME COMMENT 'T+ 源数据更新时间(未确认时可为空)', CONSTRAINT pk_businesses PRIMARY KEY (id), CONSTRAINT uk_businesses_business_no UNIQUE (business_no), CONSTRAINT fk_businesses_customer_id FOREIGN KEY(customer_id) REFERENCES customers (id) ON DELETE RESTRICT, CONSTRAINT fk_businesses_owner_personnel_id FOREIGN KEY(owner_personnel_id) REFERENCES personnel (id) ON DELETE RESTRICT, CONSTRAINT fk_businesses_assistant_personnel_id FOREIGN KEY(assistant_personnel_id) REFERENCES personnel (id) ON DELETE RESTRICT )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='业务表(业务编号自动生成;T+同步不覆盖业务状态)' COLLATE utf8mb4_general_ci; CREATE INDEX idx_businesses_business_date ON businesses (business_date); CREATE INDEX idx_businesses_customer_id ON businesses (customer_id); CREATE INDEX idx_businesses_owner_personnel_id ON businesses (owner_personnel_id); CREATE INDEX idx_businesses_source_no ON businesses (source_no); CREATE INDEX idx_businesses_status ON businesses (status); -- --------------------------------------------------------------------------- -- 业务产品明细表(V5 迁移;行级类别为折算锚点,指导价 T+ 同步不覆盖) -- --------------------------------------------------------------------------- CREATE TABLE business_items ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, business_id BIGINT UNSIGNED NOT NULL COMMENT '业务ID(businesses.id)', product_id BIGINT UNSIGNED COMMENT '产品ID(products.id;NULL=自由录入,未入产品库)', product_name VARCHAR(128) NOT NULL COMMENT '产品名称(引用产品时冗余固化)', spec_model VARCHAR(128) NOT NULL COMMENT '规格型号(冗余固化;空串对齐 products 组合唯一键口径)' DEFAULT '', unit VARCHAR(16) COMMENT '计量单位', product_category VARCHAR(32) NOT NULL COMMENT '产品类别(行级折算锚点,混合业务按产品逐条计算,对照表 #14;值域同 PRODUCT_CATEGORIES)', quantity DECIMAL(14, 2) NOT NULL COMMENT '数量(>0)', sale_price DECIMAL(14, 4) COMMENT '销售单价(元;T+ 同步或人工)', sale_amount DECIMAL(14, 2) NOT NULL COMMENT '销售额 = 数量×销售单价(服务层计算固化;不含运费口径,毛利润率分母)', cost_amount DECIMAL(14, 2) COMMENT '成本额(T+ 同步或人工录入,来源待 T+ 确认;毛利润额 = 销售额 − 成本额)', guided_price DECIMAL(14, 4) COMMENT '指导价(人工录入;T+同步不覆盖,需规 2.2.1/2.2.4)', remark VARCHAR(255) COMMENT '备注', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_business_items PRIMARY KEY (id), CONSTRAINT fk_business_items_business_id FOREIGN KEY(business_id) REFERENCES businesses (id) ON DELETE RESTRICT, CONSTRAINT fk_business_items_product_id FOREIGN KEY(product_id) REFERENCES products (id) ON DELETE RESTRICT )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='业务产品明细表(毛利润行级源数据;指导价 T+同步不覆盖)' COLLATE utf8mb4_general_ci; CREATE INDEX idx_business_items_business_id ON business_items (business_id); CREATE INDEX idx_business_items_product_category ON business_items (product_category); CREATE INDEX idx_business_items_product_id ON business_items (product_id); -- --------------------------------------------------------------------------- -- 业务状态变更记录表(V5 迁移,append-only;创建时写首条 old=new=1) -- --------------------------------------------------------------------------- CREATE TABLE business_status_logs ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, business_id BIGINT UNSIGNED NOT NULL COMMENT '业务ID(固化,无外键;删除保护由服务层承担)', old_status TINYINT NOT NULL COMMENT '变更前状态(创建首条为 1)', new_status TINYINT NOT NULL COMMENT '变更后状态', change_reason VARCHAR(255) COMMENT '变更原因(终止时必填)', operator_id BIGINT UNSIGNED COMMENT '操作人ID(账号删除后置空)', operator_name VARCHAR(64) NOT NULL COMMENT '操作人用户名(冗余固化)', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, CONSTRAINT pk_business_status_logs PRIMARY KEY (id), CONSTRAINT fk_business_status_logs_operator_id FOREIGN KEY(operator_id) REFERENCES users (id) ON DELETE SET NULL )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='业务状态变更记录表(append-only)' COLLATE utf8mb4_general_ci; CREATE INDEX idx_business_status_logs_business_id ON business_status_logs (business_id); CREATE INDEX idx_business_status_logs_create_time ON business_status_logs (create_time); -- --------------------------------------------------------------------------- -- 发货单表(V5 迁移;发货日为回款天数基准日,发货日首日计第 1 天) -- --------------------------------------------------------------------------- CREATE TABLE shipments ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, shipment_no VARCHAR(32) NOT NULL COMMENT '发货单号,自动生成 SH{YYYYMMDD}-{4位当日序号}(内部追溯用)', business_id BIGINT UNSIGNED NOT NULL COMMENT '业务ID(businesses.id;终态业务禁止新发货)', ship_date DATE NOT NULL COMMENT '发货日期(回款天数基准日,发货日首日=第 1 天)', freight_amount DECIMAL(14, 2) NOT NULL COMMENT '运费金额(仅记录展示;不计入毛利润口径,对照表 #2)' DEFAULT '0', total_amount DECIMAL(14, 2) NOT NULL COMMENT '发货总金额(明细行汇总冗余,服务层事务内维护,禁手工直改)' DEFAULT '0', remark VARCHAR(255) COMMENT '备注', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, source_no VARCHAR(64) COMMENT 'T+ 原始单据号(同步幂等去重锚点;唯一键待 IT 定键后升级)', t_plus_id VARCHAR(64) COMMENT 'T+ 系统内部标识', sync_batch_no VARCHAR(32) COMMENT '同步批次号(同步模块写入)', synced_at DATETIME COMMENT '最近同步时间', source_updated_at DATETIME COMMENT 'T+ 源数据更新时间(未确认时可为空)', CONSTRAINT pk_shipments PRIMARY KEY (id), CONSTRAINT uk_shipments_shipment_no UNIQUE (shipment_no), CONSTRAINT fk_shipments_business_id FOREIGN KEY(business_id) REFERENCES businesses (id) ON DELETE RESTRICT )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='发货单表(发货日为回款天数基准日,发货日首日计第 1 天)' COLLATE utf8mb4_general_ci; CREATE INDEX idx_shipments_business_id ON shipments (business_id); CREATE INDEX idx_shipments_ship_date ON shipments (ship_date); CREATE INDEX idx_shipments_source_no ON shipments (source_no); -- --------------------------------------------------------------------------- -- 发货产品明细表(V5 迁移) -- --------------------------------------------------------------------------- CREATE TABLE shipment_items ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, shipment_id BIGINT UNSIGNED NOT NULL COMMENT '发货单ID(shipments.id)', product_id BIGINT UNSIGNED COMMENT '产品ID(products.id;NULL=自由录入)', product_name VARCHAR(128) NOT NULL COMMENT '产品名称(引用产品时冗余固化)', spec_model VARCHAR(128) NOT NULL COMMENT '规格型号(冗余固化;空串对齐 products 组合唯一键口径)' DEFAULT '', unit VARCHAR(16) COMMENT '计量单位', quantity DECIMAL(14, 2) NOT NULL COMMENT '发货数量(>0)', sale_price DECIMAL(14, 4) COMMENT '发货单价(元;T+ 同步或人工,口径待 IT 确认)', amount DECIMAL(14, 2) NOT NULL COMMENT '行金额 = 数量×单价(服务层计算固化,不信任前端传值)', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_shipment_items PRIMARY KEY (id), CONSTRAINT fk_shipment_items_shipment_id FOREIGN KEY(shipment_id) REFERENCES shipments (id) ON DELETE RESTRICT, CONSTRAINT fk_shipment_items_product_id FOREIGN KEY(product_id) REFERENCES products (id) ON DELETE RESTRICT )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='发货产品明细表' COLLATE utf8mb4_general_ci; CREATE INDEX idx_shipment_items_product_id ON shipment_items (product_id); CREATE INDEX idx_shipment_items_shipment_id ON shipment_items (shipment_id); -- --------------------------------------------------------------------------- -- 回款表(V5 迁移;手动指定发货批次,已核算回款禁改禁删) -- --------------------------------------------------------------------------- CREATE TABLE receipts ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, receipt_batch_no VARCHAR(32) NOT NULL COMMENT '回款批次号,自动生成 HK{YYYYMMDD}-{4位当日序号}(系统内唯一;T+ 同步回款以 source_no 幂等)', business_id BIGINT UNSIGNED NOT NULL COMMENT '业务ID(businesses.id)', shipment_id BIGINT UNSIGNED COMMENT '发货单ID(shipments.id;手动指定的回款对应批次,须与本行业务一致;NULL=暂未指定)', receipt_date DATE NOT NULL COMMENT '回款到账日(M3 按此日匹配参数版本,对照表 #11)', amount DECIMAL(14, 2) NOT NULL COMMENT '回款金额(≥0;一期禁负数/红字)', is_barter TINYINT NOT NULL COMMENT '以物抵顶标记:1是 0否(M3 核算按应发绩效×barter.discount 折算,M2 仅标记)' DEFAULT '0', settlement_status TINYINT NOT NULL COMMENT '绩效核算状态:0未核算 1已核算(M3 核算防重锚点;已核算回款禁改禁删)' DEFAULT '0', remark VARCHAR(255) COMMENT '备注', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, source_no VARCHAR(64) COMMENT 'T+ 原始单据号(同步幂等去重锚点;唯一键待 IT 定键后升级)', t_plus_id VARCHAR(64) COMMENT 'T+ 系统内部标识', sync_batch_no VARCHAR(32) COMMENT '同步批次号(同步模块写入)', synced_at DATETIME COMMENT '最近同步时间', source_updated_at DATETIME COMMENT 'T+ 源数据更新时间(未确认时可为空)', CONSTRAINT pk_receipts PRIMARY KEY (id), CONSTRAINT uk_receipts_receipt_batch_no UNIQUE (receipt_batch_no), CONSTRAINT fk_receipts_business_id FOREIGN KEY(business_id) REFERENCES businesses (id) ON DELETE RESTRICT, CONSTRAINT fk_receipts_shipment_id FOREIGN KEY(shipment_id) REFERENCES shipments (id) ON DELETE RESTRICT )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='回款表(手动指定发货批次;已核算回款禁改禁删)' COLLATE utf8mb4_general_ci; CREATE INDEX idx_receipts_business_id ON receipts (business_id); CREATE INDEX idx_receipts_receipt_date ON receipts (receipt_date); CREATE INDEX idx_receipts_settlement_status ON receipts (settlement_status); CREATE INDEX idx_receipts_shipment_id ON receipts (shipment_id); CREATE INDEX idx_receipts_source_no ON receipts (source_no); -- --------------------------------------------------------------------------- -- 客户评级等级配置表(V5 迁移;判定按 sort_order 升序首个 min_score≤总分) -- --------------------------------------------------------------------------- CREATE TABLE customer_rating_grades ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, grade_name VARCHAR(32) NOT NULL COMMENT '等级名称(如 A/优秀)', min_score DECIMAL(5, 1) NOT NULL COMMENT '总分下限(含);判定=按 sort_order 升序首个 min_score ≤ 总分', max_score DECIMAL(5, 1) NOT NULL COMMENT '总分上限(展示用)', sort_order INT NOT NULL COMMENT '排序(判定顺序,升序)' DEFAULT '0', remark VARCHAR(255) COMMENT '说明', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_customer_rating_grades PRIMARY KEY (id), CONSTRAINT uk_customer_rating_grades_grade_name UNIQUE (grade_name) )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='客户评级等级配置表(等级映射可配置;判定按 sort_order 升序首个 min_score≤总分)' COLLATE utf8mb4_general_ci; -- --------------------------------------------------------------------------- -- 字典数据:评级等级(与 V5 迁移种子一致;评分项固定 5 项×20 分为前端常量,对照表 #25) -- --------------------------------------------------------------------------- INSERT INTO customer_rating_grades (grade_name, min_score, max_score, sort_order, remark) VALUES ('A', 90, 100, 1, '优秀'), ('B', 75, 89, 2, '良好'), ('C', 60, 74, 3, '合格'), ('D', 0, 59, 4, '待改进'); -- --------------------------------------------------------------------------- -- 系统设置/二次分配/审批(V6 迁移;公司信息单行;分摊计算待澄清另批) -- --------------------------------------------------------------------------- CREATE TABLE system_settings ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, company_name VARCHAR(64) NOT NULL COMMENT '公司名称(登录页与导出页眉展示)', logo_path VARCHAR(255) COMMENT 'logo 相对路径(文件存 uploads/logo/,null=未上传使用默认)', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_system_settings PRIMARY KEY (id) )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='系统设置表(公司信息,全系统单行)' COLLATE utf8mb4_general_ci; CREATE TABLE approval_orders ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, order_no VARCHAR(32) NOT NULL COMMENT '审批单号,自动生成 AP{YYYYMMDD}-{4位当日序号}', order_type TINYINT NOT NULL COMMENT '审批对象类型:1二次分配方案 2月度结算(预留)', ref_id BIGINT UNSIGNED NOT NULL COMMENT '引用对象ID(order_type=1 时为 businesses.id;固化无外键,删除保护由服务层承担)', refer_no VARCHAR(32) NOT NULL COMMENT '引用对象单号(冗余固化,列表页免联查)', version_no INT NOT NULL COMMENT '提交版本号(同一对象类型+引用对象从1递增;重提产生新版本,旧单快照不覆盖)' DEFAULT '1', snapshot_json JSON COMMENT '提交时内容快照(信封:schema_version/order_type/captured_at/data;历史单可空)', status TINYINT NOT NULL COMMENT '审批状态:1待财务复核 2待领导审核 3已通过 4已驳回 5已撤回' DEFAULT '1', submitter_id BIGINT UNSIGNED COMMENT '提交人ID(账号删除后置空)', submitter_name VARCHAR(64) NOT NULL COMMENT '提交人用户名(冗余固化)', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_approval_orders PRIMARY KEY (id), CONSTRAINT uk_approval_orders_order_no UNIQUE (order_no), CONSTRAINT uk_approval_orders_order_type_ref_version UNIQUE (order_type, ref_id, version_no), CONSTRAINT fk_approval_orders_submitter_id FOREIGN KEY(submitter_id) REFERENCES users (id) ON DELETE SET NULL )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='审批单表(营销后勤提交→财务复核→领导审核;开关关闭时自动通过留痕)' COLLATE utf8mb4_general_ci; CREATE INDEX idx_approval_orders_type_status ON approval_orders (order_type, status); CREATE INDEX idx_approval_orders_type_ref ON approval_orders (order_type, ref_id); CREATE TABLE approval_steps ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, order_id BIGINT UNSIGNED NOT NULL COMMENT '审批单ID(approval_orders.id;单删记录随删)', node TINYINT NOT NULL COMMENT '审批节点:0撤回留痕 1财务复核 2领导审核', action TINYINT NOT NULL COMMENT '动作:1通过 2驳回 3自动通过 4撤回', opinion VARCHAR(255) COMMENT '审批意见(驳回时填写)', operator_id BIGINT UNSIGNED COMMENT '操作人ID(自动通过/系统动作置空)', operator_name VARCHAR(64) NOT NULL COMMENT '操作人用户名(冗余固化;系统动作记「系统」)', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, CONSTRAINT pk_approval_steps PRIMARY KEY (id), CONSTRAINT fk_approval_steps_operator_id FOREIGN KEY(operator_id) REFERENCES users (id) ON DELETE SET NULL, CONSTRAINT fk_approval_steps_order_id FOREIGN KEY(order_id) REFERENCES approval_orders (id) ON DELETE CASCADE )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='审批节点记录表(append-only;自动通过/撤回均有留痕)' COLLATE utf8mb4_general_ci; CREATE INDEX idx_approval_steps_order_id ON approval_steps (order_id); CREATE TABLE business_secondary_allocations ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, business_id BIGINT UNSIGNED NOT NULL COMMENT '业务ID(businesses.id;业务删除随删)', version_no INT NOT NULL COMMENT '方案版本号(同一业务从1递增;编辑/重提产生新版本,旧版本仅置历史)' DEFAULT '1', personnel_id BIGINT UNSIGNED NOT NULL COMMENT '参与业务员ID(personnel.id;被方案引用禁删)', personnel_name VARCHAR(64) NOT NULL COMMENT '参与业务员姓名(冗余固化,离职后回显有名)', ratio DECIMAL(5, 2) NOT NULL COMMENT '分摊比例(0-100 两位小数;不要求合计满额,余额归属待澄清#2)', is_active TINYINT NOT NULL COMMENT '是否当前生效版本:1生效 0历史(编辑替换/驳回清空后置0,行不删除)' DEFAULT '1', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_business_secondary_allocations PRIMARY KEY (id), CONSTRAINT uk_business_secondary_allocations_business_version_personnel UNIQUE (business_id, version_no, personnel_id), CONSTRAINT fk_business_secondary_allocations_business_id FOREIGN KEY(business_id) REFERENCES businesses (id) ON DELETE CASCADE, CONSTRAINT fk_business_secondary_allocations_personnel_id FOREIGN KEY(personnel_id) REFERENCES personnel (id) ON DELETE RESTRICT )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='业务二次分配方案版本表(append-only;比例不要求合计满额,余额归属待澄清)' COLLATE utf8mb4_general_ci; CREATE INDEX idx_business_secondary_allocations_business_id ON business_secondary_allocations (business_id); CREATE INDEX idx_business_secondary_allocations_personnel_id ON business_secondary_allocations (personnel_id); CREATE INDEX idx_business_secondary_allocations_business_active ON business_secondary_allocations (business_id, is_active); -- --------------------------------------------------------------------------- -- 绩效核算台账/月结/调整单(V7 迁移;append-only 版本行;通过即锁定走调整单) -- --------------------------------------------------------------------------- CREATE TABLE monthly_settlements ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, settlement_month VARCHAR(7) NOT NULL COMMENT '结算月份(YYYY-MM;全表唯一)', status TINYINT NOT NULL COMMENT '状态:1草稿 2待审批 3已审定(终态=已锁定)4已驳回(回草稿)' DEFAULT '1', total_performance NUMERIC(14, 2) COMMENT '绩效金额合计(可负)', total_payable NUMERIC(14, 2) COMMENT '应付绩效合计(可负)', person_count TINYINT NOT NULL COMMENT '结算人数' DEFAULT '0', snapshot_json JSON COMMENT '月度总览快照(生成时刻的确认回款口径说明与汇总参数)', approval_order_no VARCHAR(32) COMMENT '关联审批单号(冗余固化;开关关闭自动通过时也有单)', submitter_id BIGINT UNSIGNED COMMENT '提交人ID(账号删除后置空)', submitter_name VARCHAR(64) NOT NULL COMMENT '提交人用户名(冗余固化)', locked_at DATETIME COMMENT '锁定时间(status=3 时回填)', locked_by VARCHAR(64) COMMENT '锁定操作人(冗余固化)', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_monthly_settlements PRIMARY KEY (id), CONSTRAINT uk_monthly_settlements_settlement_month UNIQUE (settlement_month), CONSTRAINT fk_monthly_settlements_submitter_id FOREIGN KEY(submitter_id) REFERENCES users (id) ON DELETE SET NULL )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='月度结算表(按月一行;通过即锁定,锁定后走调整单)' COLLATE utf8mb4_general_ci; CREATE TABLE settlement_items ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, settlement_id BIGINT UNSIGNED NOT NULL COMMENT '月结ID(monthly_settlements.id;头删明细随删)', personnel_id BIGINT UNSIGNED NOT NULL COMMENT '结算人员ID(personnel.id)', personnel_name VARCHAR(64) NOT NULL COMMENT '结算人员姓名(冗余固化)', role_code VARCHAR(32) NOT NULL COMMENT '岗位编码(主岗,聚合锚点)', calc_type TINYINT NOT NULL COMMENT '核算类型:1单笔回款 2经理团队聚合', performance_sum NUMERIC(14, 2) NOT NULL COMMENT '绩效金额合计(可负;聚合行排除经理个人户业绩,#12 暂口径)', payable_sum NUMERIC(14, 2) NOT NULL COMMENT '应付绩效合计(可负)', basic_amount NUMERIC(14, 2) COMMENT '月工资标准(personnel.salary_standard 当月快照)', salary_mode VARCHAR(16) COMMENT '月工资口径快照:INCLUDE/DEDUCT/EXCLUDE', net_amount NUMERIC(14, 2) COMMENT '净工资 = 绩效±基本工资(按口径;试用期 0)', is_probation TINYINT NOT NULL COMMENT '试用期:1绩效照算不发放(net=0,超年累计记 note)0否' DEFAULT '0', probation_note VARCHAR(255) COMMENT '试用期说明(年累计超阈值部分年底一次性结算)', snapshot_json JSON COMMENT '个人明细快照(台账行引用列表)', CONSTRAINT pk_settlement_items PRIMARY KEY (id), CONSTRAINT fk_settlement_items_settlement_id FOREIGN KEY(settlement_id) REFERENCES monthly_settlements (id) ON DELETE CASCADE, CONSTRAINT fk_settlement_items_personnel_id FOREIGN KEY(personnel_id) REFERENCES personnel (id) ON DELETE RESTRICT )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='月结明细表(按人固化;支持负数工资;锁定后只读)' COLLATE utf8mb4_general_ci; CREATE TABLE adjustment_orders ( adjustment_type VARCHAR(32) NOT NULL DEFAULT 'GENERAL' COMMENT '调整类型:GENERAL普通 ALLOCATION分配差额', source_ledger_id BIGINT UNSIGNED NULL COMMENT '分配差额对应的原台账ID', attribution_json JSON NULL COMMENT '原台账业务与分管归属快照', id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, order_no VARCHAR(32) NOT NULL COMMENT '调整单号,自动生成 TZ{YYYYMMDD}-{4位当日序号}', settlement_month VARCHAR(7) NOT NULL COMMENT '调整月份(YYYY-MM;跨月规则待澄清 #9 前不限制)', personnel_id BIGINT UNSIGNED NOT NULL COMMENT '调整人员ID(personnel.id)', personnel_name VARCHAR(64) NOT NULL COMMENT '调整人员姓名(冗余固化)', direction TINYINT NOT NULL COMMENT '方向:1补发 2扣减', amount NUMERIC(14, 2) NOT NULL COMMENT '调整金额(恒正,方向表达语义)', reason VARCHAR(255) NOT NULL COMMENT '扣补说明(必填,审批与追溯锚点)', status TINYINT NOT NULL COMMENT '状态:1待审批 2已生效 3已驳回 4已撤回' DEFAULT '1', submitter_id BIGINT UNSIGNED COMMENT '提交人ID(账号删除后置空)', submitter_name VARCHAR(64) NOT NULL COMMENT '提交人用户名(冗余固化)', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_adjustment_orders PRIMARY KEY (id), CONSTRAINT uk_adjustment_orders_order_no UNIQUE (order_no), CONSTRAINT fk_adjustment_orders_personnel_id FOREIGN KEY(personnel_id) REFERENCES personnel (id) ON DELETE RESTRICT, CONSTRAINT fk_adjustment_orders_submitter_id FOREIGN KEY(submitter_id) REFERENCES users (id) ON DELETE SET NULL )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='调整单表(已锁定月份的补发/扣减;走审批;生效后不回写月结快照)' COLLATE utf8mb4_general_ci; CREATE TABLE performance_ledgers ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, receipt_id BIGINT UNSIGNED COMMENT '回款ID(receipts.id;聚合行可为 NULL)', allocation_key VARCHAR(64) NOT NULL DEFAULT '' COMMENT '正式FIFO事件键;历史单笔核算为空串', calc_version TINYINT NOT NULL COMMENT '核算版本(重算+1,旧行 is_active=0)' DEFAULT '1', is_active TINYINT NOT NULL COMMENT '生效标记:1当前生效 0已被重算替代(重算受控 UPDATE 例外)' DEFAULT '1', calc_type TINYINT NOT NULL COMMENT '核算类型:1单笔回款 2经理团队聚合(月度)' DEFAULT '1', business_id BIGINT UNSIGNED NOT NULL COMMENT '业务ID(固化无外键;聚合行为该经理名下首行业务ID,报表下钻锚点)', business_no VARCHAR(32) NOT NULL COMMENT '业务编号(冗余固化,列表免联查)', personnel_id BIGINT UNSIGNED NOT NULL COMMENT '归属营销人员ID(personnel.id;核算归属锚点)', personnel_name VARCHAR(64) NOT NULL COMMENT '归属营销人员姓名(冗余固化)', role_code VARCHAR(32) NOT NULL COMMENT '岗位编码(business_roles.role_code,计提公式锚点)', customer_type VARCHAR(32) NOT NULL COMMENT '客户分类:personal/manager_personal/enterprise', product_category VARCHAR(32) NOT NULL COMMENT '产品类别:municipal_water/rail_transit/mixed(混合业务,行级明细入 snapshot_json)', ship_date DATE COMMENT '发货日期(回款天数基准)', receipt_date DATE NOT NULL COMMENT '回款日期(参数版本匹配日,裁决 #11)', payment_days INTEGER COMMENT '回款天数(发货日首日计第 1 天;未指定批次为 NULL;先款后货照实负值)', rate_text VARCHAR(32) NOT NULL COMMENT '计提比例原文(如 4/360,防 Fraction 截断;聚合行存 12.5%/5% 结构说明)', converted_profit NUMERIC(14, 2) COMMENT '折算毛利润额(可负;混合业务为各行汇总)', performance_amount NUMERIC(14, 2) COMMENT '绩效金额(可负,裁决:负绩效照算不归零)', barter_applied TINYINT NOT NULL COMMENT '以物抵顶折算:1已按 80% 折算 0否' DEFAULT '0', weight_r INTEGER COMMENT '支付权重 R(回款占销售额百分比向下取整)', payment_weight NUMERIC(7, 6) COMMENT '支付权重系数 R×R(展示用)', payable_amount NUMERIC(14, 2) COMMENT '当期应付绩效(绩效 × 支付权重;聚合行为当月汇总)', settlement_month VARCHAR(7) NOT NULL COMMENT '归属月(回款日期所在月,YYYY-MM;月结与报表维度)', is_probation TINYINT NOT NULL COMMENT '试用期:1照算不发放 0否' DEFAULT '0', missing_cost TINYINT NOT NULL COMMENT '成本缺失:1有明细行缺成本(该行毛利按 0 计)0否' DEFAULT '0', snapshot_json JSON COMMENT '计算快照(所用参数版本与行级折算明细,重算可回溯)', settlement_id BIGINT UNSIGNED COMMENT '所属月结ID(月结生成时回填;NULL=未入结)', calc_reason VARCHAR(255) COMMENT '核算/重算原因(重算必填留痕)', remark VARCHAR(255) COMMENT '备注', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_performance_ledgers PRIMARY KEY (id), INDEX idx_performance_ledgers_receipt_id (receipt_id), CONSTRAINT uk_performance_ledgers_receipt_id_calc_version_personnel UNIQUE (receipt_id, calc_version, personnel_id, allocation_key), CONSTRAINT fk_performance_ledgers_settlement_id FOREIGN KEY(settlement_id) REFERENCES monthly_settlements (id) ON DELETE RESTRICT, CONSTRAINT fk_performance_ledgers_personnel_id FOREIGN KEY(personnel_id) REFERENCES personnel (id) ON DELETE RESTRICT, CONSTRAINT fk_performance_ledgers_receipt_id FOREIGN KEY(receipt_id) REFERENCES receipts (id) ON DELETE RESTRICT )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='绩效核算台账表(append-only 版本行;重算插新版本旧行仅翻 is_active)' COLLATE utf8mb4_general_ci; CREATE INDEX idx_performance_ledgers_business_id ON performance_ledgers (business_id); CREATE INDEX idx_performance_ledgers_month_active ON performance_ledgers (settlement_month, is_active); CREATE INDEX idx_performance_ledgers_month_personnel_type ON performance_ledgers (settlement_month, personnel_id, calc_type); CREATE INDEX idx_performance_ledgers_personnel_id ON performance_ledgers (personnel_id); -- --------------------------------------------------------------------------- -- T+ 同步批次、错误、原始 staging 与增量水位表(V14) -- --------------------------------------------------------------------------- CREATE TABLE tplus_sync_batches ( trigger_type VARCHAR(16) NOT NULL DEFAULT 'MANUAL' COMMENT '触发来源:MANUAL/SCHEDULED/AUTO_RETRY', automatic_attempt INTEGER NOT NULL DEFAULT 0 COMMENT '自动重试序号(0为原始任务)', id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, batch_no VARCHAR(32) NOT NULL COMMENT '同步批次号', sync_mode VARCHAR(16) NOT NULL COMMENT '任务方式:FULL全量 AUDIT关联核验 INCREMENTAL预留', status VARCHAR(16) NOT NULL COMMENT '状态:QUEUED/RUNNING/SUCCEEDED/PARTIAL/FAILED', source_database VARCHAR(128) COMMENT 'T+ 源数据库名', started_at DATETIME COMMENT '开始执行时间(排队时为空)', finished_at DATETIME COMMENT '结束时间', watermark_from DATETIME COMMENT '增量起始水位', watermark_to DATETIME COMMENT '本批次结束水位', source_record_count INT NOT NULL DEFAULT 0 COMMENT '源记录数', staged_record_count INT NOT NULL DEFAULT 0 COMMENT '写入 staging 的记录数', failed_record_count INT NOT NULL DEFAULT 0 COMMENT '失败记录数', error_message TEXT COMMENT '批次错误摘要', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', -- 以下 6 列对应 V15 的 ADD COLUMN:物理列序须与迁移终态一致(表尾追加)。 entity_types_json JSON COMMENT '请求读取的实体类型;历史批次可为空', skipped_record_count INT NOT NULL DEFAULT 0 COMMENT '重复快照跳过条数', parent_batch_no VARCHAR(32) COMMENT '重试来源批次号,保留原批次记录', request_key VARCHAR(36) COMMENT '请求幂等键,空值用于历史和直接CLI任务', requested_by BIGINT UNSIGNED COMMENT '请求用户ID,CLI任务为空,无物理外键', audit_result_json JSON COMMENT '关联核验结果,只含系统字典和汇总', CONSTRAINT pk_tplus_sync_batches PRIMARY KEY (id), CONSTRAINT uk_tplus_sync_batches_batch_no UNIQUE (batch_no), CONSTRAINT uk_tplus_sync_batches_request_key UNIQUE (request_key) )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='T+ 同步批次表(记录读取范围、结果和对账统计)' COLLATE=utf8mb4_general_ci; CREATE INDEX idx_tplus_sync_batches_status ON tplus_sync_batches (status); CREATE INDEX idx_tplus_sync_batches_started_at ON tplus_sync_batches (started_at); CREATE INDEX idx_tplus_sync_batches_parent_status ON tplus_sync_batches (parent_batch_no, status); CREATE TABLE tplus_sync_errors ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, batch_no VARCHAR(32) NOT NULL COMMENT '同步批次号', entity_type VARCHAR(32) NOT NULL COMMENT '业务实体类型', source_table VARCHAR(128) NOT NULL COMMENT 'T+ 源表', source_id VARCHAR(64) COMMENT 'T+ 源主键', source_line_no VARCHAR(64) COMMENT 'T+ 明细行号或明细主键', error_code VARCHAR(32) NOT NULL COMMENT '错误编码', error_message TEXT NOT NULL COMMENT '错误说明', retry_count INT NOT NULL DEFAULT 0 COMMENT '已重试次数', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', CONSTRAINT pk_tplus_sync_errors PRIMARY KEY (id) )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='T+ 同步错误表(记录失败行和重试信息)' COLLATE=utf8mb4_general_ci; CREATE INDEX idx_tplus_sync_errors_batch_no ON tplus_sync_errors (batch_no); CREATE INDEX idx_tplus_sync_errors_entity_type ON tplus_sync_errors (entity_type); CREATE TABLE tplus_sync_records ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, batch_no VARCHAR(32) NOT NULL COMMENT '同步批次号', entity_type VARCHAR(32) NOT NULL COMMENT '业务实体类型', source_table VARCHAR(128) NOT NULL COMMENT 'T+ 源表', source_id VARCHAR(64) NOT NULL COMMENT 'T+ 源主键', source_no VARCHAR(64) COMMENT 'T+ 原始编号', source_line_no VARCHAR(64) COMMENT 'T+ 明细行号或明细主键', source_updated_at DATETIME COMMENT 'T+ 源数据更新时间', row_hash VARCHAR(64) NOT NULL COMMENT '原始行 SHA-256', state VARCHAR(16) NOT NULL DEFAULT 'PENDING' COMMENT '状态:PENDING/APPLIED/SKIPPED/ERROR', payload_json JSON NOT NULL COMMENT '原始行 JSON', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', CONSTRAINT pk_tplus_sync_records PRIMARY KEY (id), CONSTRAINT uk_tplus_sync_records_entity_source_hash UNIQUE (entity_type, source_id, row_hash) )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='T+ 原始同步 staging 表(映射确认前只保存原始行,不直接改业务表)' COLLATE=utf8mb4_general_ci; CREATE INDEX idx_tplus_sync_records_batch_no ON tplus_sync_records (batch_no); CREATE INDEX idx_tplus_sync_records_source_no ON tplus_sync_records (source_no); CREATE INDEX idx_tplus_sync_records_state ON tplus_sync_records (state); CREATE TABLE tplus_sync_watermarks ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, entity_type VARCHAR(32) NOT NULL COMMENT '业务实体类型', last_source_updated_at DATETIME COMMENT '最近源更新时间', last_source_id VARCHAR(64) COMMENT '同一时间点的最后源主键', status VARCHAR(16) NOT NULL DEFAULT 'READY' COMMENT '状态:READY/BLOCKED', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', CONSTRAINT pk_tplus_sync_watermarks PRIMARY KEY (id), CONSTRAINT uk_tplus_sync_watermarks_entity_type UNIQUE (entity_type) )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='T+ 增量同步水位表' COLLATE=utf8mb4_general_ci; ALTER TABLE approval_orders MODIFY order_type TINYINT NOT NULL COMMENT '审批对象类型:1二次分配方案 2月度结算 3调整单'; -- 公司信息单行(system_settings 恒为一行,id=1 由迁移保底) INSERT INTO system_settings (id, company_name, logo_path) VALUES (1, '衍水集团', NULL); -- --------------------------------------------------------------------------- -- 迁移版本记录:须等于当前 head,使 alembic upgrade head 成为空操作 -- --------------------------------------------------------------------------- -- V16:基础导入与核算预演的隔离工作区;无正式工资写入。 CREATE TABLE tplus_source_heads ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, source_database VARCHAR(128) NOT NULL COMMENT '源账套', entity_type VARCHAR(32) NOT NULL COMMENT '实体类型', source_id VARCHAR(64) NOT NULL COMMENT '源内部ID', record_id BIGINT UNSIGNED NOT NULL COMMENT '原始快照ID', batch_no VARCHAR(32) NOT NULL COMMENT '最后观察批次', CONSTRAINT pk_tplus_source_heads PRIMARY KEY (id), CONSTRAINT uk_tplus_source_heads_source_entity_id UNIQUE (source_database, entity_type, source_id) )ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='T+ 源当前快照指针(按成功全量批次读取,删除不自动回写业务表)' COLLATE utf8mb4_general_ci; CREATE INDEX idx_tplus_source_heads_batch_entity ON tplus_source_heads (batch_no, entity_type); CREATE TABLE tplus_facts ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, source_database VARCHAR(128) NOT NULL COMMENT '源账套', kind VARCHAR(32) NOT NULL COMMENT '事实类别', fact_key VARCHAR(128) NOT NULL COMMENT '事实业务键', version INTEGER NOT NULL COMMENT '版本号', data_json JSON NOT NULL COMMENT '经校验的事实内容', evidence VARCHAR(500) NOT NULL COMMENT '依据和修改原因', requested_by BIGINT UNSIGNED NOT NULL COMMENT '操作者ID', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_tplus_facts PRIMARY KEY (id), CONSTRAINT uk_tplus_facts_source_kind_key_version UNIQUE (source_database, kind, fact_key, version) )ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='T+ 人工补充事实版本表' COLLATE utf8mb4_general_ci; CREATE TABLE tplus_source_links ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, source_database VARCHAR(128) NOT NULL COMMENT '源账套', entity_type VARCHAR(32) NOT NULL COMMENT '实体类型', source_id VARCHAR(64) NOT NULL COMMENT '源内部ID', target_id BIGINT UNSIGNED NOT NULL COMMENT '业务目标ID', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_tplus_source_links PRIMARY KEY (id), CONSTRAINT uk_tplus_source_links_source_entity_id UNIQUE (source_database, entity_type, source_id), CONSTRAINT uk_tplus_source_links_entity_target UNIQUE (entity_type, target_id) )ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='T+ 基础数据源目标关联' COLLATE utf8mb4_general_ci; CREATE TABLE tplus_work_runs ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, run_no VARCHAR(32) NOT NULL COMMENT '运行编号', request_key VARCHAR(36) NOT NULL COMMENT '请求幂等键', kind VARCHAR(32) NOT NULL COMMENT 'MASTER_PREVIEW/MASTER_APPLY/CALC_PREVIEW', status VARCHAR(16) NOT NULL COMMENT '运行状态', source_database VARCHAR(128) NOT NULL COMMENT '固定源账套', requested_by BIGINT UNSIGNED NOT NULL COMMENT '操作者ID', input_json JSON NOT NULL COMMENT '请求输入', snapshot_json JSON COMMENT '规则和补充资料的固定快照', snapshot_hash VARCHAR(64) COMMENT '输入指纹', summary_json JSON COMMENT '结果汇总', error_code VARCHAR(64) COMMENT '固定错误编码', started_at DATETIME COMMENT '开始时间', finished_at DATETIME COMMENT '结束时间', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_tplus_work_runs PRIMARY KEY (id), CONSTRAINT uk_tplus_work_runs_run_no UNIQUE (run_no), CONSTRAINT uk_tplus_work_runs_request_key UNIQUE (request_key) )ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='T+ 导入与预演运行表' COLLATE utf8mb4_general_ci; CREATE INDEX idx_tplus_work_runs_status_id ON tplus_work_runs (status, id); CREATE TABLE tplus_work_lines ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, run_no VARCHAR(32) NOT NULL COMMENT '运行编号', line_no INTEGER NOT NULL COMMENT '稳定行序号', entity_type VARCHAR(32) NOT NULL COMMENT '实体或分组类型', source_id VARCHAR(128) NOT NULL COMMENT '源ID或平账组', action VARCHAR(32) NOT NULL COMMENT '新增/更新/跳过/待补/冲突/分配', reason VARCHAR(128) COMMENT '固定原因编码', data_json JSON NOT NULL COMMENT '最小必要的业务明细', CONSTRAINT pk_tplus_work_lines PRIMARY KEY (id), CONSTRAINT uk_tplus_work_lines_run_line UNIQUE (run_no, line_no) )ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='T+ 导入预览与核算预演明细' COLLATE utf8mb4_general_ci; CREATE TABLE alembic_version ( version_num VARCHAR(32) NOT NULL, CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num) )CHARSET=utf8mb4 ENGINE=InnoDB COLLATE utf8mb4_general_ci; INSERT INTO alembic_version (version_num) VALUES ('21f2a3b4c5d6'); -- 正式工资输入、FIFO过程及生成锁定;新增表,不改写历史结果。 CREATE TABLE payroll_months ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, month VARCHAR(7) NOT NULL COMMENT '工资月份', maker_id BIGINT UNSIGNED NOT NULL COMMENT '实际工资制作人账号ID', maker_name VARCHAR(64) NOT NULL COMMENT '制作人用户名快照', generated_at DATETIME COMMENT '首次成功生成时间(不可解锁)', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_payroll_months PRIMARY KEY (id), CONSTRAINT uk_payroll_months_month UNIQUE (month) )ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='工资月份控制表(首次生成即锁定分配,审批不解锁)' COLLATE utf8mb4_general_ci; CREATE TABLE payroll_inputs ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, business_id BIGINT UNSIGNED NOT NULL COMMENT '正式业务ID', version INTEGER NOT NULL COMMENT '输入版本', source_database VARCHAR(128) NOT NULL COMMENT '源账套或人工来源', group_key VARCHAR(128) NOT NULL COMMENT '独立业务平账组', fingerprint VARCHAR(64) NOT NULL COMMENT '来源及事实指纹', data_json JSON NOT NULL COMMENT '经核实的源数据及人工事实快照', requested_by BIGINT UNSIGNED NOT NULL COMMENT '录入人账号ID', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_payroll_inputs PRIMARY KEY (id), CONSTRAINT uk_payroll_inputs_business_version UNIQUE (business_id, version) )ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='正式工资输入版本表' COLLATE utf8mb4_general_ci; CREATE INDEX idx_payroll_inputs_source_group ON payroll_inputs (source_database, group_key); CREATE TABLE payroll_allocations ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, ledger_id BIGINT UNSIGNED NOT NULL COMMENT '所属正式台账ID', business_id BIGINT UNSIGNED NOT NULL COMMENT '正式业务ID', line_no INTEGER NOT NULL COMMENT '本台账稳定明细序号', input_id BIGINT UNSIGNED NOT NULL COMMENT '所用输入版本ID', amount NUMERIC(14, 2) NOT NULL COMMENT '分配回款金额', data_json JSON NOT NULL COMMENT '单据、成本、归属、参数和逐段计算依据', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_payroll_allocations PRIMARY KEY (id), CONSTRAINT uk_payroll_allocations_ledger_line UNIQUE (ledger_id, line_no) )ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='正式FIFO分配明细表' COLLATE utf8mb4_general_ci; CREATE INDEX idx_payroll_allocations_business_id ON payroll_allocations (business_id); CREATE TABLE tplus_automation_states ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, source_key VARCHAR(64) NOT NULL COMMENT '源连接身份摘要(不含凭据)', source_database VARCHAR(128) NOT NULL COMMENT '源账套', scheduled_period VARCHAR(16) COMMENT '最近已排队ISO周', root_batch_no VARCHAR(32) COMMENT '本周期原始采集批次', current_batch_no VARCHAR(32) COMMENT '当前原始或重试批次', retry_attempts INTEGER NOT NULL COMMENT '本周期自动重试次数' DEFAULT '0', next_retry_at DATETIME COMMENT '下一次自动重试时间', last_success_at DATETIME COMMENT '最近成功采集时间', maintenance_at DATETIME COMMENT '最近周期检查时间', heartbeat_at DATETIME COMMENT '独立进程心跳时间', worker_owner VARCHAR(36) COMMENT '当前持锁进程身份', worker_phase VARCHAR(16) NOT NULL COMMENT '进程状态:IDLE/RUNNING/STOPPED' DEFAULT 'STOPPED', create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT pk_tplus_automation_states PRIMARY KEY (id), CONSTRAINT uk_tplus_automation_states_source_key UNIQUE (source_key) )ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='T+自动采集周期与进程状态(不自动导入正式业务)' COLLATE utf8mb4_general_ci;