Sfoglia il codice sorgente

增加与ai大模型对话

wwh 1 settimana fa
parent
commit
d1b41abbab
2 ha cambiato i file con 209 aggiunte e 270 eliminazioni
  1. 89 150
      doc/灵活用工-mysql.sql
  2. 120 120
      doc/灵活用工.sql

+ 89 - 150
doc/灵活用工-mysql.sql

@@ -69,8 +69,8 @@ CREATE TABLE `fe_enterprise` (
69
 DROP TABLE IF EXISTS `fe_enterprise_user`;
69
 DROP TABLE IF EXISTS `fe_enterprise_user`;
70
 CREATE TABLE `fe_enterprise_user` (
70
 CREATE TABLE `fe_enterprise_user` (
71
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。绑定关系创建时生成。非空。',
71
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。绑定关系创建时生成。非空。',
72
-  `enterprise_id` BIGINT          NOT NULL COMMENT '关联企业主键,外键 REFERENCES fe_enterprise(id)。管理员邀请绑定或企业创建时写入。非空;级联查询企业下所有管理员。',
73
-  `user_id` BIGINT          NOT NULL COMMENT '关联微信用户主键,外键 REFERENCES fe_user(id)。被邀请用户接受绑定或企业创建者自动绑定时写入。非空;建立索引 idx_fe_enterprise_user_uid。',
72
+  `enterprise_id` BIGINT          NOT NULL COMMENT '关联企业主键,外键。管理员邀请绑定或企业创建时写入。非空;级联查询企业下所有管理员。',
73
+  `user_id` BIGINT          NOT NULL COMMENT '关联微信用户主键,外键。被邀请用户接受绑定或企业创建者自动绑定时写入。非空;建立索引 idx_fe_enterprise_user_uid。',
74
   `role` VARCHAR(20)     NOT NULL DEFAULT 'owner' COMMENT '用户在该企业下的权限角色。绑定或角色调整时由企业主/管理员写入。枚举:owner=主账号(最高权限);admin=管理员;viewer=只读。非空,默认 owner。',
74
   `role` VARCHAR(20)     NOT NULL DEFAULT 'owner' COMMENT '用户在该企业下的权限角色。绑定或角色调整时由企业主/管理员写入。枚举:owner=主账号(最高权限);admin=管理员;viewer=只读。非空,默认 owner。',
75
   `is_default` tinyint(1)         NOT NULL DEFAULT 0 COMMENT '是否为用户登录后的默认选中企业。用户切换默认企业或首次绑定时由应用层更新,同一 user_id 仅一条为 true。非空,默认 FALSE;影响 API 请求默认 enterprise_id。',
75
   `is_default` tinyint(1)         NOT NULL DEFAULT 0 COMMENT '是否为用户登录后的默认选中企业。用户切换默认企业或首次绑定时由应用层更新,同一 user_id 仅一条为 true。非空,默认 FALSE;影响 API 请求默认 enterprise_id。',
76
   `bind_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '绑定关系建立时间。绑定成功时写入,默认 NOW()。非空;用于审计。',
76
   `bind_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '绑定关系建立时间。绑定成功时写入,默认 NOW()。非空;用于审计。',
@@ -79,15 +79,13 @@ CREATE TABLE `fe_enterprise_user` (
79
   `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。解除绑定关系时置 1,非物理删除。枚举:0=正常;1=已解除。非空,默认 0;唯一索引 uk_fe_enterprise_user(enterprise_id,user_id) 在 del_flag=0 时生效。',
79
   `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。解除绑定关系时置 1,非物理删除。枚举:0=正常;1=已解除。非空,默认 0;唯一索引 uk_fe_enterprise_user(enterprise_id,user_id) 在 del_flag=0 时生效。',
80
   PRIMARY KEY (`id`),
80
   PRIMARY KEY (`id`),
81
   UNIQUE KEY `uk_fe_enterprise_user` (`enterprise_id`, `user_id`, `del_flag`),
81
   UNIQUE KEY `uk_fe_enterprise_user` (`enterprise_id`, `user_id`, `del_flag`),
82
-  KEY `idx_fe_enterprise_user_uid` (`user_id`),
83
-  CONSTRAINT `fk_fe_enterprise_user_enterprise_id` FOREIGN KEY (`enterprise_id`) REFERENCES `fe_enterprise` (`id`),
84
-  CONSTRAINT `fk_fe_enterprise_user_user_id` FOREIGN KEY (`user_id`) REFERENCES `fe_user` (`id`)
82
+  KEY `idx_fe_enterprise_user_uid` (`user_id`)
85
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='企业与微信用户的多对多绑定关系表,支持一企业多管理员、一用户管多企业。通过 is_default 标识用户登录后默认选中的企业上下文,关联 fe_enterprise 与 fe_user。';
83
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='企业与微信用户的多对多绑定关系表,支持一企业多管理员、一用户管多企业。通过 is_default 标识用户登录后默认选中的企业上下文,关联 fe_enterprise 与 fe_user。';
86
 
84
 
87
 DROP TABLE IF EXISTS `fe_enterprise_finance`;
85
 DROP TABLE IF EXISTS `fe_enterprise_finance`;
88
 CREATE TABLE `fe_enterprise_finance` (
86
 CREATE TABLE `fe_enterprise_finance` (
89
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。企业首次维护财务信息时生成。非空。',
87
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。企业首次维护财务信息时生成。非空。',
90
-  `enterprise_id` BIGINT          NOT NULL COMMENT '关联企业主键,外键 REFERENCES fe_enterprise(id)。财务信息首次录入时写入。非空;一对一,唯一索引 uk_fe_enterprise_finance。',
88
+  `enterprise_id` BIGINT          NOT NULL COMMENT '关联企业主键,外键。财务信息首次录入时写入。非空;一对一,唯一索引 uk_fe_enterprise_finance。',
91
   `bank_name` VARCHAR(100) COMMENT '对公账户开户银行名称。企业主在财务设置页填写时写入。示例:中国工商银行上海张江支行。可空。',
89
   `bank_name` VARCHAR(100) COMMENT '对公账户开户银行名称。企业主在财务设置页填写时写入。示例:中国工商银行上海张江支行。可空。',
92
   `bank_account_enc` TEXT COMMENT '对公银行账号加密密文。企业提交账户信息时由应用层加密写入。高度敏感;禁止明文入库与前端回显;可空。',
90
   `bank_account_enc` TEXT COMMENT '对公银行账号加密密文。企业提交账户信息时由应用层加密写入。高度敏感;禁止明文入库与前端回显;可空。',
93
   `bank_account_mask` VARCHAR(32) COMMENT '对公账号脱敏展示值。与 bank_account_enc 同时生成。示例:6222****1234。可空;供运营后台列表展示。',
91
   `bank_account_mask` VARCHAR(32) COMMENT '对公账号脱敏展示值。与 bank_account_enc 同时生成。示例:6222****1234。可空;供运营后台列表展示。',
@@ -99,14 +97,13 @@ CREATE TABLE `fe_enterprise_finance` (
99
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '财务信息变更时更新。非空。',
97
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '财务信息变更时更新。非空。',
100
   `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。',
98
   `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。',
101
   PRIMARY KEY (`id`),
99
   PRIMARY KEY (`id`),
102
-  UNIQUE KEY `uk_fe_enterprise_finance` (`enterprise_id`, `del_flag`),
103
-  CONSTRAINT `fk_fe_enterprise_finance_enterprise_id` FOREIGN KEY (`enterprise_id`) REFERENCES `fe_enterprise` (`id`)
100
+  UNIQUE KEY `uk_fe_enterprise_finance` (`enterprise_id`, `del_flag`)
104
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='企业财务与开票信息表,与企业主体一对一(enterprise_id 唯一)。存储对公账户密文、开票抬头、打款渠道等;小程序端仅展示渠道类型,不展示账户明细等敏感金融信息。';
101
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='企业财务与开票信息表,与企业主体一对一(enterprise_id 唯一)。存储对公账户密文、开票抬头、打款渠道等;小程序端仅展示渠道类型,不展示账户明细等敏感金融信息。';
105
 
102
 
106
 DROP TABLE IF EXISTS `fe_enterprise_preference`;
103
 DROP TABLE IF EXISTS `fe_enterprise_preference`;
107
 CREATE TABLE `fe_enterprise_preference` (
104
 CREATE TABLE `fe_enterprise_preference` (
108
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。偏好项创建时生成。非空。',
105
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。偏好项创建时生成。非空。',
109
-  `enterprise_id` BIGINT          NOT NULL COMMENT '关联企业主键,外键 REFERENCES fe_enterprise(id)。偏好配置时写入。非空;索引 idx_fe_enterprise_pref(enterprise_id,pref_type)。',
106
+  `enterprise_id` BIGINT          NOT NULL COMMENT '关联企业主键,外键。偏好配置时写入。非空;索引 idx_fe_enterprise_pref(enterprise_id,pref_type)。',
110
   `pref_type` VARCHAR(50)     NOT NULL COMMENT '偏好大类。用户或 AI 配置时写入。枚举:work_type=工种薪资基准;insurance=默认保险配置;payment_cycle=发薪/结算周期偏好。非空。',
107
   `pref_type` VARCHAR(50)     NOT NULL COMMENT '偏好大类。用户或 AI 配置时写入。枚举:work_type=工种薪资基准;insurance=默认保险配置;payment_cycle=发薪/结算周期偏好。非空。',
111
   `pref_key` VARCHAR(100) COMMENT '偏好子键,细分到具体工种或场景。示例:搬运工、仓库分拣。可空;同一 pref_type 下可有多条记录。',
108
   `pref_key` VARCHAR(100) COMMENT '偏好子键,细分到具体工种或场景。示例:搬运工、仓库分拣。可空;同一 pref_type 下可有多条记录。',
112
   `pref_value` json           NOT NULL COMMENT '结构化偏好值 JSON,承载薪资区间、保险方案参数等。AI 解析或用户表单提交时写入。示例:{"daily_wage":280,"currency":"CNY"}。非空,默认 {}。',
109
   `pref_value` json           NOT NULL COMMENT '结构化偏好值 JSON,承载薪资区间、保险方案参数等。AI 解析或用户表单提交时写入。示例:{"daily_wage":280,"currency":"CNY"}。非空,默认 {}。',
@@ -117,16 +114,15 @@ CREATE TABLE `fe_enterprise_preference` (
117
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '偏好值变更时更新。非空。',
114
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '偏好值变更时更新。非空。',
118
   `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。',
115
   `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。',
119
   PRIMARY KEY (`id`),
116
   PRIMARY KEY (`id`),
120
-  KEY `idx_fe_enterprise_pref` (`enterprise_id`, `pref_type`),
121
-  CONSTRAINT `fk_fe_enterprise_preference_enterprise_id` FOREIGN KEY (`enterprise_id`) REFERENCES `fe_enterprise` (`id`)
117
+  KEY `idx_fe_enterprise_pref` (`enterprise_id`, `pref_type`)
122
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='企业智能偏好配置表,存储工种薪资基准、默认保险档次、发薪结算周期等结构化偏好。支持用户自然语言配置后由 AI 解析入库,供草稿生成引擎复用,关联 fe_enterprise。';
118
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='企业智能偏好配置表,存储工种薪资基准、默认保险档次、发薪结算周期等结构化偏好。支持用户自然语言配置后由 AI 解析入库,供草稿生成引擎复用,关联 fe_enterprise。';
123
 
119
 
124
 DROP TABLE IF EXISTS `fe_conversation`;
120
 DROP TABLE IF EXISTS `fe_conversation`;
125
 CREATE TABLE `fe_conversation` (
121
 CREATE TABLE `fe_conversation` (
126
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。用户发起新对话时生成。非空;被消息表、草稿表外键引用。',
122
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。用户发起新对话时生成。非空;被消息表、草稿表外键引用。',
127
   `conversation_no` VARCHAR(32)     NOT NULL COMMENT '会话对外业务编号,API 路径与日志中使用。创建会话时由编号生成器写入。示例:conv_001。非空;唯一索引 uk_fe_conversation_no。',
123
   `conversation_no` VARCHAR(32)     NOT NULL COMMENT '会话对外业务编号,API 路径与日志中使用。创建会话时由编号生成器写入。示例:conv_001。非空;唯一索引 uk_fe_conversation_no。',
128
-  `enterprise_id` BIGINT          NOT NULL COMMENT '所属企业,外键 REFERENCES fe_enterprise(id)。创建会话时从当前登录上下文写入。非空;索引 idx_fe_conversation_ent 用于侧边栏按企业筛选。',
129
-  `user_id` BIGINT          NOT NULL COMMENT '发起对话的企业主用户,外键 REFERENCES fe_user(id)。创建会话时写入。非空;须为 enterprise 类型用户。',
124
+  `enterprise_id` BIGINT          NOT NULL COMMENT '所属企业,外键。创建会话时从当前登录上下文写入。非空;索引 idx_fe_conversation_ent 用于侧边栏按企业筛选。',
125
+  `user_id` BIGINT          NOT NULL COMMENT '发起对话的企业主用户,外键。创建会话时写入。非空;须为 enterprise 类型用户。',
130
   `title` VARCHAR(200) COMMENT '会话标题,侧边栏展示用。可由首条用户消息摘要或 AI 自动生成,用户可重命名。示例:浦东仓库暑期用工。可空。',
126
   `title` VARCHAR(200) COMMENT '会话标题,侧边栏展示用。可由首条用户消息摘要或 AI 自动生成,用户可重命名。示例:浦东仓库暑期用工。可空。',
131
   `chat_type` VARCHAR(30)     NOT NULL DEFAULT 'employment' COMMENT '对话专题类型,决定加载的子智能体与卡片模板。创建时根据入口或首条意图写入。枚举:employment=用工办理;knowledge=政策知识库;order=订单查询;cost=成本测算;attendance=考勤;emergency=应急咨询。非空,默认 employment。',
127
   `chat_type` VARCHAR(30)     NOT NULL DEFAULT 'employment' COMMENT '对话专题类型,决定加载的子智能体与卡片模板。创建时根据入口或首条意图写入。枚举:employment=用工办理;knowledge=政策知识库;order=订单查询;cost=成本测算;attendance=考勤;emergency=应急咨询。非空,默认 employment。',
132
   `status` VARCHAR(20)     NOT NULL DEFAULT 'active' COMMENT '会话生命周期状态。用户归档或长期无消息时更新。枚举:active=进行中;archived=已归档(只读)。非空,默认 active。',
128
   `status` VARCHAR(20)     NOT NULL DEFAULT 'active' COMMENT '会话生命周期状态。用户归档或长期无消息时更新。枚举:active=进行中;archived=已归档(只读)。非空,默认 active。',
@@ -136,15 +132,13 @@ CREATE TABLE `fe_conversation` (
136
   `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。',
132
   `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。',
137
   PRIMARY KEY (`id`),
133
   PRIMARY KEY (`id`),
138
   UNIQUE KEY `uk_fe_conversation_no` (`conversation_no`),
134
   UNIQUE KEY `uk_fe_conversation_no` (`conversation_no`),
139
-  KEY `idx_fe_conversation_ent` (`enterprise_id`, `last_message_at`),
140
-  CONSTRAINT `fk_fe_conversation_enterprise_id` FOREIGN KEY (`enterprise_id`) REFERENCES `fe_enterprise` (`id`),
141
-  CONSTRAINT `fk_fe_conversation_user_id` FOREIGN KEY (`user_id`) REFERENCES `fe_user` (`id`)
135
+  KEY `idx_fe_conversation_ent` (`enterprise_id`, `last_message_at`)
142
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI 对话会话主表,企业主与智能体交互的容器。通过 chat_type 区分用工、知识库、订单、成本等专题对话;一对多关联 fe_conversation_message。enterprise_id 与 user_id 共同界定会话归属与权限。';
136
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI 对话会话主表,企业主与智能体交互的容器。通过 chat_type 区分用工、知识库、订单、成本等专题对话;一对多关联 fe_conversation_message。enterprise_id 与 user_id 共同界定会话归属与权限。';
143
 
137
 
144
 DROP TABLE IF EXISTS `fe_conversation_message`;
138
 DROP TABLE IF EXISTS `fe_conversation_message`;
145
 CREATE TABLE `fe_conversation_message` (
139
 CREATE TABLE `fe_conversation_message` (
146
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。每条消息入库时生成。非空。',
140
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。每条消息入库时生成。非空。',
147
-  `conversation_id` BIGINT          NOT NULL COMMENT '所属会话,外键 REFERENCES fe_conversation(id)。发送消息时写入。非空;索引 idx_fe_conv_msg(conversation_id,create_time)。',
141
+  `conversation_id` BIGINT          NOT NULL COMMENT '所属会话,外键。发送消息时写入。非空;索引 idx_fe_conv_msg(conversation_id,create_time)。',
148
   `role` VARCHAR(20)     NOT NULL COMMENT '消息发送方角色。写入时由网关标记。枚举:user=企业主用户;assistant=AI 助手;system=系统提示(如流程引导)。非空。',
142
   `role` VARCHAR(20)     NOT NULL COMMENT '消息发送方角色。写入时由网关标记。枚举:user=企业主用户;assistant=AI 助手;system=系统提示(如流程引导)。非空。',
149
   `content` TEXT            NOT NULL COMMENT '消息正文文本或卡片摘要说明,供聊天气泡展示。用户输入或 AI 生成时写入。非空;长文本需注意截断策略。',
143
   `content` TEXT            NOT NULL COMMENT '消息正文文本或卡片摘要说明,供聊天气泡展示。用户输入或 AI 生成时写入。非空;长文本需注意截断策略。',
150
   `content_type` VARCHAR(30)     NOT NULL COMMENT '消息内容形态,决定前端渲染组件。写入时标记。枚举:text=纯文本;card_draft=用工草稿卡;card_cost=成本对比卡;card_order=订单进度卡。非空,默认 text。',
144
   `content_type` VARCHAR(30)     NOT NULL COMMENT '消息内容形态,决定前端渲染组件。写入时标记。枚举:text=纯文本;card_draft=用工草稿卡;card_cost=成本对比卡;card_order=订单进度卡。非空,默认 text。',
@@ -155,15 +149,14 @@ CREATE TABLE `fe_conversation_message` (
155
   `token_usage` json COMMENT '大模型 token 消耗统计 JSON,含 prompt/completion 分项。AI 调用完成后写入,供成本核算。示例:{"prompt":1200,"completion":800}。可空;不展示给用户。',
149
   `token_usage` json COMMENT '大模型 token 消耗统计 JSON,含 prompt/completion 分项。AI 调用完成后写入,供成本核算。示例:{"prompt":1200,"completion":800}。可空;不展示给用户。',
156
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '消息发送/入库时间,聊天气泡排序依据。非空,默认 NOW()。',
150
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '消息发送/入库时间,聊天气泡排序依据。非空,默认 NOW()。',
157
   PRIMARY KEY (`id`),
151
   PRIMARY KEY (`id`),
158
-  KEY `idx_fe_conv_msg` (`conversation_id`, `create_time`),
159
-  CONSTRAINT `fk_fe_conversation_message_conversation_id` FOREIGN KEY (`conversation_id`) REFERENCES `fe_conversation` (`id`)
152
+  KEY `idx_fe_conv_msg` (`conversation_id`, `create_time`)
160
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='对话消息明细表,存储用户与助手往返的文本及结构化卡片(草稿卡、成本卡、订单卡)。通过 next_action 驱动小程序路由跳转;关联 fe_conversation,可软链 fe_employment_draft。';
153
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='对话消息明细表,存储用户与助手往返的文本及结构化卡片(草稿卡、成本卡、订单卡)。通过 next_action 驱动小程序路由跳转;关联 fe_conversation,可软链 fe_employment_draft。';
161
 
154
 
162
 DROP TABLE IF EXISTS `fe_agent_action_log`;
155
 DROP TABLE IF EXISTS `fe_agent_action_log`;
163
 CREATE TABLE `fe_agent_action_log` (
156
 CREATE TABLE `fe_agent_action_log` (
164
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。每次子模块调用时生成。非空。',
157
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。每次子模块调用时生成。非空。',
165
-  `conversation_id` BIGINT COMMENT '关联会话,外键 REFERENCES fe_conversation(id)。对话内调用时写入;后台定时任务触发时可为空。可空。',
166
-  `enterprise_id` BIGINT          NOT NULL COMMENT '所属企业,外键 REFERENCES fe_enterprise(id)。调用上下文中的企业 ID,必填以便按企业排障。非空;索引 idx_fe_agent_log。',
158
+  `conversation_id` BIGINT COMMENT '关联会话,外键。对话内调用时写入;后台定时任务触发时可为空。可空。',
159
+  `enterprise_id` BIGINT          NOT NULL COMMENT '所属企业,外键。调用上下文中的企业 ID,必填以便按企业排障。非空;索引 idx_fe_agent_log。',
167
   `module_name` VARCHAR(50)     NOT NULL COMMENT '被调用的模块名称。调用发起时写入。枚举示例:main_agent=主路由;flexible_employment=用工子模块;cost_engine=成本测算引擎。非空。',
160
   `module_name` VARCHAR(50)     NOT NULL COMMENT '被调用的模块名称。调用发起时写入。枚举示例:main_agent=主路由;flexible_employment=用工子模块;cost_engine=成本测算引擎。非空。',
168
   `action` VARCHAR(100)    NOT NULL COMMENT '模块内具体动作编码。示例:generate_draft、calc_cost、parse_nl_preference。非空;与 module_name 组合定位代码路径。',
161
   `action` VARCHAR(100)    NOT NULL COMMENT '模块内具体动作编码。示例:generate_draft、calc_cost、parse_nl_preference。非空;与 module_name 组合定位代码路径。',
169
   `request_json` json COMMENT '请求体 JSON 快照,含用户输入与上下文参数。调用前由中间件序列化写入。可空;可能含业务敏感字段,访问需授权。',
162
   `request_json` json COMMENT '请求体 JSON 快照,含用户输入与上下文参数。调用前由中间件序列化写入。可空;可能含业务敏感字段,访问需授权。',
@@ -173,9 +166,7 @@ CREATE TABLE `fe_agent_action_log` (
173
   `duration_ms` int COMMENT '调用耗时(毫秒)。调用结束时计算写入。示例:2350。可空;用于性能监控。',
166
   `duration_ms` int COMMENT '调用耗时(毫秒)。调用结束时计算写入。示例:2350。可空;用于性能监控。',
174
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '调用发生时间。非空;按时间倒序查最近异常。',
167
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '调用发生时间。非空;按时间倒序查最近异常。',
175
   PRIMARY KEY (`id`),
168
   PRIMARY KEY (`id`),
176
-  KEY `idx_fe_agent_log` (`enterprise_id`, `create_time`),
177
-  CONSTRAINT `fk_fe_agent_action_log_conversation_id` FOREIGN KEY (`conversation_id`) REFERENCES `fe_conversation` (`id`),
178
-  CONSTRAINT `fk_fe_agent_action_log_enterprise_id` FOREIGN KEY (`enterprise_id`) REFERENCES `fe_enterprise` (`id`)
169
+  KEY `idx_fe_agent_log` (`enterprise_id`, `create_time`)
179
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='智能体与子模块调用审计日志表,记录主智能体、灵活用工模块、成本引擎等的入参出参与耗时。用于技术排障与合规审计,不对小程序用户直接展示;可关联 fe_conversation。';
170
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='智能体与子模块调用审计日志表,记录主智能体、灵活用工模块、成本引擎等的入参出参与耗时。用于技术排障与合规审计,不对小程序用户直接展示;可关联 fe_conversation。';
180
 
171
 
181
 DROP TABLE IF EXISTS `fe_service_plan`;
172
 DROP TABLE IF EXISTS `fe_service_plan`;
@@ -204,7 +195,7 @@ CREATE TABLE `fe_service_plan` (
204
 DROP TABLE IF EXISTS `fe_service_plan_fee_rule`;
195
 DROP TABLE IF EXISTS `fe_service_plan_fee_rule`;
205
 CREATE TABLE `fe_service_plan_fee_rule` (
196
 CREATE TABLE `fe_service_plan_fee_rule` (
206
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。运营为方案配置费用项时生成。非空。',
197
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。运营为方案配置费用项时生成。非空。',
207
-  `plan_id` BIGINT          NOT NULL COMMENT '关联方案,外键 REFERENCES fe_service_plan(id)。配置费用规则时写入。非空;索引 idx_fe_plan_fee。',
198
+  `plan_id` BIGINT          NOT NULL COMMENT '关联方案,外键。配置费用规则时写入。非空;索引 idx_fe_plan_fee。',
208
   `fee_code` VARCHAR(50)     NOT NULL COMMENT '费用项编码。枚举:labor_fee=劳务费;service_fee=平台服务费;insurance=保险费;tax_withhold=税费代征。非空。',
199
   `fee_code` VARCHAR(50)     NOT NULL COMMENT '费用项编码。枚举:labor_fee=劳务费;service_fee=平台服务费;insurance=保险费;tax_withhold=税费代征。非空。',
209
   `fee_name` VARCHAR(100)    NOT NULL COMMENT '费用项中文展示名。示例:劳务费、服务费。非空。',
200
   `fee_name` VARCHAR(100)    NOT NULL COMMENT '费用项中文展示名。示例:劳务费、服务费。非空。',
210
   `calc_type` VARCHAR(30)     NOT NULL COMMENT '计算方式类型。枚举:fixed=固定金额;rate=按基数比例;formula=自定义公式(由 calc_expression 描述)。非空。',
201
   `calc_type` VARCHAR(30)     NOT NULL COMMENT '计算方式类型。枚举:fixed=固定金额;rate=按基数比例;formula=自定义公式(由 calc_expression 描述)。非空。',
@@ -214,8 +205,7 @@ CREATE TABLE `fe_service_plan_fee_rule` (
214
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间。非空。',
205
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间。非空。',
215
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '规则变更时更新。非空。',
206
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '规则变更时更新。非空。',
216
   PRIMARY KEY (`id`),
207
   PRIMARY KEY (`id`),
217
-  KEY `idx_fe_plan_fee` (`plan_id`),
218
-  CONSTRAINT `fk_fe_service_plan_fee_rule_plan_id` FOREIGN KEY (`plan_id`) REFERENCES `fe_service_plan` (`id`)
208
+  KEY `idx_fe_plan_fee` (`plan_id`)
219
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='方案费用项计算规则表,定义劳务费、服务费、保险、税费代征等分项的计算方式(固定额/比例/公式)。成本测算引擎读取本表与 fe_service_plan 联合计算;一对多归属 plan_id。';
209
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='方案费用项计算规则表,定义劳务费、服务费、保险、税费代征等分项的计算方式(固定额/比例/公式)。成本测算引擎读取本表与 fe_service_plan 联合计算;一对多归属 plan_id。';
220
 
210
 
221
 DROP TABLE IF EXISTS `fe_workflow_definition`;
211
 DROP TABLE IF EXISTS `fe_workflow_definition`;
@@ -235,7 +225,7 @@ CREATE TABLE `fe_workflow_definition` (
235
 DROP TABLE IF EXISTS `fe_workflow_step`;
225
 DROP TABLE IF EXISTS `fe_workflow_step`;
236
 CREATE TABLE `fe_workflow_step` (
226
 CREATE TABLE `fe_workflow_step` (
237
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。流程版本初始化时批量插入。非空。',
227
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。流程版本初始化时批量插入。非空。',
238
-  `workflow_id` BIGINT          NOT NULL COMMENT '关联流程定义,外键 REFERENCES fe_workflow_definition(id)。步骤归属的流程版本。非空。',
228
+  `workflow_id` BIGINT          NOT NULL COMMENT '关联流程定义,外键。步骤归属的流程版本。非空。',
239
   `step_code` VARCHAR(50)     NOT NULL COMMENT '步骤唯一编码,订单 current_step_code 引用此值。枚举(九步):draft_created=草稿创建;plan_confirmed=方案确认;registration=扫码登记;enterprise_audit=企业审核;contract_signing=合同签署;work_started=开始用工;settlement_pending=待结算;settlement_paid=已支付;completed=已完成。非空;与 workflow_id 组成唯一索引。',
229
   `step_code` VARCHAR(50)     NOT NULL COMMENT '步骤唯一编码,订单 current_step_code 引用此值。枚举(九步):draft_created=草稿创建;plan_confirmed=方案确认;registration=扫码登记;enterprise_audit=企业审核;contract_signing=合同签署;work_started=开始用工;settlement_pending=待结算;settlement_paid=已支付;completed=已完成。非空;与 workflow_id 组成唯一索引。',
240
   `step_name` VARCHAR(100)    NOT NULL COMMENT '步骤中文展示名。示例:扫码登记、合同签署。非空。',
230
   `step_name` VARCHAR(100)    NOT NULL COMMENT '步骤中文展示名。示例:扫码登记、合同签署。非空。',
241
   `step_order` int         NOT NULL COMMENT '步骤顺序号,从小到大推进。初始化时写入 1-9。非空。',
231
   `step_order` int         NOT NULL COMMENT '步骤顺序号,从小到大推进。初始化时写入 1-9。非空。',
@@ -243,8 +233,7 @@ CREATE TABLE `fe_workflow_step` (
243
   `auto_advance` tinyint(1)         NOT NULL DEFAULT 0 COMMENT '满足系统条件后是否自动推进到下一步,无需人工点击。非空,默认 FALSE;如登记人数达标可自动推进。',
233
   `auto_advance` tinyint(1)         NOT NULL DEFAULT 0 COMMENT '满足系统条件后是否自动推进到下一步,无需人工点击。非空,默认 FALSE;如登记人数达标可自动推进。',
244
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '步骤定义创建时间。非空。',
234
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '步骤定义创建时间。非空。',
245
   PRIMARY KEY (`id`),
235
   PRIMARY KEY (`id`),
246
-  UNIQUE KEY `uk_fe_workflow_step` (`workflow_id`, `step_code`),
247
-  CONSTRAINT `fk_fe_workflow_step_workflow_id` FOREIGN KEY (`workflow_id`) REFERENCES `fe_workflow_definition` (`id`)
236
+  UNIQUE KEY `uk_fe_workflow_step` (`workflow_id`, `step_code`)
248
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='合规流程步骤定义表,订单 fe_employment_order.current_step_code 对应本表 step_code。强制校验实名、合同、结算、完税、开票等必经节点完整性;归属 fe_workflow_definition。';
237
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='合规流程步骤定义表,订单 fe_employment_order.current_step_code 对应本表 step_code。强制校验实名、合同、结算、完税、开票等必经节点完整性;归属 fe_workflow_definition。';
249
 
238
 
250
 DROP TABLE IF EXISTS `fe_policy_rule`;
239
 DROP TABLE IF EXISTS `fe_policy_rule`;
@@ -268,9 +257,9 @@ DROP TABLE IF EXISTS `fe_employment_draft`;
268
 CREATE TABLE `fe_employment_draft` (
257
 CREATE TABLE `fe_employment_draft` (
269
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。AI 子模块生成草稿时创建。非空;被 fe_draft_field、fe_draft_cost_snapshot 引用。',
258
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。AI 子模块生成草稿时创建。非空;被 fe_draft_field、fe_draft_cost_snapshot 引用。',
270
   `draft_no` VARCHAR(32)     NOT NULL COMMENT '草稿业务编号,对外 API 使用。生成时由编号器写入。示例:draft_001。非空;唯一索引 uk_fe_draft_no。',
259
   `draft_no` VARCHAR(32)     NOT NULL COMMENT '草稿业务编号,对外 API 使用。生成时由编号器写入。示例:draft_001。非空;唯一索引 uk_fe_draft_no。',
271
-  `enterprise_id` BIGINT          NOT NULL COMMENT '所属企业,外键 REFERENCES fe_enterprise(id)。从对话上下文写入。非空;索引 idx_fe_draft_ent。',
272
-  `user_id` BIGINT          NOT NULL COMMENT '发起草稿的企业主用户,外键 REFERENCES fe_user(id)。创建时从 fe_conversation.user_id 写入。非空;索引 idx_fe_draft_user。',
273
-  `conversation_id` BIGINT COMMENT '来源 AI 对话,外键 REFERENCES fe_conversation(id)。对话触发生成时写入;后台批量生成可为空。可空。',
260
+  `enterprise_id` BIGINT          NOT NULL COMMENT '所属企业,外键。从对话上下文写入。非空;索引 idx_fe_draft_ent。',
261
+  `user_id` BIGINT          NOT NULL COMMENT '发起草稿的企业主用户,外键。创建时从 fe_conversation.user_id 写入。非空;索引 idx_fe_draft_user。',
262
+  `conversation_id` BIGINT COMMENT '来源 AI 对话,外键。对话触发生成时写入;后台批量生成可为空。可空。',
274
   `scenario` VARCHAR(50)     NOT NULL COMMENT '用工业务场景类型。AI 识别用户意图时写入。枚举:existing_worker_regularization=已有非正规临时工规范转正;new_demand=全新用工需求。非空。',
263
   `scenario` VARCHAR(50)     NOT NULL COMMENT '用工业务场景类型。AI 识别用户意图时写入。枚举:existing_worker_regularization=已有非正规临时工规范转正;new_demand=全新用工需求。非空。',
275
   `title` VARCHAR(200) COMMENT '草稿标题,列表与卡片展示。AI 摘要或用户输入。示例:浦东仓库暑期搬运。可空。',
264
   `title` VARCHAR(200) COMMENT '草稿标题,列表与卡片展示。AI 摘要或用户输入。示例:浦东仓库暑期搬运。可空。',
276
   `status` VARCHAR(20)     NOT NULL DEFAULT 'pending' COMMENT '草稿生命周期状态。枚举:pending=待用户确认;confirmed=已确认并转订单;cancelled=用户取消;expired=超时未确认自动过期。非空,默认 pending。',
265
   `status` VARCHAR(20)     NOT NULL DEFAULT 'pending' COMMENT '草稿生命周期状态。枚举:pending=待用户确认;confirmed=已确认并转订单;cancelled=用户取消;expired=超时未确认自动过期。非空,默认 pending。',
@@ -293,27 +282,22 @@ CREATE TABLE `fe_employment_draft` (
293
   `risk_prompts` json COMMENT '风险提示 JSON 数组,合规引擎输出。示例:["未签劳动合同存在用工风险"]。可空,默认 []。',
282
   `risk_prompts` json COMMENT '风险提示 JSON 数组,合规引擎输出。示例:["未签劳动合同存在用工风险"]。可空,默认 []。',
294
   `estimated_total` decimal(14,2) COMMENT '预估企业总支出(元)。成本引擎测算后回写。可空。',
283
   `estimated_total` decimal(14,2) COMMENT '预估企业总支出(元)。成本引擎测算后回写。可空。',
295
   `estimated_per_capita` decimal(12,2) COMMENT '预估人均成本(元)。成本引擎测算后回写。可空。',
284
   `estimated_per_capita` decimal(12,2) COMMENT '预估人均成本(元)。成本引擎测算后回写。可空。',
296
-  `selected_plan_id` BIGINT COMMENT '用户选中的用工方案,外键 REFERENCES fe_service_plan(id)。用户在成本对比页确认方案时写入;确认草稿时必填。可空(待确认阶段)。',
285
+  `selected_plan_id` BIGINT COMMENT '用户选中的用工方案,外键。用户在成本对比页确认方案时写入;确认草稿时必填。可空(待确认阶段)。',
297
   `confirmed_at` datetime COMMENT '用户点击确认草稿的时间戳。确认接口成功时写入。可空。',
286
   `confirmed_at` datetime COMMENT '用户点击确认草稿的时间戳。确认接口成功时写入。可空。',
298
-  `confirmed_by` BIGINT COMMENT '确认操作用户,外键 REFERENCES fe_user(id)。确认接口写入。可空。',
287
+  `confirmed_by` BIGINT COMMENT '确认操作用户,外键。确认接口写入。可空。',
299
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '草稿创建时间。非空。',
288
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '草稿创建时间。非空。',
300
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '草稿字段或状态变更时更新。非空。',
289
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '草稿字段或状态变更时更新。非空。',
301
   `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。',
290
   `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。',
302
   PRIMARY KEY (`id`),
291
   PRIMARY KEY (`id`),
303
   UNIQUE KEY `uk_fe_draft_no` (`draft_no`),
292
   UNIQUE KEY `uk_fe_draft_no` (`draft_no`),
304
   KEY `idx_fe_draft_ent` (`enterprise_id`, `status`, `create_time`),
293
   KEY `idx_fe_draft_ent` (`enterprise_id`, `status`, `create_time`),
305
-  KEY `idx_fe_draft_user` (`user_id`, `status`, `create_time`),
306
-  CONSTRAINT `fk_fe_employment_draft_enterprise_id` FOREIGN KEY (`enterprise_id`) REFERENCES `fe_enterprise` (`id`),
307
-  CONSTRAINT `fk_fe_employment_draft_user_id` FOREIGN KEY (`user_id`) REFERENCES `fe_user` (`id`),
308
-  CONSTRAINT `fk_fe_employment_draft_conversation_id` FOREIGN KEY (`conversation_id`) REFERENCES `fe_conversation` (`id`),
309
-  CONSTRAINT `fk_fe_employment_draft_selected_plan_id` FOREIGN KEY (`selected_plan_id`) REFERENCES `fe_service_plan` (`id`),
310
-  CONSTRAINT `fk_fe_employment_draft_confirmed_by` FOREIGN KEY (`confirmed_by`) REFERENCES `fe_user` (`id`)
294
+  KEY `idx_fe_draft_user` (`user_id`, `status`, `create_time`)
311
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用工草稿主表,体现「草稿优先」产品原则:AI 根据对话生成,用户确认前均为草稿状态。确认并选定方案后生成 fe_employment_order 与 fe_registration_batch;关联 fe_enterprise、fe_conversation、fe_service_plan。';
295
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用工草稿主表,体现「草稿优先」产品原则:AI 根据对话生成,用户确认前均为草稿状态。确认并选定方案后生成 fe_employment_order 与 fe_registration_batch;关联 fe_enterprise、fe_conversation、fe_service_plan。';
312
 
296
 
313
 DROP TABLE IF EXISTS `fe_draft_field`;
297
 DROP TABLE IF EXISTS `fe_draft_field`;
314
 CREATE TABLE `fe_draft_field` (
298
 CREATE TABLE `fe_draft_field` (
315
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。草稿生成或字段补全时插入。非空。',
299
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。草稿生成或字段补全时插入。非空。',
316
-  `draft_id` BIGINT          NOT NULL COMMENT '关联草稿,外键 REFERENCES fe_employment_draft(id)。非空;与 field_key 组成唯一索引 uk_fe_draft_field。',
300
+  `draft_id` BIGINT          NOT NULL COMMENT '关联草稿,外键。非空;与 field_key 组成唯一索引 uk_fe_draft_field。',
317
   `field_key` VARCHAR(100)    NOT NULL COMMENT '字段键名,与草稿主表列名或扩展字段对应。示例:work_location、daily_wage。非空。',
301
   `field_key` VARCHAR(100)    NOT NULL COMMENT '字段键名,与草稿主表列名或扩展字段对应。示例:work_location、daily_wage。非空。',
318
   `field_label` VARCHAR(100) COMMENT '字段中文标签,表单展示用。示例:工作地点、日薪标准。可空。',
302
   `field_label` VARCHAR(100) COMMENT '字段中文标签,表单展示用。示例:工作地点、日薪标准。可空。',
319
   `field_value` TEXT COMMENT '简单文本类型字段值。用户输入或 AI 填充时写入。可空;复杂结构用 value_json。',
303
   `field_value` TEXT COMMENT '简单文本类型字段值。用户输入或 AI 填充时写入。可空;复杂结构用 value_json。',
@@ -324,15 +308,14 @@ CREATE TABLE `fe_draft_field` (
324
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '字段记录创建时间。非空。',
308
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '字段记录创建时间。非空。',
325
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '字段值变更时更新。非空。',
309
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '字段值变更时更新。非空。',
326
   PRIMARY KEY (`id`),
310
   PRIMARY KEY (`id`),
327
-  UNIQUE KEY `uk_fe_draft_field` (`draft_id`, `field_key`),
328
-  CONSTRAINT `fk_fe_draft_field_draft_id` FOREIGN KEY (`draft_id`) REFERENCES `fe_employment_draft` (`id`)
311
+  UNIQUE KEY `uk_fe_draft_field` (`draft_id`, `field_key`)
329
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='草稿字段明细细表,逐字段记录值、数据来源与可编辑性,支撑前端「默认生成」角标(is_default=true)与字段级审计。一对多归属 fe_employment_draft。';
312
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='草稿字段明细细表,逐字段记录值、数据来源与可编辑性,支撑前端「默认生成」角标(is_default=true)与字段级审计。一对多归属 fe_employment_draft。';
330
 
313
 
331
 DROP TABLE IF EXISTS `fe_draft_cost_snapshot`;
314
 DROP TABLE IF EXISTS `fe_draft_cost_snapshot`;
332
 CREATE TABLE `fe_draft_cost_snapshot` (
315
 CREATE TABLE `fe_draft_cost_snapshot` (
333
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。成本引擎每次全量测算时批量插入。非空。',
316
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。成本引擎每次全量测算时批量插入。非空。',
334
-  `draft_id` BIGINT          NOT NULL COMMENT '关联草稿,外键 REFERENCES fe_employment_draft(id)。非空;索引 idx_fe_cost_snapshot。',
335
-  `plan_id` BIGINT COMMENT '关联方案目录,外键 REFERENCES fe_service_plan(id)。current 行可能为空(表示非平台方案)。可空。',
317
+  `draft_id` BIGINT          NOT NULL COMMENT '关联草稿,外键。非空;索引 idx_fe_cost_snapshot。',
318
+  `plan_id` BIGINT COMMENT '关联方案目录,外键。current 行可能为空(表示非平台方案)。可空。',
336
   `plan_code` VARCHAR(32)     NOT NULL COMMENT '方案编码快照,防止方案后续改名影响历史展示。示例:plan_1。非空。',
319
   `plan_code` VARCHAR(32)     NOT NULL COMMENT '方案编码快照,防止方案后续改名影响历史展示。示例:plan_1。非空。',
337
   `plan_name` VARCHAR(100)    NOT NULL COMMENT '方案名称快照。示例:合规优先 (A)。非空。',
320
   `plan_name` VARCHAR(100)    NOT NULL COMMENT '方案名称快照。示例:合规优先 (A)。非空。',
338
   `employer_total_outflow` decimal(14,2)   NOT NULL COMMENT '企业总支出(元),含劳务+服务费+保险+税费等。成本引擎计算写入。非空。',
321
   `employer_total_outflow` decimal(14,2)   NOT NULL COMMENT '企业总支出(元),含劳务+服务费+保险+税费等。成本引擎计算写入。非空。',
@@ -345,33 +328,30 @@ CREATE TABLE `fe_draft_cost_snapshot` (
345
   `calc_version` VARCHAR(20) COMMENT '测算引擎版本号,便于回放与排障。示例:v1.2.0。可空。',
328
   `calc_version` VARCHAR(20) COMMENT '测算引擎版本号,便于回放与排障。示例:v1.2.0。可空。',
346
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '快照生成时间,同一 draft_id 下多条记录时间相近。非空。',
329
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '快照生成时间,同一 draft_id 下多条记录时间相近。非空。',
347
   PRIMARY KEY (`id`),
330
   PRIMARY KEY (`id`),
348
-  KEY `idx_fe_cost_snapshot` (`draft_id`),
349
-  CONSTRAINT `fk_fe_draft_cost_snapshot_draft_id` FOREIGN KEY (`draft_id`) REFERENCES `fe_employment_draft` (`id`),
350
-  CONSTRAINT `fk_fe_draft_cost_snapshot_plan_id` FOREIGN KEY (`plan_id`) REFERENCES `fe_service_plan` (`id`)
331
+  KEY `idx_fe_cost_snapshot` (`draft_id`)
351
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='草稿成本对比快照表,一次测算为同一草稿生成多行(current + plan_1/2/3)。核心指标:企业总支出、人均成本、员工到手;一对多关联 fe_draft_cost_detail。';
332
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='草稿成本对比快照表,一次测算为同一草稿生成多行(current + plan_1/2/3)。核心指标:企业总支出、人均成本、员工到手;一对多关联 fe_draft_cost_detail。';
352
 
333
 
353
 DROP TABLE IF EXISTS `fe_draft_cost_detail`;
334
 DROP TABLE IF EXISTS `fe_draft_cost_detail`;
354
 CREATE TABLE `fe_draft_cost_detail` (
335
 CREATE TABLE `fe_draft_cost_detail` (
355
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。生成快照时同步插入各费用项。非空。',
336
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。生成快照时同步插入各费用项。非空。',
356
-  `snapshot_id` BIGINT          NOT NULL COMMENT '关联成本快照,外键 REFERENCES fe_draft_cost_snapshot(id)。非空;索引 idx_fe_cost_detail。',
337
+  `snapshot_id` BIGINT          NOT NULL COMMENT '关联成本快照,外键。非空;索引 idx_fe_cost_detail。',
357
   `fee_code` VARCHAR(50)     NOT NULL COMMENT '费用项编码,与 fe_service_plan_fee_rule.fee_code 对齐。示例:labor_fee、service_fee。非空。',
338
   `fee_code` VARCHAR(50)     NOT NULL COMMENT '费用项编码,与 fe_service_plan_fee_rule.fee_code 对齐。示例:labor_fee、service_fee。非空。',
358
   `fee_name` VARCHAR(100)    NOT NULL COMMENT '费用项中文名。示例:劳务费、平台服务费。非空。',
339
   `fee_name` VARCHAR(100)    NOT NULL COMMENT '费用项中文名。示例:劳务费、平台服务费。非空。',
359
   `amount` decimal(14,2)   NOT NULL COMMENT '该费用项金额(元),NUMERIC(14,2)。非空。',
340
   `amount` decimal(14,2)   NOT NULL COMMENT '该费用项金额(元),NUMERIC(14,2)。非空。',
360
   `rate` decimal(8,4) COMMENT '适用费率或系数,NUMERIC(8,4)。可空;固定额费用项无费率。',
341
   `rate` decimal(8,4) COMMENT '适用费率或系数,NUMERIC(8,4)。可空;固定额费用项无费率。',
361
   `sort_order` int         NOT NULL DEFAULT 0 COMMENT '明细列表展示顺序。非空,默认 0。',
342
   `sort_order` int         NOT NULL DEFAULT 0 COMMENT '明细列表展示顺序。非空,默认 0。',
362
   PRIMARY KEY (`id`),
343
   PRIMARY KEY (`id`),
363
-  KEY `idx_fe_cost_detail` (`snapshot_id`),
364
-  CONSTRAINT `fk_fe_draft_cost_detail_snapshot_id` FOREIGN KEY (`snapshot_id`) REFERENCES `fe_draft_cost_snapshot` (`id`)
344
+  KEY `idx_fe_cost_detail` (`snapshot_id`)
365
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='成本对比费用明细细表,对应快照下劳务费、服务费、保险、税费代征等分项金额与费率。归属 fe_draft_cost_snapshot,供前端展开明细列表。';
345
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='成本对比费用明细细表,对应快照下劳务费、服务费、保险、税费代征等分项金额与费率。归属 fe_draft_cost_snapshot,供前端展开明细列表。';
366
 
346
 
367
 DROP TABLE IF EXISTS `fe_employment_order`;
347
 DROP TABLE IF EXISTS `fe_employment_order`;
368
 CREATE TABLE `fe_employment_order` (
348
 CREATE TABLE `fe_employment_order` (
369
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。草稿确认接口成功时创建。非空。',
349
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。草稿确认接口成功时创建。非空。',
370
   `order_no` VARCHAR(32)     NOT NULL COMMENT '订单业务编号,企业主可见。示例:2024-001、ORD20260707001。非空;唯一索引 uk_fe_order_no。',
350
   `order_no` VARCHAR(32)     NOT NULL COMMENT '订单业务编号,企业主可见。示例:2024-001、ORD20260707001。非空;唯一索引 uk_fe_order_no。',
371
-  `enterprise_id` BIGINT          NOT NULL COMMENT '所属企业,外键 REFERENCES fe_enterprise(id)。非空;索引 idx_fe_order_ent。',
372
-  `user_id` BIGINT          NOT NULL COMMENT '下单企业主用户,外键 REFERENCES fe_user(id)。确认草稿时从 fe_employment_draft.user_id 复制。非空;索引 idx_fe_order_user。',
373
-  `draft_id` BIGINT COMMENT '来源草稿,外键 REFERENCES fe_employment_draft(id)。确认时写入,追溯对话与方案选择。可空(极少数后台直创订单)。',
374
-  `selected_plan_id` BIGINT COMMENT '确认选用的用工方案,外键 REFERENCES fe_service_plan(id)。草稿确认时从 draft.selected_plan_id 复制。可空;应尽早补齐。',
351
+  `enterprise_id` BIGINT          NOT NULL COMMENT '所属企业,外键。非空;索引 idx_fe_order_ent。',
352
+  `user_id` BIGINT          NOT NULL COMMENT '下单企业主用户,外键。确认草稿时从 fe_employment_draft.user_id 复制。非空;索引 idx_fe_order_user。',
353
+  `draft_id` BIGINT COMMENT '来源草稿,外键。确认时写入,追溯对话与方案选择。可空(极少数后台直创订单)。',
354
+  `selected_plan_id` BIGINT COMMENT '确认选用的用工方案,外键。草稿确认时从 draft.selected_plan_id 复制。可空;应尽早补齐。',
375
   `title` VARCHAR(200)    NOT NULL COMMENT '订单标题,通常继承草稿标题。非空。',
355
   `title` VARCHAR(200)    NOT NULL COMMENT '订单标题,通常继承草稿标题。非空。',
376
   `worker_count` int         NOT NULL COMMENT '计划用工人数。非空;与登记批次 expected_count 对齐。',
356
   `worker_count` int         NOT NULL COMMENT '计划用工人数。非空;与登记批次 expected_count 对齐。',
377
   `work_days` decimal(8,2) COMMENT '工作天数,支持小数。可空。',
357
   `work_days` decimal(8,2) COMMENT '工作天数,支持小数。可空。',
@@ -391,11 +371,7 @@ CREATE TABLE `fe_employment_order` (
391
   PRIMARY KEY (`id`),
371
   PRIMARY KEY (`id`),
392
   UNIQUE KEY `uk_fe_order_no` (`order_no`),
372
   UNIQUE KEY `uk_fe_order_no` (`order_no`),
393
   KEY `idx_fe_order_ent` (`enterprise_id`, `order_status`, `create_time`),
373
   KEY `idx_fe_order_ent` (`enterprise_id`, `order_status`, `create_time`),
394
-  KEY `idx_fe_order_user` (`user_id`, `order_status`, `create_time`),
395
-  CONSTRAINT `fk_fe_employment_order_enterprise_id` FOREIGN KEY (`enterprise_id`) REFERENCES `fe_enterprise` (`id`),
396
-  CONSTRAINT `fk_fe_employment_order_user_id` FOREIGN KEY (`user_id`) REFERENCES `fe_user` (`id`),
397
-  CONSTRAINT `fk_fe_employment_order_draft_id` FOREIGN KEY (`draft_id`) REFERENCES `fe_employment_draft` (`id`),
398
-  CONSTRAINT `fk_fe_employment_order_selected_plan_id` FOREIGN KEY (`selected_plan_id`) REFERENCES `fe_service_plan` (`id`)
374
+  KEY `idx_fe_order_user` (`user_id`, `order_status`, `create_time`)
399
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用工订单主表,草稿确认并选定方案后生成,承载办理全流程业务状态与登记进度冗余统计。current_step_code 驱动合规状态机;关联 fe_enterprise、fe_employment_draft、fe_service_plan,一对多关联登记批次与结算单。';
375
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用工订单主表,草稿确认并选定方案后生成,承载办理全流程业务状态与登记进度冗余统计。current_step_code 驱动合规状态机;关联 fe_enterprise、fe_employment_draft、fe_service_plan,一对多关联登记批次与结算单。';
400
 
376
 
401
 DROP TABLE IF EXISTS `fe_registration_batch`;
377
 DROP TABLE IF EXISTS `fe_registration_batch`;
@@ -429,26 +405,24 @@ CREATE TABLE `fe_registration_batch` (
429
 DROP TABLE IF EXISTS `fe_order_workflow_log`;
405
 DROP TABLE IF EXISTS `fe_order_workflow_log`;
430
 CREATE TABLE `fe_order_workflow_log` (
406
 CREATE TABLE `fe_order_workflow_log` (
431
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。每次步骤推进时追加写入,不可修改。非空。',
407
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。每次步骤推进时追加写入,不可修改。非空。',
432
-  `order_id` BIGINT          NOT NULL COMMENT '关联订单,外键 REFERENCES fe_employment_order(id)。非空;索引 idx_fe_order_wf_log。',
408
+  `order_id` BIGINT          NOT NULL COMMENT '关联订单,外键。非空;索引 idx_fe_order_wf_log。',
433
   `from_step` VARCHAR(50) COMMENT '变更前合规步骤编码。首次创建订单时可为空。可空。',
409
   `from_step` VARCHAR(50) COMMENT '变更前合规步骤编码。首次创建订单时可为空。可空。',
434
   `to_step` VARCHAR(50)     NOT NULL COMMENT '变更后合规步骤编码,对应 fe_workflow_step.step_code。非空。',
410
   `to_step` VARCHAR(50)     NOT NULL COMMENT '变更后合规步骤编码,对应 fe_workflow_step.step_code。非空。',
435
   `from_status` VARCHAR(30) COMMENT '变更前订单业务状态 order_status。可空。',
411
   `from_status` VARCHAR(30) COMMENT '变更前订单业务状态 order_status。可空。',
436
   `to_status` VARCHAR(30)     NOT NULL COMMENT '变更后订单业务状态。非空。',
412
   `to_status` VARCHAR(30)     NOT NULL COMMENT '变更后订单业务状态。非空。',
437
-  `operator_id` BIGINT COMMENT '操作人用户 ID,外键 REFERENCES fe_user(id)。系统自动推进时为 NULL。可空。',
413
+  `operator_id` BIGINT COMMENT '操作人用户 ID,外键。系统自动推进时为 NULL。可空。',
438
   `operator_type` VARCHAR(20)     NOT NULL DEFAULT 'system' COMMENT '操作方类型。枚举:system=系统自动;enterprise=企业主/管理员;worker=临时工;provider=第三方合作平台。非空,默认 system。',
414
   `operator_type` VARCHAR(20)     NOT NULL DEFAULT 'system' COMMENT '操作方类型。枚举:system=系统自动;enterprise=企业主/管理员;worker=临时工;provider=第三方合作平台。非空,默认 system。',
439
   `remark` TEXT COMMENT '变更说明,如「登记人数已达预期,自动推进」。可空。',
415
   `remark` TEXT COMMENT '变更说明,如「登记人数已达预期,自动推进」。可空。',
440
   `extra_json` json COMMENT '扩展上下文 JSON,如触发条件、关联合格人数。可空。',
416
   `extra_json` json COMMENT '扩展上下文 JSON,如触发条件、关联合格人数。可空。',
441
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '变更发生时间,审计时间轴依据。非空。',
417
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '变更发生时间,审计时间轴依据。非空。',
442
   PRIMARY KEY (`id`),
418
   PRIMARY KEY (`id`),
443
-  KEY `idx_fe_order_wf_log` (`order_id`, `create_time`),
444
-  CONSTRAINT `fk_fe_order_workflow_log_order_id` FOREIGN KEY (`order_id`) REFERENCES `fe_employment_order` (`id`),
445
-  CONSTRAINT `fk_fe_order_workflow_log_operator_id` FOREIGN KEY (`operator_id`) REFERENCES `fe_user` (`id`)
419
+  KEY `idx_fe_order_wf_log` (`order_id`, `create_time`)
446
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单合规流程状态变更日志表,记录状态机每一步推进的前后步骤、操作人与备注,构成五流合一合规证据链。关联 fe_employment_order,operator_id 可引用 fe_user。';
420
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单合规流程状态变更日志表,记录状态机每一步推进的前后步骤、操作人与备注,构成五流合一合规证据链。关联 fe_employment_order,operator_id 可引用 fe_user。';
447
 
421
 
448
 DROP TABLE IF EXISTS `fe_worker`;
422
 DROP TABLE IF EXISTS `fe_worker`;
449
 CREATE TABLE `fe_worker` (
423
 CREATE TABLE `fe_worker` (
450
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。首次登记提交且实名核验通过后创建或匹配已有档案。非空。',
424
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。首次登记提交且实名核验通过后创建或匹配已有档案。非空。',
451
-  `user_id` BIGINT COMMENT '关联微信用户,外键 REFERENCES fe_user(id)。临时工首次扫码授权微信后绑定。可空;未授权前仅通过身份证匹配。',
425
+  `user_id` BIGINT COMMENT '关联微信用户,外键。临时工首次扫码授权微信后绑定。可空;未授权前仅通过身份证匹配。',
452
   `worker_no` VARCHAR(32) COMMENT '临时工业务编号,平台内唯一标识。档案创建时生成。示例:WK20260001。可空。',
426
   `worker_no` VARCHAR(32) COMMENT '临时工业务编号,平台内唯一标识。档案创建时生成。示例:WK20260001。可空。',
453
   `real_name` VARCHAR(64)     NOT NULL COMMENT '临时工真实姓名,与身份证一致。登记提交时写入。非空。',
427
   `real_name` VARCHAR(64)     NOT NULL COMMENT '临时工真实姓名,与身份证一致。登记提交时写入。非空。',
454
   `id_card_no_enc` TEXT            NOT NULL COMMENT '身份证号加密密文。登记页提交时应用层加密写入。非空;高度敏感,禁止明文。',
428
   `id_card_no_enc` TEXT            NOT NULL COMMENT '身份证号加密密文。登记页提交时应用层加密写入。非空;高度敏感,禁止明文。',
@@ -467,17 +441,16 @@ CREATE TABLE `fe_worker` (
467
   PRIMARY KEY (`id`),
441
   PRIMARY KEY (`id`),
468
   UNIQUE KEY `uk_fe_worker_worker_no` (`worker_no`, `del_flag`),
442
   UNIQUE KEY `uk_fe_worker_worker_no` (`worker_no`, `del_flag`),
469
   UNIQUE KEY `uk_fe_worker_user_id` (`user_id`, `del_flag`),
443
   UNIQUE KEY `uk_fe_worker_user_id` (`user_id`, `del_flag`),
470
-  KEY `idx_fe_worker_mobile` (`mobile_mask`),
471
-  CONSTRAINT `fk_fe_worker_user_id` FOREIGN KEY (`user_id`) REFERENCES `fe_user` (`id`)
444
+  KEY `idx_fe_worker_mobile` (`mobile_mask`)
472
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='临时工自然人档案主表,跨登记批次复用,避免重复录入身份证与银行卡。身份证、银行卡、手机号均加密存储(*_enc),列表仅展示脱敏值(*_mask);可关联 fe_user 实现微信绑定。';
445
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='临时工自然人档案主表,跨登记批次复用,避免重复录入身份证与银行卡。身份证、银行卡、手机号均加密存储(*_enc),列表仅展示脱敏值(*_mask);可关联 fe_user 实现微信绑定。';
473
 
446
 
474
 DROP TABLE IF EXISTS `fe_worker_registration`;
447
 DROP TABLE IF EXISTS `fe_worker_registration`;
475
 CREATE TABLE `fe_worker_registration` (
448
 CREATE TABLE `fe_worker_registration` (
476
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。临时工打开登记页或提交时创建。非空。',
449
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。临时工打开登记页或提交时创建。非空。',
477
   `batch_id` BIGINT          NOT NULL COMMENT '所属登记批次 fe_registration_batch.id(逻辑关联,无数据库外键)。非空;索引 idx_fe_worker_reg_batch。',
450
   `batch_id` BIGINT          NOT NULL COMMENT '所属登记批次 fe_registration_batch.id(逻辑关联,无数据库外键)。非空;索引 idx_fe_worker_reg_batch。',
478
-  `order_id` BIGINT          NOT NULL COMMENT '关联订单,外键 REFERENCES fe_employment_order(id)。冗余便于按订单查登记列表。非空;索引 idx_fe_worker_reg_order。',
479
-  `enterprise_id` BIGINT          NOT NULL COMMENT '所属企业,外键 REFERENCES fe_enterprise(id)。冗余。非空。',
480
-  `worker_id` BIGINT COMMENT '关联临时工档案,外键 REFERENCES fe_worker(id)。提交成功且匹配/创建档案后绑定。可空(登记进行中)。',
451
+  `order_id` BIGINT          NOT NULL COMMENT '关联订单,外键。冗余便于按订单查登记列表。非空;索引 idx_fe_worker_reg_order。',
452
+  `enterprise_id` BIGINT          NOT NULL COMMENT '所属企业,外键。冗余。非空。',
453
+  `worker_id` BIGINT COMMENT '关联临时工档案,外键。提交成功且匹配/创建档案后绑定。可空(登记进行中)。',
481
   `real_name` VARCHAR(64)     NOT NULL COMMENT '本次登记填写的姓名。非空;可能与 worker 档案后续同步。',
454
   `real_name` VARCHAR(64)     NOT NULL COMMENT '本次登记填写的姓名。非空;可能与 worker 档案后续同步。',
482
   `mobile_enc` TEXT COMMENT '登记手机号密文。提交时加密写入。可空;高度敏感。',
455
   `mobile_enc` TEXT COMMENT '登记手机号密文。提交时加密写入。可空;高度敏感。',
483
   `mobile_mask` VARCHAR(20) COMMENT '登记手机号脱敏。可空。',
456
   `mobile_mask` VARCHAR(20) COMMENT '登记手机号脱敏。可空。',
@@ -488,7 +461,7 @@ CREATE TABLE `fe_worker_registration` (
488
   `fail_reason` TEXT COMMENT '失败或企业驳回原因。可空。',
461
   `fail_reason` TEXT COMMENT '失败或企业驳回原因。可空。',
489
   `submitted_at` datetime COMMENT '临时工点击提交时间。可空。',
462
   `submitted_at` datetime COMMENT '临时工点击提交时间。可空。',
490
   `reviewed_at` datetime COMMENT '企业审核完成时间。可空。',
463
   `reviewed_at` datetime COMMENT '企业审核完成时间。可空。',
491
-  `reviewed_by` BIGINT COMMENT '审核人,外键 REFERENCES fe_user(id)。可空。',
464
+  `reviewed_by` BIGINT COMMENT '审核人,外键。可空。',
492
   `remind_count` int         NOT NULL DEFAULT 0 COMMENT '企业主催办次数,每次催办 +1。非空,默认 0。',
465
   `remind_count` int         NOT NULL DEFAULT 0 COMMENT '企业主催办次数,每次催办 +1。非空,默认 0。',
493
   `last_remind_at` datetime COMMENT '最近一次催办时间。可空。',
466
   `last_remind_at` datetime COMMENT '最近一次催办时间。可空。',
494
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '登记记录创建时间。非空。',
467
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '登记记录创建时间。非空。',
@@ -496,18 +469,14 @@ CREATE TABLE `fe_worker_registration` (
496
   `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。',
469
   `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。',
497
   PRIMARY KEY (`id`),
470
   PRIMARY KEY (`id`),
498
   KEY `idx_fe_worker_reg_batch` (`batch_id`, `reg_status`),
471
   KEY `idx_fe_worker_reg_batch` (`batch_id`, `reg_status`),
499
-  KEY `idx_fe_worker_reg_order` (`order_id`),
500
-  CONSTRAINT `fk_fe_worker_registration_order_id` FOREIGN KEY (`order_id`) REFERENCES `fe_employment_order` (`id`),
501
-  CONSTRAINT `fk_fe_worker_registration_enterprise_id` FOREIGN KEY (`enterprise_id`) REFERENCES `fe_enterprise` (`id`),
502
-  CONSTRAINT `fk_fe_worker_registration_worker_id` FOREIGN KEY (`worker_id`) REFERENCES `fe_worker` (`id`),
503
-  CONSTRAINT `fk_fe_worker_registration_reviewed_by` FOREIGN KEY (`reviewed_by`) REFERENCES `fe_user` (`id`)
472
+  KEY `idx_fe_worker_reg_order` (`order_id`)
504
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='批次登记记录表,记录每个临时工在某一 fe_registration_batch 下的一次登记全过程。reg_status 驱动进度页统计、催办与审核;关联 fe_worker 档案,敏感证件信息加密存储。batch_id 暂无数据库外键。';
473
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='批次登记记录表,记录每个临时工在某一 fe_registration_batch 下的一次登记全过程。reg_status 驱动进度页统计、催办与审核;关联 fe_worker 档案,敏感证件信息加密存储。batch_id 暂无数据库外键。';
505
 
474
 
506
 DROP TABLE IF EXISTS `fe_worker_consent`;
475
 DROP TABLE IF EXISTS `fe_worker_consent`;
507
 CREATE TABLE `fe_worker_consent` (
476
 CREATE TABLE `fe_worker_consent` (
508
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。临时工勾选协议并提交时插入。非空。',
477
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。临时工勾选协议并提交时插入。非空。',
509
-  `registration_id` BIGINT COMMENT '关联登记记录,外键 REFERENCES fe_worker_registration(id)。首次档案登记可为空;批次扫码登记时写入。',
510
-  `worker_id` BIGINT COMMENT '关联临时工档案,外键 REFERENCES fe_worker(id)。档案绑定后写入。可空。',
478
+  `registration_id` BIGINT COMMENT '关联登记记录,外键。首次档案登记可为空;批次扫码登记时写入。',
479
+  `worker_id` BIGINT COMMENT '关联临时工档案,外键。档案绑定后写入。可空。',
511
   `consent_type` VARCHAR(50)     NOT NULL COMMENT '协议类型。枚举:labor_contract=电子劳动合同;privacy_policy=隐私政策;authorization=个人信息处理授权。非空。',
480
   `consent_type` VARCHAR(50)     NOT NULL COMMENT '协议类型。枚举:labor_contract=电子劳动合同;privacy_policy=隐私政策;authorization=个人信息处理授权。非空。',
512
   `consent_version` VARCHAR(20) COMMENT '协议版本号,对应法务发布的协议版本。示例:v2.1。可空。',
481
   `consent_version` VARCHAR(20) COMMENT '协议版本号,对应法务发布的协议版本。示例:v2.1。可空。',
513
   `consent_title` VARCHAR(200) COMMENT '协议标题展示文案。示例:《灵活用工电子劳动合同》。可空。',
482
   `consent_title` VARCHAR(200) COMMENT '协议标题展示文案。示例:《灵活用工电子劳动合同》。可空。',
@@ -517,19 +486,17 @@ CREATE TABLE `fe_worker_consent` (
517
   `user_agent` VARCHAR(500) COMMENT '客户端 User-Agent 字符串。可空;最长 500 字符。',
486
   `user_agent` VARCHAR(500) COMMENT '客户端 User-Agent 字符串。可空;最长 500 字符。',
518
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录入库时间。非空。',
487
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录入库时间。非空。',
519
   PRIMARY KEY (`id`),
488
   PRIMARY KEY (`id`),
520
-  KEY `idx_fe_worker_consent` (`registration_id`),
521
-  CONSTRAINT `fk_fe_worker_consent_registration_id` FOREIGN KEY (`registration_id`) REFERENCES `fe_worker_registration` (`id`),
522
-  CONSTRAINT `fk_fe_worker_consent_worker_id` FOREIGN KEY (`worker_id`) REFERENCES `fe_worker` (`id`)
489
+  KEY `idx_fe_worker_consent` (`registration_id`)
523
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='临时工协议授权确认表,记录勾选电子劳动合同、隐私政策、信息授权等合规留痕。含同意时间、客户端 IP 与 UA,满足电子证据要求;首次档案登记可不关联 fe_worker_registration。';
490
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='临时工协议授权确认表,记录勾选电子劳动合同、隐私政策、信息授权等合规留痕。含同意时间、客户端 IP 与 UA,满足电子证据要求;首次档案登记可不关联 fe_worker_registration。';
524
 
491
 
525
 DROP TABLE IF EXISTS `fe_contract`;
492
 DROP TABLE IF EXISTS `fe_contract`;
526
 CREATE TABLE `fe_contract` (
493
 CREATE TABLE `fe_contract` (
527
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。登记完成进入合同签署步骤时创建。非空。',
494
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。登记完成进入合同签署步骤时创建。非空。',
528
   `contract_no` VARCHAR(32)     NOT NULL COMMENT '合同业务编号。示例:CT20260707001。非空;唯一索引 uk_fe_contract_no。',
495
   `contract_no` VARCHAR(32)     NOT NULL COMMENT '合同业务编号。示例:CT20260707001。非空;唯一索引 uk_fe_contract_no。',
529
-  `order_id` BIGINT          NOT NULL COMMENT '关联订单,外键 REFERENCES fe_employment_order(id)。非空;索引 idx_fe_contract_order。',
530
-  `registration_id` BIGINT COMMENT '关联登记记录(一人一合同),外键 REFERENCES fe_worker_registration(id)。可空;建议必填。',
531
-  `worker_id` BIGINT COMMENT '签约临时工,外键 REFERENCES fe_worker(id)。可空。',
532
-  `enterprise_id` BIGINT          NOT NULL COMMENT '签约企业,外键 REFERENCES fe_enterprise(id)。非空。',
496
+  `order_id` BIGINT          NOT NULL COMMENT '关联订单,外键。非空;索引 idx_fe_contract_order。',
497
+  `registration_id` BIGINT COMMENT '关联登记记录(一人一合同),外键。可空;建议必填。',
498
+  `worker_id` BIGINT COMMENT '签约临时工,外键。可空。',
499
+  `enterprise_id` BIGINT          NOT NULL COMMENT '签约企业,外键。非空。',
533
   `contract_type` VARCHAR(50)     NOT NULL DEFAULT 'labor' COMMENT '合同类型编码。非空,默认 labor(劳动合同)。',
500
   `contract_type` VARCHAR(50)     NOT NULL DEFAULT 'labor' COMMENT '合同类型编码。非空,默认 labor(劳动合同)。',
534
   `contract_title` VARCHAR(200) COMMENT '合同标题。示例:劳务派遣协议-张三。可空。',
501
   `contract_title` VARCHAR(200) COMMENT '合同标题。示例:劳务派遣协议-张三。可空。',
535
   `sign_status` VARCHAR(20)     NOT NULL DEFAULT 'pending' COMMENT '签署状态。枚举:pending=待签署;signing=签署中;signed=已签署;rejected=拒签;expired=已过期。非空,默认 pending。',
502
   `sign_status` VARCHAR(20)     NOT NULL DEFAULT 'pending' COMMENT '签署状态。枚举:pending=待签署;signing=签署中;signed=已签署;rejected=拒签;expired=已过期。非空,默认 pending。',
@@ -543,20 +510,16 @@ CREATE TABLE `fe_contract` (
543
   `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。',
510
   `del_flag` tinyint        NOT NULL DEFAULT 0 COMMENT '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。',
544
   PRIMARY KEY (`id`),
511
   PRIMARY KEY (`id`),
545
   UNIQUE KEY `uk_fe_contract_no` (`contract_no`),
512
   UNIQUE KEY `uk_fe_contract_no` (`contract_no`),
546
-  KEY `idx_fe_contract_order` (`order_id`, `sign_status`),
547
-  CONSTRAINT `fk_fe_contract_order_id` FOREIGN KEY (`order_id`) REFERENCES `fe_employment_order` (`id`),
548
-  CONSTRAINT `fk_fe_contract_registration_id` FOREIGN KEY (`registration_id`) REFERENCES `fe_worker_registration` (`id`),
549
-  CONSTRAINT `fk_fe_contract_worker_id` FOREIGN KEY (`worker_id`) REFERENCES `fe_worker` (`id`),
550
-  CONSTRAINT `fk_fe_contract_enterprise_id` FOREIGN KEY (`enterprise_id`) REFERENCES `fe_enterprise` (`id`)
513
+  KEY `idx_fe_contract_order` (`order_id`, `sign_status`)
551
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='电子劳动合同表,合规流程「合同签署」节点核心数据。一人一登记一条合同;MVP 阶段 sign_provider 可用 mock,对接电子签平台后替换。关联 fe_employment_order、fe_worker_registration、fe_worker。';
514
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='电子劳动合同表,合规流程「合同签署」节点核心数据。一人一登记一条合同;MVP 阶段 sign_provider 可用 mock,对接电子签平台后替换。关联 fe_employment_order、fe_worker_registration、fe_worker。';
552
 
515
 
553
 DROP TABLE IF EXISTS `fe_settlement_order`;
516
 DROP TABLE IF EXISTS `fe_settlement_order`;
554
 CREATE TABLE `fe_settlement_order` (
517
 CREATE TABLE `fe_settlement_order` (
555
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。结算引擎生成结算单时创建。非空。',
518
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。结算引擎生成结算单时创建。非空。',
556
   `settlement_no` VARCHAR(32)     NOT NULL COMMENT '结算单业务编号。示例:STL20260707001。非空;唯一索引 uk_fe_settlement_no。',
519
   `settlement_no` VARCHAR(32)     NOT NULL COMMENT '结算单业务编号。示例:STL20260707001。非空;唯一索引 uk_fe_settlement_no。',
557
-  `order_id` BIGINT          NOT NULL COMMENT '关联用工订单,外键 REFERENCES fe_employment_order(id)。非空。',
520
+  `order_id` BIGINT          NOT NULL COMMENT '关联用工订单,外键。非空。',
558
   `batch_id` BIGINT COMMENT '关联登记批次 fe_registration_batch.id(逻辑关联,无数据库外键)。可空;多批次订单可只关联主批次。',
521
   `batch_id` BIGINT COMMENT '关联登记批次 fe_registration_batch.id(逻辑关联,无数据库外键)。可空;多批次订单可只关联主批次。',
559
-  `enterprise_id` BIGINT          NOT NULL COMMENT '所属企业,外键 REFERENCES fe_enterprise(id)。非空;索引 idx_fe_settlement_ent。',
522
+  `enterprise_id` BIGINT          NOT NULL COMMENT '所属企业,外键。非空;索引 idx_fe_settlement_ent。',
560
   `worker_count` int         NOT NULL COMMENT '本次结算涵盖人数。非空。',
523
   `worker_count` int         NOT NULL COMMENT '本次结算涵盖人数。非空。',
561
   `gross_amount` decimal(14,2)   NOT NULL DEFAULT 0 COMMENT '应发总额(元),税前劳务合计。非空,默认 0。',
524
   `gross_amount` decimal(14,2)   NOT NULL DEFAULT 0 COMMENT '应发总额(元),税前劳务合计。非空,默认 0。',
562
   `deduction_amount` decimal(14,2)   NOT NULL DEFAULT 0 COMMENT '扣款及个税合计(元)。非空,默认 0。',
525
   `deduction_amount` decimal(14,2)   NOT NULL DEFAULT 0 COMMENT '扣款及个税合计(元)。非空,默认 0。',
@@ -568,7 +531,7 @@ CREATE TABLE `fe_settlement_order` (
568
   `compliance_tags` json COMMENT '五流合一合规校验结果标签 JSON。示例:["个税已申报","发票合规"]。可空,默认 []。',
531
   `compliance_tags` json COMMENT '五流合一合规校验结果标签 JSON。示例:["个税已申报","发票合规"]。可空,默认 []。',
569
   `compliance_remark` TEXT COMMENT '合规说明文案。示例:可全额税前扣除。可空。',
532
   `compliance_remark` TEXT COMMENT '合规说明文案。示例:可全额税前扣除。可空。',
570
   `confirmed_at` datetime COMMENT '企业主确认结算单时间。可空。',
533
   `confirmed_at` datetime COMMENT '企业主确认结算单时间。可空。',
571
-  `confirmed_by` BIGINT COMMENT '确认人,外键 REFERENCES fe_user(id)。可空。',
534
+  `confirmed_by` BIGINT COMMENT '确认人,外键。可空。',
572
   `paid_at` datetime COMMENT '支付完成时间,全部打款成功后写入。可空。',
535
   `paid_at` datetime COMMENT '支付完成时间,全部打款成功后写入。可空。',
573
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '结算单生成时间。非空。',
536
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '结算单生成时间。非空。',
574
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '状态或金额变更时更新。非空。',
537
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '状态或金额变更时更新。非空。',
@@ -576,18 +539,15 @@ CREATE TABLE `fe_settlement_order` (
576
   PRIMARY KEY (`id`),
539
   PRIMARY KEY (`id`),
577
   UNIQUE KEY `uk_fe_settlement_no` (`settlement_no`),
540
   UNIQUE KEY `uk_fe_settlement_no` (`settlement_no`),
578
   KEY `idx_fe_settlement_ent` (`enterprise_id`, `settlement_status`),
541
   KEY `idx_fe_settlement_ent` (`enterprise_id`, `settlement_status`),
579
-  KEY `idx_fe_settlement_batch` (`batch_id`),
580
-  CONSTRAINT `fk_fe_settlement_order_order_id` FOREIGN KEY (`order_id`) REFERENCES `fe_employment_order` (`id`),
581
-  CONSTRAINT `fk_fe_settlement_order_enterprise_id` FOREIGN KEY (`enterprise_id`) REFERENCES `fe_enterprise` (`id`),
582
-  CONSTRAINT `fk_fe_settlement_order_confirmed_by` FOREIGN KEY (`confirmed_by`) REFERENCES `fe_user` (`id`)
542
+  KEY `idx_fe_settlement_batch` (`batch_id`)
583
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='结算确认单主表,用工结束后按考勤或约定生成,展示应发/扣款/实发、服务费、开票额与企业总支出。企业确认后进入支付环节;一对多关联 fe_settlement_item、fe_settlement_fee、fe_payment_record。batch_id 暂无数据库外键。';
543
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='结算确认单主表,用工结束后按考勤或约定生成,展示应发/扣款/实发、服务费、开票额与企业总支出。企业确认后进入支付环节;一对多关联 fe_settlement_item、fe_settlement_fee、fe_payment_record。batch_id 暂无数据库外键。';
584
 
544
 
585
 DROP TABLE IF EXISTS `fe_settlement_item`;
545
 DROP TABLE IF EXISTS `fe_settlement_item`;
586
 CREATE TABLE `fe_settlement_item` (
546
 CREATE TABLE `fe_settlement_item` (
587
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。生成结算单时按登记记录逐人插入。非空。',
547
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。生成结算单时按登记记录逐人插入。非空。',
588
-  `settlement_id` BIGINT          NOT NULL COMMENT '关联结算单,外键 REFERENCES fe_settlement_order(id)。非空;索引 idx_fe_settlement_item。',
589
-  `registration_id` BIGINT COMMENT '关联登记记录,外键 REFERENCES fe_worker_registration(id)。可空;建议必填以追溯人员。',
590
-  `worker_id` BIGINT COMMENT '关联临时工档案,外键 REFERENCES fe_worker(id)。可空。',
548
+  `settlement_id` BIGINT          NOT NULL COMMENT '关联结算单,外键。非空;索引 idx_fe_settlement_item。',
549
+  `registration_id` BIGINT COMMENT '关联登记记录,外键。可空;建议必填以追溯人员。',
550
+  `worker_id` BIGINT COMMENT '关联临时工档案,外键。可空。',
591
   `worker_name_mask` VARCHAR(64) COMMENT '姓名脱敏展示,如张*三。可空;禁止存明文全名。',
551
   `worker_name_mask` VARCHAR(64) COMMENT '姓名脱敏展示,如张*三。可空;禁止存明文全名。',
592
   `work_days` decimal(8,2) COMMENT '结算工作天数,NUMERIC(8,2)。可空。',
552
   `work_days` decimal(8,2) COMMENT '结算工作天数,NUMERIC(8,2)。可空。',
593
   `work_hours` decimal(8,2) COMMENT '结算工作小时数。可空。',
553
   `work_hours` decimal(8,2) COMMENT '结算工作小时数。可空。',
@@ -600,37 +560,33 @@ CREATE TABLE `fe_settlement_item` (
600
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '明细创建时间。非空。',
560
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '明细创建时间。非空。',
601
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '明细金额调整时更新。非空。',
561
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '明细金额调整时更新。非空。',
602
   PRIMARY KEY (`id`),
562
   PRIMARY KEY (`id`),
603
-  KEY `idx_fe_settlement_item` (`settlement_id`),
604
-  CONSTRAINT `fk_fe_settlement_item_settlement_id` FOREIGN KEY (`settlement_id`) REFERENCES `fe_settlement_order` (`id`),
605
-  CONSTRAINT `fk_fe_settlement_item_registration_id` FOREIGN KEY (`registration_id`) REFERENCES `fe_worker_registration` (`id`),
606
-  CONSTRAINT `fk_fe_settlement_item_worker_id` FOREIGN KEY (`worker_id`) REFERENCES `fe_worker` (`id`)
563
+  KEY `idx_fe_settlement_item` (`settlement_id`)
607
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='结算单人明细表,按临时工拆分应发、个税、其他扣款与实发金额。支持按天、按小时、计件多种计量维度;关联 fe_settlement_order、fe_worker_registration、fe_worker。';
564
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='结算单人明细表,按临时工拆分应发、个税、其他扣款与实发金额。支持按天、按小时、计件多种计量维度;关联 fe_settlement_order、fe_worker_registration、fe_worker。';
608
 
565
 
609
 DROP TABLE IF EXISTS `fe_settlement_fee`;
566
 DROP TABLE IF EXISTS `fe_settlement_fee`;
610
 CREATE TABLE `fe_settlement_fee` (
567
 CREATE TABLE `fe_settlement_fee` (
611
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。结算单生成时同步写入各费用分项。非空。',
568
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。结算单生成时同步写入各费用分项。非空。',
612
-  `settlement_id` BIGINT          NOT NULL COMMENT '关联结算单,外键 REFERENCES fe_settlement_order(id)。非空;索引 idx_fe_settlement_fee。',
569
+  `settlement_id` BIGINT          NOT NULL COMMENT '关联结算单,外键。非空;索引 idx_fe_settlement_fee。',
613
   `fee_code` VARCHAR(50)     NOT NULL COMMENT '费用项编码。示例:labor_fee、service_fee、insurance、tax_withhold。非空。',
570
   `fee_code` VARCHAR(50)     NOT NULL COMMENT '费用项编码。示例:labor_fee、service_fee、insurance、tax_withhold。非空。',
614
   `fee_name` VARCHAR(100)    NOT NULL COMMENT '费用项中文名。非空。',
571
   `fee_name` VARCHAR(100)    NOT NULL COMMENT '费用项中文名。非空。',
615
   `amount` decimal(14,2)   NOT NULL COMMENT '费用金额(元),NUMERIC(14,2)。非空。',
572
   `amount` decimal(14,2)   NOT NULL COMMENT '费用金额(元),NUMERIC(14,2)。非空。',
616
   `rate` decimal(8,4) COMMENT '适用费率,NUMERIC(8,4)。可空。',
573
   `rate` decimal(8,4) COMMENT '适用费率,NUMERIC(8,4)。可空。',
617
   `sort_order` int         NOT NULL DEFAULT 0 COMMENT '资金总览展示顺序。非空,默认 0。',
574
   `sort_order` int         NOT NULL DEFAULT 0 COMMENT '资金总览展示顺序。非空,默认 0。',
618
   PRIMARY KEY (`id`),
575
   PRIMARY KEY (`id`),
619
-  KEY `idx_fe_settlement_fee` (`settlement_id`),
620
-  CONSTRAINT `fk_fe_settlement_fee_settlement_id` FOREIGN KEY (`settlement_id`) REFERENCES `fe_settlement_order` (`id`)
576
+  KEY `idx_fe_settlement_fee` (`settlement_id`)
621
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='结算单费用汇总项表,订单级劳务费、服务费、保险、税费等分项金额,对应小程序「资金总览」模块。归属 fe_settlement_order,结构与 fe_draft_cost_detail 类似但为实际结算数据。';
577
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='结算单费用汇总项表,订单级劳务费、服务费、保险、税费等分项金额,对应小程序「资金总览」模块。归属 fe_settlement_order,结构与 fe_draft_cost_detail 类似但为实际结算数据。';
622
 
578
 
623
 DROP TABLE IF EXISTS `fe_payment_record`;
579
 DROP TABLE IF EXISTS `fe_payment_record`;
624
 CREATE TABLE `fe_payment_record` (
580
 CREATE TABLE `fe_payment_record` (
625
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。发起支付时创建。非空。',
581
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。发起支付时创建。非空。',
626
   `payment_no` VARCHAR(32)     NOT NULL COMMENT '支付单业务编号。示例:PAY20260707001。非空;唯一索引 uk_fe_payment_no。',
582
   `payment_no` VARCHAR(32)     NOT NULL COMMENT '支付单业务编号。示例:PAY20260707001。非空;唯一索引 uk_fe_payment_no。',
627
-  `settlement_id` BIGINT          NOT NULL COMMENT '关联结算单,外键 REFERENCES fe_settlement_order(id)。非空;索引 idx_fe_payment_settlement。',
628
-  `enterprise_id` BIGINT          NOT NULL COMMENT '付款企业,外键 REFERENCES fe_enterprise(id)。非空。',
583
+  `settlement_id` BIGINT          NOT NULL COMMENT '关联结算单,外键。非空;索引 idx_fe_payment_settlement。',
584
+  `enterprise_id` BIGINT          NOT NULL COMMENT '付款企业,外键。非空。',
629
   `payment_channel` VARCHAR(50)     NOT NULL COMMENT '支付渠道类型,前端仅展示此字段。枚举:wechat=微信支付;alipay=支付宝;bank=银行转账。非空。',
585
   `payment_channel` VARCHAR(50)     NOT NULL COMMENT '支付渠道类型,前端仅展示此字段。枚举:wechat=微信支付;alipay=支付宝;bank=银行转账。非空。',
630
   `payment_amount` decimal(14,2)   NOT NULL COMMENT '支付金额(元)。非空。',
586
   `payment_amount` decimal(14,2)   NOT NULL COMMENT '支付金额(元)。非空。',
631
   `payment_status` VARCHAR(20)     NOT NULL DEFAULT 'pending' COMMENT '支付状态。枚举:pending=处理中;success=成功;failed=失败;refunded=已退款。非空,默认 pending。',
587
   `payment_status` VARCHAR(20)     NOT NULL DEFAULT 'pending' COMMENT '支付状态。枚举:pending=处理中;success=成功;failed=失败;refunded=已退款。非空,默认 pending。',
632
   `external_trade_no` VARCHAR(100) COMMENT '微信/支付宝/银行等第三方交易流水号。支付回调成功时写入。可空。',
588
   `external_trade_no` VARCHAR(100) COMMENT '微信/支付宝/银行等第三方交易流水号。支付回调成功时写入。可空。',
633
-  `payer_user_id` BIGINT COMMENT '发起付款的企业主用户,外键 REFERENCES fe_user(id)。可空。',
589
+  `payer_user_id` BIGINT COMMENT '发起付款的企业主用户,外键。可空。',
634
   `paid_at` datetime COMMENT '支付成功时间戳。可空。',
590
   `paid_at` datetime COMMENT '支付成功时间戳。可空。',
635
   `receipt_url` VARCHAR(512) COMMENT '支付凭证或回单下载地址。可空。',
591
   `receipt_url` VARCHAR(512) COMMENT '支付凭证或回单下载地址。可空。',
636
   `fail_reason` TEXT COMMENT '支付失败原因。可空。',
592
   `fail_reason` TEXT COMMENT '支付失败原因。可空。',
@@ -638,17 +594,14 @@ CREATE TABLE `fe_payment_record` (
638
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '状态变更时更新。非空。',
594
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '状态变更时更新。非空。',
639
   PRIMARY KEY (`id`),
595
   PRIMARY KEY (`id`),
640
   UNIQUE KEY `uk_fe_payment_no` (`payment_no`),
596
   UNIQUE KEY `uk_fe_payment_no` (`payment_no`),
641
-  KEY `idx_fe_payment_settlement` (`settlement_id`),
642
-  CONSTRAINT `fk_fe_payment_record_settlement_id` FOREIGN KEY (`settlement_id`) REFERENCES `fe_settlement_order` (`id`),
643
-  CONSTRAINT `fk_fe_payment_record_enterprise_id` FOREIGN KEY (`enterprise_id`) REFERENCES `fe_enterprise` (`id`),
644
-  CONSTRAINT `fk_fe_payment_record_payer_user_id` FOREIGN KEY (`payer_user_id`) REFERENCES `fe_user` (`id`)
597
+  KEY `idx_fe_payment_settlement` (`settlement_id`)
645
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付/打款记录表,企业确认结算后发起付款,记录渠道、金额、第三方交易流水与凭证。小程序仅展示 payment_channel 渠道类型,不展示对公账户;关联 fe_settlement_order、fe_enterprise。';
598
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付/打款记录表,企业确认结算后发起付款,记录渠道、金额、第三方交易流水与凭证。小程序仅展示 payment_channel 渠道类型,不展示对公账户;关联 fe_settlement_order、fe_enterprise。';
646
 
599
 
647
 DROP TABLE IF EXISTS `fe_attendance_batch`;
600
 DROP TABLE IF EXISTS `fe_attendance_batch`;
648
 CREATE TABLE `fe_attendance_batch` (
601
 CREATE TABLE `fe_attendance_batch` (
649
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。每日定时任务或企业主手动生成日报时创建。非空。',
602
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。每日定时任务或企业主手动生成日报时创建。非空。',
650
   `batch_id` BIGINT          NOT NULL COMMENT '关联登记批次 fe_registration_batch.id(逻辑关联,无数据库外键)。非空;与 attendance_date 组成唯一索引 uk_fe_attendance_batch。',
603
   `batch_id` BIGINT          NOT NULL COMMENT '关联登记批次 fe_registration_batch.id(逻辑关联,无数据库外键)。非空;与 attendance_date 组成唯一索引 uk_fe_attendance_batch。',
651
-  `order_id` BIGINT          NOT NULL COMMENT '关联订单,外键 REFERENCES fe_employment_order(id)。冗余便于订单维度查考勤。非空。',
604
+  `order_id` BIGINT          NOT NULL COMMENT '关联订单,外键。冗余便于订单维度查考勤。非空。',
652
   `attendance_date` DATE            NOT NULL COMMENT '考勤统计日期,DATE 类型。示例:2026-08-15。非空。',
605
   `attendance_date` DATE            NOT NULL COMMENT '考勤统计日期,DATE 类型。示例:2026-08-15。非空。',
653
   `total_workers` int         NOT NULL DEFAULT 0 COMMENT '当日应考勤人数。非空,默认 0。',
606
   `total_workers` int         NOT NULL DEFAULT 0 COMMENT '当日应考勤人数。非空,默认 0。',
654
   `normal_count` int         NOT NULL DEFAULT 0 COMMENT '正常出勤人数。非空,默认 0。',
607
   `normal_count` int         NOT NULL DEFAULT 0 COMMENT '正常出勤人数。非空,默认 0。',
@@ -658,22 +611,20 @@ CREATE TABLE `fe_attendance_batch` (
658
   `total_pieces` decimal(12,2)   DEFAULT 0 COMMENT '当日总计件数。可空,默认 0。',
611
   `total_pieces` decimal(12,2)   DEFAULT 0 COMMENT '当日总计件数。可空,默认 0。',
659
   `estimated_cost` decimal(14,2)   DEFAULT 0 COMMENT '当日预估劳务费用(元)。可空,默认 0。',
612
   `estimated_cost` decimal(14,2)   DEFAULT 0 COMMENT '当日预估劳务费用(元)。可空,默认 0。',
660
   `status` VARCHAR(20)     NOT NULL DEFAULT 'draft' COMMENT '日报状态。枚举:draft=草稿可编辑;confirmed=已确认锁定;archived=已归档。非空,默认 draft。',
613
   `status` VARCHAR(20)     NOT NULL DEFAULT 'draft' COMMENT '日报状态。枚举:draft=草稿可编辑;confirmed=已确认锁定;archived=已归档。非空,默认 draft。',
661
-  `confirmed_by` BIGINT COMMENT '确认人,外键 REFERENCES fe_user(id)。企业主确认日报时写入。可空。',
614
+  `confirmed_by` BIGINT COMMENT '确认人,外键。企业主确认日报时写入。可空。',
662
   `confirmed_at` datetime COMMENT '日报确认时间。可空。',
615
   `confirmed_at` datetime COMMENT '日报确认时间。可空。',
663
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '日报创建时间。非空。',
616
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '日报创建时间。非空。',
664
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '考勤数据变更时更新。非空。',
617
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '考勤数据变更时更新。非空。',
665
   PRIMARY KEY (`id`),
618
   PRIMARY KEY (`id`),
666
-  UNIQUE KEY `uk_fe_attendance_batch` (`batch_id`, `attendance_date`),
667
-  CONSTRAINT `fk_fe_attendance_batch_order_id` FOREIGN KEY (`order_id`) REFERENCES `fe_employment_order` (`id`),
668
-  CONSTRAINT `fk_fe_attendance_batch_confirmed_by` FOREIGN KEY (`confirmed_by`) REFERENCES `fe_user` (`id`)
619
+  UNIQUE KEY `uk_fe_attendance_batch` (`batch_id`, `attendance_date`)
669
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考勤日报批次表(二期功能),按登记批次与日期汇总当日应考勤人数、出勤/加班/请假统计及预估费用。一期 MVP 可不实现业务逻辑,表结构先行预留;batch_id 暂无数据库外键。';
620
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考勤日报批次表(二期功能),按登记批次与日期汇总当日应考勤人数、出勤/加班/请假统计及预估费用。一期 MVP 可不实现业务逻辑,表结构先行预留;batch_id 暂无数据库外键。';
670
 
621
 
671
 DROP TABLE IF EXISTS `fe_attendance_record`;
622
 DROP TABLE IF EXISTS `fe_attendance_record`;
672
 CREATE TABLE `fe_attendance_record` (
623
 CREATE TABLE `fe_attendance_record` (
673
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。录入或导入单人考勤时插入。非空。',
624
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。录入或导入单人考勤时插入。非空。',
674
-  `attendance_batch_id` BIGINT          NOT NULL COMMENT '关联考勤日报,外键 REFERENCES fe_attendance_batch(id)。非空;索引 idx_fe_attendance_rec。',
675
-  `registration_id` BIGINT          NOT NULL COMMENT '关联登记记录,外键 REFERENCES fe_worker_registration(id)。非空;确定考勤对象。',
676
-  `worker_id` BIGINT COMMENT '关联临时工档案,外键 REFERENCES fe_worker(id)。可空;冗余加速查询。',
625
+  `attendance_batch_id` BIGINT          NOT NULL COMMENT '关联考勤日报,外键。非空;索引 idx_fe_attendance_rec。',
626
+  `registration_id` BIGINT          NOT NULL COMMENT '关联登记记录,外键。非空;确定考勤对象。',
627
+  `worker_id` BIGINT COMMENT '关联临时工档案,外键。可空;冗余加速查询。',
677
   `attendance_type` VARCHAR(20)     NOT NULL DEFAULT 'normal' COMMENT '考勤类型。枚举:normal=正常出勤;overtime=加班;leave=请假;piece=计件产量。非空,默认 normal。',
628
   `attendance_type` VARCHAR(20)     NOT NULL DEFAULT 'normal' COMMENT '考勤类型。枚举:normal=正常出勤;overtime=加班;leave=请假;piece=计件产量。非空,默认 normal。',
678
   `work_hours` decimal(8,2) COMMENT '正常工作小时数,NUMERIC(8,2)。可空。',
629
   `work_hours` decimal(8,2) COMMENT '正常工作小时数,NUMERIC(8,2)。可空。',
679
   `overtime_hours` decimal(8,2) COMMENT '加班小时数。可空。',
630
   `overtime_hours` decimal(8,2) COMMENT '加班小时数。可空。',
@@ -683,32 +634,26 @@ CREATE TABLE `fe_attendance_record` (
683
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间。非空。',
634
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间。非空。',
684
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '考勤数据修改时更新。非空。',
635
   `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '考勤数据修改时更新。非空。',
685
   PRIMARY KEY (`id`),
636
   PRIMARY KEY (`id`),
686
-  KEY `idx_fe_attendance_rec` (`attendance_batch_id`),
687
-  CONSTRAINT `fk_fe_attendance_record_attendance_batch_id` FOREIGN KEY (`attendance_batch_id`) REFERENCES `fe_attendance_batch` (`id`),
688
-  CONSTRAINT `fk_fe_attendance_record_registration_id` FOREIGN KEY (`registration_id`) REFERENCES `fe_worker_registration` (`id`),
689
-  CONSTRAINT `fk_fe_attendance_record_worker_id` FOREIGN KEY (`worker_id`) REFERENCES `fe_worker` (`id`)
637
+  KEY `idx_fe_attendance_rec` (`attendance_batch_id`)
690
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考勤明细表(二期),记录单人单日考勤类型(正常/加班/请假/计件)、工时与计件数。支持 manual/voice/import 多种录入来源;关联 fe_attendance_batch、fe_worker_registration、fe_worker。';
638
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考勤明细表(二期),记录单人单日考勤类型(正常/加班/请假/计件)、工时与计件数。支持 manual/voice/import 多种录入来源;关联 fe_attendance_batch、fe_worker_registration、fe_worker。';
691
 
639
 
692
 DROP TABLE IF EXISTS `fe_user_confirmation`;
640
 DROP TABLE IF EXISTS `fe_user_confirmation`;
693
 CREATE TABLE `fe_user_confirmation` (
641
 CREATE TABLE `fe_user_confirmation` (
694
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。用户执行确认类操作时同步插入,不可篡改。非空。',
642
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。用户执行确认类操作时同步插入,不可篡改。非空。',
695
-  `enterprise_id` BIGINT          NOT NULL COMMENT '所属企业,外键 REFERENCES fe_enterprise(id)。非空;索引 idx_fe_user_confirm。',
696
-  `user_id` BIGINT          NOT NULL COMMENT '操作用户,外键 REFERENCES fe_user(id)。非空;须为 enterprise 类型企业主或管理员。',
643
+  `enterprise_id` BIGINT          NOT NULL COMMENT '所属企业,外键。非空;索引 idx_fe_user_confirm。',
644
+  `user_id` BIGINT          NOT NULL COMMENT '操作用户,外键。非空;须为 enterprise 类型企业主或管理员。',
697
   `biz_type` VARCHAR(50)     NOT NULL COMMENT '业务场景类型。枚举:draft_confirm=确认用工草稿;plan_select=选定用工方案;settlement_pay=确认并支付结算;external_submit=授权提交第三方平台。非空。',
645
   `biz_type` VARCHAR(50)     NOT NULL COMMENT '业务场景类型。枚举:draft_confirm=确认用工草稿;plan_select=选定用工方案;settlement_pay=确认并支付结算;external_submit=授权提交第三方平台。非空。',
698
   `biz_id` BIGINT          NOT NULL COMMENT '关联业务主键 ID,如 draft_id、settlement_id。非空;与 biz_type 组合解析。',
646
   `biz_id` BIGINT          NOT NULL COMMENT '关联业务主键 ID,如 draft_id、settlement_id。非空;与 biz_type 组合解析。',
699
   `biz_no` VARCHAR(32) COMMENT '关联业务编号冗余,便于人工审计。示例:draft_001。可空。',
647
   `biz_no` VARCHAR(32) COMMENT '关联业务编号冗余,便于人工审计。示例:draft_001。可空。',
700
   `action` VARCHAR(50)     NOT NULL COMMENT '用户动作类型。枚举:confirm=确认;modify=修改后确认;authorize=授权。非空。',
648
   `action` VARCHAR(50)     NOT NULL COMMENT '用户动作类型。枚举:confirm=确认;modify=修改后确认;authorize=授权。非空。',
701
   `confirmed_fields` json COMMENT '用户确认时的关键字段快照 JSON,固化确认瞬间数据。示例:{"worker_count":15,"daily_wage":280}。可空,默认 {}。',
649
   `confirmed_fields` json COMMENT '用户确认时的关键字段快照 JSON,固化确认瞬间数据。示例:{"worker_count":15,"daily_wage":280}。可空,默认 {}。',
702
-  `selected_plan_id` BIGINT COMMENT '确认选用的方案,外键 REFERENCES fe_service_plan(id)。biz_type=plan_select 或 draft_confirm 时写入。可空。',
650
+  `selected_plan_id` BIGINT COMMENT '确认选用的方案,外键。biz_type=plan_select 或 draft_confirm 时写入。可空。',
703
   `client_ip` VARCHAR(64) COMMENT '客户端 IP,合规取证。网关提取。可空。',
651
   `client_ip` VARCHAR(64) COMMENT '客户端 IP,合规取证。网关提取。可空。',
704
   `user_agent` VARCHAR(500) COMMENT '客户端 UA 字符串。可空。',
652
   `user_agent` VARCHAR(500) COMMENT '客户端 UA 字符串。可空。',
705
   `remark` TEXT COMMENT '用户填写的备注或系统附注。可空。',
653
   `remark` TEXT COMMENT '用户填写的备注或系统附注。可空。',
706
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '确认操作发生时间。非空。',
654
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '确认操作发生时间。非空。',
707
   PRIMARY KEY (`id`),
655
   PRIMARY KEY (`id`),
708
-  KEY `idx_fe_user_confirm` (`enterprise_id`, `biz_type`, `create_time`),
709
-  CONSTRAINT `fk_fe_user_confirmation_enterprise_id` FOREIGN KEY (`enterprise_id`) REFERENCES `fe_enterprise` (`id`),
710
-  CONSTRAINT `fk_fe_user_confirmation_user_id` FOREIGN KEY (`user_id`) REFERENCES `fe_user` (`id`),
711
-  CONSTRAINT `fk_fe_user_confirmation_selected_plan_id` FOREIGN KEY (`selected_plan_id`) REFERENCES `fe_service_plan` (`id`)
656
+  KEY `idx_fe_user_confirm` (`enterprise_id`, `biz_type`, `create_time`)
712
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户确认与授权留痕表,草稿确认、方案选择、结算支付、外部平台提交等高风险操作必须写入,满足审计与合规举证。关联 fe_enterprise、fe_user,可引用 fe_service_plan。';
657
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户确认与授权留痕表,草稿确认、方案选择、结算支付、外部平台提交等高风险操作必须写入,满足审计与合规举证。关联 fe_enterprise、fe_user,可引用 fe_service_plan。';
713
 
658
 
714
 DROP TABLE IF EXISTS `fe_field_change_log`;
659
 DROP TABLE IF EXISTS `fe_field_change_log`;
@@ -720,11 +665,10 @@ CREATE TABLE `fe_field_change_log` (
720
   `old_value` TEXT COMMENT '变更前的文本值。可空;首次填入时 old_value 为空。',
665
   `old_value` TEXT COMMENT '变更前的文本值。可空;首次填入时 old_value 为空。',
721
   `new_value` TEXT COMMENT '变更后的文本值。可空。',
666
   `new_value` TEXT COMMENT '变更后的文本值。可空。',
722
   `change_source` VARCHAR(30)     NOT NULL COMMENT '变更来源。枚举:user_edit=用户表单编辑;nl_edit=自然语言对话修改;ai_regenerate=AI 重新生成草稿;system=系统自动(如状态联动)。非空。',
667
   `change_source` VARCHAR(30)     NOT NULL COMMENT '变更来源。枚举:user_edit=用户表单编辑;nl_edit=自然语言对话修改;ai_regenerate=AI 重新生成草稿;system=系统自动(如状态联动)。非空。',
723
-  `operator_id` BIGINT COMMENT '操作人,外键 REFERENCES fe_user(id)。系统自动变更时可为空。可空。',
668
+  `operator_id` BIGINT COMMENT '操作人,外键。系统自动变更时可为空。可空。',
724
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '变更发生时间。非空。',
669
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '变更发生时间。非空。',
725
   PRIMARY KEY (`id`),
670
   PRIMARY KEY (`id`),
726
-  KEY `idx_fe_field_change` (`biz_type`, `biz_id`, `create_time`),
727
-  CONSTRAINT `fk_fe_field_change_log_operator_id` FOREIGN KEY (`operator_id`) REFERENCES `fe_user` (`id`)
671
+  KEY `idx_fe_field_change` (`biz_type`, `biz_id`, `create_time`)
728
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='关键字段变更历史表,记录草稿、订单、登记等业务对象重要字段的修改前后值,区分用户手工编辑、自然语言修改、AI 重新生成与系统自动变更,支撑争议追溯。';
672
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='关键字段变更历史表,记录草稿、订单、登记等业务对象重要字段的修改前后值,区分用户手工编辑、自然语言修改、AI 重新生成与系统自动变更,支撑争议追溯。';
729
 
673
 
730
 DROP TABLE IF EXISTS `fe_provider`;
674
 DROP TABLE IF EXISTS `fe_provider`;
@@ -744,9 +688,9 @@ CREATE TABLE `fe_provider` (
744
 DROP TABLE IF EXISTS `fe_provider_api_log`;
688
 DROP TABLE IF EXISTS `fe_provider_api_log`;
745
 CREATE TABLE `fe_provider_api_log` (
689
 CREATE TABLE `fe_provider_api_log` (
746
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。每次调用第三方 API 时追加。非空。',
690
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。每次调用第三方 API 时追加。非空。',
747
-  `provider_id` BIGINT          NOT NULL COMMENT '合作平台,外键 REFERENCES fe_provider(id)。非空;索引 idx_fe_provider_log。',
748
-  `enterprise_id` BIGINT COMMENT '关联企业,外键 REFERENCES fe_enterprise(id)。调用上下文企业。可空。',
749
-  `order_id` BIGINT COMMENT '关联订单,外键 REFERENCES fe_employment_order(id)。可空;索引 idx_fe_provider_log_order。',
691
+  `provider_id` BIGINT          NOT NULL COMMENT '合作平台,外键。非空;索引 idx_fe_provider_log。',
692
+  `enterprise_id` BIGINT COMMENT '关联企业,外键。调用上下文企业。可空。',
693
+  `order_id` BIGINT COMMENT '关联订单,外键。可空;索引 idx_fe_provider_log_order。',
750
   `action` VARCHAR(100)    NOT NULL COMMENT 'API 动作编码。示例:create_requirement=创建用工需求;query_status=查询办理状态;callback=异步回调。非空。',
694
   `action` VARCHAR(100)    NOT NULL COMMENT 'API 动作编码。示例:create_requirement=创建用工需求;query_status=查询办理状态;callback=异步回调。非空。',
751
   `request_payload` json COMMENT '请求体 JSON 快照。可空;可能含敏感业务数据,访问受控。',
695
   `request_payload` json COMMENT '请求体 JSON 快照。可空;可能含敏感业务数据,访问受控。',
752
   `response_payload` json COMMENT '响应体 JSON 快照。可空。',
696
   `response_payload` json COMMENT '响应体 JSON 快照。可空。',
@@ -758,17 +702,14 @@ CREATE TABLE `fe_provider_api_log` (
758
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '调用时间。非空。',
702
   `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '调用时间。非空。',
759
   PRIMARY KEY (`id`),
703
   PRIMARY KEY (`id`),
760
   KEY `idx_fe_provider_log` (`provider_id`, `create_time`),
704
   KEY `idx_fe_provider_log` (`provider_id`, `create_time`),
761
-  KEY `idx_fe_provider_log_order` (`order_id`),
762
-  CONSTRAINT `fk_fe_provider_api_log_provider_id` FOREIGN KEY (`provider_id`) REFERENCES `fe_provider` (`id`),
763
-  CONSTRAINT `fk_fe_provider_api_log_enterprise_id` FOREIGN KEY (`enterprise_id`) REFERENCES `fe_enterprise` (`id`),
764
-  CONSTRAINT `fk_fe_provider_api_log_order_id` FOREIGN KEY (`order_id`) REFERENCES `fe_employment_order` (`id`)
705
+  KEY `idx_fe_provider_log_order` (`order_id`)
765
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='合作平台 API 调用日志表,保存原始 HTTP 请求响应、技术状态码与转换后的业务状态 biz_status。技术细节不对用户展示;audit_required 标识是否需用户确认后才能继续推进订单流程。';
706
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='合作平台 API 调用日志表,保存原始 HTTP 请求响应、技术状态码与转换后的业务状态 biz_status。技术细节不对用户展示;audit_required 标识是否需用户确认后才能继续推进订单流程。';
766
 
707
 
767
 DROP TABLE IF EXISTS `fe_notification`;
708
 DROP TABLE IF EXISTS `fe_notification`;
768
 CREATE TABLE `fe_notification` (
709
 CREATE TABLE `fe_notification` (
769
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。业务事件触发时由通知服务写入。非空。',
710
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '表主键,自增。业务事件触发时由通知服务写入。非空。',
770
-  `enterprise_id` BIGINT COMMENT '所属企业,外键 REFERENCES fe_enterprise(id)。企业维度消息筛选。可空;索引 idx_fe_notification_ent。',
771
-  `user_id` BIGINT COMMENT '接收用户,外键 REFERENCES fe_user(id)。可空;索引 idx_fe_notification_user;与 enterprise_id 至少其一有值。',
711
+  `enterprise_id` BIGINT COMMENT '所属企业,外键。企业维度消息筛选。可空;索引 idx_fe_notification_ent。',
712
+  `user_id` BIGINT COMMENT '接收用户,外键。可空;索引 idx_fe_notification_user;与 enterprise_id 至少其一有值。',
772
   `notify_type` VARCHAR(30)     NOT NULL COMMENT '通知展示样式。枚举:pending=待办(橙色);error=异常(红色);info=提示(蓝色);success=成功(绿色)。非空。',
713
   `notify_type` VARCHAR(30)     NOT NULL COMMENT '通知展示样式。枚举:pending=待办(橙色);error=异常(红色);info=提示(蓝色);success=成功(绿色)。非空。',
773
   `category` VARCHAR(50)     NOT NULL COMMENT '业务分类。枚举:settlement=结算;registration=登记;verify=实名核验;workflow=流程进度。非空。',
714
   `category` VARCHAR(50)     NOT NULL COMMENT '业务分类。枚举:settlement=结算;registration=登记;verify=实名核验;workflow=流程进度。非空。',
774
   `title` VARCHAR(200)    NOT NULL COMMENT '通知标题,列表主文案。非空。',
715
   `title` VARCHAR(200)    NOT NULL COMMENT '通知标题,列表主文案。非空。',
@@ -784,9 +725,7 @@ CREATE TABLE `fe_notification` (
784
   `handled_time` datetime COMMENT '待办完成时间。可空。',
725
   `handled_time` datetime COMMENT '待办完成时间。可空。',
785
   PRIMARY KEY (`id`),
726
   PRIMARY KEY (`id`),
786
   KEY `idx_fe_notification_user` (`user_id`, `read_flag`, `create_time`),
727
   KEY `idx_fe_notification_user` (`user_id`, `read_flag`, `create_time`),
787
-  KEY `idx_fe_notification_ent` (`enterprise_id`, `handled_flag`, `create_time`),
788
-  CONSTRAINT `fk_fe_notification_enterprise_id` FOREIGN KEY (`enterprise_id`) REFERENCES `fe_enterprise` (`id`),
789
-  CONSTRAINT `fk_fe_notification_user_id` FOREIGN KEY (`user_id`) REFERENCES `fe_user` (`id`)
728
+  KEY `idx_fe_notification_ent` (`enterprise_id`, `handled_flag`, `create_time`)
790
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='消息与待办中心表,推送结算待确认、实名失败、登记进度、流程节点变更等通知。支持 action_url 跳转小程序对应页面/弹窗;关联 fe_enterprise、fe_user,通过 read_flag 与 handled_flag 区分已读与已办。';
729
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='消息与待办中心表,推送结算待确认、实名失败、登记进度、流程节点变更等通知。支持 action_url 跳转小程序对应页面/弹窗;关联 fe_enterprise、fe_user,通过 read_flag 与 handled_flag 区分已读与已办。';
791
 -- -----------------------------------------------------------------------------
730
 -- -----------------------------------------------------------------------------
792
 -- 初始化数据(测试阶段默认值)
731
 -- 初始化数据(测试阶段默认值)

+ 120 - 120
doc/灵活用工.sql

@@ -90,8 +90,8 @@ CREATE UNIQUE INDEX uk_fe_enterprise_credit_code ON fe_enterprise (credit_code,
90
 -- 企业-用户绑定(一个企业可有多个管理员)
90
 -- 企业-用户绑定(一个企业可有多个管理员)
91
 CREATE TABLE fe_enterprise_user (
91
 CREATE TABLE fe_enterprise_user (
92
     id              BIGSERIAL       PRIMARY KEY,
92
     id              BIGSERIAL       PRIMARY KEY,
93
-    enterprise_id   BIGINT          NOT NULL REFERENCES fe_enterprise(id),
94
-    user_id         BIGINT          NOT NULL REFERENCES fe_user(id),
93
+    enterprise_id   BIGINT          NOT NULL,
94
+    user_id         BIGINT          NOT NULL,
95
     role            VARCHAR(20)     NOT NULL DEFAULT 'owner',        -- owner / admin / viewer
95
     role            VARCHAR(20)     NOT NULL DEFAULT 'owner',        -- owner / admin / viewer
96
     is_default      BOOLEAN         NOT NULL DEFAULT FALSE,          -- 默认选中企业
96
     is_default      BOOLEAN         NOT NULL DEFAULT FALSE,          -- 默认选中企业
97
     bind_time       TIMESTAMPTZ     NOT NULL DEFAULT NOW(),
97
     bind_time       TIMESTAMPTZ     NOT NULL DEFAULT NOW(),
@@ -106,7 +106,7 @@ CREATE INDEX idx_fe_enterprise_user_uid ON fe_enterprise_user (user_id);
106
 -- 企业财务与开票信息(敏感,小程序端不直接展示明细)
106
 -- 企业财务与开票信息(敏感,小程序端不直接展示明细)
107
 CREATE TABLE fe_enterprise_finance (
107
 CREATE TABLE fe_enterprise_finance (
108
     id                  BIGSERIAL       PRIMARY KEY,
108
     id                  BIGSERIAL       PRIMARY KEY,
109
-    enterprise_id       BIGINT          NOT NULL REFERENCES fe_enterprise(id),
109
+    enterprise_id       BIGINT          NOT NULL,
110
     bank_name           VARCHAR(100),
110
     bank_name           VARCHAR(100),
111
     bank_account_enc    TEXT,                                       -- 对公账户密文
111
     bank_account_enc    TEXT,                                       -- 对公账户密文
112
     bank_account_mask   VARCHAR(32),
112
     bank_account_mask   VARCHAR(32),
@@ -124,7 +124,7 @@ CREATE UNIQUE INDEX uk_fe_enterprise_finance ON fe_enterprise_finance (enterpris
124
 -- 企业智能偏好(工种薪资基准、默认保险、发薪周期等)
124
 -- 企业智能偏好(工种薪资基准、默认保险、发薪周期等)
125
 CREATE TABLE fe_enterprise_preference (
125
 CREATE TABLE fe_enterprise_preference (
126
     id              BIGSERIAL       PRIMARY KEY,
126
     id              BIGSERIAL       PRIMARY KEY,
127
-    enterprise_id   BIGINT          NOT NULL REFERENCES fe_enterprise(id),
127
+    enterprise_id   BIGINT          NOT NULL,
128
     pref_type       VARCHAR(50)     NOT NULL,                       -- work_type / insurance / payment_cycle
128
     pref_type       VARCHAR(50)     NOT NULL,                       -- work_type / insurance / payment_cycle
129
     pref_key        VARCHAR(100),
129
     pref_key        VARCHAR(100),
130
     pref_value      JSONB           NOT NULL DEFAULT '{}',
130
     pref_value      JSONB           NOT NULL DEFAULT '{}',
@@ -147,8 +147,8 @@ CREATE INDEX idx_fe_enterprise_pref ON fe_enterprise_preference (enterprise_id,
147
 CREATE TABLE fe_conversation (
147
 CREATE TABLE fe_conversation (
148
     id              BIGSERIAL       PRIMARY KEY,
148
     id              BIGSERIAL       PRIMARY KEY,
149
     conversation_no VARCHAR(32)     NOT NULL,                       -- conv_001
149
     conversation_no VARCHAR(32)     NOT NULL,                       -- conv_001
150
-    enterprise_id   BIGINT          NOT NULL REFERENCES fe_enterprise(id),
151
-    user_id         BIGINT          NOT NULL REFERENCES fe_user(id),
150
+    enterprise_id   BIGINT          NOT NULL,
151
+    user_id         BIGINT          NOT NULL,
152
     title           VARCHAR(200),
152
     title           VARCHAR(200),
153
     chat_type       VARCHAR(30)     NOT NULL DEFAULT 'employment',  -- employment/knowledge/order/cost/attendance/emergency
153
     chat_type       VARCHAR(30)     NOT NULL DEFAULT 'employment',  -- employment/knowledge/order/cost/attendance/emergency
154
     status          VARCHAR(20)     NOT NULL DEFAULT 'active',        -- active / archived
154
     status          VARCHAR(20)     NOT NULL DEFAULT 'active',        -- active / archived
@@ -163,7 +163,7 @@ CREATE INDEX idx_fe_conversation_ent ON fe_conversation (enterprise_id, last_mes
163
 
163
 
164
 CREATE TABLE fe_conversation_message (
164
 CREATE TABLE fe_conversation_message (
165
     id                  BIGSERIAL       PRIMARY KEY,
165
     id                  BIGSERIAL       PRIMARY KEY,
166
-    conversation_id     BIGINT          NOT NULL REFERENCES fe_conversation(id),
166
+    conversation_id     BIGINT          NOT NULL,
167
     role                VARCHAR(20)     NOT NULL,                   -- user / assistant / system
167
     role                VARCHAR(20)     NOT NULL,                   -- user / assistant / system
168
     content             TEXT            NOT NULL,
168
     content             TEXT            NOT NULL,
169
     content_type        VARCHAR(30)     NOT NULL DEFAULT 'text',    -- text / card_draft / card_cost / card_order
169
     content_type        VARCHAR(30)     NOT NULL DEFAULT 'text',    -- text / card_draft / card_cost / card_order
@@ -180,8 +180,8 @@ CREATE INDEX idx_fe_conv_msg ON fe_conversation_message (conversation_id, create
180
 -- 智能体/子模块调用记录(审计、排障)
180
 -- 智能体/子模块调用记录(审计、排障)
181
 CREATE TABLE fe_agent_action_log (
181
 CREATE TABLE fe_agent_action_log (
182
     id              BIGSERIAL       PRIMARY KEY,
182
     id              BIGSERIAL       PRIMARY KEY,
183
-    conversation_id BIGINT          REFERENCES fe_conversation(id),
184
-    enterprise_id   BIGINT          NOT NULL REFERENCES fe_enterprise(id),
183
+    conversation_id BIGINT,
184
+    enterprise_id   BIGINT          NOT NULL,
185
     module_name     VARCHAR(50)     NOT NULL,                       -- main_agent / flexible_employment / cost_engine
185
     module_name     VARCHAR(50)     NOT NULL,                       -- main_agent / flexible_employment / cost_engine
186
     action          VARCHAR(100)    NOT NULL,
186
     action          VARCHAR(100)    NOT NULL,
187
     request_json    JSONB,
187
     request_json    JSONB,
@@ -226,7 +226,7 @@ CREATE UNIQUE INDEX uk_fe_service_plan_code ON fe_service_plan (plan_code) WHERE
226
 -- 方案费用项规则
226
 -- 方案费用项规则
227
 CREATE TABLE fe_service_plan_fee_rule (
227
 CREATE TABLE fe_service_plan_fee_rule (
228
     id              BIGSERIAL       PRIMARY KEY,
228
     id              BIGSERIAL       PRIMARY KEY,
229
-    plan_id         BIGINT          NOT NULL REFERENCES fe_service_plan(id),
229
+    plan_id         BIGINT          NOT NULL,
230
     fee_code        VARCHAR(50)     NOT NULL,                       -- labor_fee / service_fee / insurance / tax_withhold
230
     fee_code        VARCHAR(50)     NOT NULL,                       -- labor_fee / service_fee / insurance / tax_withhold
231
     fee_name        VARCHAR(100)    NOT NULL,
231
     fee_name        VARCHAR(100)    NOT NULL,
232
     calc_type       VARCHAR(30)     NOT NULL,                       -- fixed / rate / formula
232
     calc_type       VARCHAR(30)     NOT NULL,                       -- fixed / rate / formula
@@ -254,7 +254,7 @@ CREATE UNIQUE INDEX uk_fe_workflow_def ON fe_workflow_definition (workflow_code,
254
 
254
 
255
 CREATE TABLE fe_workflow_step (
255
 CREATE TABLE fe_workflow_step (
256
     id              BIGSERIAL       PRIMARY KEY,
256
     id              BIGSERIAL       PRIMARY KEY,
257
-    workflow_id     BIGINT          NOT NULL REFERENCES fe_workflow_definition(id),
257
+    workflow_id     BIGINT          NOT NULL,
258
     step_code       VARCHAR(50)     NOT NULL,                       -- draft_created / plan_confirmed / registration ...
258
     step_code       VARCHAR(50)     NOT NULL,                       -- draft_created / plan_confirmed / registration ...
259
     step_name       VARCHAR(100)    NOT NULL,
259
     step_name       VARCHAR(100)    NOT NULL,
260
     step_order      INTEGER         NOT NULL,
260
     step_order      INTEGER         NOT NULL,
@@ -291,9 +291,9 @@ CREATE UNIQUE INDEX uk_fe_policy_rule ON fe_policy_rule (rule_code);
291
 CREATE TABLE fe_employment_draft (
291
 CREATE TABLE fe_employment_draft (
292
     id                  BIGSERIAL       PRIMARY KEY,
292
     id                  BIGSERIAL       PRIMARY KEY,
293
     draft_no            VARCHAR(32)     NOT NULL,                   -- draft_001
293
     draft_no            VARCHAR(32)     NOT NULL,                   -- draft_001
294
-    enterprise_id       BIGINT          NOT NULL REFERENCES fe_enterprise(id),
295
-    user_id             BIGINT          NOT NULL REFERENCES fe_user(id),
296
-    conversation_id     BIGINT          REFERENCES fe_conversation(id),
294
+    enterprise_id       BIGINT          NOT NULL,
295
+    user_id             BIGINT          NOT NULL,
296
+    conversation_id     BIGINT,
297
     scenario            VARCHAR(50)     NOT NULL,                   -- existing_worker_regularization / new_demand
297
     scenario            VARCHAR(50)     NOT NULL,                   -- existing_worker_regularization / new_demand
298
     title               VARCHAR(200),                               -- 浦东仓库搬运
298
     title               VARCHAR(200),                               -- 浦东仓库搬运
299
     status              VARCHAR(20)     NOT NULL DEFAULT 'pending',   -- pending / confirmed / cancelled / expired
299
     status              VARCHAR(20)     NOT NULL DEFAULT 'pending',   -- pending / confirmed / cancelled / expired
@@ -316,9 +316,9 @@ CREATE TABLE fe_employment_draft (
316
     risk_prompts        JSONB           DEFAULT '[]',               -- 风险提示
316
     risk_prompts        JSONB           DEFAULT '[]',               -- 风险提示
317
     estimated_total     NUMERIC(14,2),                              -- 预估总支出
317
     estimated_total     NUMERIC(14,2),                              -- 预估总支出
318
     estimated_per_capita NUMERIC(12,2),                             -- 预估人均成本
318
     estimated_per_capita NUMERIC(12,2),                             -- 预估人均成本
319
-    selected_plan_id    BIGINT          REFERENCES fe_service_plan(id),
319
+    selected_plan_id    BIGINT,
320
     confirmed_at        TIMESTAMPTZ,
320
     confirmed_at        TIMESTAMPTZ,
321
-    confirmed_by        BIGINT          REFERENCES fe_user(id),
321
+    confirmed_by        BIGINT,
322
     create_time         TIMESTAMPTZ     NOT NULL DEFAULT NOW(),
322
     create_time         TIMESTAMPTZ     NOT NULL DEFAULT NOW(),
323
     update_time         TIMESTAMPTZ     NOT NULL DEFAULT NOW(),
323
     update_time         TIMESTAMPTZ     NOT NULL DEFAULT NOW(),
324
     del_flag            SMALLINT        NOT NULL DEFAULT 0
324
     del_flag            SMALLINT        NOT NULL DEFAULT 0
@@ -330,7 +330,7 @@ CREATE INDEX idx_fe_draft_ent ON fe_employment_draft (enterprise_id, status, cre
330
 -- 草稿字段明细(带来源与可编辑标记,支持「默认生成」展示)
330
 -- 草稿字段明细(带来源与可编辑标记,支持「默认生成」展示)
331
 CREATE TABLE fe_draft_field (
331
 CREATE TABLE fe_draft_field (
332
     id              BIGSERIAL       PRIMARY KEY,
332
     id              BIGSERIAL       PRIMARY KEY,
333
-    draft_id        BIGINT          NOT NULL REFERENCES fe_employment_draft(id),
333
+    draft_id        BIGINT          NOT NULL,
334
     field_key       VARCHAR(100)    NOT NULL,
334
     field_key       VARCHAR(100)    NOT NULL,
335
     field_label     VARCHAR(100),
335
     field_label     VARCHAR(100),
336
     field_value     TEXT,
336
     field_value     TEXT,
@@ -347,8 +347,8 @@ CREATE UNIQUE INDEX uk_fe_draft_field ON fe_draft_field (draft_id, field_key);
347
 -- 草稿成本对比快照
347
 -- 草稿成本对比快照
348
 CREATE TABLE fe_draft_cost_snapshot (
348
 CREATE TABLE fe_draft_cost_snapshot (
349
     id                          BIGSERIAL       PRIMARY KEY,
349
     id                          BIGSERIAL       PRIMARY KEY,
350
-    draft_id                    BIGINT          NOT NULL REFERENCES fe_employment_draft(id),
351
-    plan_id                     BIGINT          REFERENCES fe_service_plan(id),
350
+    draft_id                    BIGINT          NOT NULL,
351
+    plan_id                     BIGINT,
352
     plan_code                   VARCHAR(32)     NOT NULL,
352
     plan_code                   VARCHAR(32)     NOT NULL,
353
     plan_name                   VARCHAR(100)    NOT NULL,
353
     plan_name                   VARCHAR(100)    NOT NULL,
354
     employer_total_outflow      NUMERIC(14,2)   NOT NULL,           -- 企业总支出
354
     employer_total_outflow      NUMERIC(14,2)   NOT NULL,           -- 企业总支出
@@ -367,7 +367,7 @@ CREATE INDEX idx_fe_cost_snapshot ON fe_draft_cost_snapshot (draft_id);
367
 -- 成本明细项(劳务费、服务费、保险、税费代征等)
367
 -- 成本明细项(劳务费、服务费、保险、税费代征等)
368
 CREATE TABLE fe_draft_cost_detail (
368
 CREATE TABLE fe_draft_cost_detail (
369
     id              BIGSERIAL       PRIMARY KEY,
369
     id              BIGSERIAL       PRIMARY KEY,
370
-    snapshot_id     BIGINT          NOT NULL REFERENCES fe_draft_cost_snapshot(id),
370
+    snapshot_id     BIGINT          NOT NULL,
371
     fee_code        VARCHAR(50)     NOT NULL,
371
     fee_code        VARCHAR(50)     NOT NULL,
372
     fee_name        VARCHAR(100)    NOT NULL,
372
     fee_name        VARCHAR(100)    NOT NULL,
373
     amount          NUMERIC(14,2)   NOT NULL,
373
     amount          NUMERIC(14,2)   NOT NULL,
@@ -386,10 +386,10 @@ CREATE INDEX idx_fe_cost_detail ON fe_draft_cost_detail (snapshot_id);
386
 CREATE TABLE fe_employment_order (
386
 CREATE TABLE fe_employment_order (
387
     id                  BIGSERIAL       PRIMARY KEY,
387
     id                  BIGSERIAL       PRIMARY KEY,
388
     order_no            VARCHAR(32)     NOT NULL,                   -- 2024-001
388
     order_no            VARCHAR(32)     NOT NULL,                   -- 2024-001
389
-    enterprise_id       BIGINT          NOT NULL REFERENCES fe_enterprise(id),
390
-    user_id             BIGINT          NOT NULL REFERENCES fe_user(id),
391
-    draft_id            BIGINT          REFERENCES fe_employment_draft(id),
392
-    selected_plan_id    BIGINT          REFERENCES fe_service_plan(id),
389
+    enterprise_id       BIGINT          NOT NULL,
390
+    user_id             BIGINT          NOT NULL,
391
+    draft_id            BIGINT,
392
+    selected_plan_id    BIGINT,
393
     title               VARCHAR(200)    NOT NULL,
393
     title               VARCHAR(200)    NOT NULL,
394
     worker_count        INTEGER         NOT NULL,
394
     worker_count        INTEGER         NOT NULL,
395
     work_days           NUMERIC(8,2),
395
     work_days           NUMERIC(8,2),
@@ -442,12 +442,12 @@ CREATE INDEX idx_fe_batch_enterprise ON fe_registration_batch (enterprise_id);
442
 -- 订单流程状态变更日志(合规状态机留痕)
442
 -- 订单流程状态变更日志(合规状态机留痕)
443
 CREATE TABLE fe_order_workflow_log (
443
 CREATE TABLE fe_order_workflow_log (
444
     id              BIGSERIAL       PRIMARY KEY,
444
     id              BIGSERIAL       PRIMARY KEY,
445
-    order_id        BIGINT          NOT NULL REFERENCES fe_employment_order(id),
445
+    order_id        BIGINT          NOT NULL,
446
     from_step       VARCHAR(50),
446
     from_step       VARCHAR(50),
447
     to_step         VARCHAR(50)     NOT NULL,
447
     to_step         VARCHAR(50)     NOT NULL,
448
     from_status     VARCHAR(30),
448
     from_status     VARCHAR(30),
449
     to_status       VARCHAR(30)     NOT NULL,
449
     to_status       VARCHAR(30)     NOT NULL,
450
-    operator_id     BIGINT          REFERENCES fe_user(id),
450
+    operator_id     BIGINT,
451
     operator_type   VARCHAR(20)     NOT NULL DEFAULT 'system',      -- system / enterprise / worker / provider
451
     operator_type   VARCHAR(20)     NOT NULL DEFAULT 'system',      -- system / enterprise / worker / provider
452
     remark          TEXT,
452
     remark          TEXT,
453
     extra_json      JSONB,
453
     extra_json      JSONB,
@@ -465,7 +465,7 @@ CREATE INDEX idx_fe_order_wf_log ON fe_order_workflow_log (order_id, create_time
465
 
465
 
466
 CREATE TABLE fe_worker (
466
 CREATE TABLE fe_worker (
467
     id                  BIGSERIAL       PRIMARY KEY,
467
     id                  BIGSERIAL       PRIMARY KEY,
468
-    user_id             BIGINT          REFERENCES fe_user(id),
468
+    user_id             BIGINT,
469
     worker_no           VARCHAR(32),
469
     worker_no           VARCHAR(32),
470
     real_name           VARCHAR(64)     NOT NULL,
470
     real_name           VARCHAR(64)     NOT NULL,
471
     id_card_no_enc      TEXT            NOT NULL,                   -- 身份证号密文
471
     id_card_no_enc      TEXT            NOT NULL,                   -- 身份证号密文
@@ -491,9 +491,9 @@ CREATE INDEX idx_fe_worker_mobile ON fe_worker (mobile_mask);
491
 CREATE TABLE fe_worker_registration (
491
 CREATE TABLE fe_worker_registration (
492
     id                  BIGSERIAL       PRIMARY KEY,
492
     id                  BIGSERIAL       PRIMARY KEY,
493
     batch_id            BIGINT          NOT NULL,                   -- 逻辑关联 fe_registration_batch.id(无 FK)
493
     batch_id            BIGINT          NOT NULL,                   -- 逻辑关联 fe_registration_batch.id(无 FK)
494
-    order_id            BIGINT          NOT NULL REFERENCES fe_employment_order(id),
495
-    enterprise_id       BIGINT          NOT NULL REFERENCES fe_enterprise(id),
496
-    worker_id           BIGINT          REFERENCES fe_worker(id),
494
+    order_id            BIGINT          NOT NULL,
495
+    enterprise_id       BIGINT          NOT NULL,
496
+    worker_id           BIGINT,
497
     real_name           VARCHAR(64)     NOT NULL,
497
     real_name           VARCHAR(64)     NOT NULL,
498
     mobile_enc          TEXT,
498
     mobile_enc          TEXT,
499
     mobile_mask         VARCHAR(20),
499
     mobile_mask         VARCHAR(20),
@@ -504,7 +504,7 @@ CREATE TABLE fe_worker_registration (
504
     fail_reason         TEXT,
504
     fail_reason         TEXT,
505
     submitted_at        TIMESTAMPTZ,
505
     submitted_at        TIMESTAMPTZ,
506
     reviewed_at         TIMESTAMPTZ,
506
     reviewed_at         TIMESTAMPTZ,
507
-    reviewed_by         BIGINT          REFERENCES fe_user(id),
507
+    reviewed_by         BIGINT,
508
     remind_count        INTEGER         NOT NULL DEFAULT 0,
508
     remind_count        INTEGER         NOT NULL DEFAULT 0,
509
     last_remind_at      TIMESTAMPTZ,
509
     last_remind_at      TIMESTAMPTZ,
510
     create_time         TIMESTAMPTZ     NOT NULL DEFAULT NOW(),
510
     create_time         TIMESTAMPTZ     NOT NULL DEFAULT NOW(),
@@ -518,8 +518,8 @@ CREATE INDEX idx_fe_worker_reg_order ON fe_worker_registration (order_id);
518
 -- 协议/授权确认(电子合同、隐私政策等)
518
 -- 协议/授权确认(电子合同、隐私政策等)
519
 CREATE TABLE fe_worker_consent (
519
 CREATE TABLE fe_worker_consent (
520
     id              BIGSERIAL       PRIMARY KEY,
520
     id              BIGSERIAL       PRIMARY KEY,
521
-    registration_id BIGINT          REFERENCES fe_worker_registration(id),
522
-    worker_id       BIGINT          REFERENCES fe_worker(id),
521
+    registration_id BIGINT,
522
+    worker_id       BIGINT,
523
     consent_type    VARCHAR(50)     NOT NULL,                       -- labor_contract / privacy_policy / authorization
523
     consent_type    VARCHAR(50)     NOT NULL,                       -- labor_contract / privacy_policy / authorization
524
     consent_version VARCHAR(20),
524
     consent_version VARCHAR(20),
525
     consent_title   VARCHAR(200),
525
     consent_title   VARCHAR(200),
@@ -540,10 +540,10 @@ CREATE INDEX idx_fe_worker_consent ON fe_worker_consent (registration_id);
540
 CREATE TABLE fe_contract (
540
 CREATE TABLE fe_contract (
541
     id              BIGSERIAL       PRIMARY KEY,
541
     id              BIGSERIAL       PRIMARY KEY,
542
     contract_no     VARCHAR(32)     NOT NULL,
542
     contract_no     VARCHAR(32)     NOT NULL,
543
-    order_id        BIGINT          NOT NULL REFERENCES fe_employment_order(id),
544
-    registration_id BIGINT          REFERENCES fe_worker_registration(id),
545
-    worker_id       BIGINT          REFERENCES fe_worker(id),
546
-    enterprise_id   BIGINT          NOT NULL REFERENCES fe_enterprise(id),
543
+    order_id        BIGINT          NOT NULL,
544
+    registration_id BIGINT,
545
+    worker_id       BIGINT,
546
+    enterprise_id   BIGINT          NOT NULL,
547
     contract_type   VARCHAR(50)     NOT NULL DEFAULT 'labor',
547
     contract_type   VARCHAR(50)     NOT NULL DEFAULT 'labor',
548
     contract_title  VARCHAR(200),
548
     contract_title  VARCHAR(200),
549
     sign_status     VARCHAR(20)     NOT NULL DEFAULT 'pending',     -- pending / signing / signed / rejected / expired
549
     sign_status     VARCHAR(20)     NOT NULL DEFAULT 'pending',     -- pending / signing / signed / rejected / expired
@@ -569,9 +569,9 @@ CREATE INDEX idx_fe_contract_order ON fe_contract (order_id, sign_status);
569
 CREATE TABLE fe_settlement_order (
569
 CREATE TABLE fe_settlement_order (
570
     id                  BIGSERIAL       PRIMARY KEY,
570
     id                  BIGSERIAL       PRIMARY KEY,
571
     settlement_no       VARCHAR(32)     NOT NULL,
571
     settlement_no       VARCHAR(32)     NOT NULL,
572
-    order_id            BIGINT          NOT NULL REFERENCES fe_employment_order(id),
572
+    order_id            BIGINT          NOT NULL,
573
     batch_id            BIGINT,                                     -- 逻辑关联 fe_registration_batch.id(无 FK)
573
     batch_id            BIGINT,                                     -- 逻辑关联 fe_registration_batch.id(无 FK)
574
-    enterprise_id       BIGINT          NOT NULL REFERENCES fe_enterprise(id),
574
+    enterprise_id       BIGINT          NOT NULL,
575
     worker_count        INTEGER         NOT NULL,
575
     worker_count        INTEGER         NOT NULL,
576
     gross_amount        NUMERIC(14,2)   NOT NULL DEFAULT 0,         -- 应发总额
576
     gross_amount        NUMERIC(14,2)   NOT NULL DEFAULT 0,         -- 应发总额
577
     deduction_amount    NUMERIC(14,2)   NOT NULL DEFAULT 0,         -- 扣款/个税
577
     deduction_amount    NUMERIC(14,2)   NOT NULL DEFAULT 0,         -- 扣款/个税
@@ -583,7 +583,7 @@ CREATE TABLE fe_settlement_order (
583
     compliance_tags     JSONB           DEFAULT '[]',
583
     compliance_tags     JSONB           DEFAULT '[]',
584
     compliance_remark   TEXT,
584
     compliance_remark   TEXT,
585
     confirmed_at        TIMESTAMPTZ,
585
     confirmed_at        TIMESTAMPTZ,
586
-    confirmed_by        BIGINT          REFERENCES fe_user(id),
586
+    confirmed_by        BIGINT,
587
     paid_at             TIMESTAMPTZ,
587
     paid_at             TIMESTAMPTZ,
588
     create_time         TIMESTAMPTZ     NOT NULL DEFAULT NOW(),
588
     create_time         TIMESTAMPTZ     NOT NULL DEFAULT NOW(),
589
     update_time         TIMESTAMPTZ     NOT NULL DEFAULT NOW(),
589
     update_time         TIMESTAMPTZ     NOT NULL DEFAULT NOW(),
@@ -596,9 +596,9 @@ CREATE INDEX idx_fe_settlement_ent ON fe_settlement_order (enterprise_id, settle
596
 -- 按人结算明细
596
 -- 按人结算明细
597
 CREATE TABLE fe_settlement_item (
597
 CREATE TABLE fe_settlement_item (
598
     id                  BIGSERIAL       PRIMARY KEY,
598
     id                  BIGSERIAL       PRIMARY KEY,
599
-    settlement_id       BIGINT          NOT NULL REFERENCES fe_settlement_order(id),
600
-    registration_id     BIGINT          REFERENCES fe_worker_registration(id),
601
-    worker_id           BIGINT          REFERENCES fe_worker(id),
599
+    settlement_id       BIGINT          NOT NULL,
600
+    registration_id     BIGINT,
601
+    worker_id           BIGINT,
602
     worker_name_mask    VARCHAR(64),
602
     worker_name_mask    VARCHAR(64),
603
     work_days           NUMERIC(8,2),
603
     work_days           NUMERIC(8,2),
604
     work_hours          NUMERIC(8,2),
604
     work_hours          NUMERIC(8,2),
@@ -617,7 +617,7 @@ CREATE INDEX idx_fe_settlement_item ON fe_settlement_item (settlement_id);
617
 -- 结算费用汇总项
617
 -- 结算费用汇总项
618
 CREATE TABLE fe_settlement_fee (
618
 CREATE TABLE fe_settlement_fee (
619
     id              BIGSERIAL       PRIMARY KEY,
619
     id              BIGSERIAL       PRIMARY KEY,
620
-    settlement_id   BIGINT          NOT NULL REFERENCES fe_settlement_order(id),
620
+    settlement_id   BIGINT          NOT NULL,
621
     fee_code        VARCHAR(50)     NOT NULL,
621
     fee_code        VARCHAR(50)     NOT NULL,
622
     fee_name        VARCHAR(100)    NOT NULL,
622
     fee_name        VARCHAR(100)    NOT NULL,
623
     amount          NUMERIC(14,2)   NOT NULL,
623
     amount          NUMERIC(14,2)   NOT NULL,
@@ -631,13 +631,13 @@ CREATE INDEX idx_fe_settlement_fee ON fe_settlement_fee (settlement_id);
631
 CREATE TABLE fe_payment_record (
631
 CREATE TABLE fe_payment_record (
632
     id                  BIGSERIAL       PRIMARY KEY,
632
     id                  BIGSERIAL       PRIMARY KEY,
633
     payment_no          VARCHAR(32)     NOT NULL,
633
     payment_no          VARCHAR(32)     NOT NULL,
634
-    settlement_id       BIGINT          NOT NULL REFERENCES fe_settlement_order(id),
635
-    enterprise_id       BIGINT          NOT NULL REFERENCES fe_enterprise(id),
634
+    settlement_id       BIGINT          NOT NULL,
635
+    enterprise_id       BIGINT          NOT NULL,
636
     payment_channel     VARCHAR(50)     NOT NULL,                   -- wechat / alipay / bank
636
     payment_channel     VARCHAR(50)     NOT NULL,                   -- wechat / alipay / bank
637
     payment_amount      NUMERIC(14,2)   NOT NULL,
637
     payment_amount      NUMERIC(14,2)   NOT NULL,
638
     payment_status      VARCHAR(20)     NOT NULL DEFAULT 'pending', -- pending / success / failed / refunded
638
     payment_status      VARCHAR(20)     NOT NULL DEFAULT 'pending', -- pending / success / failed / refunded
639
     external_trade_no   VARCHAR(100),
639
     external_trade_no   VARCHAR(100),
640
-    payer_user_id       BIGINT          REFERENCES fe_user(id),
640
+    payer_user_id       BIGINT,
641
     paid_at             TIMESTAMPTZ,
641
     paid_at             TIMESTAMPTZ,
642
     receipt_url         VARCHAR(512),
642
     receipt_url         VARCHAR(512),
643
     fail_reason         TEXT,
643
     fail_reason         TEXT,
@@ -656,7 +656,7 @@ CREATE INDEX idx_fe_payment_settlement ON fe_payment_record (settlement_id);
656
 CREATE TABLE fe_attendance_batch (
656
 CREATE TABLE fe_attendance_batch (
657
     id              BIGSERIAL       PRIMARY KEY,
657
     id              BIGSERIAL       PRIMARY KEY,
658
     batch_id        BIGINT          NOT NULL,                       -- 逻辑关联 fe_registration_batch.id(无 FK)
658
     batch_id        BIGINT          NOT NULL,                       -- 逻辑关联 fe_registration_batch.id(无 FK)
659
-    order_id        BIGINT          NOT NULL REFERENCES fe_employment_order(id),
659
+    order_id        BIGINT          NOT NULL,
660
     attendance_date DATE            NOT NULL,
660
     attendance_date DATE            NOT NULL,
661
     total_workers   INTEGER         NOT NULL DEFAULT 0,
661
     total_workers   INTEGER         NOT NULL DEFAULT 0,
662
     normal_count    INTEGER         NOT NULL DEFAULT 0,
662
     normal_count    INTEGER         NOT NULL DEFAULT 0,
@@ -666,7 +666,7 @@ CREATE TABLE fe_attendance_batch (
666
     total_pieces    NUMERIC(12,2)   DEFAULT 0,
666
     total_pieces    NUMERIC(12,2)   DEFAULT 0,
667
     estimated_cost  NUMERIC(14,2)   DEFAULT 0,
667
     estimated_cost  NUMERIC(14,2)   DEFAULT 0,
668
     status          VARCHAR(20)     NOT NULL DEFAULT 'draft',       -- draft / confirmed / archived
668
     status          VARCHAR(20)     NOT NULL DEFAULT 'draft',       -- draft / confirmed / archived
669
-    confirmed_by    BIGINT          REFERENCES fe_user(id),
669
+    confirmed_by    BIGINT,
670
     confirmed_at    TIMESTAMPTZ,
670
     confirmed_at    TIMESTAMPTZ,
671
     create_time     TIMESTAMPTZ     NOT NULL DEFAULT NOW(),
671
     create_time     TIMESTAMPTZ     NOT NULL DEFAULT NOW(),
672
     update_time     TIMESTAMPTZ     NOT NULL DEFAULT NOW()
672
     update_time     TIMESTAMPTZ     NOT NULL DEFAULT NOW()
@@ -675,9 +675,9 @@ CREATE UNIQUE INDEX uk_fe_attendance_batch ON fe_attendance_batch (batch_id, att
675
 
675
 
676
 CREATE TABLE fe_attendance_record (
676
 CREATE TABLE fe_attendance_record (
677
     id                  BIGSERIAL       PRIMARY KEY,
677
     id                  BIGSERIAL       PRIMARY KEY,
678
-    attendance_batch_id BIGINT          NOT NULL REFERENCES fe_attendance_batch(id),
679
-    registration_id     BIGINT          NOT NULL REFERENCES fe_worker_registration(id),
680
-    worker_id           BIGINT          REFERENCES fe_worker(id),
678
+    attendance_batch_id BIGINT          NOT NULL,
679
+    registration_id     BIGINT          NOT NULL,
680
+    worker_id           BIGINT,
681
     attendance_type     VARCHAR(20)     NOT NULL DEFAULT 'normal',  -- normal / overtime / leave / piece
681
     attendance_type     VARCHAR(20)     NOT NULL DEFAULT 'normal',  -- normal / overtime / leave / piece
682
     work_hours          NUMERIC(8,2),
682
     work_hours          NUMERIC(8,2),
683
     overtime_hours      NUMERIC(8,2),
683
     overtime_hours      NUMERIC(8,2),
@@ -698,14 +698,14 @@ CREATE INDEX idx_fe_attendance_rec ON fe_attendance_record (attendance_batch_id)
698
 
698
 
699
 CREATE TABLE fe_user_confirmation (
699
 CREATE TABLE fe_user_confirmation (
700
     id              BIGSERIAL       PRIMARY KEY,
700
     id              BIGSERIAL       PRIMARY KEY,
701
-    enterprise_id   BIGINT          NOT NULL REFERENCES fe_enterprise(id),
702
-    user_id         BIGINT          NOT NULL REFERENCES fe_user(id),
701
+    enterprise_id   BIGINT          NOT NULL,
702
+    user_id         BIGINT          NOT NULL,
703
     biz_type        VARCHAR(50)     NOT NULL,                       -- draft_confirm / plan_select / settlement_pay / external_submit
703
     biz_type        VARCHAR(50)     NOT NULL,                       -- draft_confirm / plan_select / settlement_pay / external_submit
704
     biz_id          BIGINT          NOT NULL,
704
     biz_id          BIGINT          NOT NULL,
705
     biz_no          VARCHAR(32),
705
     biz_no          VARCHAR(32),
706
     action          VARCHAR(50)     NOT NULL,                       -- confirm / modify / authorize
706
     action          VARCHAR(50)     NOT NULL,                       -- confirm / modify / authorize
707
     confirmed_fields JSONB          DEFAULT '{}',
707
     confirmed_fields JSONB          DEFAULT '{}',
708
-    selected_plan_id BIGINT         REFERENCES fe_service_plan(id),
708
+    selected_plan_id BIGINT,
709
     client_ip       VARCHAR(64),
709
     client_ip       VARCHAR(64),
710
     user_agent      VARCHAR(500),
710
     user_agent      VARCHAR(500),
711
     remark          TEXT,
711
     remark          TEXT,
@@ -722,7 +722,7 @@ CREATE TABLE fe_field_change_log (
722
     old_value       TEXT,
722
     old_value       TEXT,
723
     new_value       TEXT,
723
     new_value       TEXT,
724
     change_source   VARCHAR(30)     NOT NULL,                       -- user_edit / nl_edit / ai_regenerate / system
724
     change_source   VARCHAR(30)     NOT NULL,                       -- user_edit / nl_edit / ai_regenerate / system
725
-    operator_id     BIGINT          REFERENCES fe_user(id),
725
+    operator_id     BIGINT,
726
     create_time     TIMESTAMPTZ     NOT NULL DEFAULT NOW()
726
     create_time     TIMESTAMPTZ     NOT NULL DEFAULT NOW()
727
 );
727
 );
728
 CREATE INDEX idx_fe_field_change ON fe_field_change_log (biz_type, biz_id, create_time);
728
 CREATE INDEX idx_fe_field_change ON fe_field_change_log (biz_type, biz_id, create_time);
@@ -748,9 +748,9 @@ CREATE UNIQUE INDEX uk_fe_provider_code ON fe_provider (provider_code);
748
 
748
 
749
 CREATE TABLE fe_provider_api_log (
749
 CREATE TABLE fe_provider_api_log (
750
     id                  BIGSERIAL       PRIMARY KEY,
750
     id                  BIGSERIAL       PRIMARY KEY,
751
-    provider_id         BIGINT          NOT NULL REFERENCES fe_provider(id),
752
-    enterprise_id       BIGINT          REFERENCES fe_enterprise(id),
753
-    order_id            BIGINT          REFERENCES fe_employment_order(id),
751
+    provider_id         BIGINT          NOT NULL,
752
+    enterprise_id       BIGINT,
753
+    order_id            BIGINT,
754
     action              VARCHAR(100)    NOT NULL,                   -- create_requirement / query_status / callback
754
     action              VARCHAR(100)    NOT NULL,                   -- create_requirement / query_status / callback
755
     request_payload     JSONB,
755
     request_payload     JSONB,
756
     response_payload    JSONB,
756
     response_payload    JSONB,
@@ -772,8 +772,8 @@ CREATE INDEX idx_fe_provider_log_order ON fe_provider_api_log (order_id);
772
 
772
 
773
 CREATE TABLE fe_notification (
773
 CREATE TABLE fe_notification (
774
     id              BIGSERIAL       PRIMARY KEY,
774
     id              BIGSERIAL       PRIMARY KEY,
775
-    enterprise_id   BIGINT          REFERENCES fe_enterprise(id),
776
-    user_id         BIGINT          REFERENCES fe_user(id),
775
+    enterprise_id   BIGINT,
776
+    user_id         BIGINT,
777
     notify_type     VARCHAR(30)     NOT NULL,                       -- pending / error / info / success
777
     notify_type     VARCHAR(30)     NOT NULL,                       -- pending / error / info / success
778
     category        VARCHAR(50)     NOT NULL,                       -- settlement / registration / verify / workflow
778
     category        VARCHAR(50)     NOT NULL,                       -- settlement / registration / verify / workflow
779
     title           VARCHAR(200)    NOT NULL,
779
     title           VARCHAR(200)    NOT NULL,
@@ -839,8 +839,8 @@ COMMENT ON COLUMN fe_enterprise.del_flag IS '逻辑删除标记。企业注销
839
 
839
 
840
 COMMENT ON TABLE fe_enterprise_user IS '企业与微信用户的多对多绑定关系表,支持一企业多管理员、一用户管多企业。通过 is_default 标识用户登录后默认选中的企业上下文,关联 fe_enterprise 与 fe_user。';
840
 COMMENT ON TABLE fe_enterprise_user IS '企业与微信用户的多对多绑定关系表,支持一企业多管理员、一用户管多企业。通过 is_default 标识用户登录后默认选中的企业上下文,关联 fe_enterprise 与 fe_user。';
841
 COMMENT ON COLUMN fe_enterprise_user.id IS '表主键,自增。绑定关系创建时生成。非空。';
841
 COMMENT ON COLUMN fe_enterprise_user.id IS '表主键,自增。绑定关系创建时生成。非空。';
842
-COMMENT ON COLUMN fe_enterprise_user.enterprise_id IS '关联企业主键,外键 REFERENCES fe_enterprise(id)。管理员邀请绑定或企业创建时写入。非空;级联查询企业下所有管理员。';
843
-COMMENT ON COLUMN fe_enterprise_user.user_id IS '关联微信用户主键,外键 REFERENCES fe_user(id)。被邀请用户接受绑定或企业创建者自动绑定时写入。非空;建立索引 idx_fe_enterprise_user_uid。';
842
+COMMENT ON COLUMN fe_enterprise_user.enterprise_id IS '关联企业主键,外键。管理员邀请绑定或企业创建时写入。非空;级联查询企业下所有管理员。';
843
+COMMENT ON COLUMN fe_enterprise_user.user_id IS '关联微信用户主键,外键。被邀请用户接受绑定或企业创建者自动绑定时写入。非空;建立索引 idx_fe_enterprise_user_uid。';
844
 COMMENT ON COLUMN fe_enterprise_user.role IS '用户在该企业下的权限角色。绑定或角色调整时由企业主/管理员写入。枚举:owner=主账号(最高权限);admin=管理员;viewer=只读。非空,默认 owner。';
844
 COMMENT ON COLUMN fe_enterprise_user.role IS '用户在该企业下的权限角色。绑定或角色调整时由企业主/管理员写入。枚举:owner=主账号(最高权限);admin=管理员;viewer=只读。非空,默认 owner。';
845
 COMMENT ON COLUMN fe_enterprise_user.is_default IS '是否为用户登录后的默认选中企业。用户切换默认企业或首次绑定时由应用层更新,同一 user_id 仅一条为 true。非空,默认 FALSE;影响 API 请求默认 enterprise_id。';
845
 COMMENT ON COLUMN fe_enterprise_user.is_default IS '是否为用户登录后的默认选中企业。用户切换默认企业或首次绑定时由应用层更新,同一 user_id 仅一条为 true。非空,默认 FALSE;影响 API 请求默认 enterprise_id。';
846
 COMMENT ON COLUMN fe_enterprise_user.bind_time IS '绑定关系建立时间。绑定成功时写入,默认 NOW()。非空;用于审计。';
846
 COMMENT ON COLUMN fe_enterprise_user.bind_time IS '绑定关系建立时间。绑定成功时写入,默认 NOW()。非空;用于审计。';
@@ -850,7 +850,7 @@ COMMENT ON COLUMN fe_enterprise_user.del_flag IS '逻辑删除标记。解除绑
850
 
850
 
851
 COMMENT ON TABLE fe_enterprise_finance IS '企业财务与开票信息表,与企业主体一对一(enterprise_id 唯一)。存储对公账户密文、开票抬头、打款渠道等;小程序端仅展示渠道类型,不展示账户明细等敏感金融信息。';
851
 COMMENT ON TABLE fe_enterprise_finance IS '企业财务与开票信息表,与企业主体一对一(enterprise_id 唯一)。存储对公账户密文、开票抬头、打款渠道等;小程序端仅展示渠道类型,不展示账户明细等敏感金融信息。';
852
 COMMENT ON COLUMN fe_enterprise_finance.id IS '表主键,自增。企业首次维护财务信息时生成。非空。';
852
 COMMENT ON COLUMN fe_enterprise_finance.id IS '表主键,自增。企业首次维护财务信息时生成。非空。';
853
-COMMENT ON COLUMN fe_enterprise_finance.enterprise_id IS '关联企业主键,外键 REFERENCES fe_enterprise(id)。财务信息首次录入时写入。非空;一对一,唯一索引 uk_fe_enterprise_finance。';
853
+COMMENT ON COLUMN fe_enterprise_finance.enterprise_id IS '关联企业主键,外键。财务信息首次录入时写入。非空;一对一,唯一索引 uk_fe_enterprise_finance。';
854
 COMMENT ON COLUMN fe_enterprise_finance.bank_name IS '对公账户开户银行名称。企业主在财务设置页填写时写入。示例:中国工商银行上海张江支行。可空。';
854
 COMMENT ON COLUMN fe_enterprise_finance.bank_name IS '对公账户开户银行名称。企业主在财务设置页填写时写入。示例:中国工商银行上海张江支行。可空。';
855
 COMMENT ON COLUMN fe_enterprise_finance.bank_account_enc IS '对公银行账号加密密文。企业提交账户信息时由应用层加密写入。高度敏感;禁止明文入库与前端回显;可空。';
855
 COMMENT ON COLUMN fe_enterprise_finance.bank_account_enc IS '对公银行账号加密密文。企业提交账户信息时由应用层加密写入。高度敏感;禁止明文入库与前端回显;可空。';
856
 COMMENT ON COLUMN fe_enterprise_finance.bank_account_mask IS '对公账号脱敏展示值。与 bank_account_enc 同时生成。示例:6222****1234。可空;供运营后台列表展示。';
856
 COMMENT ON COLUMN fe_enterprise_finance.bank_account_mask IS '对公账号脱敏展示值。与 bank_account_enc 同时生成。示例:6222****1234。可空;供运营后台列表展示。';
@@ -864,7 +864,7 @@ COMMENT ON COLUMN fe_enterprise_finance.del_flag IS '逻辑删除标记。枚举
864
 
864
 
865
 COMMENT ON TABLE fe_enterprise_preference IS '企业智能偏好配置表,存储工种薪资基准、默认保险档次、发薪结算周期等结构化偏好。支持用户自然语言配置后由 AI 解析入库,供草稿生成引擎复用,关联 fe_enterprise。';
865
 COMMENT ON TABLE fe_enterprise_preference IS '企业智能偏好配置表,存储工种薪资基准、默认保险档次、发薪结算周期等结构化偏好。支持用户自然语言配置后由 AI 解析入库,供草稿生成引擎复用,关联 fe_enterprise。';
866
 COMMENT ON COLUMN fe_enterprise_preference.id IS '表主键,自增。偏好项创建时生成。非空。';
866
 COMMENT ON COLUMN fe_enterprise_preference.id IS '表主键,自增。偏好项创建时生成。非空。';
867
-COMMENT ON COLUMN fe_enterprise_preference.enterprise_id IS '关联企业主键,外键 REFERENCES fe_enterprise(id)。偏好配置时写入。非空;索引 idx_fe_enterprise_pref(enterprise_id,pref_type)。';
867
+COMMENT ON COLUMN fe_enterprise_preference.enterprise_id IS '关联企业主键,外键。偏好配置时写入。非空;索引 idx_fe_enterprise_pref(enterprise_id,pref_type)。';
868
 COMMENT ON COLUMN fe_enterprise_preference.pref_type IS '偏好大类。用户或 AI 配置时写入。枚举:work_type=工种薪资基准;insurance=默认保险配置;payment_cycle=发薪/结算周期偏好。非空。';
868
 COMMENT ON COLUMN fe_enterprise_preference.pref_type IS '偏好大类。用户或 AI 配置时写入。枚举:work_type=工种薪资基准;insurance=默认保险配置;payment_cycle=发薪/结算周期偏好。非空。';
869
 COMMENT ON COLUMN fe_enterprise_preference.pref_key IS '偏好子键,细分到具体工种或场景。示例:搬运工、仓库分拣。可空;同一 pref_type 下可有多条记录。';
869
 COMMENT ON COLUMN fe_enterprise_preference.pref_key IS '偏好子键,细分到具体工种或场景。示例:搬运工、仓库分拣。可空;同一 pref_type 下可有多条记录。';
870
 COMMENT ON COLUMN fe_enterprise_preference.pref_value IS '结构化偏好值 JSON,承载薪资区间、保险方案参数等。AI 解析或用户表单提交时写入。示例:{"daily_wage":280,"currency":"CNY"}。非空,默认 {}。';
870
 COMMENT ON COLUMN fe_enterprise_preference.pref_value IS '结构化偏好值 JSON,承载薪资区间、保险方案参数等。AI 解析或用户表单提交时写入。示例:{"daily_wage":280,"currency":"CNY"}。非空,默认 {}。';
@@ -878,8 +878,8 @@ COMMENT ON COLUMN fe_enterprise_preference.del_flag IS '逻辑删除标记。枚
878
 COMMENT ON TABLE fe_conversation IS 'AI 对话会话主表,企业主与智能体交互的容器。通过 chat_type 区分用工、知识库、订单、成本等专题对话;一对多关联 fe_conversation_message。enterprise_id 与 user_id 共同界定会话归属与权限。';
878
 COMMENT ON TABLE fe_conversation IS 'AI 对话会话主表,企业主与智能体交互的容器。通过 chat_type 区分用工、知识库、订单、成本等专题对话;一对多关联 fe_conversation_message。enterprise_id 与 user_id 共同界定会话归属与权限。';
879
 COMMENT ON COLUMN fe_conversation.id IS '表主键,自增。用户发起新对话时生成。非空;被消息表、草稿表外键引用。';
879
 COMMENT ON COLUMN fe_conversation.id IS '表主键,自增。用户发起新对话时生成。非空;被消息表、草稿表外键引用。';
880
 COMMENT ON COLUMN fe_conversation.conversation_no IS '会话对外业务编号,API 路径与日志中使用。创建会话时由编号生成器写入。示例:conv_001。非空;唯一索引 uk_fe_conversation_no。';
880
 COMMENT ON COLUMN fe_conversation.conversation_no IS '会话对外业务编号,API 路径与日志中使用。创建会话时由编号生成器写入。示例:conv_001。非空;唯一索引 uk_fe_conversation_no。';
881
-COMMENT ON COLUMN fe_conversation.enterprise_id IS '所属企业,外键 REFERENCES fe_enterprise(id)。创建会话时从当前登录上下文写入。非空;索引 idx_fe_conversation_ent 用于侧边栏按企业筛选。';
882
-COMMENT ON COLUMN fe_conversation.user_id IS '发起对话的企业主用户,外键 REFERENCES fe_user(id)。创建会话时写入。非空;须为 enterprise 类型用户。';
881
+COMMENT ON COLUMN fe_conversation.enterprise_id IS '所属企业,外键。创建会话时从当前登录上下文写入。非空;索引 idx_fe_conversation_ent 用于侧边栏按企业筛选。';
882
+COMMENT ON COLUMN fe_conversation.user_id IS '发起对话的企业主用户,外键。创建会话时写入。非空;须为 enterprise 类型用户。';
883
 COMMENT ON COLUMN fe_conversation.title IS '会话标题,侧边栏展示用。可由首条用户消息摘要或 AI 自动生成,用户可重命名。示例:浦东仓库暑期用工。可空。';
883
 COMMENT ON COLUMN fe_conversation.title IS '会话标题,侧边栏展示用。可由首条用户消息摘要或 AI 自动生成,用户可重命名。示例:浦东仓库暑期用工。可空。';
884
 COMMENT ON COLUMN fe_conversation.chat_type IS '对话专题类型,决定加载的子智能体与卡片模板。创建时根据入口或首条意图写入。枚举:employment=用工办理;knowledge=政策知识库;order=订单查询;cost=成本测算;attendance=考勤;emergency=应急咨询。非空,默认 employment。';
884
 COMMENT ON COLUMN fe_conversation.chat_type IS '对话专题类型,决定加载的子智能体与卡片模板。创建时根据入口或首条意图写入。枚举:employment=用工办理;knowledge=政策知识库;order=订单查询;cost=成本测算;attendance=考勤;emergency=应急咨询。非空,默认 employment。';
885
 COMMENT ON COLUMN fe_conversation.status IS '会话生命周期状态。用户归档或长期无消息时更新。枚举:active=进行中;archived=已归档(只读)。非空,默认 active。';
885
 COMMENT ON COLUMN fe_conversation.status IS '会话生命周期状态。用户归档或长期无消息时更新。枚举:active=进行中;archived=已归档(只读)。非空,默认 active。';
@@ -890,7 +890,7 @@ COMMENT ON COLUMN fe_conversation.del_flag IS '逻辑删除标记。枚举:0=
890
 
890
 
891
 COMMENT ON TABLE fe_conversation_message IS '对话消息明细表,存储用户与助手往返的文本及结构化卡片(草稿卡、成本卡、订单卡)。通过 next_action 驱动小程序路由跳转;关联 fe_conversation,可软链 fe_employment_draft。';
891
 COMMENT ON TABLE fe_conversation_message IS '对话消息明细表,存储用户与助手往返的文本及结构化卡片(草稿卡、成本卡、订单卡)。通过 next_action 驱动小程序路由跳转;关联 fe_conversation,可软链 fe_employment_draft。';
892
 COMMENT ON COLUMN fe_conversation_message.id IS '表主键,自增。每条消息入库时生成。非空。';
892
 COMMENT ON COLUMN fe_conversation_message.id IS '表主键,自增。每条消息入库时生成。非空。';
893
-COMMENT ON COLUMN fe_conversation_message.conversation_id IS '所属会话,外键 REFERENCES fe_conversation(id)。发送消息时写入。非空;索引 idx_fe_conv_msg(conversation_id,create_time)。';
893
+COMMENT ON COLUMN fe_conversation_message.conversation_id IS '所属会话,外键。发送消息时写入。非空;索引 idx_fe_conv_msg(conversation_id,create_time)。';
894
 COMMENT ON COLUMN fe_conversation_message.role IS '消息发送方角色。写入时由网关标记。枚举:user=企业主用户;assistant=AI 助手;system=系统提示(如流程引导)。非空。';
894
 COMMENT ON COLUMN fe_conversation_message.role IS '消息发送方角色。写入时由网关标记。枚举:user=企业主用户;assistant=AI 助手;system=系统提示(如流程引导)。非空。';
895
 COMMENT ON COLUMN fe_conversation_message.content IS '消息正文文本或卡片摘要说明,供聊天气泡展示。用户输入或 AI 生成时写入。非空;长文本需注意截断策略。';
895
 COMMENT ON COLUMN fe_conversation_message.content IS '消息正文文本或卡片摘要说明,供聊天气泡展示。用户输入或 AI 生成时写入。非空;长文本需注意截断策略。';
896
 COMMENT ON COLUMN fe_conversation_message.content_type IS '消息内容形态,决定前端渲染组件。写入时标记。枚举:text=纯文本;card_draft=用工草稿卡;card_cost=成本对比卡;card_order=订单进度卡。非空,默认 text。';
896
 COMMENT ON COLUMN fe_conversation_message.content_type IS '消息内容形态,决定前端渲染组件。写入时标记。枚举:text=纯文本;card_draft=用工草稿卡;card_cost=成本对比卡;card_order=订单进度卡。非空,默认 text。';
@@ -903,8 +903,8 @@ COMMENT ON COLUMN fe_conversation_message.create_time IS '消息发送/入库时
903
 
903
 
904
 COMMENT ON TABLE fe_agent_action_log IS '智能体与子模块调用审计日志表,记录主智能体、灵活用工模块、成本引擎等的入参出参与耗时。用于技术排障与合规审计,不对小程序用户直接展示;可关联 fe_conversation。';
904
 COMMENT ON TABLE fe_agent_action_log IS '智能体与子模块调用审计日志表,记录主智能体、灵活用工模块、成本引擎等的入参出参与耗时。用于技术排障与合规审计,不对小程序用户直接展示;可关联 fe_conversation。';
905
 COMMENT ON COLUMN fe_agent_action_log.id IS '表主键,自增。每次子模块调用时生成。非空。';
905
 COMMENT ON COLUMN fe_agent_action_log.id IS '表主键,自增。每次子模块调用时生成。非空。';
906
-COMMENT ON COLUMN fe_agent_action_log.conversation_id IS '关联会话,外键 REFERENCES fe_conversation(id)。对话内调用时写入;后台定时任务触发时可为空。可空。';
907
-COMMENT ON COLUMN fe_agent_action_log.enterprise_id IS '所属企业,外键 REFERENCES fe_enterprise(id)。调用上下文中的企业 ID,必填以便按企业排障。非空;索引 idx_fe_agent_log。';
906
+COMMENT ON COLUMN fe_agent_action_log.conversation_id IS '关联会话,外键。对话内调用时写入;后台定时任务触发时可为空。可空。';
907
+COMMENT ON COLUMN fe_agent_action_log.enterprise_id IS '所属企业,外键。调用上下文中的企业 ID,必填以便按企业排障。非空;索引 idx_fe_agent_log。';
908
 COMMENT ON COLUMN fe_agent_action_log.module_name IS '被调用的模块名称。调用发起时写入。枚举示例:main_agent=主路由;flexible_employment=用工子模块;cost_engine=成本测算引擎。非空。';
908
 COMMENT ON COLUMN fe_agent_action_log.module_name IS '被调用的模块名称。调用发起时写入。枚举示例:main_agent=主路由;flexible_employment=用工子模块;cost_engine=成本测算引擎。非空。';
909
 COMMENT ON COLUMN fe_agent_action_log.action IS '模块内具体动作编码。示例:generate_draft、calc_cost、parse_nl_preference。非空;与 module_name 组合定位代码路径。';
909
 COMMENT ON COLUMN fe_agent_action_log.action IS '模块内具体动作编码。示例:generate_draft、calc_cost、parse_nl_preference。非空;与 module_name 组合定位代码路径。';
910
 COMMENT ON COLUMN fe_agent_action_log.request_json IS '请求体 JSON 快照,含用户输入与上下文参数。调用前由中间件序列化写入。可空;可能含业务敏感字段,访问需授权。';
910
 COMMENT ON COLUMN fe_agent_action_log.request_json IS '请求体 JSON 快照,含用户输入与上下文参数。调用前由中间件序列化写入。可空;可能含业务敏感字段,访问需授权。';
@@ -935,7 +935,7 @@ COMMENT ON COLUMN fe_service_plan.del_flag IS '逻辑删除标记。枚举:0=
935
 
935
 
936
 COMMENT ON TABLE fe_service_plan_fee_rule IS '方案费用项计算规则表,定义劳务费、服务费、保险、税费代征等分项的计算方式(固定额/比例/公式)。成本测算引擎读取本表与 fe_service_plan 联合计算;一对多归属 plan_id。';
936
 COMMENT ON TABLE fe_service_plan_fee_rule IS '方案费用项计算规则表,定义劳务费、服务费、保险、税费代征等分项的计算方式(固定额/比例/公式)。成本测算引擎读取本表与 fe_service_plan 联合计算;一对多归属 plan_id。';
937
 COMMENT ON COLUMN fe_service_plan_fee_rule.id IS '表主键,自增。运营为方案配置费用项时生成。非空。';
937
 COMMENT ON COLUMN fe_service_plan_fee_rule.id IS '表主键,自增。运营为方案配置费用项时生成。非空。';
938
-COMMENT ON COLUMN fe_service_plan_fee_rule.plan_id IS '关联方案,外键 REFERENCES fe_service_plan(id)。配置费用规则时写入。非空;索引 idx_fe_plan_fee。';
938
+COMMENT ON COLUMN fe_service_plan_fee_rule.plan_id IS '关联方案,外键。配置费用规则时写入。非空;索引 idx_fe_plan_fee。';
939
 COMMENT ON COLUMN fe_service_plan_fee_rule.fee_code IS '费用项编码。枚举:labor_fee=劳务费;service_fee=平台服务费;insurance=保险费;tax_withhold=税费代征。非空。';
939
 COMMENT ON COLUMN fe_service_plan_fee_rule.fee_code IS '费用项编码。枚举:labor_fee=劳务费;service_fee=平台服务费;insurance=保险费;tax_withhold=税费代征。非空。';
940
 COMMENT ON COLUMN fe_service_plan_fee_rule.fee_name IS '费用项中文展示名。示例:劳务费、服务费。非空。';
940
 COMMENT ON COLUMN fe_service_plan_fee_rule.fee_name IS '费用项中文展示名。示例:劳务费、服务费。非空。';
941
 COMMENT ON COLUMN fe_service_plan_fee_rule.calc_type IS '计算方式类型。枚举:fixed=固定金额;rate=按基数比例;formula=自定义公式(由 calc_expression 描述)。非空。';
941
 COMMENT ON COLUMN fe_service_plan_fee_rule.calc_type IS '计算方式类型。枚举:fixed=固定金额;rate=按基数比例;formula=自定义公式(由 calc_expression 描述)。非空。';
@@ -957,7 +957,7 @@ COMMENT ON COLUMN fe_workflow_definition.update_time IS '流程元数据变更
957
 
957
 
958
 COMMENT ON TABLE fe_workflow_step IS '合规流程步骤定义表,订单 fe_employment_order.current_step_code 对应本表 step_code。强制校验实名、合同、结算、完税、开票等必经节点完整性;归属 fe_workflow_definition。';
958
 COMMENT ON TABLE fe_workflow_step IS '合规流程步骤定义表,订单 fe_employment_order.current_step_code 对应本表 step_code。强制校验实名、合同、结算、完税、开票等必经节点完整性;归属 fe_workflow_definition。';
959
 COMMENT ON COLUMN fe_workflow_step.id IS '表主键,自增。流程版本初始化时批量插入。非空。';
959
 COMMENT ON COLUMN fe_workflow_step.id IS '表主键,自增。流程版本初始化时批量插入。非空。';
960
-COMMENT ON COLUMN fe_workflow_step.workflow_id IS '关联流程定义,外键 REFERENCES fe_workflow_definition(id)。步骤归属的流程版本。非空。';
960
+COMMENT ON COLUMN fe_workflow_step.workflow_id IS '关联流程定义,外键。步骤归属的流程版本。非空。';
961
 COMMENT ON COLUMN fe_workflow_step.step_code IS '步骤唯一编码,订单 current_step_code 引用此值。枚举(九步):draft_created=草稿创建;plan_confirmed=方案确认;registration=扫码登记;enterprise_audit=企业审核;contract_signing=合同签署;work_started=开始用工;settlement_pending=待结算;settlement_paid=已支付;completed=已完成。非空;与 workflow_id 组成唯一索引。';
961
 COMMENT ON COLUMN fe_workflow_step.step_code IS '步骤唯一编码,订单 current_step_code 引用此值。枚举(九步):draft_created=草稿创建;plan_confirmed=方案确认;registration=扫码登记;enterprise_audit=企业审核;contract_signing=合同签署;work_started=开始用工;settlement_pending=待结算;settlement_paid=已支付;completed=已完成。非空;与 workflow_id 组成唯一索引。';
962
 COMMENT ON COLUMN fe_workflow_step.step_name IS '步骤中文展示名。示例:扫码登记、合同签署。非空。';
962
 COMMENT ON COLUMN fe_workflow_step.step_name IS '步骤中文展示名。示例:扫码登记、合同签署。非空。';
963
 COMMENT ON COLUMN fe_workflow_step.step_order IS '步骤顺序号,从小到大推进。初始化时写入 1-9。非空。';
963
 COMMENT ON COLUMN fe_workflow_step.step_order IS '步骤顺序号,从小到大推进。初始化时写入 1-9。非空。';
@@ -981,8 +981,8 @@ COMMENT ON COLUMN fe_policy_rule.update_time IS '规则内容变更时更新。
981
 COMMENT ON TABLE fe_employment_draft IS '用工草稿主表,体现「草稿优先」产品原则:AI 根据对话生成,用户确认前均为草稿状态。确认并选定方案后生成 fe_employment_order 与 fe_registration_batch;关联 fe_enterprise、fe_conversation、fe_service_plan。';
981
 COMMENT ON TABLE fe_employment_draft IS '用工草稿主表,体现「草稿优先」产品原则:AI 根据对话生成,用户确认前均为草稿状态。确认并选定方案后生成 fe_employment_order 与 fe_registration_batch;关联 fe_enterprise、fe_conversation、fe_service_plan。';
982
 COMMENT ON COLUMN fe_employment_draft.id IS '表主键,自增。AI 子模块生成草稿时创建。非空;被 fe_draft_field、fe_draft_cost_snapshot 引用。';
982
 COMMENT ON COLUMN fe_employment_draft.id IS '表主键,自增。AI 子模块生成草稿时创建。非空;被 fe_draft_field、fe_draft_cost_snapshot 引用。';
983
 COMMENT ON COLUMN fe_employment_draft.draft_no IS '草稿业务编号,对外 API 使用。生成时由编号器写入。示例:draft_001。非空;唯一索引 uk_fe_draft_no。';
983
 COMMENT ON COLUMN fe_employment_draft.draft_no IS '草稿业务编号,对外 API 使用。生成时由编号器写入。示例:draft_001。非空;唯一索引 uk_fe_draft_no。';
984
-COMMENT ON COLUMN fe_employment_draft.enterprise_id IS '所属企业,外键 REFERENCES fe_enterprise(id)。从对话上下文写入。非空;索引 idx_fe_draft_ent。';
985
-COMMENT ON COLUMN fe_employment_draft.conversation_id IS '来源 AI 对话,外键 REFERENCES fe_conversation(id)。对话触发生成时写入;后台批量生成可为空。可空。';
984
+COMMENT ON COLUMN fe_employment_draft.enterprise_id IS '所属企业,外键。从对话上下文写入。非空;索引 idx_fe_draft_ent。';
985
+COMMENT ON COLUMN fe_employment_draft.conversation_id IS '来源 AI 对话,外键。对话触发生成时写入;后台批量生成可为空。可空。';
986
 COMMENT ON COLUMN fe_employment_draft.scenario IS '用工业务场景类型。AI 识别用户意图时写入。枚举:existing_worker_regularization=已有非正规临时工规范转正;new_demand=全新用工需求。非空。';
986
 COMMENT ON COLUMN fe_employment_draft.scenario IS '用工业务场景类型。AI 识别用户意图时写入。枚举:existing_worker_regularization=已有非正规临时工规范转正;new_demand=全新用工需求。非空。';
987
 COMMENT ON COLUMN fe_employment_draft.title IS '草稿标题,列表与卡片展示。AI 摘要或用户输入。示例:浦东仓库暑期搬运。可空。';
987
 COMMENT ON COLUMN fe_employment_draft.title IS '草稿标题,列表与卡片展示。AI 摘要或用户输入。示例:浦东仓库暑期搬运。可空。';
988
 COMMENT ON COLUMN fe_employment_draft.status IS '草稿生命周期状态。枚举:pending=待用户确认;confirmed=已确认并转订单;cancelled=用户取消;expired=超时未确认自动过期。非空,默认 pending。';
988
 COMMENT ON COLUMN fe_employment_draft.status IS '草稿生命周期状态。枚举:pending=待用户确认;confirmed=已确认并转订单;cancelled=用户取消;expired=超时未确认自动过期。非空,默认 pending。';
@@ -1005,16 +1005,16 @@ COMMENT ON COLUMN fe_employment_draft.missing_fields IS '待用户补充的字
1005
 COMMENT ON COLUMN fe_employment_draft.risk_prompts IS '风险提示 JSON 数组,合规引擎输出。示例:["未签劳动合同存在用工风险"]。可空,默认 []。';
1005
 COMMENT ON COLUMN fe_employment_draft.risk_prompts IS '风险提示 JSON 数组,合规引擎输出。示例:["未签劳动合同存在用工风险"]。可空,默认 []。';
1006
 COMMENT ON COLUMN fe_employment_draft.estimated_total IS '预估企业总支出(元)。成本引擎测算后回写。可空。';
1006
 COMMENT ON COLUMN fe_employment_draft.estimated_total IS '预估企业总支出(元)。成本引擎测算后回写。可空。';
1007
 COMMENT ON COLUMN fe_employment_draft.estimated_per_capita IS '预估人均成本(元)。成本引擎测算后回写。可空。';
1007
 COMMENT ON COLUMN fe_employment_draft.estimated_per_capita IS '预估人均成本(元)。成本引擎测算后回写。可空。';
1008
-COMMENT ON COLUMN fe_employment_draft.selected_plan_id IS '用户选中的用工方案,外键 REFERENCES fe_service_plan(id)。用户在成本对比页确认方案时写入;确认草稿时必填。可空(待确认阶段)。';
1008
+COMMENT ON COLUMN fe_employment_draft.selected_plan_id IS '用户选中的用工方案,外键。用户在成本对比页确认方案时写入;确认草稿时必填。可空(待确认阶段)。';
1009
 COMMENT ON COLUMN fe_employment_draft.confirmed_at IS '用户点击确认草稿的时间戳。确认接口成功时写入。可空。';
1009
 COMMENT ON COLUMN fe_employment_draft.confirmed_at IS '用户点击确认草稿的时间戳。确认接口成功时写入。可空。';
1010
-COMMENT ON COLUMN fe_employment_draft.confirmed_by IS '确认操作用户,外键 REFERENCES fe_user(id)。确认接口写入。可空。';
1010
+COMMENT ON COLUMN fe_employment_draft.confirmed_by IS '确认操作用户,外键。确认接口写入。可空。';
1011
 COMMENT ON COLUMN fe_employment_draft.create_time IS '草稿创建时间。非空。';
1011
 COMMENT ON COLUMN fe_employment_draft.create_time IS '草稿创建时间。非空。';
1012
 COMMENT ON COLUMN fe_employment_draft.update_time IS '草稿字段或状态变更时更新。非空。';
1012
 COMMENT ON COLUMN fe_employment_draft.update_time IS '草稿字段或状态变更时更新。非空。';
1013
 COMMENT ON COLUMN fe_employment_draft.del_flag IS '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。';
1013
 COMMENT ON COLUMN fe_employment_draft.del_flag IS '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。';
1014
 
1014
 
1015
 COMMENT ON TABLE fe_draft_field IS '草稿字段明细细表,逐字段记录值、数据来源与可编辑性,支撑前端「默认生成」角标(is_default=true)与字段级审计。一对多归属 fe_employment_draft。';
1015
 COMMENT ON TABLE fe_draft_field IS '草稿字段明细细表,逐字段记录值、数据来源与可编辑性,支撑前端「默认生成」角标(is_default=true)与字段级审计。一对多归属 fe_employment_draft。';
1016
 COMMENT ON COLUMN fe_draft_field.id IS '表主键,自增。草稿生成或字段补全时插入。非空。';
1016
 COMMENT ON COLUMN fe_draft_field.id IS '表主键,自增。草稿生成或字段补全时插入。非空。';
1017
-COMMENT ON COLUMN fe_draft_field.draft_id IS '关联草稿,外键 REFERENCES fe_employment_draft(id)。非空;与 field_key 组成唯一索引 uk_fe_draft_field。';
1017
+COMMENT ON COLUMN fe_draft_field.draft_id IS '关联草稿,外键。非空;与 field_key 组成唯一索引 uk_fe_draft_field。';
1018
 COMMENT ON COLUMN fe_draft_field.field_key IS '字段键名,与草稿主表列名或扩展字段对应。示例:work_location、daily_wage。非空。';
1018
 COMMENT ON COLUMN fe_draft_field.field_key IS '字段键名,与草稿主表列名或扩展字段对应。示例:work_location、daily_wage。非空。';
1019
 COMMENT ON COLUMN fe_draft_field.field_label IS '字段中文标签,表单展示用。示例:工作地点、日薪标准。可空。';
1019
 COMMENT ON COLUMN fe_draft_field.field_label IS '字段中文标签,表单展示用。示例:工作地点、日薪标准。可空。';
1020
 COMMENT ON COLUMN fe_draft_field.field_value IS '简单文本类型字段值。用户输入或 AI 填充时写入。可空;复杂结构用 value_json。';
1020
 COMMENT ON COLUMN fe_draft_field.field_value IS '简单文本类型字段值。用户输入或 AI 填充时写入。可空;复杂结构用 value_json。';
@@ -1027,8 +1027,8 @@ COMMENT ON COLUMN fe_draft_field.update_time IS '字段值变更时更新。非
1027
 
1027
 
1028
 COMMENT ON TABLE fe_draft_cost_snapshot IS '草稿成本对比快照表,一次测算为同一草稿生成多行(current + plan_1/2/3)。核心指标:企业总支出、人均成本、员工到手;一对多关联 fe_draft_cost_detail。';
1028
 COMMENT ON TABLE fe_draft_cost_snapshot IS '草稿成本对比快照表,一次测算为同一草稿生成多行(current + plan_1/2/3)。核心指标:企业总支出、人均成本、员工到手;一对多关联 fe_draft_cost_detail。';
1029
 COMMENT ON COLUMN fe_draft_cost_snapshot.id IS '表主键,自增。成本引擎每次全量测算时批量插入。非空。';
1029
 COMMENT ON COLUMN fe_draft_cost_snapshot.id IS '表主键,自增。成本引擎每次全量测算时批量插入。非空。';
1030
-COMMENT ON COLUMN fe_draft_cost_snapshot.draft_id IS '关联草稿,外键 REFERENCES fe_employment_draft(id)。非空;索引 idx_fe_cost_snapshot。';
1031
-COMMENT ON COLUMN fe_draft_cost_snapshot.plan_id IS '关联方案目录,外键 REFERENCES fe_service_plan(id)。current 行可能为空(表示非平台方案)。可空。';
1030
+COMMENT ON COLUMN fe_draft_cost_snapshot.draft_id IS '关联草稿,外键。非空;索引 idx_fe_cost_snapshot。';
1031
+COMMENT ON COLUMN fe_draft_cost_snapshot.plan_id IS '关联方案目录,外键。current 行可能为空(表示非平台方案)。可空。';
1032
 COMMENT ON COLUMN fe_draft_cost_snapshot.plan_code IS '方案编码快照,防止方案后续改名影响历史展示。示例:plan_1。非空。';
1032
 COMMENT ON COLUMN fe_draft_cost_snapshot.plan_code IS '方案编码快照,防止方案后续改名影响历史展示。示例:plan_1。非空。';
1033
 COMMENT ON COLUMN fe_draft_cost_snapshot.plan_name IS '方案名称快照。示例:合规优先 (A)。非空。';
1033
 COMMENT ON COLUMN fe_draft_cost_snapshot.plan_name IS '方案名称快照。示例:合规优先 (A)。非空。';
1034
 COMMENT ON COLUMN fe_draft_cost_snapshot.employer_total_outflow IS '企业总支出(元),含劳务+服务费+保险+税费等。成本引擎计算写入。非空。';
1034
 COMMENT ON COLUMN fe_draft_cost_snapshot.employer_total_outflow IS '企业总支出(元),含劳务+服务费+保险+税费等。成本引擎计算写入。非空。';
@@ -1043,7 +1043,7 @@ COMMENT ON COLUMN fe_draft_cost_snapshot.create_time IS '快照生成时间,
1043
 
1043
 
1044
 COMMENT ON TABLE fe_draft_cost_detail IS '成本对比费用明细细表,对应快照下劳务费、服务费、保险、税费代征等分项金额与费率。归属 fe_draft_cost_snapshot,供前端展开明细列表。';
1044
 COMMENT ON TABLE fe_draft_cost_detail IS '成本对比费用明细细表,对应快照下劳务费、服务费、保险、税费代征等分项金额与费率。归属 fe_draft_cost_snapshot,供前端展开明细列表。';
1045
 COMMENT ON COLUMN fe_draft_cost_detail.id IS '表主键,自增。生成快照时同步插入各费用项。非空。';
1045
 COMMENT ON COLUMN fe_draft_cost_detail.id IS '表主键,自增。生成快照时同步插入各费用项。非空。';
1046
-COMMENT ON COLUMN fe_draft_cost_detail.snapshot_id IS '关联成本快照,外键 REFERENCES fe_draft_cost_snapshot(id)。非空;索引 idx_fe_cost_detail。';
1046
+COMMENT ON COLUMN fe_draft_cost_detail.snapshot_id IS '关联成本快照,外键。非空;索引 idx_fe_cost_detail。';
1047
 COMMENT ON COLUMN fe_draft_cost_detail.fee_code IS '费用项编码,与 fe_service_plan_fee_rule.fee_code 对齐。示例:labor_fee、service_fee。非空。';
1047
 COMMENT ON COLUMN fe_draft_cost_detail.fee_code IS '费用项编码,与 fe_service_plan_fee_rule.fee_code 对齐。示例:labor_fee、service_fee。非空。';
1048
 COMMENT ON COLUMN fe_draft_cost_detail.fee_name IS '费用项中文名。示例:劳务费、平台服务费。非空。';
1048
 COMMENT ON COLUMN fe_draft_cost_detail.fee_name IS '费用项中文名。示例:劳务费、平台服务费。非空。';
1049
 COMMENT ON COLUMN fe_draft_cost_detail.amount IS '该费用项金额(元),NUMERIC(14,2)。非空。';
1049
 COMMENT ON COLUMN fe_draft_cost_detail.amount IS '该费用项金额(元),NUMERIC(14,2)。非空。';
@@ -1053,9 +1053,9 @@ COMMENT ON COLUMN fe_draft_cost_detail.sort_order IS '明细列表展示顺序
1053
 COMMENT ON TABLE fe_employment_order IS '用工订单主表,草稿确认并选定方案后生成,承载办理全流程业务状态与登记进度冗余统计。current_step_code 驱动合规状态机;关联 fe_enterprise、fe_employment_draft、fe_service_plan,一对多关联登记批次与结算单。';
1053
 COMMENT ON TABLE fe_employment_order IS '用工订单主表,草稿确认并选定方案后生成,承载办理全流程业务状态与登记进度冗余统计。current_step_code 驱动合规状态机;关联 fe_enterprise、fe_employment_draft、fe_service_plan,一对多关联登记批次与结算单。';
1054
 COMMENT ON COLUMN fe_employment_order.id IS '表主键,自增。草稿确认接口成功时创建。非空。';
1054
 COMMENT ON COLUMN fe_employment_order.id IS '表主键,自增。草稿确认接口成功时创建。非空。';
1055
 COMMENT ON COLUMN fe_employment_order.order_no IS '订单业务编号,企业主可见。示例:2024-001、ORD20260707001。非空;唯一索引 uk_fe_order_no。';
1055
 COMMENT ON COLUMN fe_employment_order.order_no IS '订单业务编号,企业主可见。示例:2024-001、ORD20260707001。非空;唯一索引 uk_fe_order_no。';
1056
-COMMENT ON COLUMN fe_employment_order.enterprise_id IS '所属企业,外键 REFERENCES fe_enterprise(id)。非空;索引 idx_fe_order_ent。';
1057
-COMMENT ON COLUMN fe_employment_order.draft_id IS '来源草稿,外键 REFERENCES fe_employment_draft(id)。确认时写入,追溯对话与方案选择。可空(极少数后台直创订单)。';
1058
-COMMENT ON COLUMN fe_employment_order.selected_plan_id IS '确认选用的用工方案,外键 REFERENCES fe_service_plan(id)。草稿确认时从 draft.selected_plan_id 复制。可空;应尽早补齐。';
1056
+COMMENT ON COLUMN fe_employment_order.enterprise_id IS '所属企业,外键。非空;索引 idx_fe_order_ent。';
1057
+COMMENT ON COLUMN fe_employment_order.draft_id IS '来源草稿,外键。确认时写入,追溯对话与方案选择。可空(极少数后台直创订单)。';
1058
+COMMENT ON COLUMN fe_employment_order.selected_plan_id IS '确认选用的用工方案,外键。草稿确认时从 draft.selected_plan_id 复制。可空;应尽早补齐。';
1059
 COMMENT ON COLUMN fe_employment_order.title IS '订单标题,通常继承草稿标题。非空。';
1059
 COMMENT ON COLUMN fe_employment_order.title IS '订单标题,通常继承草稿标题。非空。';
1060
 COMMENT ON COLUMN fe_employment_order.worker_count IS '计划用工人数。非空;与登记批次 expected_count 对齐。';
1060
 COMMENT ON COLUMN fe_employment_order.worker_count IS '计划用工人数。非空;与登记批次 expected_count 对齐。';
1061
 COMMENT ON COLUMN fe_employment_order.work_days IS '工作天数,支持小数。可空。';
1061
 COMMENT ON COLUMN fe_employment_order.work_days IS '工作天数,支持小数。可空。';
@@ -1096,12 +1096,12 @@ COMMENT ON COLUMN fe_registration_batch.del_flag IS '逻辑删除标记。枚举
1096
 
1096
 
1097
 COMMENT ON TABLE fe_order_workflow_log IS '订单合规流程状态变更日志表,记录状态机每一步推进的前后步骤、操作人与备注,构成五流合一合规证据链。关联 fe_employment_order,operator_id 可引用 fe_user。';
1097
 COMMENT ON TABLE fe_order_workflow_log IS '订单合规流程状态变更日志表,记录状态机每一步推进的前后步骤、操作人与备注,构成五流合一合规证据链。关联 fe_employment_order,operator_id 可引用 fe_user。';
1098
 COMMENT ON COLUMN fe_order_workflow_log.id IS '表主键,自增。每次步骤推进时追加写入,不可修改。非空。';
1098
 COMMENT ON COLUMN fe_order_workflow_log.id IS '表主键,自增。每次步骤推进时追加写入,不可修改。非空。';
1099
-COMMENT ON COLUMN fe_order_workflow_log.order_id IS '关联订单,外键 REFERENCES fe_employment_order(id)。非空;索引 idx_fe_order_wf_log。';
1099
+COMMENT ON COLUMN fe_order_workflow_log.order_id IS '关联订单,外键。非空;索引 idx_fe_order_wf_log。';
1100
 COMMENT ON COLUMN fe_order_workflow_log.from_step IS '变更前合规步骤编码。首次创建订单时可为空。可空。';
1100
 COMMENT ON COLUMN fe_order_workflow_log.from_step IS '变更前合规步骤编码。首次创建订单时可为空。可空。';
1101
 COMMENT ON COLUMN fe_order_workflow_log.to_step IS '变更后合规步骤编码,对应 fe_workflow_step.step_code。非空。';
1101
 COMMENT ON COLUMN fe_order_workflow_log.to_step IS '变更后合规步骤编码,对应 fe_workflow_step.step_code。非空。';
1102
 COMMENT ON COLUMN fe_order_workflow_log.from_status IS '变更前订单业务状态 order_status。可空。';
1102
 COMMENT ON COLUMN fe_order_workflow_log.from_status IS '变更前订单业务状态 order_status。可空。';
1103
 COMMENT ON COLUMN fe_order_workflow_log.to_status IS '变更后订单业务状态。非空。';
1103
 COMMENT ON COLUMN fe_order_workflow_log.to_status IS '变更后订单业务状态。非空。';
1104
-COMMENT ON COLUMN fe_order_workflow_log.operator_id IS '操作人用户 ID,外键 REFERENCES fe_user(id)。系统自动推进时为 NULL。可空。';
1104
+COMMENT ON COLUMN fe_order_workflow_log.operator_id IS '操作人用户 ID,外键。系统自动推进时为 NULL。可空。';
1105
 COMMENT ON COLUMN fe_order_workflow_log.operator_type IS '操作方类型。枚举:system=系统自动;enterprise=企业主/管理员;worker=临时工;provider=第三方合作平台。非空,默认 system。';
1105
 COMMENT ON COLUMN fe_order_workflow_log.operator_type IS '操作方类型。枚举:system=系统自动;enterprise=企业主/管理员;worker=临时工;provider=第三方合作平台。非空,默认 system。';
1106
 COMMENT ON COLUMN fe_order_workflow_log.remark IS '变更说明,如「登记人数已达预期,自动推进」。可空。';
1106
 COMMENT ON COLUMN fe_order_workflow_log.remark IS '变更说明,如「登记人数已达预期,自动推进」。可空。';
1107
 COMMENT ON COLUMN fe_order_workflow_log.extra_json IS '扩展上下文 JSON,如触发条件、关联合格人数。可空。';
1107
 COMMENT ON COLUMN fe_order_workflow_log.extra_json IS '扩展上下文 JSON,如触发条件、关联合格人数。可空。';
@@ -1109,7 +1109,7 @@ COMMENT ON COLUMN fe_order_workflow_log.create_time IS '变更发生时间,审
1109
 
1109
 
1110
 COMMENT ON TABLE fe_worker IS '临时工自然人档案主表,跨登记批次复用,避免重复录入身份证与银行卡。身份证、银行卡、手机号均加密存储(*_enc),列表仅展示脱敏值(*_mask);可关联 fe_user 实现微信绑定。';
1110
 COMMENT ON TABLE fe_worker IS '临时工自然人档案主表,跨登记批次复用,避免重复录入身份证与银行卡。身份证、银行卡、手机号均加密存储(*_enc),列表仅展示脱敏值(*_mask);可关联 fe_user 实现微信绑定。';
1111
 COMMENT ON COLUMN fe_worker.id IS '表主键,自增。首次登记提交且实名核验通过后创建或匹配已有档案。非空。';
1111
 COMMENT ON COLUMN fe_worker.id IS '表主键,自增。首次登记提交且实名核验通过后创建或匹配已有档案。非空。';
1112
-COMMENT ON COLUMN fe_worker.user_id IS '关联微信用户,外键 REFERENCES fe_user(id)。临时工首次扫码授权微信后绑定。可空;未授权前仅通过身份证匹配。';
1112
+COMMENT ON COLUMN fe_worker.user_id IS '关联微信用户,外键。临时工首次扫码授权微信后绑定。可空;未授权前仅通过身份证匹配。';
1113
 COMMENT ON COLUMN fe_worker.worker_no IS '临时工业务编号,平台内唯一标识。档案创建时生成。示例:WK20260001。可空。';
1113
 COMMENT ON COLUMN fe_worker.worker_no IS '临时工业务编号,平台内唯一标识。档案创建时生成。示例:WK20260001。可空。';
1114
 COMMENT ON COLUMN fe_worker.real_name IS '临时工真实姓名,与身份证一致。登记提交时写入。非空。';
1114
 COMMENT ON COLUMN fe_worker.real_name IS '临时工真实姓名,与身份证一致。登记提交时写入。非空。';
1115
 COMMENT ON COLUMN fe_worker.id_card_no_enc IS '身份证号加密密文。登记页提交时应用层加密写入。非空;高度敏感,禁止明文。';
1115
 COMMENT ON COLUMN fe_worker.id_card_no_enc IS '身份证号加密密文。登记页提交时应用层加密写入。非空;高度敏感,禁止明文。';
@@ -1129,9 +1129,9 @@ COMMENT ON COLUMN fe_worker.del_flag IS '逻辑删除标记。枚举:0=正常
1129
 COMMENT ON TABLE fe_worker_registration IS '批次登记记录表,记录每个临时工在某一 fe_registration_batch 下的一次登记全过程。reg_status 驱动进度页统计、催办与审核;关联 fe_worker 档案,敏感证件信息加密存储。';
1129
 COMMENT ON TABLE fe_worker_registration IS '批次登记记录表,记录每个临时工在某一 fe_registration_batch 下的一次登记全过程。reg_status 驱动进度页统计、催办与审核;关联 fe_worker 档案,敏感证件信息加密存储。';
1130
 COMMENT ON COLUMN fe_worker_registration.id IS '表主键,自增。临时工打开登记页或提交时创建。非空。';
1130
 COMMENT ON COLUMN fe_worker_registration.id IS '表主键,自增。临时工打开登记页或提交时创建。非空。';
1131
 COMMENT ON COLUMN fe_worker_registration.batch_id IS '所属登记批次 fe_registration_batch.id(逻辑关联,无数据库外键)。非空;索引 idx_fe_worker_reg_batch。';
1131
 COMMENT ON COLUMN fe_worker_registration.batch_id IS '所属登记批次 fe_registration_batch.id(逻辑关联,无数据库外键)。非空;索引 idx_fe_worker_reg_batch。';
1132
-COMMENT ON COLUMN fe_worker_registration.order_id IS '关联订单,外键 REFERENCES fe_employment_order(id)。冗余便于按订单查登记列表。非空;索引 idx_fe_worker_reg_order。';
1133
-COMMENT ON COLUMN fe_worker_registration.enterprise_id IS '所属企业,外键 REFERENCES fe_enterprise(id)。冗余。非空。';
1134
-COMMENT ON COLUMN fe_worker_registration.worker_id IS '关联临时工档案,外键 REFERENCES fe_worker(id)。提交成功且匹配/创建档案后绑定。可空(登记进行中)。';
1132
+COMMENT ON COLUMN fe_worker_registration.order_id IS '关联订单,外键。冗余便于按订单查登记列表。非空;索引 idx_fe_worker_reg_order。';
1133
+COMMENT ON COLUMN fe_worker_registration.enterprise_id IS '所属企业,外键。冗余。非空。';
1134
+COMMENT ON COLUMN fe_worker_registration.worker_id IS '关联临时工档案,外键。提交成功且匹配/创建档案后绑定。可空(登记进行中)。';
1135
 COMMENT ON COLUMN fe_worker_registration.real_name IS '本次登记填写的姓名。非空;可能与 worker 档案后续同步。';
1135
 COMMENT ON COLUMN fe_worker_registration.real_name IS '本次登记填写的姓名。非空;可能与 worker 档案后续同步。';
1136
 COMMENT ON COLUMN fe_worker_registration.mobile_enc IS '登记手机号密文。提交时加密写入。可空;高度敏感。';
1136
 COMMENT ON COLUMN fe_worker_registration.mobile_enc IS '登记手机号密文。提交时加密写入。可空;高度敏感。';
1137
 COMMENT ON COLUMN fe_worker_registration.mobile_mask IS '登记手机号脱敏。可空。';
1137
 COMMENT ON COLUMN fe_worker_registration.mobile_mask IS '登记手机号脱敏。可空。';
@@ -1142,7 +1142,7 @@ COMMENT ON COLUMN fe_worker_registration.reg_status IS '登记流程状态。枚
1142
 COMMENT ON COLUMN fe_worker_registration.fail_reason IS '失败或企业驳回原因。可空。';
1142
 COMMENT ON COLUMN fe_worker_registration.fail_reason IS '失败或企业驳回原因。可空。';
1143
 COMMENT ON COLUMN fe_worker_registration.submitted_at IS '临时工点击提交时间。可空。';
1143
 COMMENT ON COLUMN fe_worker_registration.submitted_at IS '临时工点击提交时间。可空。';
1144
 COMMENT ON COLUMN fe_worker_registration.reviewed_at IS '企业审核完成时间。可空。';
1144
 COMMENT ON COLUMN fe_worker_registration.reviewed_at IS '企业审核完成时间。可空。';
1145
-COMMENT ON COLUMN fe_worker_registration.reviewed_by IS '审核人,外键 REFERENCES fe_user(id)。可空。';
1145
+COMMENT ON COLUMN fe_worker_registration.reviewed_by IS '审核人,外键。可空。';
1146
 COMMENT ON COLUMN fe_worker_registration.remind_count IS '企业主催办次数,每次催办 +1。非空,默认 0。';
1146
 COMMENT ON COLUMN fe_worker_registration.remind_count IS '企业主催办次数,每次催办 +1。非空,默认 0。';
1147
 COMMENT ON COLUMN fe_worker_registration.last_remind_at IS '最近一次催办时间。可空。';
1147
 COMMENT ON COLUMN fe_worker_registration.last_remind_at IS '最近一次催办时间。可空。';
1148
 COMMENT ON COLUMN fe_worker_registration.create_time IS '登记记录创建时间。非空。';
1148
 COMMENT ON COLUMN fe_worker_registration.create_time IS '登记记录创建时间。非空。';
@@ -1151,8 +1151,8 @@ COMMENT ON COLUMN fe_worker_registration.del_flag IS '逻辑删除标记。枚
1151
 
1151
 
1152
 COMMENT ON TABLE fe_worker_consent IS '临时工协议授权确认表,记录勾选电子劳动合同、隐私政策、信息授权等合规留痕。含同意时间、客户端 IP 与 UA,满足电子证据要求;首次档案登记可不关联 fe_worker_registration。';
1152
 COMMENT ON TABLE fe_worker_consent IS '临时工协议授权确认表,记录勾选电子劳动合同、隐私政策、信息授权等合规留痕。含同意时间、客户端 IP 与 UA,满足电子证据要求;首次档案登记可不关联 fe_worker_registration。';
1153
 COMMENT ON COLUMN fe_worker_consent.id IS '表主键,自增。临时工勾选协议并提交时插入。非空。';
1153
 COMMENT ON COLUMN fe_worker_consent.id IS '表主键,自增。临时工勾选协议并提交时插入。非空。';
1154
-COMMENT ON COLUMN fe_worker_consent.registration_id IS '关联登记记录,外键 REFERENCES fe_worker_registration(id)。首次档案登记可为空;批次扫码登记时写入。';
1155
-COMMENT ON COLUMN fe_worker_consent.worker_id IS '关联临时工档案,外键 REFERENCES fe_worker(id)。档案绑定后写入。可空。';
1154
+COMMENT ON COLUMN fe_worker_consent.registration_id IS '关联登记记录,外键。首次档案登记可为空;批次扫码登记时写入。';
1155
+COMMENT ON COLUMN fe_worker_consent.worker_id IS '关联临时工档案,外键。档案绑定后写入。可空。';
1156
 COMMENT ON COLUMN fe_worker_consent.consent_type IS '协议类型。枚举:labor_contract=电子劳动合同;privacy_policy=隐私政策;authorization=个人信息处理授权。非空。';
1156
 COMMENT ON COLUMN fe_worker_consent.consent_type IS '协议类型。枚举:labor_contract=电子劳动合同;privacy_policy=隐私政策;authorization=个人信息处理授权。非空。';
1157
 COMMENT ON COLUMN fe_worker_consent.consent_version IS '协议版本号,对应法务发布的协议版本。示例:v2.1。可空。';
1157
 COMMENT ON COLUMN fe_worker_consent.consent_version IS '协议版本号,对应法务发布的协议版本。示例:v2.1。可空。';
1158
 COMMENT ON COLUMN fe_worker_consent.consent_title IS '协议标题展示文案。示例:《灵活用工电子劳动合同》。可空。';
1158
 COMMENT ON COLUMN fe_worker_consent.consent_title IS '协议标题展示文案。示例:《灵活用工电子劳动合同》。可空。';
@@ -1165,10 +1165,10 @@ COMMENT ON COLUMN fe_worker_consent.create_time IS '记录入库时间。非空
1165
 COMMENT ON TABLE fe_contract IS '电子劳动合同表,合规流程「合同签署」节点核心数据。一人一登记一条合同;MVP 阶段 sign_provider 可用 mock,对接电子签平台后替换。关联 fe_employment_order、fe_worker_registration、fe_worker。';
1165
 COMMENT ON TABLE fe_contract IS '电子劳动合同表,合规流程「合同签署」节点核心数据。一人一登记一条合同;MVP 阶段 sign_provider 可用 mock,对接电子签平台后替换。关联 fe_employment_order、fe_worker_registration、fe_worker。';
1166
 COMMENT ON COLUMN fe_contract.id IS '表主键,自增。登记完成进入合同签署步骤时创建。非空。';
1166
 COMMENT ON COLUMN fe_contract.id IS '表主键,自增。登记完成进入合同签署步骤时创建。非空。';
1167
 COMMENT ON COLUMN fe_contract.contract_no IS '合同业务编号。示例:CT20260707001。非空;唯一索引 uk_fe_contract_no。';
1167
 COMMENT ON COLUMN fe_contract.contract_no IS '合同业务编号。示例:CT20260707001。非空;唯一索引 uk_fe_contract_no。';
1168
-COMMENT ON COLUMN fe_contract.order_id IS '关联订单,外键 REFERENCES fe_employment_order(id)。非空;索引 idx_fe_contract_order。';
1169
-COMMENT ON COLUMN fe_contract.registration_id IS '关联登记记录(一人一合同),外键 REFERENCES fe_worker_registration(id)。可空;建议必填。';
1170
-COMMENT ON COLUMN fe_contract.worker_id IS '签约临时工,外键 REFERENCES fe_worker(id)。可空。';
1171
-COMMENT ON COLUMN fe_contract.enterprise_id IS '签约企业,外键 REFERENCES fe_enterprise(id)。非空。';
1168
+COMMENT ON COLUMN fe_contract.order_id IS '关联订单,外键。非空;索引 idx_fe_contract_order。';
1169
+COMMENT ON COLUMN fe_contract.registration_id IS '关联登记记录(一人一合同),外键。可空;建议必填。';
1170
+COMMENT ON COLUMN fe_contract.worker_id IS '签约临时工,外键。可空。';
1171
+COMMENT ON COLUMN fe_contract.enterprise_id IS '签约企业,外键。非空。';
1172
 COMMENT ON COLUMN fe_contract.contract_type IS '合同类型编码。非空,默认 labor(劳动合同)。';
1172
 COMMENT ON COLUMN fe_contract.contract_type IS '合同类型编码。非空,默认 labor(劳动合同)。';
1173
 COMMENT ON COLUMN fe_contract.contract_title IS '合同标题。示例:劳务派遣协议-张三。可空。';
1173
 COMMENT ON COLUMN fe_contract.contract_title IS '合同标题。示例:劳务派遣协议-张三。可空。';
1174
 COMMENT ON COLUMN fe_contract.sign_status IS '签署状态。枚举:pending=待签署;signing=签署中;signed=已签署;rejected=拒签;expired=已过期。非空,默认 pending。';
1174
 COMMENT ON COLUMN fe_contract.sign_status IS '签署状态。枚举:pending=待签署;signing=签署中;signed=已签署;rejected=拒签;expired=已过期。非空,默认 pending。';
@@ -1184,9 +1184,9 @@ COMMENT ON COLUMN fe_contract.del_flag IS '逻辑删除标记。枚举:0=正
1184
 COMMENT ON TABLE fe_settlement_order IS '结算确认单主表,用工结束后按考勤或约定生成,展示应发/扣款/实发、服务费、开票额与企业总支出。企业确认后进入支付环节;一对多关联 fe_settlement_item、fe_settlement_fee、fe_payment_record。';
1184
 COMMENT ON TABLE fe_settlement_order IS '结算确认单主表,用工结束后按考勤或约定生成,展示应发/扣款/实发、服务费、开票额与企业总支出。企业确认后进入支付环节;一对多关联 fe_settlement_item、fe_settlement_fee、fe_payment_record。';
1185
 COMMENT ON COLUMN fe_settlement_order.id IS '表主键,自增。结算引擎生成结算单时创建。非空。';
1185
 COMMENT ON COLUMN fe_settlement_order.id IS '表主键,自增。结算引擎生成结算单时创建。非空。';
1186
 COMMENT ON COLUMN fe_settlement_order.settlement_no IS '结算单业务编号。示例:STL20260707001。非空;唯一索引 uk_fe_settlement_no。';
1186
 COMMENT ON COLUMN fe_settlement_order.settlement_no IS '结算单业务编号。示例:STL20260707001。非空;唯一索引 uk_fe_settlement_no。';
1187
-COMMENT ON COLUMN fe_settlement_order.order_id IS '关联用工订单,外键 REFERENCES fe_employment_order(id)。非空。';
1187
+COMMENT ON COLUMN fe_settlement_order.order_id IS '关联用工订单,外键。非空。';
1188
 COMMENT ON COLUMN fe_settlement_order.batch_id IS '关联登记批次 fe_registration_batch.id(逻辑关联,无数据库外键)。可空;多批次订单可只关联主批次。';
1188
 COMMENT ON COLUMN fe_settlement_order.batch_id IS '关联登记批次 fe_registration_batch.id(逻辑关联,无数据库外键)。可空;多批次订单可只关联主批次。';
1189
-COMMENT ON COLUMN fe_settlement_order.enterprise_id IS '所属企业,外键 REFERENCES fe_enterprise(id)。非空;索引 idx_fe_settlement_ent。';
1189
+COMMENT ON COLUMN fe_settlement_order.enterprise_id IS '所属企业,外键。非空;索引 idx_fe_settlement_ent。';
1190
 COMMENT ON COLUMN fe_settlement_order.worker_count IS '本次结算涵盖人数。非空。';
1190
 COMMENT ON COLUMN fe_settlement_order.worker_count IS '本次结算涵盖人数。非空。';
1191
 COMMENT ON COLUMN fe_settlement_order.gross_amount IS '应发总额(元),税前劳务合计。非空,默认 0。';
1191
 COMMENT ON COLUMN fe_settlement_order.gross_amount IS '应发总额(元),税前劳务合计。非空,默认 0。';
1192
 COMMENT ON COLUMN fe_settlement_order.deduction_amount IS '扣款及个税合计(元)。非空,默认 0。';
1192
 COMMENT ON COLUMN fe_settlement_order.deduction_amount IS '扣款及个税合计(元)。非空,默认 0。';
@@ -1198,7 +1198,7 @@ COMMENT ON COLUMN fe_settlement_order.settlement_status IS '结算单状态。
1198
 COMMENT ON COLUMN fe_settlement_order.compliance_tags IS '五流合一合规校验结果标签 JSON。示例:["个税已申报","发票合规"]。可空,默认 []。';
1198
 COMMENT ON COLUMN fe_settlement_order.compliance_tags IS '五流合一合规校验结果标签 JSON。示例:["个税已申报","发票合规"]。可空,默认 []。';
1199
 COMMENT ON COLUMN fe_settlement_order.compliance_remark IS '合规说明文案。示例:可全额税前扣除。可空。';
1199
 COMMENT ON COLUMN fe_settlement_order.compliance_remark IS '合规说明文案。示例:可全额税前扣除。可空。';
1200
 COMMENT ON COLUMN fe_settlement_order.confirmed_at IS '企业主确认结算单时间。可空。';
1200
 COMMENT ON COLUMN fe_settlement_order.confirmed_at IS '企业主确认结算单时间。可空。';
1201
-COMMENT ON COLUMN fe_settlement_order.confirmed_by IS '确认人,外键 REFERENCES fe_user(id)。可空。';
1201
+COMMENT ON COLUMN fe_settlement_order.confirmed_by IS '确认人,外键。可空。';
1202
 COMMENT ON COLUMN fe_settlement_order.paid_at IS '支付完成时间,全部打款成功后写入。可空。';
1202
 COMMENT ON COLUMN fe_settlement_order.paid_at IS '支付完成时间,全部打款成功后写入。可空。';
1203
 COMMENT ON COLUMN fe_settlement_order.create_time IS '结算单生成时间。非空。';
1203
 COMMENT ON COLUMN fe_settlement_order.create_time IS '结算单生成时间。非空。';
1204
 COMMENT ON COLUMN fe_settlement_order.update_time IS '状态或金额变更时更新。非空。';
1204
 COMMENT ON COLUMN fe_settlement_order.update_time IS '状态或金额变更时更新。非空。';
@@ -1206,9 +1206,9 @@ COMMENT ON COLUMN fe_settlement_order.del_flag IS '逻辑删除标记。枚举
1206
 
1206
 
1207
 COMMENT ON TABLE fe_settlement_item IS '结算单人明细表,按临时工拆分应发、个税、其他扣款与实发金额。支持按天、按小时、计件多种计量维度;关联 fe_settlement_order、fe_worker_registration、fe_worker。';
1207
 COMMENT ON TABLE fe_settlement_item IS '结算单人明细表,按临时工拆分应发、个税、其他扣款与实发金额。支持按天、按小时、计件多种计量维度;关联 fe_settlement_order、fe_worker_registration、fe_worker。';
1208
 COMMENT ON COLUMN fe_settlement_item.id IS '表主键,自增。生成结算单时按登记记录逐人插入。非空。';
1208
 COMMENT ON COLUMN fe_settlement_item.id IS '表主键,自增。生成结算单时按登记记录逐人插入。非空。';
1209
-COMMENT ON COLUMN fe_settlement_item.settlement_id IS '关联结算单,外键 REFERENCES fe_settlement_order(id)。非空;索引 idx_fe_settlement_item。';
1210
-COMMENT ON COLUMN fe_settlement_item.registration_id IS '关联登记记录,外键 REFERENCES fe_worker_registration(id)。可空;建议必填以追溯人员。';
1211
-COMMENT ON COLUMN fe_settlement_item.worker_id IS '关联临时工档案,外键 REFERENCES fe_worker(id)。可空。';
1209
+COMMENT ON COLUMN fe_settlement_item.settlement_id IS '关联结算单,外键。非空;索引 idx_fe_settlement_item。';
1210
+COMMENT ON COLUMN fe_settlement_item.registration_id IS '关联登记记录,外键。可空;建议必填以追溯人员。';
1211
+COMMENT ON COLUMN fe_settlement_item.worker_id IS '关联临时工档案,外键。可空。';
1212
 COMMENT ON COLUMN fe_settlement_item.worker_name_mask IS '姓名脱敏展示,如张*三。可空;禁止存明文全名。';
1212
 COMMENT ON COLUMN fe_settlement_item.worker_name_mask IS '姓名脱敏展示,如张*三。可空;禁止存明文全名。';
1213
 COMMENT ON COLUMN fe_settlement_item.work_days IS '结算工作天数,NUMERIC(8,2)。可空。';
1213
 COMMENT ON COLUMN fe_settlement_item.work_days IS '结算工作天数,NUMERIC(8,2)。可空。';
1214
 COMMENT ON COLUMN fe_settlement_item.work_hours IS '结算工作小时数。可空。';
1214
 COMMENT ON COLUMN fe_settlement_item.work_hours IS '结算工作小时数。可空。';
@@ -1223,7 +1223,7 @@ COMMENT ON COLUMN fe_settlement_item.update_time IS '明细金额调整时更新
1223
 
1223
 
1224
 COMMENT ON TABLE fe_settlement_fee IS '结算单费用汇总项表,订单级劳务费、服务费、保险、税费等分项金额,对应小程序「资金总览」模块。归属 fe_settlement_order,结构与 fe_draft_cost_detail 类似但为实际结算数据。';
1224
 COMMENT ON TABLE fe_settlement_fee IS '结算单费用汇总项表,订单级劳务费、服务费、保险、税费等分项金额,对应小程序「资金总览」模块。归属 fe_settlement_order,结构与 fe_draft_cost_detail 类似但为实际结算数据。';
1225
 COMMENT ON COLUMN fe_settlement_fee.id IS '表主键,自增。结算单生成时同步写入各费用分项。非空。';
1225
 COMMENT ON COLUMN fe_settlement_fee.id IS '表主键,自增。结算单生成时同步写入各费用分项。非空。';
1226
-COMMENT ON COLUMN fe_settlement_fee.settlement_id IS '关联结算单,外键 REFERENCES fe_settlement_order(id)。非空;索引 idx_fe_settlement_fee。';
1226
+COMMENT ON COLUMN fe_settlement_fee.settlement_id IS '关联结算单,外键。非空;索引 idx_fe_settlement_fee。';
1227
 COMMENT ON COLUMN fe_settlement_fee.fee_code IS '费用项编码。示例:labor_fee、service_fee、insurance、tax_withhold。非空。';
1227
 COMMENT ON COLUMN fe_settlement_fee.fee_code IS '费用项编码。示例:labor_fee、service_fee、insurance、tax_withhold。非空。';
1228
 COMMENT ON COLUMN fe_settlement_fee.fee_name IS '费用项中文名。非空。';
1228
 COMMENT ON COLUMN fe_settlement_fee.fee_name IS '费用项中文名。非空。';
1229
 COMMENT ON COLUMN fe_settlement_fee.amount IS '费用金额(元),NUMERIC(14,2)。非空。';
1229
 COMMENT ON COLUMN fe_settlement_fee.amount IS '费用金额(元),NUMERIC(14,2)。非空。';
@@ -1233,13 +1233,13 @@ COMMENT ON COLUMN fe_settlement_fee.sort_order IS '资金总览展示顺序。
1233
 COMMENT ON TABLE fe_payment_record IS '支付/打款记录表,企业确认结算后发起付款,记录渠道、金额、第三方交易流水与凭证。小程序仅展示 payment_channel 渠道类型,不展示对公账户;关联 fe_settlement_order、fe_enterprise。';
1233
 COMMENT ON TABLE fe_payment_record IS '支付/打款记录表,企业确认结算后发起付款,记录渠道、金额、第三方交易流水与凭证。小程序仅展示 payment_channel 渠道类型,不展示对公账户;关联 fe_settlement_order、fe_enterprise。';
1234
 COMMENT ON COLUMN fe_payment_record.id IS '表主键,自增。发起支付时创建。非空。';
1234
 COMMENT ON COLUMN fe_payment_record.id IS '表主键,自增。发起支付时创建。非空。';
1235
 COMMENT ON COLUMN fe_payment_record.payment_no IS '支付单业务编号。示例:PAY20260707001。非空;唯一索引 uk_fe_payment_no。';
1235
 COMMENT ON COLUMN fe_payment_record.payment_no IS '支付单业务编号。示例:PAY20260707001。非空;唯一索引 uk_fe_payment_no。';
1236
-COMMENT ON COLUMN fe_payment_record.settlement_id IS '关联结算单,外键 REFERENCES fe_settlement_order(id)。非空;索引 idx_fe_payment_settlement。';
1237
-COMMENT ON COLUMN fe_payment_record.enterprise_id IS '付款企业,外键 REFERENCES fe_enterprise(id)。非空。';
1236
+COMMENT ON COLUMN fe_payment_record.settlement_id IS '关联结算单,外键。非空;索引 idx_fe_payment_settlement。';
1237
+COMMENT ON COLUMN fe_payment_record.enterprise_id IS '付款企业,外键。非空。';
1238
 COMMENT ON COLUMN fe_payment_record.payment_channel IS '支付渠道类型,前端仅展示此字段。枚举:wechat=微信支付;alipay=支付宝;bank=银行转账。非空。';
1238
 COMMENT ON COLUMN fe_payment_record.payment_channel IS '支付渠道类型,前端仅展示此字段。枚举:wechat=微信支付;alipay=支付宝;bank=银行转账。非空。';
1239
 COMMENT ON COLUMN fe_payment_record.payment_amount IS '支付金额(元)。非空。';
1239
 COMMENT ON COLUMN fe_payment_record.payment_amount IS '支付金额(元)。非空。';
1240
 COMMENT ON COLUMN fe_payment_record.payment_status IS '支付状态。枚举:pending=处理中;success=成功;failed=失败;refunded=已退款。非空,默认 pending。';
1240
 COMMENT ON COLUMN fe_payment_record.payment_status IS '支付状态。枚举:pending=处理中;success=成功;failed=失败;refunded=已退款。非空,默认 pending。';
1241
 COMMENT ON COLUMN fe_payment_record.external_trade_no IS '微信/支付宝/银行等第三方交易流水号。支付回调成功时写入。可空。';
1241
 COMMENT ON COLUMN fe_payment_record.external_trade_no IS '微信/支付宝/银行等第三方交易流水号。支付回调成功时写入。可空。';
1242
-COMMENT ON COLUMN fe_payment_record.payer_user_id IS '发起付款的企业主用户,外键 REFERENCES fe_user(id)。可空。';
1242
+COMMENT ON COLUMN fe_payment_record.payer_user_id IS '发起付款的企业主用户,外键。可空。';
1243
 COMMENT ON COLUMN fe_payment_record.paid_at IS '支付成功时间戳。可空。';
1243
 COMMENT ON COLUMN fe_payment_record.paid_at IS '支付成功时间戳。可空。';
1244
 COMMENT ON COLUMN fe_payment_record.receipt_url IS '支付凭证或回单下载地址。可空。';
1244
 COMMENT ON COLUMN fe_payment_record.receipt_url IS '支付凭证或回单下载地址。可空。';
1245
 COMMENT ON COLUMN fe_payment_record.fail_reason IS '支付失败原因。可空。';
1245
 COMMENT ON COLUMN fe_payment_record.fail_reason IS '支付失败原因。可空。';
@@ -1249,7 +1249,7 @@ COMMENT ON COLUMN fe_payment_record.update_time IS '状态变更时更新。非
1249
 COMMENT ON TABLE fe_attendance_batch IS '考勤日报批次表(二期功能),按登记批次与日期汇总当日应考勤人数、出勤/加班/请假统计及预估费用。一期 MVP 可不实现业务逻辑,表结构先行预留;关联 fe_registration_batch、fe_employment_order。';
1249
 COMMENT ON TABLE fe_attendance_batch IS '考勤日报批次表(二期功能),按登记批次与日期汇总当日应考勤人数、出勤/加班/请假统计及预估费用。一期 MVP 可不实现业务逻辑,表结构先行预留;关联 fe_registration_batch、fe_employment_order。';
1250
 COMMENT ON COLUMN fe_attendance_batch.id IS '表主键,自增。每日定时任务或企业主手动生成日报时创建。非空。';
1250
 COMMENT ON COLUMN fe_attendance_batch.id IS '表主键,自增。每日定时任务或企业主手动生成日报时创建。非空。';
1251
 COMMENT ON COLUMN fe_attendance_batch.batch_id IS '关联登记批次 fe_registration_batch.id(逻辑关联,无数据库外键)。非空;与 attendance_date 组成唯一索引 uk_fe_attendance_batch。';
1251
 COMMENT ON COLUMN fe_attendance_batch.batch_id IS '关联登记批次 fe_registration_batch.id(逻辑关联,无数据库外键)。非空;与 attendance_date 组成唯一索引 uk_fe_attendance_batch。';
1252
-COMMENT ON COLUMN fe_attendance_batch.order_id IS '关联订单,外键 REFERENCES fe_employment_order(id)。冗余便于订单维度查考勤。非空。';
1252
+COMMENT ON COLUMN fe_attendance_batch.order_id IS '关联订单,外键。冗余便于订单维度查考勤。非空。';
1253
 COMMENT ON COLUMN fe_attendance_batch.attendance_date IS '考勤统计日期,DATE 类型。示例:2026-08-15。非空。';
1253
 COMMENT ON COLUMN fe_attendance_batch.attendance_date IS '考勤统计日期,DATE 类型。示例:2026-08-15。非空。';
1254
 COMMENT ON COLUMN fe_attendance_batch.total_workers IS '当日应考勤人数。非空,默认 0。';
1254
 COMMENT ON COLUMN fe_attendance_batch.total_workers IS '当日应考勤人数。非空,默认 0。';
1255
 COMMENT ON COLUMN fe_attendance_batch.normal_count IS '正常出勤人数。非空,默认 0。';
1255
 COMMENT ON COLUMN fe_attendance_batch.normal_count IS '正常出勤人数。非空,默认 0。';
@@ -1259,16 +1259,16 @@ COMMENT ON COLUMN fe_attendance_batch.total_hours IS '当日总工时(小时
1259
 COMMENT ON COLUMN fe_attendance_batch.total_pieces IS '当日总计件数。可空,默认 0。';
1259
 COMMENT ON COLUMN fe_attendance_batch.total_pieces IS '当日总计件数。可空,默认 0。';
1260
 COMMENT ON COLUMN fe_attendance_batch.estimated_cost IS '当日预估劳务费用(元)。可空,默认 0。';
1260
 COMMENT ON COLUMN fe_attendance_batch.estimated_cost IS '当日预估劳务费用(元)。可空,默认 0。';
1261
 COMMENT ON COLUMN fe_attendance_batch.status IS '日报状态。枚举:draft=草稿可编辑;confirmed=已确认锁定;archived=已归档。非空,默认 draft。';
1261
 COMMENT ON COLUMN fe_attendance_batch.status IS '日报状态。枚举:draft=草稿可编辑;confirmed=已确认锁定;archived=已归档。非空,默认 draft。';
1262
-COMMENT ON COLUMN fe_attendance_batch.confirmed_by IS '确认人,外键 REFERENCES fe_user(id)。企业主确认日报时写入。可空。';
1262
+COMMENT ON COLUMN fe_attendance_batch.confirmed_by IS '确认人,外键。企业主确认日报时写入。可空。';
1263
 COMMENT ON COLUMN fe_attendance_batch.confirmed_at IS '日报确认时间。可空。';
1263
 COMMENT ON COLUMN fe_attendance_batch.confirmed_at IS '日报确认时间。可空。';
1264
 COMMENT ON COLUMN fe_attendance_batch.create_time IS '日报创建时间。非空。';
1264
 COMMENT ON COLUMN fe_attendance_batch.create_time IS '日报创建时间。非空。';
1265
 COMMENT ON COLUMN fe_attendance_batch.update_time IS '考勤数据变更时更新。非空。';
1265
 COMMENT ON COLUMN fe_attendance_batch.update_time IS '考勤数据变更时更新。非空。';
1266
 
1266
 
1267
 COMMENT ON TABLE fe_attendance_record IS '考勤明细表(二期),记录单人单日考勤类型(正常/加班/请假/计件)、工时与计件数。支持 manual/voice/import 多种录入来源;关联 fe_attendance_batch、fe_worker_registration、fe_worker。';
1267
 COMMENT ON TABLE fe_attendance_record IS '考勤明细表(二期),记录单人单日考勤类型(正常/加班/请假/计件)、工时与计件数。支持 manual/voice/import 多种录入来源;关联 fe_attendance_batch、fe_worker_registration、fe_worker。';
1268
 COMMENT ON COLUMN fe_attendance_record.id IS '表主键,自增。录入或导入单人考勤时插入。非空。';
1268
 COMMENT ON COLUMN fe_attendance_record.id IS '表主键,自增。录入或导入单人考勤时插入。非空。';
1269
-COMMENT ON COLUMN fe_attendance_record.attendance_batch_id IS '关联考勤日报,外键 REFERENCES fe_attendance_batch(id)。非空;索引 idx_fe_attendance_rec。';
1270
-COMMENT ON COLUMN fe_attendance_record.registration_id IS '关联登记记录,外键 REFERENCES fe_worker_registration(id)。非空;确定考勤对象。';
1271
-COMMENT ON COLUMN fe_attendance_record.worker_id IS '关联临时工档案,外键 REFERENCES fe_worker(id)。可空;冗余加速查询。';
1269
+COMMENT ON COLUMN fe_attendance_record.attendance_batch_id IS '关联考勤日报,外键。非空;索引 idx_fe_attendance_rec。';
1270
+COMMENT ON COLUMN fe_attendance_record.registration_id IS '关联登记记录,外键。非空;确定考勤对象。';
1271
+COMMENT ON COLUMN fe_attendance_record.worker_id IS '关联临时工档案,外键。可空;冗余加速查询。';
1272
 COMMENT ON COLUMN fe_attendance_record.attendance_type IS '考勤类型。枚举:normal=正常出勤;overtime=加班;leave=请假;piece=计件产量。非空,默认 normal。';
1272
 COMMENT ON COLUMN fe_attendance_record.attendance_type IS '考勤类型。枚举:normal=正常出勤;overtime=加班;leave=请假;piece=计件产量。非空,默认 normal。';
1273
 COMMENT ON COLUMN fe_attendance_record.work_hours IS '正常工作小时数,NUMERIC(8,2)。可空。';
1273
 COMMENT ON COLUMN fe_attendance_record.work_hours IS '正常工作小时数,NUMERIC(8,2)。可空。';
1274
 COMMENT ON COLUMN fe_attendance_record.overtime_hours IS '加班小时数。可空。';
1274
 COMMENT ON COLUMN fe_attendance_record.overtime_hours IS '加班小时数。可空。';
@@ -1280,14 +1280,14 @@ COMMENT ON COLUMN fe_attendance_record.update_time IS '考勤数据修改时更
1280
 
1280
 
1281
 COMMENT ON TABLE fe_user_confirmation IS '用户确认与授权留痕表,草稿确认、方案选择、结算支付、外部平台提交等高风险操作必须写入,满足审计与合规举证。关联 fe_enterprise、fe_user,可引用 fe_service_plan。';
1281
 COMMENT ON TABLE fe_user_confirmation IS '用户确认与授权留痕表,草稿确认、方案选择、结算支付、外部平台提交等高风险操作必须写入,满足审计与合规举证。关联 fe_enterprise、fe_user,可引用 fe_service_plan。';
1282
 COMMENT ON COLUMN fe_user_confirmation.id IS '表主键,自增。用户执行确认类操作时同步插入,不可篡改。非空。';
1282
 COMMENT ON COLUMN fe_user_confirmation.id IS '表主键,自增。用户执行确认类操作时同步插入,不可篡改。非空。';
1283
-COMMENT ON COLUMN fe_user_confirmation.enterprise_id IS '所属企业,外键 REFERENCES fe_enterprise(id)。非空;索引 idx_fe_user_confirm。';
1284
-COMMENT ON COLUMN fe_user_confirmation.user_id IS '操作用户,外键 REFERENCES fe_user(id)。非空;须为 enterprise 类型企业主或管理员。';
1283
+COMMENT ON COLUMN fe_user_confirmation.enterprise_id IS '所属企业,外键。非空;索引 idx_fe_user_confirm。';
1284
+COMMENT ON COLUMN fe_user_confirmation.user_id IS '操作用户,外键。非空;须为 enterprise 类型企业主或管理员。';
1285
 COMMENT ON COLUMN fe_user_confirmation.biz_type IS '业务场景类型。枚举:draft_confirm=确认用工草稿;plan_select=选定用工方案;settlement_pay=确认并支付结算;external_submit=授权提交第三方平台。非空。';
1285
 COMMENT ON COLUMN fe_user_confirmation.biz_type IS '业务场景类型。枚举:draft_confirm=确认用工草稿;plan_select=选定用工方案;settlement_pay=确认并支付结算;external_submit=授权提交第三方平台。非空。';
1286
 COMMENT ON COLUMN fe_user_confirmation.biz_id IS '关联业务主键 ID,如 draft_id、settlement_id。非空;与 biz_type 组合解析。';
1286
 COMMENT ON COLUMN fe_user_confirmation.biz_id IS '关联业务主键 ID,如 draft_id、settlement_id。非空;与 biz_type 组合解析。';
1287
 COMMENT ON COLUMN fe_user_confirmation.biz_no IS '关联业务编号冗余,便于人工审计。示例:draft_001。可空。';
1287
 COMMENT ON COLUMN fe_user_confirmation.biz_no IS '关联业务编号冗余,便于人工审计。示例:draft_001。可空。';
1288
 COMMENT ON COLUMN fe_user_confirmation.action IS '用户动作类型。枚举:confirm=确认;modify=修改后确认;authorize=授权。非空。';
1288
 COMMENT ON COLUMN fe_user_confirmation.action IS '用户动作类型。枚举:confirm=确认;modify=修改后确认;authorize=授权。非空。';
1289
 COMMENT ON COLUMN fe_user_confirmation.confirmed_fields IS '用户确认时的关键字段快照 JSON,固化确认瞬间数据。示例:{"worker_count":15,"daily_wage":280}。可空,默认 {}。';
1289
 COMMENT ON COLUMN fe_user_confirmation.confirmed_fields IS '用户确认时的关键字段快照 JSON,固化确认瞬间数据。示例:{"worker_count":15,"daily_wage":280}。可空,默认 {}。';
1290
-COMMENT ON COLUMN fe_user_confirmation.selected_plan_id IS '确认选用的方案,外键 REFERENCES fe_service_plan(id)。biz_type=plan_select 或 draft_confirm 时写入。可空。';
1290
+COMMENT ON COLUMN fe_user_confirmation.selected_plan_id IS '确认选用的方案,外键。biz_type=plan_select 或 draft_confirm 时写入。可空。';
1291
 COMMENT ON COLUMN fe_user_confirmation.client_ip IS '客户端 IP,合规取证。网关提取。可空。';
1291
 COMMENT ON COLUMN fe_user_confirmation.client_ip IS '客户端 IP,合规取证。网关提取。可空。';
1292
 COMMENT ON COLUMN fe_user_confirmation.user_agent IS '客户端 UA 字符串。可空。';
1292
 COMMENT ON COLUMN fe_user_confirmation.user_agent IS '客户端 UA 字符串。可空。';
1293
 COMMENT ON COLUMN fe_user_confirmation.remark IS '用户填写的备注或系统附注。可空。';
1293
 COMMENT ON COLUMN fe_user_confirmation.remark IS '用户填写的备注或系统附注。可空。';
@@ -1301,7 +1301,7 @@ COMMENT ON COLUMN fe_field_change_log.field_key IS '被变更字段键名。示
1301
 COMMENT ON COLUMN fe_field_change_log.old_value IS '变更前的文本值。可空;首次填入时 old_value 为空。';
1301
 COMMENT ON COLUMN fe_field_change_log.old_value IS '变更前的文本值。可空;首次填入时 old_value 为空。';
1302
 COMMENT ON COLUMN fe_field_change_log.new_value IS '变更后的文本值。可空。';
1302
 COMMENT ON COLUMN fe_field_change_log.new_value IS '变更后的文本值。可空。';
1303
 COMMENT ON COLUMN fe_field_change_log.change_source IS '变更来源。枚举:user_edit=用户表单编辑;nl_edit=自然语言对话修改;ai_regenerate=AI 重新生成草稿;system=系统自动(如状态联动)。非空。';
1303
 COMMENT ON COLUMN fe_field_change_log.change_source IS '变更来源。枚举:user_edit=用户表单编辑;nl_edit=自然语言对话修改;ai_regenerate=AI 重新生成草稿;system=系统自动(如状态联动)。非空。';
1304
-COMMENT ON COLUMN fe_field_change_log.operator_id IS '操作人,外键 REFERENCES fe_user(id)。系统自动变更时可为空。可空。';
1304
+COMMENT ON COLUMN fe_field_change_log.operator_id IS '操作人,外键。系统自动变更时可为空。可空。';
1305
 COMMENT ON COLUMN fe_field_change_log.create_time IS '变更发生时间。非空。';
1305
 COMMENT ON COLUMN fe_field_change_log.create_time IS '变更发生时间。非空。';
1306
 
1306
 
1307
 COMMENT ON TABLE fe_provider IS '第三方灵活用工/税筹合作平台连接器配置表,存储 API 根地址与加密鉴权信息。不对小程序用户暴露;被 fe_provider_api_log 引用,一期可采用 Mock 打桩。';
1307
 COMMENT ON TABLE fe_provider IS '第三方灵活用工/税筹合作平台连接器配置表,存储 API 根地址与加密鉴权信息。不对小程序用户暴露;被 fe_provider_api_log 引用,一期可采用 Mock 打桩。';
@@ -1316,9 +1316,9 @@ COMMENT ON COLUMN fe_provider.update_time IS '配置变更时更新。非空。'
1316
 
1316
 
1317
 COMMENT ON TABLE fe_provider_api_log IS '合作平台 API 调用日志表,保存原始 HTTP 请求响应、技术状态码与转换后的业务状态 biz_status。技术细节不对用户展示;audit_required 标识是否需用户确认后才能继续推进订单流程。';
1317
 COMMENT ON TABLE fe_provider_api_log IS '合作平台 API 调用日志表,保存原始 HTTP 请求响应、技术状态码与转换后的业务状态 biz_status。技术细节不对用户展示;audit_required 标识是否需用户确认后才能继续推进订单流程。';
1318
 COMMENT ON COLUMN fe_provider_api_log.id IS '表主键,自增。每次调用第三方 API 时追加。非空。';
1318
 COMMENT ON COLUMN fe_provider_api_log.id IS '表主键,自增。每次调用第三方 API 时追加。非空。';
1319
-COMMENT ON COLUMN fe_provider_api_log.provider_id IS '合作平台,外键 REFERENCES fe_provider(id)。非空;索引 idx_fe_provider_log。';
1320
-COMMENT ON COLUMN fe_provider_api_log.enterprise_id IS '关联企业,外键 REFERENCES fe_enterprise(id)。调用上下文企业。可空。';
1321
-COMMENT ON COLUMN fe_provider_api_log.order_id IS '关联订单,外键 REFERENCES fe_employment_order(id)。可空;索引 idx_fe_provider_log_order。';
1319
+COMMENT ON COLUMN fe_provider_api_log.provider_id IS '合作平台,外键。非空;索引 idx_fe_provider_log。';
1320
+COMMENT ON COLUMN fe_provider_api_log.enterprise_id IS '关联企业,外键。调用上下文企业。可空。';
1321
+COMMENT ON COLUMN fe_provider_api_log.order_id IS '关联订单,外键。可空;索引 idx_fe_provider_log_order。';
1322
 COMMENT ON COLUMN fe_provider_api_log.action IS 'API 动作编码。示例:create_requirement=创建用工需求;query_status=查询办理状态;callback=异步回调。非空。';
1322
 COMMENT ON COLUMN fe_provider_api_log.action IS 'API 动作编码。示例:create_requirement=创建用工需求;query_status=查询办理状态;callback=异步回调。非空。';
1323
 COMMENT ON COLUMN fe_provider_api_log.request_payload IS '请求体 JSON 快照。可空;可能含敏感业务数据,访问受控。';
1323
 COMMENT ON COLUMN fe_provider_api_log.request_payload IS '请求体 JSON 快照。可空;可能含敏感业务数据,访问受控。';
1324
 COMMENT ON COLUMN fe_provider_api_log.response_payload IS '响应体 JSON 快照。可空。';
1324
 COMMENT ON COLUMN fe_provider_api_log.response_payload IS '响应体 JSON 快照。可空。';
@@ -1331,8 +1331,8 @@ COMMENT ON COLUMN fe_provider_api_log.create_time IS '调用时间。非空。';
1331
 
1331
 
1332
 COMMENT ON TABLE fe_notification IS '消息与待办中心表,推送结算待确认、实名失败、登记进度、流程节点变更等通知。支持 action_url 跳转小程序对应页面/弹窗;关联 fe_enterprise、fe_user,通过 read_flag 与 handled_flag 区分已读与已办。';
1332
 COMMENT ON TABLE fe_notification IS '消息与待办中心表,推送结算待确认、实名失败、登记进度、流程节点变更等通知。支持 action_url 跳转小程序对应页面/弹窗;关联 fe_enterprise、fe_user,通过 read_flag 与 handled_flag 区分已读与已办。';
1333
 COMMENT ON COLUMN fe_notification.id IS '表主键,自增。业务事件触发时由通知服务写入。非空。';
1333
 COMMENT ON COLUMN fe_notification.id IS '表主键,自增。业务事件触发时由通知服务写入。非空。';
1334
-COMMENT ON COLUMN fe_notification.enterprise_id IS '所属企业,外键 REFERENCES fe_enterprise(id)。企业维度消息筛选。可空;索引 idx_fe_notification_ent。';
1335
-COMMENT ON COLUMN fe_notification.user_id IS '接收用户,外键 REFERENCES fe_user(id)。可空;索引 idx_fe_notification_user;与 enterprise_id 至少其一有值。';
1334
+COMMENT ON COLUMN fe_notification.enterprise_id IS '所属企业,外键。企业维度消息筛选。可空;索引 idx_fe_notification_ent。';
1335
+COMMENT ON COLUMN fe_notification.user_id IS '接收用户,外键。可空;索引 idx_fe_notification_user;与 enterprise_id 至少其一有值。';
1336
 COMMENT ON COLUMN fe_notification.notify_type IS '通知展示样式。枚举:pending=待办(橙色);error=异常(红色);info=提示(蓝色);success=成功(绿色)。非空。';
1336
 COMMENT ON COLUMN fe_notification.notify_type IS '通知展示样式。枚举:pending=待办(橙色);error=异常(红色);info=提示(蓝色);success=成功(绿色)。非空。';
1337
 COMMENT ON COLUMN fe_notification.category IS '业务分类。枚举:settlement=结算;registration=登记;verify=实名核验;workflow=流程进度。非空。';
1337
 COMMENT ON COLUMN fe_notification.category IS '业务分类。枚举:settlement=结算;registration=登记;verify=实名核验;workflow=流程进度。非空。';
1338
 COMMENT ON COLUMN fe_notification.title IS '通知标题,列表主文案。非空。';
1338
 COMMENT ON COLUMN fe_notification.title IS '通知标题,列表主文案。非空。';