-- =============================================================================
-- 灵活用工与用工税筹模块 - MySQL 5.7 数据库脚本
-- =============================================================================
-- 自 PostgreSQL 版 灵活用工.sql 转换
-- 引擎：InnoDB | 字符集：utf8mb4
-- 转换说明：
--   1. BIGSERIAL -> BIGINT AUTO_INCREMENT；TIMESTAMPTZ -> DATETIME；JSONB -> JSON
--   2. BOOLEAN -> TINYINT(1)；NUMERIC -> DECIMAL；COMMENT ON -> 列/表内联 COMMENT
--   3. PostgreSQL 部分唯一索引 (WHERE del_flag=0) -> 联合唯一索引 (业务列, del_flag)
--   4. JSON/TEXT/BLOB 列不设置 DEFAULT（MySQL 5.7 限制），默认值由应用层写入
--   5. 无数据库外键；请先按依赖顺序执行，或整文件执行（已 DROP IF EXISTS）
-- 主流程（六步）：
--   草稿 → 企业认证 → 人员登记/临时工招聘 → 任务发布 → 结算打款 → 开票归档
--   worker_source=existing→人员登记；recruit→临时工招聘
-- 设计要点：
--   用工明细在 fe_draft_work_item / fe_order_work_item；头表不存用工冗余
--   一账号多企业：fe_enterprise_user；认证通过后将该企业 is_default=1
-- =============================================================================

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS `fe_user`;
CREATE TABLE `fe_user` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，BIGSERIAL 自增。首次微信登录时由数据库自动生成，后续所有关联表通过本字段引用用户。示例：10001。非空，非敏感，只读展示。',
  `openid` VARCHAR(64)     NULL COMMENT '微信小程序用户唯一标识，微信登录时写入；纯短信登录可为空。示例：oX9k2_abc123def456。建立唯一索引 uk_fe_user_openid（del_flag=0 时，NULL 不参与冲突）；不可对外暴露。',
  `unionid` VARCHAR(64) COMMENT '微信开放平台 unionid，用于同一主体下多应用用户关联。用户绑定开放平台账号且小程序已接入时写入，否则保持为空。示例：oUZ6w_union789。可空；跨应用场景使用。',
  `user_type` VARCHAR(20)     NOT NULL DEFAULT 'enterprise' COMMENT '用户身份类型，区分企业主与临时工两类业务角色。注册或首次登录时根据入口（企业端/临时工端）由应用层写入。枚举：enterprise=企业主（发单、确认方案、结算）；worker=临时工（扫码登记、签署协议）。非空，默认 enterprise；影响菜单权限与 API 鉴权。',
  `nickname` VARCHAR(64) COMMENT '用户在微信侧展示的昵称。登录成功后从微信用户信息接口同步，用户可在小程序内修改后更新。示例：张经理、小李。可空；用于消息列表与操作日志展示。',
  `avatar_url` VARCHAR(512) COMMENT '用户头像图片 URL。登录时从微信同步或用户上传后由应用层更新。示例：https://thirdwx.qlogo.cn/mmopen/...。可空；CDN 地址，需校验域名白名单。',
  `mobile_enc` TEXT COMMENT '手机号 AES 等算法加密后的密文，用于实名核验与联系。用户授权获取手机号或企业主填写时，由应用层加密后写入。高度敏感；数据库禁止存明文；解密仅限后端授权接口。可空。',
  `mobile_mask` VARCHAR(20) COMMENT '手机号脱敏展示值，供列表、通知、日志使用。与 mobile_enc 同时写入，由应用层按规则生成。示例：138****1234。可空；禁止从脱敏值反推明文。',
  `username` VARCHAR(64) COMMENT '登录用户名，用户登录后可选设置。6-20 位字母数字下划线，字母开头，全局唯一。可空。',
  `password_hash` VARCHAR(128) COMMENT 'BCrypt 密码哈希，前端 RSA 加密传输后服务端解密再哈希入库。NULL 表示未设置账密登录。',
  `pwd_failed_count` INT NOT NULL DEFAULT 0 COMMENT '账密登录连续失败次数，成功登录或设密后清零。',
  `pwd_locked_until` datetime COMMENT '账密登录锁定截止时间，超过该时间后允许重试。',
  `password_set_at` datetime COMMENT '最近一次成功设置/修改密码的时间。',
  `session_key` VARCHAR(128) COMMENT '微信会话密钥，用于解密用户敏感数据及维持登录态。每次 code2session 成功后由认证服务覆盖写入，需定期刷新。高度敏感；仅后端持有，禁止返回前端或写入日志。可空。',
  `status` VARCHAR(20)     NOT NULL DEFAULT 'active' COMMENT '账号启用状态，控制是否允许登录与业务操作。管理员禁用违规账号时写入 disabled，解禁时改回 active。枚举：active=正常可用；disabled=禁用（拒绝登录）。非空，默认 active。',
  `last_login_at` datetime COMMENT '用户最近一次成功登录的时间戳（含时区）。每次登录鉴权通过时由认证中间件更新。示例：2026-07-07T09:30:00+08:00。可空；用于活跃度统计与异常登录检测。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间，用户首次入库时刻。INSERT 时由数据库 DEFAULT NOW() 或应用层写入。非空；审计字段，一般不修改。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录最后更新时间。任意字段变更时由应用层维护刷新。非空；与 create_time 配合追踪变更。',
  `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记，软删后释放 openid 唯一索引占用。用户注销或管理员删除时置 1，恢复时置 0。枚举：0=正常；1=已逻辑删除。非空，默认 0；查询默认过滤 del_flag=0。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_user_openid` (`openid`, `del_flag`),
  UNIQUE KEY `uk_fe_user_username` (`username`, `del_flag`),
  UNIQUE KEY `uk_fe_user_mobile_enc` (`mobile_enc`(128), `del_flag`),
  KEY `idx_fe_user_type` (`user_type`, `status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信用户主表，企业主与临时工共用账号体系，通过 user_type 区分身份。支撑微信小程序 code2session 登录与 Session 鉴权，是 fe_enterprise_user、fe_conversation、fe_worker 等表的用户外键来源。敏感手机号仅存密文与脱敏值，禁止明文入库。';

DROP TABLE IF EXISTS `fe_enterprise`;
CREATE TABLE `fe_enterprise` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，BIGSERIAL 自增。企业入驻或管理员创建企业时生成。示例：2001。非空；被草稿、订单、会话等多表外键引用。',
  `enterprise_code` VARCHAR(32)     NULL COMMENT '企业业务编码，档案创建后写入，平台内唯一。创建中可为空；唯一索引 uk_fe_enterprise_code（del_flag=0）。',
  `name` VARCHAR(200)    NOT NULL COMMENT '企业全称，工商注册名称。企业入驻表单或 OCR 识别营业执照时写入。示例：上海某某物流有限公司。非空；用于合同抬头与结算展示。',
  `credit_code` VARCHAR(32) COMMENT '统一社会信用代码，企业实名认证核心字段。企业提交认证材料时写入，审核通过后不变更。示例：91310000MA1K3XXXXX。可空；认证前可为空；非敏感但需校验格式。',
  `legal_person` VARCHAR(64) COMMENT '法定代表人姓名。认证材料解析或人工填写时写入。示例：王某某。可空；用于合同与开票信息核对。',
  `legal_person_id_card_enc` TEXT COMMENT '法人身份证号加密密文。企业认证时由应用层加密写入。高度敏感；禁止明文入库。可空。',
  `legal_person_id_card_mask` VARCHAR(32) COMMENT '法人身份证号脱敏值。与 legal_person_id_card_enc 同步生成，供列表展示。示例：110***********1234。可空。',
  `registered_address` VARCHAR(500) COMMENT '企业注册地址。认证或企业资料维护时写入；AI 生成草稿时优先作为 work_location 默认值来源。示例：上海市浦东新区张江路 88 号。可空；影响草稿地点推断。',
  `contact_name` VARCHAR(64) COMMENT '企业日常联系人姓名。企业主维护企业资料时写入。示例：李主管。可空；用于平台客服联系。',
  `contact_mobile_enc` TEXT COMMENT '联系人手机号加密密文。企业登记时由应用层加密写入。高度敏感；禁止明文入库。',
  `contact_mobile_mask` VARCHAR(20) COMMENT '联系人手机号脱敏值。与 contact_mobile_enc 同步生成，供列表展示。示例：139****5678。可空；非敏感。',
  `industry` VARCHAR(100) COMMENT '所属行业分类。企业资料维护或 AI 画像推断时写入。示例：仓储物流、制造业。可空；用于方案推荐与风险诊断。',
  `scale` VARCHAR(50) COMMENT '企业规模描述。企业资料维护时写入。示例：50-200人、小微企业。可空；辅助成本测算与合规判断。',
  `auth_status` VARCHAR(20)     NOT NULL DEFAULT 'pending' COMMENT '企业实名认证状态。提交认证置 pending，审核通过置 verified，驳回置 rejected。枚举：pending=待审核；verified=已认证；rejected=已驳回。非空，默认 pending；未认证企业功能受限。',
  `auth_time` datetime COMMENT '认证审核通过时间戳。运营或系统自动审核通过时写入。可空；仅 auth_status=verified 时有值。',
  `profile_json` json COMMENT '企业扩展画像 JSON，承载行业标签、历史偏好摘要、风险标签等。AI 画像服务或运营标注时增量更新。示例：{"tags":["仓储","旺季用工"]}。可空，默认 {}；非敏感；结构由应用层约定。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '企业记录创建时间。INSERT 时默认 NOW()。非空；审计字段。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '企业资料最后更新时间。任意字段变更时由应用层刷新。非空。',
  `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。企业注销或管理员删除时置 1。枚举：0=正常；1=已删除。非空，默认 0；软删后释放 enterprise_code 唯一索引。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_enterprise_code` (`enterprise_code`, `del_flag`),
  UNIQUE KEY `uk_fe_enterprise_credit_code` (`credit_code`, `del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='企业主体表，灵活用工业务归属主体，承载企业认证信息与扩展画像。与 fe_enterprise_user（多管理员）、fe_employment_draft、fe_employment_order 等为一对多关系。注册地址 registered_address 供 AI 草稿默认推断工作地点。';

DROP TABLE IF EXISTS `fe_enterprise_user`;
CREATE TABLE `fe_enterprise_user` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。绑定关系创建时生成。非空。',
  `enterprise_id` BIGINT          NOT NULL COMMENT '关联企业主键，外键。管理员邀请绑定或企业创建时写入。非空；级联查询企业下所有管理员。',
  `user_id` BIGINT          NOT NULL COMMENT '关联微信用户主键，外键。被邀请用户接受绑定或企业创建者自动绑定时写入。非空；建立索引 idx_fe_enterprise_user_uid。',
  `role` VARCHAR(20)     NOT NULL DEFAULT 'owner' COMMENT '用户在该企业下的权限角色。绑定或角色调整时由企业主/管理员写入。枚举：owner=主账号（最高权限）；admin=管理员；viewer=只读。非空，默认 owner。',
  `is_default` tinyint(1)         NOT NULL DEFAULT 0 COMMENT '是否默认企业上下文。同一 user_id 且 del_flag=0 仅一条为 1；企业认证通过时将该企业置 1 并清除同用户其它默认（最近认证为默认）；亦可手动切换。',
  `bind_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '绑定关系建立时间。绑定成功时写入，默认 NOW()。非空；用于审计。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间。INSERT 时写入。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录更新时间。角色或默认企业变更时刷新。非空。',
  `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。解除绑定关系时置 1，非物理删除。枚举：0=正常；1=已解除。非空，默认 0；唯一索引 uk_fe_enterprise_user(enterprise_id,user_id) 在 del_flag=0 时生效。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_enterprise_user` (`enterprise_id`, `user_id`, `del_flag`),
  KEY `idx_fe_enterprise_user_uid` (`user_id`),
  KEY `idx_fe_enterprise_user_default` (`user_id`, `is_default`, `del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='企业与用户多对多绑定：一账号可认证多家企业、一企业可多管理员。is_default 为登录/业务默认企业；不在 fe_user 上冗余存默认企业 ID。';

DROP TABLE IF EXISTS `fe_enterprise_finance`;
CREATE TABLE `fe_enterprise_finance` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。企业首次维护财务信息时生成。非空。',
  `enterprise_id` BIGINT          NOT NULL COMMENT '关联企业主键，外键。财务信息首次录入时写入。非空；一对一，唯一索引 uk_fe_enterprise_finance。',
  `bank_name` VARCHAR(100) COMMENT '对公账户开户银行名称。企业主在财务设置页填写时写入。示例：中国工商银行上海张江支行。可空。',
  `bank_account_enc` TEXT COMMENT '对公银行账号加密密文。企业提交账户信息时由应用层加密写入。高度敏感；禁止明文入库与前端回显；可空。',
  `bank_account_mask` VARCHAR(32) COMMENT '对公账号脱敏展示值。与 bank_account_enc 同时生成。示例：6222****1234。可空；供运营后台列表展示。',
  `invoice_title` VARCHAR(200) COMMENT '增值税发票开票抬头，通常与企业全称一致。财务设置时写入。示例：上海某某物流有限公司。可空；结算开票使用。',
  `tax_no` VARCHAR(32) COMMENT '纳税人识别号，用于开票与税务合规。财务设置或认证同步时写入。示例：91310000MA1K3XXXXX。可空；需与统一社会信用代码核对。',
  `payment_channel` VARCHAR(50) COMMENT '企业偏好打款渠道类型，小程序仅展示此枚举不展示账户号。财务设置时写入。枚举：wechat=微信支付；alipay=支付宝；bank=银行转账。可空。',
  `balance_amount` decimal(14,2)   DEFAULT 0 COMMENT '企业在平台虚拟账户余额（元），NUMERIC(14,2)。充值、结算扣款时由账务服务更新。示例：50000.00。可空，默认 0；非敏感。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '财务信息变更时更新。非空。',
  `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举：0=正常；1=已删除。非空，默认 0。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_enterprise_finance` (`enterprise_id`, `del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='企业财务与开票信息表，与企业主体一对一（enterprise_id 唯一）。存储对公账户密文、开票抬头、打款渠道等；小程序端仅展示渠道类型，不展示账户明细等敏感金融信息。';

DROP TABLE IF EXISTS `fe_enterprise_preference`;
CREATE TABLE `fe_enterprise_preference` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。偏好项创建时生成。非空。',
  `enterprise_id` BIGINT          NOT NULL COMMENT '关联企业主键，外键。偏好配置时写入。非空；索引 idx_fe_enterprise_pref(enterprise_id,pref_type)。',
  `pref_type` VARCHAR(50)     NOT NULL COMMENT '偏好大类。用户或 AI 配置时写入。枚举：work_type=工种薪资基准；insurance=默认保险配置；payment_cycle=发薪/结算周期偏好。非空。',
  `pref_key` VARCHAR(100) COMMENT '偏好子键，细分到具体工种或场景。示例：搬运工、仓库分拣。可空；同一 pref_type 下可有多条记录。',
  `pref_value` json           NOT NULL COMMENT '结构化偏好值 JSON，承载薪资区间、保险方案参数等。AI 解析或用户表单提交时写入。示例：{"daily_wage":280,"currency":"CNY"}。非空，默认 {}。',
  `source` VARCHAR(50)     DEFAULT 'user_config' COMMENT '偏好数据来源，用于前端展示可信度标签。写入时由应用层标记。枚举：user_config=用户主动配置；ai_inferred=AI 从历史订单推断；default=系统默认。可空，默认 user_config。',
  `raw_text` TEXT COMMENT '用户自然语言配置原文，便于审计与重新解析。用户在对话或设置页输入时保存。示例：「搬运工日薪 280，要标准意外险」。可空。',
  `confirmed` tinyint(1)         NOT NULL DEFAULT 0 COMMENT '用户是否已明确确认该偏好项。用户点击确认后置 TRUE，未确认前草稿生成可提示复核。非空，默认 FALSE。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '偏好值变更时更新。非空。',
  `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举：0=正常；1=已删除。非空，默认 0。',
  PRIMARY KEY (`id`),
  KEY `idx_fe_enterprise_pref` (`enterprise_id`, `pref_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='企业智能偏好配置表，存储工种薪资基准、默认保险档次、发薪结算周期等结构化偏好。支持用户自然语言配置后由 AI 解析入库，供草稿生成引擎复用，关联 fe_enterprise。';

DROP TABLE IF EXISTS `fe_conversation`;
CREATE TABLE `fe_conversation` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。用户发起新对话时生成。非空；被消息表、草稿表外键引用。',
  `conversation_no` VARCHAR(32)     NOT NULL COMMENT '会话对外业务编号，API 路径与日志中使用。创建会话时由编号生成器写入。示例：conv_001。非空；唯一索引 uk_fe_conversation_no。',
  `user_id` BIGINT          NOT NULL COMMENT '发起对话的企业主用户。创建会话时写入。非空；会话仅归属用户，不与企业绑定。',
  `title` VARCHAR(200) COMMENT '会话标题，侧边栏展示用。可由首条用户消息摘要或 AI 自动生成，用户可重命名。示例：浦东仓库暑期用工。可空。',
  `chat_type` VARCHAR(30)     NOT NULL DEFAULT 'employment' COMMENT '对话专题类型，决定加载的子智能体与卡片模板。创建时根据入口或首条意图写入。枚举：employment=用工办理；knowledge=政策知识库；order=订单查询；cost=成本测算；attendance=考勤；emergency=应急咨询。非空，默认 employment。',
  `status` VARCHAR(20)     NOT NULL DEFAULT 'active' COMMENT '会话生命周期状态。用户归档或长期无消息时更新。枚举：active=进行中；archived=已归档（只读）。非空，默认 active。',
  `last_message_at` datetime COMMENT '最后一条消息时间，用于侧边栏按时间排序。每次 INSERT fe_conversation_message 后由应用层刷新。可空；索引排序字段。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '会话创建时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '会话元数据变更时更新。非空。',
  `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举：0=正常；1=已删除。非空，默认 0。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_conversation_no` (`conversation_no`),
  KEY `idx_fe_conversation_user` (`user_id`, `last_message_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI 对话会话主表。会话仅归属用户（user_id），与企业无绑定；企业在草稿/订单企业认证节点绑定。一对多关联 fe_conversation_message。';

DROP TABLE IF EXISTS `fe_conversation_message`;
CREATE TABLE `fe_conversation_message` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。每条消息入库时生成。非空。',
  `conversation_id` BIGINT          NOT NULL COMMENT '所属会话，外键。发送消息时写入。非空；索引 idx_fe_conv_msg(conversation_id,create_time)。',
  `role` VARCHAR(20)     NOT NULL COMMENT '消息发送方角色。写入时由网关标记。枚举：user=企业主用户；assistant=AI 助手；system=系统提示（如流程引导）。非空。',
  `content` TEXT            NOT NULL COMMENT '消息正文文本或卡片摘要说明，供聊天气泡展示。用户输入或 AI 生成时写入。非空；长文本需注意截断策略。',
  `content_type` VARCHAR(30)     NOT NULL COMMENT '消息内容形态，决定前端渲染组件。写入时标记。枚举：text=纯文本；card_draft=用工草稿卡；card_cost=成本对比卡；card_order=订单进度卡。非空，默认 text。',
  `card_payload` json COMMENT '卡片结构化数据 JSON，如草稿字段列表、成本行、订单摘要。AI 子模块返回卡片时写入。示例：{"draft_id":101,"fields":[...]}。可空；仅 content_type 为卡片类型时有值。',
  `agent_module` VARCHAR(50) COMMENT '处理该消息的子智能体模块名，用于排障与统计。路由层写入。示例：flexible_employment、cost_engine。可空。',
  `next_action` VARCHAR(50) COMMENT '建议前端执行的下一步动作编码，用于自动跳转或弹窗。助手回复卡片时写入。示例：show_employment_draft、open_cost_comparison。可空。',
  `related_draft_id` BIGINT COMMENT '关联的用工草稿 ID，软引用 fe_employment_draft(id)。生成或引用草稿卡时写入。可空；无外键约束，由应用层保证一致性。',
  `token_usage` json COMMENT '大模型 token 消耗统计 JSON，含 prompt/completion 分项。AI 调用完成后写入，供成本核算。示例：{"prompt":1200,"completion":800}。可空；不展示给用户。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '消息发送/入库时间，聊天气泡排序依据。非空，默认 NOW()。',
  PRIMARY KEY (`id`),
  KEY `idx_fe_conv_msg` (`conversation_id`, `create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='对话消息明细表，存储用户与助手往返的文本及结构化卡片（草稿卡、成本卡、订单卡）。通过 next_action 驱动小程序路由跳转；关联 fe_conversation，可软链 fe_employment_draft。';

DROP TABLE IF EXISTS `fe_agent_action_log`;
CREATE TABLE `fe_agent_action_log` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。每次子模块调用时生成。非空。',
  `conversation_id` BIGINT COMMENT '关联会话，外键。对话内调用时写入；后台定时任务触发时可为空。可空。',
  `enterprise_id` BIGINT          NOT NULL COMMENT '所属企业，外键。调用上下文中的企业 ID，必填以便按企业排障。非空；索引 idx_fe_agent_log。',
  `module_name` VARCHAR(50)     NOT NULL COMMENT '被调用的模块名称。调用发起时写入。枚举示例：main_agent=主路由；flexible_employment=用工子模块；cost_engine=成本测算引擎。非空。',
  `action` VARCHAR(100)    NOT NULL COMMENT '模块内具体动作编码。示例：generate_draft、calc_cost、parse_nl_preference。非空；与 module_name 组合定位代码路径。',
  `request_json` json COMMENT '请求体 JSON 快照，含用户输入与上下文参数。调用前由中间件序列化写入。可空；可能含业务敏感字段，访问需授权。',
  `response_json` json COMMENT '响应体 JSON 快照，含 AI 结构化输出。调用成功后写入。可空；失败时可能为空或部分写入。',
  `status` VARCHAR(20)     NOT NULL DEFAULT 'success' COMMENT '调用结果状态。调用结束时写入。枚举：success=成功；failed=失败。非空，默认 success。',
  `error_message` TEXT COMMENT '失败时的错误堆栈或业务错误码说明。仅 status=failed 时写入。可空；供研发排障。',
  `duration_ms` int COMMENT '调用耗时（毫秒）。调用结束时计算写入。示例：2350。可空；用于性能监控。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '调用发生时间。非空；按时间倒序查最近异常。',
  PRIMARY KEY (`id`),
  KEY `idx_fe_agent_log` (`enterprise_id`, `create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='智能体与子模块调用审计日志表，记录主智能体、灵活用工模块、成本引擎等的入参出参与耗时。用于技术排障与合规审计，不对小程序用户直接展示；可关联 fe_conversation。';

DROP TABLE IF EXISTS `fe_service_plan`;
CREATE TABLE `fe_service_plan` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。运营配置或初始化脚本插入时生成。非空。',
  `plan_code` VARCHAR(32)     NOT NULL COMMENT '方案业务编码，全局唯一（软删条件下）。初始化或运营录入时写入。枚举：current=企业现有处理方式；plan_1/plan_2/plan_3=对比方案。示例：plan_1。非空；唯一索引 uk_fe_service_plan_code。',
  `plan_name` VARCHAR(100)    NOT NULL COMMENT '前端展示名称。运营配置时写入。示例：合规优先 (A)、传统用工 (B)。非空。',
  `plan_type` VARCHAR(30)     NOT NULL DEFAULT 'flexible' COMMENT '方案用工模式大类。配置时写入。枚举：flexible=灵活用工；traditional=传统用工；hybrid=混合模式。非空，默认 flexible。',
  `description` TEXT COMMENT '方案详细说明文案，成本对比页展开区展示。运营维护时写入。可空。',
  `service_fee_rate` decimal(8,4) COMMENT '平台服务费率，NUMERIC(8,4)。示例：0.08 表示 8%。运营配置或费率调整时写入。可空；current 方案可为 NULL 表示按企业现状估算。',
  `insurance_level` VARCHAR(30) COMMENT '方案默认保险档次。枚举：basic=基础；standard=标准；premium=高级。可空；影响保险费用项测算。',
  `tax_mode` VARCHAR(50) COMMENT '税费代征模式编码，与地方税筹政策对应。运营配置时写入。示例：withhold_standard。可空。',
  `applicable_scenarios` json COMMENT '适用场景 JSON 数组，供 AI 推荐方案时匹配。示例：["旺季临时工","仓储搬运"]。可空，默认 []。',
  `compliance_tags` json COMMENT '合规能力标签 JSON 数组，前端展示勾选图标。示例：["业务真实","资金合规","个税申报"]。可空，默认 []。',
  `sort_order` int         NOT NULL DEFAULT 0 COMMENT '前端展示排序权重，越小越靠前。运营配置时写入。非空，默认 0。',
  `status` VARCHAR(20)     NOT NULL DEFAULT 'active' COMMENT '方案生效状态。枚举：active=正式可用；test_only=测试演示默认；disabled=停用。非空，默认 active；生产环境应仅 active 参与正式测算。',
  `effective_from` DATE COMMENT '方案生效开始日期。费率版本管理时写入。可空。',
  `effective_to` DATE COMMENT '方案生效结束日期，到期后自动不参与测算。可空。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '方案配置变更时更新。非空。',
  `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举：0=正常；1=已删除。非空，默认 0。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_service_plan_code` (`plan_code`, `del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用工方案目录表，成本对比页「当前方式 + 方案一二三」的配置数据源。正式环境费率以此表为准；test_only 状态方案仅供 Demo。一对多关联 fe_service_plan_fee_rule，被草稿与订单 selected_plan_id 引用。';

DROP TABLE IF EXISTS `fe_service_plan_fee_rule`;
CREATE TABLE `fe_service_plan_fee_rule` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。运营为方案配置费用项时生成。非空。',
  `plan_id` BIGINT          NOT NULL COMMENT '关联方案，外键。配置费用规则时写入。非空；索引 idx_fe_plan_fee。',
  `fee_code` VARCHAR(50)     NOT NULL COMMENT '费用项编码。枚举：labor_fee=劳务费；service_fee=平台服务费；insurance=保险费；tax_withhold=税费代征。非空。',
  `fee_name` VARCHAR(100)    NOT NULL COMMENT '费用项中文展示名。示例：劳务费、服务费。非空。',
  `calc_type` VARCHAR(30)     NOT NULL COMMENT '计算方式类型。枚举：fixed=固定金额；rate=按基数比例；formula=自定义公式（由 calc_expression 描述）。非空。',
  `calc_expression` TEXT COMMENT '计算公式或规则描述文本，供引擎解析或人工审计。运营配置时写入。示例：gross * service_fee_rate。可空；calc_type=formula 时建议必填。',
  `default_rate` decimal(8,4) COMMENT '默认费率或系数，NUMERIC(8,4)。rate 类型费用项使用。示例：0.08。可空。',
  `sort_order` int         NOT NULL DEFAULT 0 COMMENT '成本明细展示顺序。非空，默认 0。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '规则变更时更新。非空。',
  PRIMARY KEY (`id`),
  KEY `idx_fe_plan_fee` (`plan_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='方案费用项计算规则表，定义劳务费、服务费、保险、税费代征等分项的计算方式（固定额/比例/公式）。成本测算引擎读取本表与 fe_service_plan 联合计算；一对多归属 plan_id。';

DROP TABLE IF EXISTS `fe_workflow_definition`;
CREATE TABLE `fe_workflow_definition` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。初始化脚本或运营发布新版本时生成。非空。',
  `workflow_code` VARCHAR(50)     NOT NULL COMMENT '流程业务编码，同一编码可有多个 version。示例：employment_compliance。非空；与 version 组成唯一索引 uk_fe_workflow_def。',
  `workflow_name` VARCHAR(100)    NOT NULL COMMENT '流程中文名称。示例：用工合规办理流程。非空。',
  `description` TEXT COMMENT '流程整体说明，描述五流合一覆盖范围。可空。',
  `version` int         NOT NULL DEFAULT 1 COMMENT '流程版本号，递增整数。发布新流程时在上版基础上 +1。非空，默认 1；历史订单可能引用旧版步骤定义。',
  `is_active` tinyint(1)         NOT NULL DEFAULT 1 COMMENT '是否当前系统启用的流程版本。发布新版时旧版置 FALSE，新版置 TRUE。非空，默认 TRUE；同时仅应有一个 is_active=TRUE 的同 workflow_code。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '流程元数据变更时更新。非空。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_workflow_def` (`workflow_code`, `version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='灵活用工流程定义表，版本化元数据。支持多版本并存，is_active 标识当前启用版本；一对多关联 fe_workflow_step。';

DROP TABLE IF EXISTS `fe_workflow_step`;
CREATE TABLE `fe_workflow_step` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。流程版本初始化时批量插入。非空。',
  `workflow_id` BIGINT          NOT NULL COMMENT '关联流程定义。步骤归属的流程版本。非空。',
  `step_code` VARCHAR(50)     NOT NULL COMMENT '步骤编码，订单 current_step_code 引用。六步：draft=草稿；enterprise_auth=企业认证；worker_registration=人员登记；worker_recruitment=临时工招聘；task_publish=任务发布；settlement=结算打款；invoice_archive=开票归档。登记与招聘互斥（required=0），由 worker_source 决定。',
  `step_name` VARCHAR(100)    NOT NULL COMMENT '步骤中文展示名。示例：企业认证、人员登记。非空。',
  `step_order` int         NOT NULL COMMENT '步骤顺序号。登记与招聘可同为 3。非空。',
  `required` tinyint(1)         NOT NULL DEFAULT 1 COMMENT '是否必经。登记/招聘为 0（互斥二选一）；其余主路径为 1。',
  `auto_advance` tinyint(1)         NOT NULL DEFAULT 0 COMMENT '满足条件后是否自动推进。非空，默认 FALSE。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '步骤定义创建时间。非空。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_workflow_step` (`workflow_id`, `step_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流程步骤定义；订单 current_step_code 对应本表 step_code。归属 fe_workflow_definition。';

DROP TABLE IF EXISTS `fe_policy_rule`;
CREATE TABLE `fe_policy_rule` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。运营或法务录入规则时生成。非空。',
  `rule_code` VARCHAR(50)     NOT NULL COMMENT '规则唯一业务编码。示例：TAX_WITHHOLD_001。非空；唯一索引 uk_fe_policy_rule。',
  `rule_category` VARCHAR(50)     NOT NULL COMMENT '规则分类。枚举：tax=税务；labor=劳动用工；insurance=保险；invoice=发票开票。非空；用于检索过滤。',
  `title` VARCHAR(200)    NOT NULL COMMENT '规则标题，知识库与对话引用时展示。非空。',
  `content` TEXT            NOT NULL COMMENT '规则正文全文，可含法规条文摘要。非空；可能较长，注意全文检索索引。',
  `effective_from` DATE COMMENT '规则生效开始日期。可空；为空表示无开始限制。',
  `effective_to` DATE COMMENT '规则生效结束日期，过期规则不参与实时诊断。可空。',
  `priority` int         NOT NULL DEFAULT 0 COMMENT '匹配优先级，数值越大越优先。冲突时取高优先级规则。非空，默认 0。',
  `status` VARCHAR(20)     NOT NULL DEFAULT 'active' COMMENT '规则启用状态。枚举：active=启用；disabled=停用。非空，默认 active。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '规则内容变更时更新。非空。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_policy_rule` (`rule_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='政策法规规则库表，供规则引擎与 RAG 知识库引用，支撑用工风险诊断、合规提示与智能问答。按 rule_category 分类，支持生效期与优先级排序。';

DROP TABLE IF EXISTS `fe_draft_work_item`;
DROP TABLE IF EXISTS `fe_employment_draft`;
CREATE TABLE `fe_employment_draft` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。AI 子模块生成草稿时创建。非空；被 fe_draft_work_item、fe_draft_field、fe_draft_cost_snapshot 引用。',
  `draft_no` VARCHAR(32)     NOT NULL COMMENT '草稿业务编号，对外 API 使用。示例：draft_001。非空；唯一索引 uk_fe_draft_no。',
  `enterprise_id` BIGINT COMMENT '所属企业，可空；企业认证节点完成后回填。索引 idx_fe_draft_ent。',
  `user_id` BIGINT          NOT NULL COMMENT '发起草稿的企业主用户。非空；索引 idx_fe_draft_user。',
  `conversation_id` BIGINT COMMENT '来源 AI 对话。对话触发生成时写入；可空。',
  `title` VARCHAR(200) COMMENT '草稿标题。示例：浦东仓库暑期搬运。可空。',
  `status` VARCHAR(20)     NOT NULL DEFAULT 'pending' COMMENT '草稿生命周期。枚举：pending/confirmed/cancelled/expired。非空，默认 pending。',
  `worker_source` VARCHAR(20) COMMENT '临时工来源二选一：existing=有临时工→人员登记；recruit=无临时工→临时工招聘。可空（待补）。',
  `missing_fields` json COMMENT '待补充字段名 JSON 数组。示例：["worker_source"]。可空。',
  `risk_prompts` json COMMENT '风险提示 JSON 数组。可空。',
  `selected_plan_id` BIGINT COMMENT '用户选中的用工方案。可空。',
  `confirmed_at` datetime COMMENT '确认草稿时间。可空。',
  `confirmed_by` BIGINT COMMENT '确认操作用户。可空。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '草稿创建时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '草稿变更时更新。非空。',
  `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除。0=正常；1=已删除。非空，默认 0。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_draft_no` (`draft_no`),
  KEY `idx_fe_draft_ent` (`enterprise_id`, `status`, `create_time`),
  KEY `idx_fe_draft_user` (`user_id`, `status`, `create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用工草稿头表（精简）：用工事实在 fe_draft_work_item；人数/工种/地点/金额等不落头表。确认后生成订单与订单明细。';

CREATE TABLE `fe_draft_work_item` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `draft_id` BIGINT NOT NULL COMMENT '归属草稿 fe_employment_draft.id',
  `group_no` VARCHAR(32) NOT NULL COMMENT '组编号，草稿内唯一。示例：grp_01；对应 API worker_groups[].group_id',
  `sort_order` INT NOT NULL DEFAULT 0 COMMENT '展示顺序',
  `job_type` VARCHAR(100) NULL COMMENT '工种。示例：厨师、搬运工',
  `worker_count` INT NULL COMMENT '本行人数',
  `work_days` DECIMAL(8,2) NULL COMMENT '本行工作天数，支持小数',
  `work_location` VARCHAR(500) NULL COMMENT '本行工作地点',
  `settlement_cycle` VARCHAR(20) NULL COMMENT '结算周期：daily/weekly/monthly',
  `unit_amount` DECIMAL(12,2) NULL COMMENT '单价（可选）',
  `total_amount` DECIMAL(14,2) NULL COMMENT '本行劳务费合计',
  `work_content` TEXT NULL COMMENT '本行工作内容（可选）',
  `work_start_date` DATE NULL COMMENT '本行计划开工（可选）',
  `work_end_date` DATE NULL COMMENT '本行计划结束（可选）',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `del_flag` tinyint NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_draft_work_item` (`draft_id`, `group_no`, `del_flag`),
  KEY `idx_fe_draft_work_item_sort` (`draft_id`, `sort_order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='草稿用工明细；列表汇总用 SUM/应用层组装，不回写头表。';

DROP TABLE IF EXISTS `fe_draft_field`;
CREATE TABLE `fe_draft_field` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。草稿生成或字段补全时插入。非空。',
  `draft_id` BIGINT          NOT NULL COMMENT '关联草稿，外键。非空；与 field_key 组成唯一索引 uk_fe_draft_field。',
  `field_key` VARCHAR(100)    NOT NULL COMMENT '字段键名，与草稿主表列名或扩展字段对应。示例：work_location、daily_wage。非空。',
  `field_label` VARCHAR(100) COMMENT '字段中文标签，表单展示用。示例：工作地点、日薪标准。可空。',
  `field_value` TEXT COMMENT '简单文本类型字段值。用户输入或 AI 填充时写入。可空；复杂结构用 value_json。',
  `value_json` json COMMENT '复杂类型字段 JSON 值，如多选、地址对象。可空。',
  `source` VARCHAR(50)     NOT NULL DEFAULT 'ai_inferred' COMMENT '字段值来源，前端展示可信度。枚举：enterprise_profile=企业画像；history_preference=历史偏好；default=系统默认；user_input=用户输入；ai_inferred=AI 推断。非空，默认 ai_inferred。',
  `editable` tinyint(1)         NOT NULL DEFAULT 1 COMMENT '用户是否可在草稿编辑页修改该字段。非空，默认 TRUE；系统锁定字段置 FALSE。',
  `is_default` tinyint(1)         NOT NULL DEFAULT 0 COMMENT '是否 AI/系统默认生成未经用户修改，前端展示「默认」角标。非空，默认 FALSE。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '字段记录创建时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '字段值变更时更新。非空。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_draft_field` (`draft_id`, `field_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='草稿字段明细细表，逐字段记录值、数据来源与可编辑性，支撑前端「默认生成」角标（is_default=true）与字段级审计。一对多归属 fe_employment_draft。';

DROP TABLE IF EXISTS `fe_draft_cost_snapshot`;
CREATE TABLE `fe_draft_cost_snapshot` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。成本引擎每次全量测算时批量插入。非空。',
  `draft_id` BIGINT          NOT NULL COMMENT '关联草稿，外键。非空；索引 idx_fe_cost_snapshot。',
  `plan_id` BIGINT COMMENT '关联方案目录，外键。current 行可能为空（表示非平台方案）。可空。',
  `plan_code` VARCHAR(32)     NOT NULL COMMENT '方案编码快照，防止方案后续改名影响历史展示。示例：plan_1。非空。',
  `plan_name` VARCHAR(100)    NOT NULL COMMENT '方案名称快照。示例：合规优先 (A)。非空。',
  `employer_total_outflow` decimal(14,2)   NOT NULL COMMENT '企业总支出（元），含劳务+服务费+保险+税费等。成本引擎计算写入。非空。',
  `employer_avg_cost_per_worker` decimal(12,2)  NOT NULL COMMENT '企业平均每人成本（元）。非空。',
  `worker_take_home_per_worker` decimal(12,2) COMMENT '员工每人预计到手（元），税后实发估算。可空。',
  `is_recommended` tinyint(1)         NOT NULL DEFAULT 0 COMMENT '是否 AI/规则推荐的优选方案，前端高亮展示。非空，默认 FALSE。',
  `status_tag` VARCHAR(30) COMMENT '快照数据性质标签。示例：test_only 表示使用测试费率，需向用户提示。可空。',
  `compliance_tags` json COMMENT '合规标签 JSON 快照，与方案一致。可空，默认 []。',
  `notice` TEXT COMMENT '展示给用户的补充说明文案，如费率仅供参考。可空。',
  `calc_version` VARCHAR(20) COMMENT '测算引擎版本号，便于回放与排障。示例：v1.2.0。可空。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '快照生成时间，同一 draft_id 下多条记录时间相近。非空。',
  PRIMARY KEY (`id`),
  KEY `idx_fe_cost_snapshot` (`draft_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='草稿成本对比快照表，一次测算为同一草稿生成多行（current + plan_1/2/3）。核心指标：企业总支出、人均成本、员工到手；一对多关联 fe_draft_cost_detail。';

DROP TABLE IF EXISTS `fe_draft_cost_detail`;
CREATE TABLE `fe_draft_cost_detail` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。生成快照时同步插入各费用项。非空。',
  `snapshot_id` BIGINT          NOT NULL COMMENT '关联成本快照，外键。非空；索引 idx_fe_cost_detail。',
  `fee_code` VARCHAR(50)     NOT NULL COMMENT '费用项编码，与 fe_service_plan_fee_rule.fee_code 对齐。示例：labor_fee、service_fee。非空。',
  `fee_name` VARCHAR(100)    NOT NULL COMMENT '费用项中文名。示例：劳务费、平台服务费。非空。',
  `amount` decimal(14,2)   NOT NULL COMMENT '该费用项金额（元），NUMERIC(14,2)。非空。',
  `rate` decimal(8,4) COMMENT '适用费率或系数，NUMERIC(8,4)。可空；固定额费用项无费率。',
  `sort_order` int         NOT NULL DEFAULT 0 COMMENT '明细列表展示顺序。非空，默认 0。',
  PRIMARY KEY (`id`),
  KEY `idx_fe_cost_detail` (`snapshot_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='成本对比费用明细细表，对应快照下劳务费、服务费、保险、税费代征等分项金额与费率。归属 fe_draft_cost_snapshot，供前端展开明细列表。';

DROP TABLE IF EXISTS `fe_order_work_item`;
DROP TABLE IF EXISTS `fe_employment_order`;
CREATE TABLE `fe_employment_order` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。草稿确认时创建。非空。',
  `order_no` VARCHAR(32)     NOT NULL COMMENT '订单业务编号。示例：ORD20260707001。非空；唯一索引 uk_fe_order_no。',
  `enterprise_id` BIGINT COMMENT '所属企业，可空；确认方案时草稿未绑企业则为空，企业认证后回填。索引 idx_fe_order_ent。',
  `user_id` BIGINT          NOT NULL COMMENT '下单企业主用户。非空；索引 idx_fe_order_user。',
  `draft_id` BIGINT COMMENT '来源草稿。可空。',
  `selected_plan_id` BIGINT COMMENT '确认选用的用工方案。可空。',
  `title` VARCHAR(200)    NOT NULL COMMENT '订单标题，通常继承草稿标题。非空。',
  `order_status` VARCHAR(30)     NOT NULL DEFAULT 'confirmed' COMMENT '订单业务状态。示例：confirmed、in_progress、settling、completed。非空，默认 confirmed。',
  `worker_source` VARCHAR(20) COMMENT '自草稿复制：existing→人员登记；recruit→临时工招聘。',
  `current_step_code` VARCHAR(50)     NOT NULL DEFAULT 'draft' COMMENT '当前步骤六步编码（写入 fe_workflow_step.step_code）：draft=草稿；enterprise_auth=企业认证；worker_registration=人员登记；worker_recruitment=临时工招聘；task_publish=任务发布；settlement/settlement_pending=结算打款；invoice_archive/completed=开票归档。任务发布写入 task_publish，不再使用 work_started。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '订单创建时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '订单状态变更时更新。非空。',
  `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除。0=正常；1=已删除。非空，默认 0。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_order_no` (`order_no`),
  KEY `idx_fe_order_ent` (`enterprise_id`, `order_status`, `create_time`),
  KEY `idx_fe_order_user` (`user_id`, `order_status`, `create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用工订单头表（精简）：用工明细在 fe_order_work_item；登记进度从业务表聚合，不落订单头。';

CREATE TABLE `fe_order_work_item` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `order_id` BIGINT NOT NULL COMMENT '归属订单 fe_employment_order.id',
  `draft_item_id` BIGINT NULL COMMENT '来源草稿明细 id（软链，可空）',
  `group_no` VARCHAR(32) NOT NULL COMMENT '组编号，订单内唯一',
  `sort_order` INT NOT NULL DEFAULT 0,
  `job_type` VARCHAR(100) NULL,
  `worker_count` INT NULL,
  `work_days` DECIMAL(8,2) NULL,
  `work_location` VARCHAR(500) NULL,
  `settlement_cycle` VARCHAR(20) NULL,
  `unit_amount` DECIMAL(12,2) NULL,
  `total_amount` DECIMAL(14,2) NULL,
  `work_content` TEXT NULL,
  `work_start_date` DATE NULL,
  `work_end_date` DATE NULL,
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `del_flag` tinyint NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_order_work_item` (`order_id`, `group_no`, `del_flag`),
  KEY `idx_fe_order_work_item_sort` (`order_id`, `sort_order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单用工明细快照；确认时从 fe_draft_work_item 复制。';

DROP TABLE IF EXISTS `fe_registration_batch`;
CREATE TABLE `fe_registration_batch` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。订单进入登记步骤时由后端创建。非空。',
  `batch_no` VARCHAR(32)     NOT NULL COMMENT '登记批次业务编号。示例：BATCH-001。非空；唯一索引 uk_fe_batch_no。',
  `order_id` BIGINT          NOT NULL COMMENT '关联用工订单 fe_employment_order.id（逻辑关联，无数据库外键）。非空；索引 idx_fe_batch_order。',
  `enterprise_id` BIGINT COMMENT '所属企业 fe_enterprise.id（逻辑关联，无数据库外键）。可空；随订单企业认证后回填。',
  `expected_count` int         NOT NULL COMMENT '本批次预期登记人数，通常等于订单用工明细 SUM(worker_count)。非空。',
  `registered_count` int         NOT NULL DEFAULT 0 COMMENT '已登记总数（含进行中），冗余统计。非空，默认 0。',
  `pending_count` int         NOT NULL DEFAULT 0 COMMENT '尚未开始登记人数。非空，默认 0。',
  `in_progress_count` int         NOT NULL DEFAULT 0 COMMENT '登记进行中人数（已打开页面未提交）。非空，默认 0。',
  `completed_count` int         NOT NULL DEFAULT 0 COMMENT '登记已完成人数。非空，默认 0。',
  `abnormal_count` int         NOT NULL DEFAULT 0 COMMENT '登记异常人数（核验失败等）。非空，默认 0。',
  `registration_url` VARCHAR(512) COMMENT '临时工登记页链接（H5 或小程序 path）。批次创建时由链接服务生成。可空；需配合 qr_token 校验。',
  `qr_code_url` VARCHAR(512) COMMENT '登记二维码图片 CDN URL。批次创建时生成。可空。',
  `qr_token` VARCHAR(64) COMMENT '扫码登记安全 token，校验链接有效性与防篡改。创建时随机生成。可空；非空时唯一索引 uk_fe_batch_token。',
  `valid_from` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '二维码/链接生效时间。非空，默认 NOW()。',
  `valid_until` datetime     NOT NULL COMMENT '失效时间，过期后拒绝新登记（已登记记录保留）。创建时按 draft.qr_valid_days 计算。非空。',
  `status` VARCHAR(20)     NOT NULL DEFAULT 'active' COMMENT '批次状态。枚举：active=有效可登记；expired=已过期；closed=企业关闭或登记招满后关闭（不再接受新登记）。非空，默认 active。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '批次创建时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '统计或状态变更时更新。非空。',
  `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举：0=正常；1=已删除。非空，默认 0。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_batch_no` (`batch_no`),
  UNIQUE KEY `uk_fe_batch_token` (`qr_token`),
  KEY `idx_fe_batch_order` (`order_id`),
  KEY `idx_fe_batch_enterprise` (`enterprise_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='临时工扫码登记批次表，草稿确认方案后生成，含 H5/小程序登记链接、二维码图片与有效期。企业主在进度页查看登记统计；一对多关联 fe_worker_registration。关联列暂不建数据库外键。';

DROP TABLE IF EXISTS `fe_order_workflow_log`;
CREATE TABLE `fe_order_workflow_log` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。每次步骤推进时追加写入，不可修改。非空。',
  `order_id` BIGINT          NOT NULL COMMENT '关联订单，外键。非空；索引 idx_fe_order_wf_log。',
  `from_step` VARCHAR(50) COMMENT '变更前合规步骤编码。首次创建订单时可为空。可空。',
  `to_step` VARCHAR(50)     NOT NULL COMMENT '变更后合规步骤编码，对应 fe_workflow_step.step_code。非空。',
  `from_status` VARCHAR(30) COMMENT '变更前订单业务状态 order_status。可空。',
  `to_status` VARCHAR(30)     NOT NULL COMMENT '变更后订单业务状态。非空。',
  `operator_id` BIGINT COMMENT '操作人用户 ID，外键。系统自动推进时为 NULL。可空。',
  `operator_type` VARCHAR(20)     NOT NULL DEFAULT 'system' COMMENT '操作方类型。枚举：system=系统自动；enterprise=企业主/管理员；worker=临时工；provider=第三方合作平台。非空，默认 system。',
  `remark` TEXT COMMENT '变更说明，如「登记人数已达预期，自动推进」。可空。',
  `extra_json` json COMMENT '扩展上下文 JSON，如触发条件、关联合格人数。可空。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '变更发生时间，审计时间轴依据。非空。',
  PRIMARY KEY (`id`),
  KEY `idx_fe_order_wf_log` (`order_id`, `create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单合规流程状态变更日志表，记录状态机每一步推进的前后步骤、操作人与备注，构成五流合一合规证据链。关联 fe_employment_order，operator_id 可引用 fe_user。';

DROP TABLE IF EXISTS `fe_worker`;
CREATE TABLE `fe_worker` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。首次登记提交且实名核验通过后创建或匹配已有档案。非空。',
  `user_id` BIGINT COMMENT '关联微信用户，外键。临时工首次扫码授权微信后绑定。可空；未授权前仅通过身份证匹配。',
  `worker_no` VARCHAR(32) COMMENT '临时工业务编号，平台内唯一标识。档案创建时生成。示例：WK20260001。可空。',
  `real_name` VARCHAR(64)     NOT NULL COMMENT '临时工真实姓名，与身份证一致。登记提交时写入。非空。',
  `id_card_no_enc` TEXT            NOT NULL COMMENT '身份证号加密密文。登记页提交时应用层加密写入。非空；高度敏感，禁止明文。',
  `id_card_no_mask` VARCHAR(32) COMMENT '身份证号脱敏展示。示例：310***********1234。可空；列表与结算明细使用。',
  `mobile_enc` TEXT            NOT NULL COMMENT '手机号加密密文。登记时写入。非空；高度敏感。',
  `mobile_mask` VARCHAR(20) COMMENT '手机号脱敏。示例：138****1234。可空。',
  `bank_account_enc` TEXT COMMENT '银行卡号加密密文，用于打款。登记时写入。可空；高度敏感。',
  `bank_account_mask` VARCHAR(32) COMMENT '银行卡号脱敏。示例：6222****5678。可空。',
  `bank_name` VARCHAR(100) COMMENT '开户银行名称。示例：中国工商银行。可空。',
  `bank_branch` VARCHAR(200) COMMENT '开户支行名称。可空。',
  `verify_status` VARCHAR(20)     NOT NULL DEFAULT 'pending' COMMENT '实名/人脸核验状态。枚举：pending=待核验；passed=通过；failed=失败。非空，默认 pending；failed 时登记流程阻断。',
  `verify_message` TEXT COMMENT '核验失败原因说明，展示给临时工重试。示例：光线不足导致人脸比对失败。可空。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '档案创建时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '档案信息或核验状态变更时更新。非空。',
  `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举：0=正常；1=已删除。非空，默认 0。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_worker_worker_no` (`worker_no`, `del_flag`),
  UNIQUE KEY `uk_fe_worker_user_id` (`user_id`, `del_flag`),
  KEY `idx_fe_worker_mobile` (`mobile_mask`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='临时工自然人档案主表，跨登记批次复用，避免重复录入身份证与银行卡。身份证、银行卡、手机号均加密存储（*_enc），列表仅展示脱敏值（*_mask）；可关联 fe_user 实现微信绑定。';

DROP TABLE IF EXISTS `fe_worker_registration`;
CREATE TABLE `fe_worker_registration` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。临时工打开登记页或提交时创建。非空。',
  `batch_id` BIGINT          NOT NULL COMMENT '所属登记批次 fe_registration_batch.id（逻辑关联，无数据库外键）。非空；索引 idx_fe_worker_reg_batch。',
  `order_id` BIGINT          NOT NULL COMMENT '关联订单，外键。冗余便于按订单查登记列表。非空；索引 idx_fe_worker_reg_order。',
  `enterprise_id` BIGINT          NOT NULL COMMENT '所属企业，外键。冗余。非空。',
  `worker_id` BIGINT COMMENT '关联临时工档案，外键。提交成功且匹配/创建档案后绑定。可空（登记进行中）。',
  `real_name` VARCHAR(64)     NOT NULL COMMENT '本次登记填写的姓名。非空；可能与 worker 档案后续同步。',
  `mobile_enc` TEXT COMMENT '登记手机号密文。提交时加密写入。可空；高度敏感。',
  `mobile_mask` VARCHAR(20) COMMENT '登记手机号脱敏。可空。',
  `id_card_no_enc` TEXT COMMENT '登记身份证密文。可空；高度敏感。',
  `bank_account_enc` TEXT COMMENT '登记银行卡密文。可空；高度敏感。',
  `confirmed_work_type` VARCHAR(100) COMMENT '临时工确认的工种或具体任务描述。提交时勾选或填写。可空。',
  `third_party_source` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否第三方人力来源。0=否（有临时工/人员登记）；1=是（无临时工，从第三方人力平台匹配）。非空，默认 0。',
  `reg_status` VARCHAR(20)     NOT NULL DEFAULT 'pending' COMMENT '登记流程状态。枚举：pending=待登记；registering=填写中；under_review=待企业审核；contract_signing=待签约（审核通过）；completed=已完成；verify_failed=实名核验失败；rejected=企业驳回。非空，默认 pending。',
  `fail_reason` TEXT COMMENT '失败或企业驳回原因。可空。',
  `submitted_at` datetime COMMENT '临时工点击提交时间。可空。',
  `reviewed_at` datetime COMMENT '企业审核完成时间。可空。',
  `reviewed_by` BIGINT COMMENT '审核人，外键。可空。',
  `remind_count` int         NOT NULL DEFAULT 0 COMMENT '企业主催办次数，每次催办 +1。非空，默认 0。',
  `last_remind_at` datetime COMMENT '最近一次催办时间。可空。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '登记记录创建时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '状态或资料变更时更新。非空。',
  `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举：0=正常；1=已删除。非空，默认 0。',
  PRIMARY KEY (`id`),
  KEY `idx_fe_worker_reg_batch` (`batch_id`, `reg_status`),
  KEY `idx_fe_worker_reg_order` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='批次登记记录表，记录每个临时工在某一 fe_registration_batch 下的一次登记全过程。third_party_source 区分是否第三方人力平台匹配；reg_status 驱动进度页统计、催办与审核；关联 fe_worker 档案，敏感证件信息加密存储。batch_id 暂无数据库外键。';

DROP TABLE IF EXISTS `fe_worker_consent`;
CREATE TABLE `fe_worker_consent` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。临时工勾选协议并提交时插入。非空。',
  `registration_id` BIGINT COMMENT '关联登记记录，外键。首次档案登记可为空；批次扫码登记时写入。',
  `worker_id` BIGINT COMMENT '关联临时工档案，外键。档案绑定后写入。可空。',
  `consent_type` VARCHAR(50)     NOT NULL COMMENT '协议类型。枚举：labor_contract=电子劳动合同；privacy_policy=隐私政策；authorization=个人信息处理授权。非空。',
  `consent_version` VARCHAR(20) COMMENT '协议版本号，对应法务发布的协议版本。示例：v2.1。可空。',
  `consent_title` VARCHAR(200) COMMENT '协议标题展示文案。示例：《灵活用工电子劳动合同》。可空。',
  `agreed` tinyint(1)         NOT NULL DEFAULT 0 COMMENT '是否勾选同意。非空，默认 FALSE；提交时须为 TRUE 否则阻断。',
  `agreed_at` datetime COMMENT '用户点击同意的时间戳。可空；提交成功时必填。',
  `client_ip` VARCHAR(64) COMMENT '客户端 IP 地址，合规取证。网关层提取写入。可空。',
  `user_agent` VARCHAR(500) COMMENT '客户端 User-Agent 字符串。可空；最长 500 字符。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录入库时间。非空。',
  PRIMARY KEY (`id`),
  KEY `idx_fe_worker_consent` (`registration_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='临时工协议授权确认表，记录勾选电子劳动合同、隐私政策、信息授权等合规留痕。含同意时间、客户端 IP 与 UA，满足电子证据要求；首次档案登记可不关联 fe_worker_registration。';

DROP TABLE IF EXISTS `fe_contract`;
CREATE TABLE `fe_contract` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。登记完成进入合同签署步骤时创建。非空。',
  `contract_no` VARCHAR(32)     NOT NULL COMMENT '合同业务编号。示例：CT20260707001。非空；唯一索引 uk_fe_contract_no。',
  `order_id` BIGINT          NOT NULL COMMENT '关联订单，外键。非空；索引 idx_fe_contract_order。',
  `registration_id` BIGINT COMMENT '关联登记记录（一人一合同），外键。可空；建议必填。',
  `worker_id` BIGINT COMMENT '签约临时工，外键。可空。',
  `enterprise_id` BIGINT          NOT NULL COMMENT '签约企业，外键。非空。',
  `contract_type` VARCHAR(50)     NOT NULL DEFAULT 'labor' COMMENT '合同类型编码。非空，默认 labor（劳动合同）。',
  `contract_title` VARCHAR(200) COMMENT '合同标题。示例：劳务派遣协议-张三。可空。',
  `sign_status` VARCHAR(20)     NOT NULL DEFAULT 'pending' COMMENT '签署状态。枚举：pending=待签署；signing=签署中；signed=已签署；rejected=拒签；expired=已过期。非空，默认 pending。',
  `sign_provider` VARCHAR(50) COMMENT '电子签服务商。枚举：mock=MVP 模拟；esign_partner=合作电子签平台。可空。',
  `external_contract_id` VARCHAR(100) COMMENT '第三方电子签平台返回的合同 ID。对接后写入。可空。',
  `sign_url` VARCHAR(512) COMMENT '临时工签署页面链接。创建合同时由签章服务返回。可空。',
  `signed_at` datetime COMMENT '双方签署完成时间。可空。',
  `file_url` VARCHAR(512) COMMENT '已签署合同 PDF 归档地址。签署完成后写入。可空。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '合同记录创建时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '签署状态变更时更新。非空。',
  `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举：0=正常；1=已删除。非空，默认 0。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_contract_no` (`contract_no`),
  UNIQUE KEY `uk_fe_contract_registration` (`registration_id`),
  KEY `idx_fe_contract_order` (`order_id`, `sign_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='电子劳动合同表，合规流程「合同签署」节点核心数据。一人一登记一条合同；MVP 阶段 sign_provider 可用 mock，对接电子签平台后替换。关联 fe_employment_order、fe_worker_registration、fe_worker。';

DROP TABLE IF EXISTS `fe_settlement_order`;
CREATE TABLE `fe_settlement_order` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。结算引擎生成结算单时创建。非空。',
  `settlement_no` VARCHAR(32)     NOT NULL COMMENT '结算单业务编号。示例：STL20260707001。非空；唯一索引 uk_fe_settlement_no。',
  `order_id` BIGINT          NOT NULL COMMENT '关联用工订单，外键。非空。',
  `batch_id` BIGINT COMMENT '关联登记批次 fe_registration_batch.id（逻辑关联，无数据库外键）。可空；多批次订单可只关联主批次。',
  `enterprise_id` BIGINT          NOT NULL COMMENT '所属企业，外键。非空；索引 idx_fe_settlement_ent。',
  `worker_count` int         NOT NULL COMMENT '本次结算涵盖人数。非空。',
  `gross_amount` decimal(14,2)   NOT NULL DEFAULT 0 COMMENT '应发总额（元），税前劳务合计。非空，默认 0。',
  `deduction_amount` decimal(14,2)   NOT NULL DEFAULT 0 COMMENT '扣款及个税合计（元）。非空，默认 0。',
  `net_amount` decimal(14,2)   NOT NULL DEFAULT 0 COMMENT '实发总额（元），临时工到手合计。非空，默认 0。',
  `service_fee_amount` decimal(14,2)   NOT NULL DEFAULT 0 COMMENT '平台服务费（元）。非空，默认 0。',
  `invoice_amount` decimal(14,2)   NOT NULL DEFAULT 0 COMMENT '预计开票额（元），供企业财务参考。非空，默认 0。',
  `total_outflow` decimal(14,2)   NOT NULL DEFAULT 0 COMMENT '企业总支出（元）= 实发 + 服务费 + 税费等。非空，默认 0。',
  `settlement_status` VARCHAR(20)     NOT NULL DEFAULT 'pending' COMMENT '结算单状态。枚举：pending=待企业确认；confirmed=已确认待支付；paying=支付中；paid=已支付；cancelled=已取消。非空，默认 pending。',
  `compliance_tags` json COMMENT '五流合一合规校验结果标签 JSON。示例：["个税已申报","发票合规"]。可空，默认 []。',
  `compliance_remark` TEXT COMMENT '合规说明文案。示例：可全额税前扣除。可空。',
  `confirmed_at` datetime COMMENT '企业主确认结算单时间。可空。',
  `confirmed_by` BIGINT COMMENT '确认人，外键。可空。',
  `paid_at` datetime COMMENT '支付完成时间，全部打款成功后写入。可空。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '结算单生成时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '状态或金额变更时更新。非空。',
  `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举：0=正常；1=已删除。非空，默认 0。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_settlement_no` (`settlement_no`),
  KEY `idx_fe_settlement_ent` (`enterprise_id`, `settlement_status`),
  KEY `idx_fe_settlement_batch` (`batch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='结算确认单主表，用工结束后按考勤或约定生成，展示应发/扣款/实发、服务费、开票额与企业总支出。企业确认后进入支付环节；一对多关联 fe_settlement_item、fe_settlement_fee、fe_payment_record。batch_id 暂无数据库外键。';

DROP TABLE IF EXISTS `fe_settlement_item`;
CREATE TABLE `fe_settlement_item` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。生成结算单时按登记记录逐人插入。非空。',
  `settlement_id` BIGINT          NOT NULL COMMENT '关联结算单，外键。非空；索引 idx_fe_settlement_item。',
  `registration_id` BIGINT COMMENT '关联登记记录，外键。可空；建议必填以追溯人员。',
  `worker_id` BIGINT COMMENT '关联临时工档案，外键。可空。',
  `worker_name_mask` VARCHAR(64) COMMENT '姓名脱敏展示，如张*三。可空；禁止存明文全名。',
  `work_days` decimal(8,2) COMMENT '结算工作天数，NUMERIC(8,2)。可空。',
  `work_hours` decimal(8,2) COMMENT '结算工作小时数。可空。',
  `piece_count` decimal(12,2) COMMENT '计件数量。可空。',
  `gross_amount` decimal(12,2)   NOT NULL DEFAULT 0 COMMENT '该人员应发金额（元）。非空，默认 0。',
  `tax_amount` decimal(12,2)   NOT NULL DEFAULT 0 COMMENT '个税扣款（元）。非空，默认 0。',
  `other_deduction` decimal(12,2)   NOT NULL DEFAULT 0 COMMENT '其他扣款（元），如工装赔偿。非空，默认 0。',
  `net_amount` decimal(12,2)   NOT NULL DEFAULT 0 COMMENT '该人员实发金额（元）。非空，默认 0。',
  `item_status` VARCHAR(20)     NOT NULL DEFAULT 'pending' COMMENT '明细行状态。示例：pending、confirmed、paid。非空，默认 pending。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '明细创建时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '明细金额调整时更新。非空。',
  PRIMARY KEY (`id`),
  KEY `idx_fe_settlement_item` (`settlement_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='结算单人明细表，按临时工拆分应发、个税、其他扣款与实发金额。支持按天、按小时、计件多种计量维度；关联 fe_settlement_order、fe_worker_registration、fe_worker。';

DROP TABLE IF EXISTS `fe_settlement_fee`;
CREATE TABLE `fe_settlement_fee` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。结算单生成时同步写入各费用分项。非空。',
  `settlement_id` BIGINT          NOT NULL COMMENT '关联结算单，外键。非空；索引 idx_fe_settlement_fee。',
  `fee_code` VARCHAR(50)     NOT NULL COMMENT '费用项编码。示例：labor_fee、service_fee、insurance、tax_withhold。非空。',
  `fee_name` VARCHAR(100)    NOT NULL COMMENT '费用项中文名。非空。',
  `amount` decimal(14,2)   NOT NULL COMMENT '费用金额（元），NUMERIC(14,2)。非空。',
  `rate` decimal(8,4) COMMENT '适用费率，NUMERIC(8,4)。可空。',
  `sort_order` int         NOT NULL DEFAULT 0 COMMENT '资金总览展示顺序。非空，默认 0。',
  PRIMARY KEY (`id`),
  KEY `idx_fe_settlement_fee` (`settlement_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='结算单费用汇总项表，订单级劳务费、服务费、保险、税费等分项金额，对应小程序「资金总览」模块。归属 fe_settlement_order，结构与 fe_draft_cost_detail 类似但为实际结算数据。';

DROP TABLE IF EXISTS `fe_payment_record`;
CREATE TABLE `fe_payment_record` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。发起支付时创建。非空。',
  `payment_no` VARCHAR(32)     NOT NULL COMMENT '支付单业务编号。示例：PAY20260707001。非空；唯一索引 uk_fe_payment_no。',
  `settlement_id` BIGINT          NOT NULL COMMENT '关联结算单，外键。非空；索引 idx_fe_payment_settlement。',
  `enterprise_id` BIGINT          NOT NULL COMMENT '付款企业，外键。非空。',
  `payment_channel` VARCHAR(50)     NOT NULL COMMENT '支付渠道类型，前端仅展示此字段。枚举：wechat=微信支付；alipay=支付宝；bank=银行转账。非空。',
  `payment_amount` decimal(14,2)   NOT NULL COMMENT '支付金额（元）。非空。',
  `payment_status` VARCHAR(20)     NOT NULL DEFAULT 'pending' COMMENT '支付状态。枚举：pending=处理中；success=成功；failed=失败；refunded=已退款。非空，默认 pending。',
  `external_trade_no` VARCHAR(100) COMMENT '微信/支付宝/银行等第三方交易流水号。支付回调成功时写入。可空。',
  `payer_user_id` BIGINT COMMENT '发起付款的企业主用户，外键。可空。',
  `paid_at` datetime COMMENT '支付成功时间戳。可空。',
  `receipt_url` VARCHAR(512) COMMENT '支付凭证或回单下载地址。可空。',
  `fail_reason` TEXT COMMENT '支付失败原因。可空。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '支付单创建时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '状态变更时更新。非空。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_payment_no` (`payment_no`),
  KEY `idx_fe_payment_settlement` (`settlement_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付/打款记录表，企业确认结算后发起付款，记录渠道、金额、第三方交易流水与凭证。小程序仅展示 payment_channel 渠道类型，不展示对公账户；关联 fe_settlement_order、fe_enterprise。';

DROP TABLE IF EXISTS `fe_order_invoice`;
CREATE TABLE `fe_order_invoice` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。开票归档落库时生成。非空。',
  `order_id` BIGINT NOT NULL COMMENT '用工订单 fe_employment_order.id。一单一条有效记录。非空；唯一索引 uk_fe_order_invoice_order。',
  `settlement_id` BIGINT COMMENT '关联结算单 fe_settlement_order.id。归档时从有效结算单写入。可空。',
  `enterprise_id` BIGINT COMMENT '所属企业 fe_enterprise.id。可空；索引 idx_fe_order_invoice_ent。',
  `invoice_type` VARCHAR(50) NOT NULL DEFAULT 'vat_special' COMMENT '发票类型。枚举：vat_special=增值税专用发票；vat_normal=增值税普通发票。非空，默认 vat_special。',
  `tax_rate` decimal(8,4) NOT NULL DEFAULT 0.0600 COMMENT '税率。示例：0.0600 表示 6%。非空，默认 0.0600。',
  `billable_amount` decimal(14,2) NOT NULL DEFAULT 0 COMMENT '可开票金额（元）。通常取自结算单预计开票额 invoice_amount。非空，默认 0。',
  `invoiced_amount` decimal(14,2) NOT NULL DEFAULT 0 COMMENT '已开票金额（元）。归档办结后一般为本次开票金额。非空，默认 0。',
  `pending_amount` decimal(14,2) NOT NULL DEFAULT 0 COMMENT '待开票金额（元）= 可开票 − 已开票。非空，默认 0。',
  `invoice_amount` decimal(14,2) NOT NULL DEFAULT 0 COMMENT '本次开票金额不含税（元）。非空，默认 0。',
  `tax_amount` decimal(14,2) NOT NULL DEFAULT 0 COMMENT '税额（元）。默认 开票金额 × 税率。非空，默认 0。',
  `total_with_tax` decimal(14,2) NOT NULL DEFAULT 0 COMMENT '价税合计（元）= 开票金额 + 税额。非空，默认 0。',
  `company_name` VARCHAR(200) COMMENT '开票抬头-企业名称。示例：某某科技有限公司。可空。',
  `credit_code` VARCHAR(32) COMMENT '开票抬头-统一社会信用代码/纳税人识别号。示例：91310000MA1K3XXXXX。可空。',
  `bank_account_info` VARCHAR(300) COMMENT '开户银行及账号（展示用）。示例：中国工商银行上海张江支行 6222****1234。可空。',
  `invoice_no` VARCHAR(64) COMMENT '发票号码，可选留痕。示例：INV20260802001。可空。',
  `tax_voucher_no` VARCHAR(64) COMMENT '完税凭证号，可选留痕。示例：TAX20260802001。可空。',
  `invoice_file_url` VARCHAR(512) COMMENT '增值税发票下载 URL。MVP 可为 Mock 路径。可空。',
  `tax_file_url` VARCHAR(512) COMMENT '完税证明下载 URL。MVP 可为 Mock 路径。可空。',
  `compliance_file_url` VARCHAR(512) COMMENT '合规证据链下载 URL。MVP 可为 Mock 路径。可空。',
  `invoice_status` VARCHAR(20) NOT NULL DEFAULT 'draft' COMMENT '开票状态。枚举：draft=草稿/预填；issued=已开具；archived=已归档办结。非空，默认 draft。',
  `remark` VARCHAR(500) COMMENT '备注。可空。',
  `archived_at` datetime COMMENT '开票归档办结时间。调用 invoice-archive 成功时写入。可空。',
  `archived_by` BIGINT COMMENT '办结人用户 ID（fe_user.id）。可空。',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间。非空。',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录更新时间。非空。',
  `del_flag` tinyint NOT NULL DEFAULT 0 COMMENT '逻辑删除。0=正常；1=已删除。非空，默认 0。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_order_invoice_order` (`order_id`, `del_flag`),
  KEY `idx_fe_order_invoice_settlement` (`settlement_id`),
  KEY `idx_fe_order_invoice_ent` (`enterprise_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单开票归档信息：开票金额、税额、抬头与凭证链接；一单一条。';

DROP TABLE IF EXISTS `fe_attendance_batch`;
CREATE TABLE `fe_attendance_batch` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。每日定时任务或企业主手动生成日报时创建。非空。',
  `batch_id` BIGINT          NOT NULL COMMENT '关联登记批次 fe_registration_batch.id（逻辑关联，无数据库外键）。非空；与 attendance_date 组成唯一索引 uk_fe_attendance_batch。',
  `order_id` BIGINT          NOT NULL COMMENT '关联订单，外键。冗余便于订单维度查考勤。非空。',
  `attendance_date` DATE            NOT NULL COMMENT '考勤统计日期，DATE 类型。示例：2026-08-15。非空。',
  `total_workers` int         NOT NULL DEFAULT 0 COMMENT '当日应考勤人数。非空，默认 0。',
  `normal_count` int         NOT NULL DEFAULT 0 COMMENT '正常出勤人数。非空，默认 0。',
  `overtime_count` int         NOT NULL DEFAULT 0 COMMENT '加班人数。非空，默认 0。',
  `leave_count` int         NOT NULL DEFAULT 0 COMMENT '请假人数。非空，默认 0。',
  `total_hours` decimal(10,2)   DEFAULT 0 COMMENT '当日总工时（小时）。可空，默认 0。',
  `total_pieces` decimal(12,2)   DEFAULT 0 COMMENT '当日总计件数。可空，默认 0。',
  `estimated_cost` decimal(14,2)   DEFAULT 0 COMMENT '当日预估劳务费用（元）。可空，默认 0。',
  `status` VARCHAR(20)     NOT NULL DEFAULT 'draft' COMMENT '日报状态。枚举：draft=草稿可编辑；confirmed=已确认锁定；archived=已归档。非空，默认 draft。',
  `confirmed_by` BIGINT COMMENT '确认人，外键。企业主确认日报时写入。可空。',
  `confirmed_at` datetime COMMENT '日报确认时间。可空。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '日报创建时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '考勤数据变更时更新。非空。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_attendance_batch` (`batch_id`, `attendance_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考勤日报批次表（二期功能），按登记批次与日期汇总当日应考勤人数、出勤/加班/请假统计及预估费用。一期 MVP 可不实现业务逻辑，表结构先行预留；batch_id 暂无数据库外键。';

DROP TABLE IF EXISTS `fe_attendance_record`;
CREATE TABLE `fe_attendance_record` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。录入或导入单人考勤时插入。非空。',
  `attendance_batch_id` BIGINT          NOT NULL COMMENT '关联考勤日报，外键。非空；索引 idx_fe_attendance_rec。',
  `registration_id` BIGINT          NOT NULL COMMENT '关联登记记录，外键。非空；确定考勤对象。',
  `worker_id` BIGINT COMMENT '关联临时工档案，外键。可空；冗余加速查询。',
  `attendance_type` VARCHAR(20)     NOT NULL DEFAULT 'normal' COMMENT '考勤类型。枚举：normal=正常出勤；overtime=加班；leave=请假；piece=计件产量。非空，默认 normal。',
  `work_hours` decimal(8,2) COMMENT '正常工作小时数，NUMERIC(8,2)。可空。',
  `overtime_hours` decimal(8,2) COMMENT '加班小时数。可空。',
  `piece_count` decimal(12,2) COMMENT '计件数量。可空。',
  `remark` TEXT COMMENT '考勤备注，如请假原因。可空。',
  `source` VARCHAR(30)     DEFAULT 'manual' COMMENT '录入来源。枚举：manual=手工录入；voice=语音录入（AI 解析）；import=批量导入。可空，默认 manual。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '考勤数据修改时更新。非空。',
  PRIMARY KEY (`id`),
  KEY `idx_fe_attendance_rec` (`attendance_batch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考勤明细表（二期），记录单人单日考勤类型（正常/加班/请假/计件）、工时与计件数。支持 manual/voice/import 多种录入来源；关联 fe_attendance_batch、fe_worker_registration、fe_worker。';

DROP TABLE IF EXISTS `fe_user_confirmation`;
CREATE TABLE `fe_user_confirmation` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。用户执行确认类操作时同步插入，不可篡改。非空。',
  `enterprise_id` BIGINT          NOT NULL COMMENT '所属企业，外键。非空；索引 idx_fe_user_confirm。',
  `user_id` BIGINT          NOT NULL COMMENT '操作用户，外键。非空；须为 enterprise 类型企业主或管理员。',
  `biz_type` VARCHAR(50)     NOT NULL COMMENT '业务场景类型。枚举：draft_confirm=确认用工草稿；plan_select=选定用工方案；settlement_pay=确认并支付结算；external_submit=授权提交第三方平台。非空。',
  `biz_id` BIGINT          NOT NULL COMMENT '关联业务主键 ID，如 draft_id、settlement_id。非空；与 biz_type 组合解析。',
  `biz_no` VARCHAR(32) COMMENT '关联业务编号冗余，便于人工审计。示例：draft_001。可空。',
  `action` VARCHAR(50)     NOT NULL COMMENT '用户动作类型。枚举：confirm=确认；modify=修改后确认；authorize=授权。非空。',
  `confirmed_fields` json COMMENT '用户确认时的关键字段快照 JSON，固化确认瞬间数据。示例：{"worker_count":15,"daily_wage":280}。可空，默认 {}。',
  `selected_plan_id` BIGINT COMMENT '确认选用的方案，外键。biz_type=plan_select 或 draft_confirm 时写入。可空。',
  `client_ip` VARCHAR(64) COMMENT '客户端 IP，合规取证。网关提取。可空。',
  `user_agent` VARCHAR(500) COMMENT '客户端 UA 字符串。可空。',
  `remark` TEXT COMMENT '用户填写的备注或系统附注。可空。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '确认操作发生时间。非空。',
  PRIMARY KEY (`id`),
  KEY `idx_fe_user_confirm` (`enterprise_id`, `biz_type`, `create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户确认与授权留痕表，草稿确认、方案选择、结算支付、外部平台提交等高风险操作必须写入，满足审计与合规举证。关联 fe_enterprise、fe_user，可引用 fe_service_plan。';

DROP TABLE IF EXISTS `fe_field_change_log`;
CREATE TABLE `fe_field_change_log` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。字段值发生变更时追加写入。非空。',
  `biz_type` VARCHAR(50)     NOT NULL COMMENT '业务对象类型。枚举：draft=用工草稿；order=用工订单；registration=登记记录。非空。',
  `biz_id` BIGINT          NOT NULL COMMENT '业务对象主键 ID。非空；与 biz_type 组合查询；索引 idx_fe_field_change。',
  `field_key` VARCHAR(100)    NOT NULL COMMENT '被变更字段键名。示例：work_location、daily_wage。非空。',
  `old_value` TEXT COMMENT '变更前的文本值。可空；首次填入时 old_value 为空。',
  `new_value` TEXT COMMENT '变更后的文本值。可空。',
  `change_source` VARCHAR(30)     NOT NULL COMMENT '变更来源。枚举：user_edit=用户表单编辑；nl_edit=自然语言对话修改；ai_regenerate=AI 重新生成草稿；system=系统自动（如状态联动）。非空。',
  `operator_id` BIGINT COMMENT '操作人，外键。系统自动变更时可为空。可空。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '变更发生时间。非空。',
  PRIMARY KEY (`id`),
  KEY `idx_fe_field_change` (`biz_type`, `biz_id`, `create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='关键字段变更历史表，记录草稿、订单、登记等业务对象重要字段的修改前后值，区分用户手工编辑、自然语言修改、AI 重新生成与系统自动变更，支撑争议追溯。';

DROP TABLE IF EXISTS `fe_provider`;
CREATE TABLE `fe_provider` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。运营接入新合作平台时创建。非空。',
  `provider_code` VARCHAR(50)     NOT NULL COMMENT '平台业务编码，全局唯一。示例：partner_platform、tax_partner_a。非空；唯一索引 uk_fe_provider_code。',
  `provider_name` VARCHAR(100)    NOT NULL COMMENT '平台展示名称。非空。',
  `api_base_url` VARCHAR(512) COMMENT '第三方 API 根地址。示例：https://api.partner.com/v1。可空。',
  `auth_config_enc` TEXT COMMENT 'API Key、Secret 等鉴权配置 JSON 的加密密文。运营配置时加密写入。高度敏感；禁止明文与前端暴露。可空。',
  `status` VARCHAR(20)     NOT NULL DEFAULT 'active' COMMENT '连接器启用状态。枚举：active=启用；disabled=停用。非空，默认 active。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '配置创建时间。非空。',
  `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '配置变更时更新。非空。',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_fe_provider_code` (`provider_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='第三方灵活用工/税筹合作平台连接器配置表，存储 API 根地址与加密鉴权信息。不对小程序用户暴露；被 fe_provider_api_log 引用，一期可采用 Mock 打桩。';

DROP TABLE IF EXISTS `fe_provider_api_log`;
CREATE TABLE `fe_provider_api_log` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。每次调用第三方 API 时追加。非空。',
  `provider_id` BIGINT          NOT NULL COMMENT '合作平台，外键。非空；索引 idx_fe_provider_log。',
  `enterprise_id` BIGINT COMMENT '关联企业，外键。调用上下文企业。可空。',
  `order_id` BIGINT COMMENT '关联订单，外键。可空；索引 idx_fe_provider_log_order。',
  `action` VARCHAR(100)    NOT NULL COMMENT 'API 动作编码。示例：create_requirement=创建用工需求；query_status=查询办理状态；callback=异步回调。非空。',
  `request_payload` json COMMENT '请求体 JSON 快照。可空；可能含敏感业务数据，访问受控。',
  `response_payload` json COMMENT '响应体 JSON 快照。可空。',
  `http_status` int COMMENT 'HTTP 响应状态码。示例：200、500。可空。',
  `biz_status` VARCHAR(50) COMMENT '将技术响应映射后的业务状态，供订单状态机消费。示例：submitted、approved、rejected。可空。',
  `audit_required` tinyint(1)         NOT NULL DEFAULT 0 COMMENT '是否需企业主在用户侧确认后才能继续流程。第三方返回待确认时置 TRUE。非空，默认 FALSE。',
  `error_message` TEXT COMMENT '调用失败错误信息。可空。',
  `duration_ms` int COMMENT '请求耗时（毫秒）。可空。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '调用时间。非空。',
  PRIMARY KEY (`id`),
  KEY `idx_fe_provider_log` (`provider_id`, `create_time`),
  KEY `idx_fe_provider_log_order` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='合作平台 API 调用日志表，保存原始 HTTP 请求响应、技术状态码与转换后的业务状态 biz_status。技术细节不对用户展示；audit_required 标识是否需用户确认后才能继续推进订单流程。';

DROP TABLE IF EXISTS `fe_notification`;
CREATE TABLE `fe_notification` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键，自增。业务事件触发时由通知服务写入。非空。',
  `enterprise_id` BIGINT COMMENT '所属企业，外键。企业维度消息筛选。可空；索引 idx_fe_notification_ent。',
  `user_id` BIGINT COMMENT '接收用户，外键。可空；索引 idx_fe_notification_user；与 enterprise_id 至少其一有值。',
  `notify_type` VARCHAR(30)     NOT NULL COMMENT '通知展示样式。枚举：pending=待办（橙色）；error=异常（红色）；info=提示（蓝色）；success=成功（绿色）。非空。',
  `category` VARCHAR(50)     NOT NULL COMMENT '业务分类。枚举：settlement=结算；registration=登记；verify=实名核验；workflow=流程进度。非空。',
  `title` VARCHAR(200)    NOT NULL COMMENT '通知标题，列表主文案。非空。',
  `content` TEXT COMMENT '通知正文详细描述。可空。',
  `biz_type` VARCHAR(50) COMMENT '关联业务对象类型，如 settlement、registration、order。可空。',
  `biz_id` BIGINT COMMENT '关联业务主键 ID，用于跳转后加载详情。可空。',
  `biz_no` VARCHAR(32) COMMENT '关联业务编号冗余。示例：STL20260707001。可空。',
  `action_url` VARCHAR(512) COMMENT '小程序内跳转路径或 scheme。示例：/pages/settlement/detail?id=123。可空。',
  `read_flag` tinyint(1)         NOT NULL DEFAULT 0 COMMENT '是否已读。用户打开消息中心或点击后更新。非空，默认 FALSE。',
  `handled_flag` tinyint(1)         NOT NULL DEFAULT 0 COMMENT '待办是否已处理完成。用户完成对应操作后更新。非空，默认 FALSE。',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '通知创建时间。非空。',
  `read_time` datetime COMMENT '标记已读时间。可空。',
  `handled_time` datetime COMMENT '待办完成时间。可空。',
  PRIMARY KEY (`id`),
  KEY `idx_fe_notification_user` (`user_id`, `read_flag`, `create_time`),
  KEY `idx_fe_notification_ent` (`enterprise_id`, `handled_flag`, `create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='消息与待办中心表，推送结算待确认、实名失败、登记进度、流程节点变更等通知。支持 action_url 跳转小程序对应页面/弹窗；关联 fe_enterprise、fe_user，通过 read_flag 与 handled_flag 区分已读与已办。';
-- -----------------------------------------------------------------------------
-- 初始化数据（测试阶段默认值）
-- -----------------------------------------------------------------------------

INSERT INTO `fe_workflow_definition` (`workflow_code`, `workflow_name`, `description`, `version`, `is_active`)
VALUES ('employment_compliance', '灵活用工办理流程',
        '六步双分支：草稿→企业认证→(人员登记|临时工招聘)→任务发布→结算打款→开票归档；existing=人员登记，recruit=临时工招聘', 4, 1);

INSERT INTO `fe_workflow_step` (`workflow_id`, `step_code`, `step_name`, `step_order`, `required`)
SELECT wd.`id`, s.`step_code`, s.`step_name`, s.`step_order`, s.`required`
FROM `fe_workflow_definition` wd
CROSS JOIN (
  SELECT 'draft' AS step_code, '草稿' AS step_name, 1 AS step_order, 1 AS required
  UNION ALL SELECT 'enterprise_auth', '企业认证', 2, 1
  UNION ALL SELECT 'worker_registration', '人员登记', 3, 0
  UNION ALL SELECT 'worker_recruitment', '临时工招聘', 3, 0
  UNION ALL SELECT 'task_publish', '任务发布', 4, 1
  UNION ALL SELECT 'settlement', '结算打款', 5, 1
  UNION ALL SELECT 'invoice_archive', '开票归档', 6, 1
) s
WHERE wd.`workflow_code` = 'employment_compliance' AND wd.`version` = 4;

-- fe_service_plan / fe_service_plan_fee_rule
-- 来源：成本对比 UI（方案A 合规优先 / 方案B 成本优先 / 方案C 传统用工）
-- 校验场景：浦东仓库搬运 · 10人 × 2天
INSERT INTO `fe_service_plan` (
  `plan_code`, `plan_name`, `plan_type`, `description`,
  `service_fee_rate`, `insurance_level`, `tax_mode`,
  `applicable_scenarios`, `compliance_tags`,
  `sort_order`, `status`, `del_flag`
) VALUES
(
  'current',
  '当前处理方式',
  'traditional',
  '企业现有处理方式估算（非平台方案）',
  NULL,
  NULL,
  NULL,
  JSON_ARRAY(),
  JSON_ARRAY(),
  0,
  'active',
  0
),
(
  'SCHEME_A',
  '方案A 合规优先',
  'flexible',
  CONCAT(
    '用工方式：灵活用工协议；',
    '税费承担：平台代征；',
    '保险配置：高档雇主险；',
    '发票处理：平台开具6%专票；',
    '合规风险：低。',
    '核心优势：五流合一全额税前扣除；个税已申报企业无风险；高档雇主险覆盖工伤。',
    '示例（10人×2天、到手500/天）：劳务费10000 + 服务费800 + 保险200 + 税费代征1800 = 企业总支出12800；人均成本640/天。'
  ),
  0.0800,
  'premium',
  'platform_withhold',
  JSON_ARRAY('旺季临时工', '仓储搬运', '短期用工'),
  JSON_ARRAY('业务真实', '资金合规', '个税申报', '五流合一'),
  1,
  'active',
  0
),
(
  'SCHEME_B',
  '方案B 成本优先',
  'flexible',
  CONCAT(
    '用工方式：劳务协议；',
    '税费承担：企业代扣；',
    '保险配置：基础意外险；',
    '发票处理：代开发票；',
    '合规风险：中。',
    '注意事项：基础意外险保额较低；服务费率低发票额度有限；适合短期低风险用工。',
    '示例（10人×2天、到手480/天）：劳务费9600 + 服务费576 + 保险100 + 税费代征1224 = 企业总支出11500；人均成本575/天。'
  ),
  0.0600,
  'basic',
  'enterprise_withhold',
  JSON_ARRAY('短期低风险用工', '仓储搬运'),
  JSON_ARRAY('业务真实', '资金合规'),
  2,
  'active',
  0
),
(
  'SCHEME_C',
  '方案C 传统用工',
  'traditional',
  CONCAT(
    '用工方式：劳动合同；',
    '税费承担：企业全额缴纳；',
    '保险配置：社保+商业险；',
    '发票处理：工资表+个税；',
    '合规风险：高（需审查用工关系）。',
    '风险提示：需缴纳社保公积金成本高；用工关系复杂合规风险大；适合长期固定岗位。',
    '示例（10人×2天、到手500/天）：劳务费10000 + 社保公积金3200 + 管理成本2000 = 企业总支出15200；人均成本760/天。'
  ),
  0.2000,
  'standard',
  'enterprise_full',
  JSON_ARRAY('长期固定岗位'),
  JSON_ARRAY('需合规审查'),
  3,
  'active',
  0
);

INSERT INTO `fe_service_plan_fee_rule` (
  `plan_id`, `fee_code`, `fee_name`, `calc_type`, `calc_expression`, `default_rate`, `sort_order`
)
SELECT p.`id`, f.`fee_code`, f.`fee_name`, f.`calc_type`, f.`calc_expression`, f.`default_rate`, f.`sort_order`
FROM `fe_service_plan` p
INNER JOIN (
  SELECT 'SCHEME_A' AS plan_code, 'labor_fee' AS fee_code, '劳务费' AS fee_name,
         'formula' AS calc_type, 'gross' AS calc_expression, NULL AS default_rate, 1 AS sort_order
  UNION ALL SELECT 'SCHEME_A', 'service_fee', '平台服务费', 'rate', 'gross * service_fee_rate', 0.0800, 2
  UNION ALL SELECT 'SCHEME_A', 'insurance', '保险(高档雇主险)', 'fixed', 'per_person_period', 10.0000, 3
  UNION ALL SELECT 'SCHEME_A', 'tax_withhold', '税费代征', 'rate', 'gross * 0.18', 0.1800, 4
  UNION ALL SELECT 'SCHEME_B', 'labor_fee', '劳务费', 'formula', 'gross', NULL, 1
  UNION ALL SELECT 'SCHEME_B', 'service_fee', '平台服务费', 'rate', 'gross * service_fee_rate', 0.0600, 2
  UNION ALL SELECT 'SCHEME_B', 'insurance', '保险(基础意外险)', 'fixed', 'per_person_period', 5.0000, 3
  UNION ALL SELECT 'SCHEME_B', 'tax_withhold', '税费代征', 'rate', 'gross * 0.1275', 0.1275, 4
  UNION ALL SELECT 'SCHEME_C', 'labor_fee', '劳务费', 'formula', 'gross', NULL, 1
  UNION ALL SELECT 'SCHEME_C', 'insurance', '社保公积金', 'rate', 'gross * 0.32', 0.3200, 2
  UNION ALL SELECT 'SCHEME_C', 'service_fee', '管理成本', 'rate', 'gross * service_fee_rate', 0.2000, 3
) f ON p.`plan_code` = f.`plan_code`;

SET FOREIGN_KEY_CHECKS = 1;

-- 附录：主流程 draft -> enterprise_auth -> (worker_registration | worker_recruitment)
--       -> task_publish -> settlement -> invoice_archive
--       existing→人员登记；recruit→临时工招聘
