-- ============================================================================ -- 开发环境初始化脚本 -- -- 执行时机: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 `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 '最近同步时间', 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 '最近同步时间', 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 '备注', 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 '最近同步时间', 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‰/天(=1/90),禁止按 0.011111 截断存储', 2), (3, 'salesperson.rate.floor', '业务员计提下限', '业务员个人户', 'DECIMAL', '‰', 'BUSINESS_ROLE', NULL, '4', '0', NULL, '回款天数超过分界天数后固定取此比例(≥361 天 = 4‰)', 3), (4, 'salesperson.days.boundary', '线性递减分界天数', '业务员个人户', 'INT', '天', 'BUSINESS_ROLE', NULL, '360', '0', NULL, '≤分界天数按公式线性递减(360 天=6‰);超过则取下限', 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, 'FULL=按 R×R 乘当月全额应发绩效;BALANCE=乘余额(语义待 M3 前确认)', 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, 'INCLUDE含基本工资 / DEDUCT扣除基本工资 / EXCLUDE不计', 14), (15, 'probation.annual.threshold', '试用期年累计结算阈值', '月工资口径', 'DECIMAL', '元', 'NONE', NULL, '18000', '0', NULL, '试用期年累计绩效超过此值部分年底一次性结算', 15), (17, 'approval.secondary_allocation.enabled', '二次分配审批开关', '审批开关', 'BOOL', NULL, 'NONE', NULL, '1', NULL, NULL, '0=二次分配方案提交即生效(系统自动通过全节点留痕,留痕不断链);1=提交后进入财务复核→领导审核审批流。默认开启(澄清 #5 业务答复 2026-10-19),业务可关闭', 17), (18, 'approval.monthly_settlement.enabled', '月度结算审批开关', '审批开关', 'BOOL', NULL, 'NONE', NULL, '1', NULL, NULL, '月度结算审批链开关(④ 月结提交时消费):0=结算生成即生效,1=走财务复核→领导审核审批流。默认开启(澄清 #7 业务答复 2026-10-19,月结涉及工资发放从严),业务可关闭', 18), (19, 'approval.adjustment.enabled', '调整单审批开关', '审批开关', 'BOOL', NULL, 'NONE', NULL, '0', NULL, NULL, '0=调整单提交即生效(系统自动通过留痕);1=走财务复核→领导审核审批流。调整单是已锁定月份补发/扣减的唯一通道(澄清 #9:走同一审批链,默认值业务未明确,暂按直接生效,业务可开启)', 19), (20, 'manager.personal.included', '经理个人户计入聚合基数', '经理分成', 'BOOL', NULL, 'NONE', NULL, '0', NULL, NULL, '经理 12.5%+5% 聚合时是否计入经理本人名下经理个人户业绩(澄清 #12 业务答复 2026-10-19:作为参数配置、手动调整是否纳入):0=不计入(默认,暂口径) 1=计入', 20), -- 预警规则参数(M4 ⑧ 工作台,澄清 #10「做成参数化规则便于调整」) (21, 'warning.enabled', '风险预警总开关', '预警规则', 'BOOL', NULL, 'NONE', NULL, '1', NULL, NULL, '工作台风险预警区块总开关:0=关闭(不扫描不展示) 1=开启(默认)', 21), (22, 'warning.receipt.overdue.days', '回款逾期天数阈值', '预警规则', 'INT', '天', 'NONE', NULL, '90', '1', NULL, '发货后超过该天数仍未回款的发货批次触发预警(澄清 #10 建议默认 90 天)', 22), (23, 'warning.approval.timeout.days', '审批超时天数阈值', '预警规则', 'INT', '天', 'NONE', NULL, '3', '1', NULL, '待审批单提交后超过该天数未处理触发预警(澄清 #10 建议默认 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 '最近同步时间', 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 '最近同步时间', 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 '最近同步时间', 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 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 ( 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)', 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), CONSTRAINT uk_performance_ledgers_receipt_id_calc_version_personnel UNIQUE (receipt_id, calc_version, personnel_id), 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); 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 成为空操作 -- --------------------------------------------------------------------------- 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 ('f3a8c2d61b47');