灵活用工项目

灵活用工.sql 130KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583
  1. -- =============================================================================
  2. -- 灵活用工与用工税筹模块 - 数据库表结构设计
  3. -- =============================================================================
  4. -- 依据材料:
  5. -- - wechat-mini-program-flexible-employment-plan.md
  6. -- - flexible-employment-demo.html(前端原型)
  7. -- - 会议摘要 / 灵活用开发工会议.md
  8. -- 技术栈:PostgreSQL(FastAPI + LangGraph 后端)
  9. -- 设计原则:
  10. -- 1. 草稿优先:AI 生成草稿 -> 企业认证 -> 登记/招聘 -> 任务发布 -> 结算打款 -> 开票归档
  11. -- 2. 用工明细子表为事实源;头表不存人数/工种/地点/金额等冗余
  12. -- 3. 敏感字段加密存储,业务库仅存密文与脱敏值
  13. -- 4. 一账号多企业:fe_enterprise_user;最近认证通过的企业 is_default=1
  14. -- =============================================================================
  15. -- 表命名:fe_ = flexible employment(灵活用工)
  16. -- 公共字段约定:
  17. -- create_time / update_time : 记录时间戳,应用层维护 update_time
  18. -- del_flag : 0=正常 1=逻辑删除(带此字段的表软删后释放部分唯一索引)
  19. -- 敏感字段约定:
  20. -- *_enc : 加密密文,应用层加解密,数据库禁止存明文
  21. -- *_mask : 脱敏展示值,供列表、消息、操作日志使用
  22. -- 业务流程主线(六步):
  23. -- 草稿(fe_employment_draft + fe_draft_work_item)
  24. -- -> 企业认证(回填 enterprise_id / is_default)
  25. -- -> 人员登记(existing) 或 临时工招聘(recruit)
  26. -- -> 任务发布 -> 结算打款 -> 开票归档
  27. -- 确认后:订单(fe_employment_order + fe_order_work_item)
  28. -- 建议启用扩展(UUID 主键、向量检索等)
  29. -- CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
  30. -- CREATE EXTENSION IF NOT EXISTS "pgcrypto";
  31. -- CREATE EXTENSION IF NOT EXISTS "vector";
  32. -- -----------------------------------------------------------------------------
  33. -- 一、身份与企业画像中心
  34. -- 职责:微信小程序登录鉴权、企业主/临时工身份分离、企业认证与扩展画像。
  35. -- 关联 API:POST /api/v1/agent/messages 中的 enterprise_id;企业主登录与企业绑定。
  36. -- 说明:AI 生成草稿时优先从 fe_enterprise.registered_address、fe_enterprise_preference 推断默认值。
  37. -- -----------------------------------------------------------------------------
  38. -- 小程序用户(企业主 / 临时工共用,通过 user_type 区分;支持短信/微信/可选账密登录)
  39. CREATE TABLE fe_user (
  40. id BIGSERIAL PRIMARY KEY,
  41. openid VARCHAR(64), -- 微信 openid,纯短信登录可为空
  42. unionid VARCHAR(64),
  43. user_type VARCHAR(20) NOT NULL DEFAULT 'enterprise', -- enterprise / worker
  44. nickname VARCHAR(64),
  45. avatar_url VARCHAR(512),
  46. mobile_enc TEXT, -- 手机号密文
  47. mobile_mask VARCHAR(20), -- 138****1234
  48. username VARCHAR(64), -- 登录用户名,设密时写入,全局唯一
  49. password_hash VARCHAR(128), -- BCrypt 哈希,NULL=未设密
  50. pwd_failed_count INT NOT NULL DEFAULT 0, -- 账密连续失败次数
  51. pwd_locked_until TIMESTAMPTZ, -- 账密锁定截止时间
  52. password_set_at TIMESTAMPTZ, -- 最近设密/改密时间
  53. session_key VARCHAR(128), -- 微信 session,定期刷新
  54. status VARCHAR(20) NOT NULL DEFAULT 'active', -- active / disabled
  55. last_login_at TIMESTAMPTZ,
  56. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  57. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  58. del_flag SMALLINT NOT NULL DEFAULT 0 -- 0正常 1删除
  59. );
  60. CREATE UNIQUE INDEX uk_fe_user_openid ON fe_user (openid) WHERE del_flag = 0;
  61. CREATE UNIQUE INDEX uk_fe_user_username ON fe_user (username) WHERE del_flag = 0 AND username IS NOT NULL;
  62. CREATE UNIQUE INDEX uk_fe_user_mobile_enc ON fe_user (mobile_enc, del_flag);
  63. CREATE INDEX idx_fe_user_type ON fe_user (user_type, status);
  64. -- 企业主体
  65. CREATE TABLE fe_enterprise (
  66. id BIGSERIAL PRIMARY KEY,
  67. enterprise_code VARCHAR(32), -- 业务编码,创建后写入
  68. name VARCHAR(200) NOT NULL,
  69. credit_code VARCHAR(32), -- 统一社会信用代码
  70. legal_person VARCHAR(64),
  71. legal_person_id_card_enc TEXT, -- 法人身份证号密文
  72. legal_person_id_card_mask VARCHAR(32), -- 法人身份证号脱敏
  73. registered_address VARCHAR(500),
  74. contact_name VARCHAR(64),
  75. contact_mobile_enc TEXT, -- 联系人/法人手机号密文
  76. contact_mobile_mask VARCHAR(20),
  77. industry VARCHAR(100),
  78. scale VARCHAR(50), -- 企业规模
  79. auth_status VARCHAR(20) NOT NULL DEFAULT 'pending', -- pending / verified / rejected
  80. auth_time TIMESTAMPTZ,
  81. profile_json JSONB DEFAULT '{}', -- 扩展画像(行业标签、历史偏好摘要等)
  82. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  83. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  84. del_flag SMALLINT NOT NULL DEFAULT 0
  85. );
  86. CREATE UNIQUE INDEX uk_fe_enterprise_code ON fe_enterprise (enterprise_code, del_flag);
  87. CREATE UNIQUE INDEX uk_fe_enterprise_credit_code ON fe_enterprise (credit_code, del_flag);
  88. -- 企业-用户绑定(一账号多企业认证;一企业可多管理员)
  89. CREATE TABLE fe_enterprise_user (
  90. id BIGSERIAL PRIMARY KEY,
  91. enterprise_id BIGINT NOT NULL,
  92. user_id BIGINT NOT NULL,
  93. role VARCHAR(20) NOT NULL DEFAULT 'owner', -- owner / admin / viewer
  94. is_default BOOLEAN NOT NULL DEFAULT FALSE, -- 默认企业;同用户仅一条 TRUE;认证通过置最近认证为默认
  95. bind_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  96. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  97. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  98. del_flag SMALLINT NOT NULL DEFAULT 0
  99. );
  100. CREATE UNIQUE INDEX uk_fe_enterprise_user ON fe_enterprise_user (enterprise_id, user_id) WHERE del_flag = 0;
  101. CREATE INDEX idx_fe_enterprise_user_uid ON fe_enterprise_user (user_id);
  102. CREATE INDEX idx_fe_enterprise_user_default ON fe_enterprise_user (user_id, is_default) WHERE del_flag = 0;
  103. -- 企业财务与开票信息(敏感,小程序端不直接展示明细)
  104. CREATE TABLE fe_enterprise_finance (
  105. id BIGSERIAL PRIMARY KEY,
  106. enterprise_id BIGINT NOT NULL,
  107. bank_name VARCHAR(100),
  108. bank_account_enc TEXT, -- 对公账户密文
  109. bank_account_mask VARCHAR(32),
  110. invoice_title VARCHAR(200), -- 开票抬头
  111. tax_no VARCHAR(32), -- 税号
  112. payment_channel VARCHAR(50), -- wechat / alipay / bank(仅渠道类型)
  113. balance_amount NUMERIC(14,2) DEFAULT 0,
  114. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  115. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  116. del_flag SMALLINT NOT NULL DEFAULT 0
  117. );
  118. CREATE UNIQUE INDEX uk_fe_enterprise_finance ON fe_enterprise_finance (enterprise_id) WHERE del_flag = 0;
  119. -- 企业智能偏好(工种薪资基准、默认保险、发薪周期等)
  120. CREATE TABLE fe_enterprise_preference (
  121. id BIGSERIAL PRIMARY KEY,
  122. enterprise_id BIGINT NOT NULL,
  123. pref_type VARCHAR(50) NOT NULL, -- work_type / insurance / payment_cycle
  124. pref_key VARCHAR(100),
  125. pref_value JSONB NOT NULL DEFAULT '{}',
  126. source VARCHAR(50) DEFAULT 'user_config', -- user_config / ai_inferred / default
  127. raw_text TEXT, -- 用户自然语言配置原文
  128. confirmed BOOLEAN NOT NULL DEFAULT FALSE,
  129. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  130. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  131. del_flag SMALLINT NOT NULL DEFAULT 0
  132. );
  133. CREATE INDEX idx_fe_enterprise_pref ON fe_enterprise_preference (enterprise_id, pref_type);
  134. -- -----------------------------------------------------------------------------
  135. -- 二、对话与智能体编排
  136. -- 职责:存储企业主与主智能体的对话;消息可携带草稿卡、成本卡等结构化卡片。
  137. -- 说明:小程序不直连大模型,所有对话经业务后端写入本模块;fe_agent_action_log 记录子模块调用链。
  138. -- -----------------------------------------------------------------------------
  139. CREATE TABLE fe_conversation (
  140. id BIGSERIAL PRIMARY KEY,
  141. conversation_no VARCHAR(32) NOT NULL, -- conv_001
  142. user_id BIGINT NOT NULL, -- 仅归属用户,不绑企业
  143. title VARCHAR(200),
  144. chat_type VARCHAR(30) NOT NULL DEFAULT 'employment', -- employment/knowledge/order/cost/attendance/emergency
  145. status VARCHAR(20) NOT NULL DEFAULT 'active', -- active / archived
  146. last_message_at TIMESTAMPTZ,
  147. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  148. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  149. del_flag SMALLINT NOT NULL DEFAULT 0
  150. );
  151. CREATE UNIQUE INDEX uk_fe_conversation_no ON fe_conversation (conversation_no);
  152. CREATE INDEX idx_fe_conversation_user ON fe_conversation (user_id, last_message_at DESC);
  153. CREATE TABLE fe_conversation_message (
  154. id BIGSERIAL PRIMARY KEY,
  155. conversation_id BIGINT NOT NULL,
  156. role VARCHAR(20) NOT NULL, -- user / assistant / system
  157. content TEXT NOT NULL,
  158. content_type VARCHAR(30) NOT NULL DEFAULT 'text', -- text / card_draft / card_cost / card_order
  159. card_payload JSONB, -- 卡片结构化数据
  160. agent_module VARCHAR(50), -- flexible_employment 等
  161. next_action VARCHAR(50), -- show_employment_draft 等
  162. related_draft_id BIGINT,
  163. token_usage JSONB,
  164. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
  165. );
  166. CREATE INDEX idx_fe_conv_msg ON fe_conversation_message (conversation_id, create_time);
  167. -- 智能体/子模块调用记录(审计、排障)
  168. CREATE TABLE fe_agent_action_log (
  169. id BIGSERIAL PRIMARY KEY,
  170. conversation_id BIGINT,
  171. enterprise_id BIGINT NOT NULL,
  172. module_name VARCHAR(50) NOT NULL, -- main_agent / flexible_employment / cost_engine
  173. action VARCHAR(100) NOT NULL,
  174. request_json JSONB,
  175. response_json JSONB,
  176. status VARCHAR(20) NOT NULL DEFAULT 'success',
  177. error_message TEXT,
  178. duration_ms INTEGER,
  179. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
  180. );
  181. CREATE INDEX idx_fe_agent_log ON fe_agent_action_log (enterprise_id, create_time DESC);
  182. -- -----------------------------------------------------------------------------
  183. -- 三、方案目录与规则引擎
  184. -- 职责:成本对比三方案配置、费率规则、合规状态机定义、政策法规规则库。
  185. -- 说明:成本测算引擎读取 fe_service_plan + fe_service_plan_fee_rule;test_only 方案仅供 Demo。
  186. -- -----------------------------------------------------------------------------
  187. -- 用工方案目录(成本对比三方案 + 当前方式)
  188. CREATE TABLE fe_service_plan (
  189. id BIGSERIAL PRIMARY KEY,
  190. plan_code VARCHAR(32) NOT NULL, -- current / plan_1 / plan_2 / plan_3
  191. plan_name VARCHAR(100) NOT NULL,
  192. plan_type VARCHAR(30) NOT NULL DEFAULT 'flexible', -- flexible / traditional / hybrid
  193. description TEXT,
  194. service_fee_rate NUMERIC(8,4), -- 服务费率,如 0.08
  195. insurance_level VARCHAR(30), -- basic / standard / premium
  196. tax_mode VARCHAR(50), -- 税费代征模式
  197. applicable_scenarios JSONB DEFAULT '[]', -- 适用场景列表
  198. compliance_tags JSONB DEFAULT '[]', -- ["业务真实","资金合规","个税申报"]
  199. sort_order INTEGER NOT NULL DEFAULT 0,
  200. status VARCHAR(20) NOT NULL DEFAULT 'active', -- active / test_only / disabled
  201. effective_from DATE,
  202. effective_to DATE,
  203. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  204. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  205. del_flag SMALLINT NOT NULL DEFAULT 0
  206. );
  207. CREATE UNIQUE INDEX uk_fe_service_plan_code ON fe_service_plan (plan_code) WHERE del_flag = 0;
  208. -- 方案费用项规则
  209. CREATE TABLE fe_service_plan_fee_rule (
  210. id BIGSERIAL PRIMARY KEY,
  211. plan_id BIGINT NOT NULL,
  212. fee_code VARCHAR(50) NOT NULL, -- labor_fee / service_fee / insurance / tax_withhold
  213. fee_name VARCHAR(100) NOT NULL,
  214. calc_type VARCHAR(30) NOT NULL, -- fixed / rate / formula
  215. calc_expression TEXT, -- 计算公式或规则描述
  216. default_rate NUMERIC(8,4),
  217. sort_order INTEGER NOT NULL DEFAULT 0,
  218. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  219. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
  220. );
  221. CREATE INDEX idx_fe_plan_fee ON fe_service_plan_fee_rule (plan_id);
  222. -- 灵活用工流程定义(六步状态机,版本化)
  223. CREATE TABLE fe_workflow_definition (
  224. id BIGSERIAL PRIMARY KEY,
  225. workflow_code VARCHAR(50) NOT NULL, -- employment_compliance
  226. workflow_name VARCHAR(100) NOT NULL,
  227. description TEXT,
  228. version INTEGER NOT NULL DEFAULT 1,
  229. is_active BOOLEAN NOT NULL DEFAULT TRUE,
  230. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  231. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
  232. );
  233. CREATE UNIQUE INDEX uk_fe_workflow_def ON fe_workflow_definition (workflow_code, version);
  234. CREATE TABLE fe_workflow_step (
  235. id BIGSERIAL PRIMARY KEY,
  236. workflow_id BIGINT NOT NULL,
  237. step_code VARCHAR(50) NOT NULL, -- draft / enterprise_auth / worker_registration|worker_recruitment / task_publish / settlement / invoice_archive
  238. step_name VARCHAR(100) NOT NULL,
  239. step_order INTEGER NOT NULL,
  240. required BOOLEAN NOT NULL DEFAULT TRUE, -- 登记/招聘 required=false,按 worker_source 二选一
  241. auto_advance BOOLEAN NOT NULL DEFAULT FALSE,
  242. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
  243. );
  244. CREATE UNIQUE INDEX uk_fe_workflow_step ON fe_workflow_step (workflow_id, step_code);
  245. -- 政策规则库(供规则引擎 / RAG 引用)
  246. CREATE TABLE fe_policy_rule (
  247. id BIGSERIAL PRIMARY KEY,
  248. rule_code VARCHAR(50) NOT NULL,
  249. rule_category VARCHAR(50) NOT NULL, -- tax / labor / insurance / invoice
  250. title VARCHAR(200) NOT NULL,
  251. content TEXT NOT NULL,
  252. effective_from DATE,
  253. effective_to DATE,
  254. priority INTEGER NOT NULL DEFAULT 0,
  255. status VARCHAR(20) NOT NULL DEFAULT 'active',
  256. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  257. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
  258. );
  259. CREATE UNIQUE INDEX uk_fe_policy_rule ON fe_policy_rule (rule_code);
  260. -- -----------------------------------------------------------------------------
  261. -- 四、草稿中心
  262. -- 职责:AI 生成用工草稿头 + 多条用工明细、字段来源追踪、成本对比快照。
  263. -- 说明:用工事实在 fe_draft_work_item;头表不镜像人数/工种/地点/金额。
  264. -- -----------------------------------------------------------------------------
  265. CREATE TABLE fe_employment_draft (
  266. id BIGSERIAL PRIMARY KEY,
  267. draft_no VARCHAR(32) NOT NULL, -- draft_001
  268. enterprise_id BIGINT, -- 可空;企业认证后回填
  269. user_id BIGINT NOT NULL,
  270. conversation_id BIGINT,
  271. title VARCHAR(200),
  272. status VARCHAR(20) NOT NULL DEFAULT 'pending', -- pending / confirmed / cancelled / expired
  273. worker_source VARCHAR(20), -- existing=人员登记;recruit=临时工招聘
  274. missing_fields JSONB DEFAULT '[]',
  275. risk_prompts JSONB DEFAULT '[]',
  276. selected_plan_id BIGINT,
  277. confirmed_at TIMESTAMPTZ,
  278. confirmed_by BIGINT,
  279. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  280. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  281. del_flag SMALLINT NOT NULL DEFAULT 0
  282. );
  283. CREATE UNIQUE INDEX uk_fe_draft_no ON fe_employment_draft (draft_no);
  284. CREATE INDEX idx_fe_draft_ent ON fe_employment_draft (enterprise_id, status, create_time DESC);
  285. CREATE INDEX idx_fe_draft_user ON fe_employment_draft (user_id, status, create_time DESC);
  286. -- 草稿用工明细(1 草稿 N 行,唯一事实源)
  287. CREATE TABLE fe_draft_work_item (
  288. id BIGSERIAL PRIMARY KEY,
  289. draft_id BIGINT NOT NULL,
  290. group_no VARCHAR(32) NOT NULL, -- grp_01;对应 API group_id
  291. sort_order INTEGER NOT NULL DEFAULT 0,
  292. job_type VARCHAR(100),
  293. worker_count INTEGER,
  294. work_days NUMERIC(8,2),
  295. work_location VARCHAR(500),
  296. settlement_cycle VARCHAR(20), -- daily / weekly / monthly
  297. unit_amount NUMERIC(12,2),
  298. total_amount NUMERIC(14,2),
  299. work_content TEXT,
  300. work_start_date TIMESTAMPTZ,
  301. work_end_date TIMESTAMPTZ,
  302. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  303. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  304. del_flag SMALLINT NOT NULL DEFAULT 0
  305. );
  306. CREATE UNIQUE INDEX uk_fe_draft_work_item ON fe_draft_work_item (draft_id, group_no) WHERE del_flag = 0;
  307. CREATE INDEX idx_fe_draft_work_item_sort ON fe_draft_work_item (draft_id, sort_order);
  308. -- 草稿字段明细(带来源与可编辑标记,支持「默认生成」展示)
  309. CREATE TABLE fe_draft_field (
  310. id BIGSERIAL PRIMARY KEY,
  311. draft_id BIGINT NOT NULL,
  312. field_key VARCHAR(100) NOT NULL,
  313. field_label VARCHAR(100),
  314. field_value TEXT,
  315. value_json JSONB,
  316. source VARCHAR(50) NOT NULL DEFAULT 'ai_inferred', -- enterprise_profile / history_preference / default / user_input / ai_inferred
  317. editable BOOLEAN NOT NULL DEFAULT TRUE,
  318. is_default BOOLEAN NOT NULL DEFAULT FALSE,
  319. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  320. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
  321. );
  322. CREATE UNIQUE INDEX uk_fe_draft_field ON fe_draft_field (draft_id, field_key);
  323. -- 草稿成本对比快照
  324. CREATE TABLE fe_draft_cost_snapshot (
  325. id BIGSERIAL PRIMARY KEY,
  326. draft_id BIGINT NOT NULL,
  327. plan_id BIGINT,
  328. plan_code VARCHAR(32) NOT NULL,
  329. plan_name VARCHAR(100) NOT NULL,
  330. employer_total_outflow NUMERIC(14,2) NOT NULL, -- 企业总支出
  331. employer_avg_cost_per_worker NUMERIC(12,2) NOT NULL, -- 平均每人成本
  332. worker_take_home_per_worker NUMERIC(12,2), -- 员工到手
  333. is_recommended BOOLEAN NOT NULL DEFAULT FALSE,
  334. status_tag VARCHAR(30), -- test_only
  335. compliance_tags JSONB DEFAULT '[]',
  336. notice TEXT,
  337. calc_version VARCHAR(20),
  338. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
  339. );
  340. CREATE INDEX idx_fe_cost_snapshot ON fe_draft_cost_snapshot (draft_id);
  341. -- 成本明细项(劳务费、服务费、保险、税费代征等)
  342. CREATE TABLE fe_draft_cost_detail (
  343. id BIGSERIAL PRIMARY KEY,
  344. snapshot_id BIGINT NOT NULL,
  345. fee_code VARCHAR(50) NOT NULL,
  346. fee_name VARCHAR(100) NOT NULL,
  347. amount NUMERIC(14,2) NOT NULL,
  348. rate NUMERIC(8,4),
  349. sort_order INTEGER NOT NULL DEFAULT 0
  350. );
  351. CREATE INDEX idx_fe_cost_detail ON fe_draft_cost_detail (snapshot_id);
  352. -- -----------------------------------------------------------------------------
  353. -- 五、订单与登记中心
  354. -- 职责:草稿确认后生成订单头 + 用工明细快照;按 worker_source 进入登记或招聘。
  355. -- 说明:登记进度从批次/登记表聚合,不落订单头;qr_token 需校验有效期。
  356. -- -----------------------------------------------------------------------------
  357. CREATE TABLE fe_employment_order (
  358. id BIGSERIAL PRIMARY KEY,
  359. order_no VARCHAR(32) NOT NULL,
  360. enterprise_id BIGINT, -- 可空;企业认证后回填
  361. user_id BIGINT NOT NULL,
  362. draft_id BIGINT,
  363. selected_plan_id BIGINT,
  364. title VARCHAR(200) NOT NULL,
  365. order_status VARCHAR(30) NOT NULL DEFAULT 'confirmed',
  366. worker_source VARCHAR(20), -- existing / recruit
  367. current_step_code VARCHAR(50) NOT NULL DEFAULT 'draft', -- draft/enterprise_auth/worker_registration|worker_recruitment/task_publish/settlement/invoice_archive(任务发布=task_publish,不用 work_started)
  368. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  369. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  370. del_flag SMALLINT NOT NULL DEFAULT 0
  371. );
  372. CREATE UNIQUE INDEX uk_fe_order_no ON fe_employment_order (order_no);
  373. CREATE INDEX idx_fe_order_ent ON fe_employment_order (enterprise_id, order_status, create_time DESC);
  374. CREATE INDEX idx_fe_order_user ON fe_employment_order (user_id, order_status, create_time DESC);
  375. -- 订单用工明细(确认时从草稿明细快照)
  376. CREATE TABLE fe_order_work_item (
  377. id BIGSERIAL PRIMARY KEY,
  378. order_id BIGINT NOT NULL,
  379. draft_item_id BIGINT,
  380. group_no VARCHAR(32) NOT NULL,
  381. sort_order INTEGER NOT NULL DEFAULT 0,
  382. job_type VARCHAR(100),
  383. worker_count INTEGER,
  384. work_days NUMERIC(8,2),
  385. work_location VARCHAR(500),
  386. settlement_cycle VARCHAR(20),
  387. unit_amount NUMERIC(12,2),
  388. total_amount NUMERIC(14,2),
  389. work_content TEXT,
  390. work_start_date TIMESTAMPTZ,
  391. work_end_date TIMESTAMPTZ,
  392. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  393. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  394. del_flag SMALLINT NOT NULL DEFAULT 0
  395. );
  396. CREATE UNIQUE INDEX uk_fe_order_work_item ON fe_order_work_item (order_id, group_no) WHERE del_flag = 0;
  397. CREATE INDEX idx_fe_order_work_item_sort ON fe_order_work_item (order_id, sort_order);
  398. -- 登记批次(含二维码/链接;worker_source=existing 时使用)
  399. CREATE TABLE fe_registration_batch (
  400. id BIGSERIAL PRIMARY KEY,
  401. batch_no VARCHAR(32) NOT NULL, -- BATCH-001
  402. order_id BIGINT NOT NULL, -- 逻辑关联 fe_employment_order.id(无 FK)
  403. enterprise_id BIGINT, -- 逻辑关联 fe_enterprise.id(无 FK);可空,认证后回填
  404. expected_count INTEGER NOT NULL, -- 通常等于订单明细 SUM(worker_count)
  405. registered_count INTEGER NOT NULL DEFAULT 0,
  406. pending_count INTEGER NOT NULL DEFAULT 0,
  407. in_progress_count INTEGER NOT NULL DEFAULT 0,
  408. completed_count INTEGER NOT NULL DEFAULT 0,
  409. abnormal_count INTEGER NOT NULL DEFAULT 0,
  410. registration_url VARCHAR(512),
  411. qr_code_url VARCHAR(512),
  412. qr_token VARCHAR(64), -- 扫码登记 token
  413. valid_from TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  414. valid_until TIMESTAMPTZ NOT NULL,
  415. status VARCHAR(20) NOT NULL DEFAULT 'active', -- active / expired / closed
  416. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  417. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  418. del_flag SMALLINT NOT NULL DEFAULT 0
  419. );
  420. CREATE UNIQUE INDEX uk_fe_batch_no ON fe_registration_batch (batch_no);
  421. CREATE UNIQUE INDEX uk_fe_batch_token ON fe_registration_batch (qr_token) WHERE qr_token IS NOT NULL;
  422. CREATE INDEX idx_fe_batch_order ON fe_registration_batch (order_id);
  423. CREATE INDEX idx_fe_batch_enterprise ON fe_registration_batch (enterprise_id);
  424. -- 订单流程状态变更日志(合规状态机留痕)
  425. CREATE TABLE fe_order_workflow_log (
  426. id BIGSERIAL PRIMARY KEY,
  427. order_id BIGINT NOT NULL,
  428. from_step VARCHAR(50),
  429. to_step VARCHAR(50) NOT NULL,
  430. from_status VARCHAR(30),
  431. to_status VARCHAR(30) NOT NULL,
  432. operator_id BIGINT,
  433. operator_type VARCHAR(20) NOT NULL DEFAULT 'system', -- system / enterprise / worker / provider
  434. remark TEXT,
  435. extra_json JSONB,
  436. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
  437. );
  438. CREATE INDEX idx_fe_order_wf_log ON fe_order_workflow_log (order_id, create_time);
  439. -- -----------------------------------------------------------------------------
  440. -- 六、人员管理(临时工)
  441. -- 职责:临时工档案、批次登记、协议授权;支撑扫码登记页与进度页人员列表。
  442. -- 关联 API:POST /worker-registration/{batch_id}/submit
  443. -- 安全:身份证、银行卡、手机号必须加密(*_enc),前端禁止缓存明文。
  444. -- -----------------------------------------------------------------------------
  445. CREATE TABLE fe_worker (
  446. id BIGSERIAL PRIMARY KEY,
  447. user_id BIGINT,
  448. worker_no VARCHAR(32),
  449. real_name VARCHAR(64) NOT NULL,
  450. id_card_no_enc TEXT NOT NULL, -- 身份证号密文
  451. id_card_no_mask VARCHAR(32), -- 310***********1234
  452. mobile_enc TEXT NOT NULL,
  453. mobile_mask VARCHAR(20),
  454. bank_account_enc TEXT,
  455. bank_account_mask VARCHAR(32),
  456. bank_name VARCHAR(100),
  457. bank_branch VARCHAR(200),
  458. verify_status VARCHAR(20) NOT NULL DEFAULT 'pending', -- pending / passed / failed
  459. verify_message TEXT,
  460. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  461. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  462. del_flag SMALLINT NOT NULL DEFAULT 0
  463. );
  464. CREATE UNIQUE INDEX uk_fe_worker_worker_no ON fe_worker (worker_no, del_flag);
  465. CREATE UNIQUE INDEX uk_fe_worker_user_id ON fe_worker (user_id, del_flag);
  466. CREATE INDEX idx_fe_worker_mobile ON fe_worker (mobile_mask);
  467. -- 批次登记记录
  468. CREATE TABLE fe_worker_registration (
  469. id BIGSERIAL PRIMARY KEY,
  470. batch_id BIGINT NOT NULL, -- 逻辑关联 fe_registration_batch.id(无 FK)
  471. order_id BIGINT NOT NULL,
  472. enterprise_id BIGINT NOT NULL,
  473. worker_id BIGINT,
  474. real_name VARCHAR(64) NOT NULL,
  475. mobile_enc TEXT,
  476. mobile_mask VARCHAR(20),
  477. id_card_no_enc TEXT,
  478. bank_account_enc TEXT,
  479. confirmed_work_type VARCHAR(100), -- 工种或任务确认
  480. third_party_source BOOLEAN NOT NULL DEFAULT FALSE, -- 是否第三方人力来源:FALSE=有临时工;TRUE=无临时工从第三方人力平台匹配
  481. reg_status VARCHAR(20) NOT NULL DEFAULT 'pending', -- pending/registering/under_review/contract_signing/completed/verify_failed/rejected
  482. fail_reason TEXT,
  483. submitted_at TIMESTAMPTZ,
  484. reviewed_at TIMESTAMPTZ,
  485. reviewed_by BIGINT,
  486. remind_count INTEGER NOT NULL DEFAULT 0,
  487. last_remind_at TIMESTAMPTZ,
  488. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  489. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  490. del_flag SMALLINT NOT NULL DEFAULT 0
  491. );
  492. CREATE INDEX idx_fe_worker_reg_batch ON fe_worker_registration (batch_id, reg_status);
  493. CREATE INDEX idx_fe_worker_reg_order ON fe_worker_registration (order_id);
  494. -- 协议/授权确认(电子合同、隐私政策等)
  495. CREATE TABLE fe_worker_consent (
  496. id BIGSERIAL PRIMARY KEY,
  497. registration_id BIGINT,
  498. worker_id BIGINT,
  499. consent_type VARCHAR(50) NOT NULL, -- labor_contract / privacy_policy / authorization
  500. consent_version VARCHAR(20),
  501. consent_title VARCHAR(200),
  502. agreed BOOLEAN NOT NULL DEFAULT FALSE,
  503. agreed_at TIMESTAMPTZ,
  504. client_ip VARCHAR(64),
  505. user_agent VARCHAR(500),
  506. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
  507. );
  508. CREATE INDEX idx_fe_worker_consent ON fe_worker_consent (registration_id);
  509. -- -----------------------------------------------------------------------------
  510. -- 七、合同管理(MVP 可 Mock,流程节点需预留)
  511. -- 职责:电子劳动合同签署,合规流程「合同签署」节点;对接电子签平台前可用 mock provider。
  512. -- -----------------------------------------------------------------------------
  513. CREATE TABLE fe_contract (
  514. id BIGSERIAL PRIMARY KEY,
  515. contract_no VARCHAR(32) NOT NULL,
  516. order_id BIGINT NOT NULL,
  517. registration_id BIGINT,
  518. worker_id BIGINT,
  519. enterprise_id BIGINT NOT NULL,
  520. contract_type VARCHAR(50) NOT NULL DEFAULT 'labor',
  521. contract_title VARCHAR(200),
  522. sign_status VARCHAR(20) NOT NULL DEFAULT 'pending', -- pending / signing / signed / rejected / expired
  523. sign_provider VARCHAR(50), -- mock / esign_partner
  524. external_contract_id VARCHAR(100),
  525. sign_url VARCHAR(512),
  526. signed_at TIMESTAMPTZ,
  527. file_url VARCHAR(512),
  528. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  529. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  530. del_flag SMALLINT NOT NULL DEFAULT 0
  531. );
  532. CREATE UNIQUE INDEX uk_fe_contract_no ON fe_contract (contract_no);
  533. CREATE UNIQUE INDEX uk_fe_contract_registration ON fe_contract (registration_id);
  534. CREATE INDEX idx_fe_contract_order ON fe_contract (order_id, sign_status);
  535. -- -----------------------------------------------------------------------------
  536. -- 八、结算中心
  537. -- 职责:结算确认单、按人明细、费用汇总、支付打款;对应小程序「历史订单/结算确认单」弹窗。
  538. -- 说明:小程序仅展示渠道类型(微信/支付宝),不展示对公账户等敏感金融信息。
  539. -- -----------------------------------------------------------------------------
  540. CREATE TABLE fe_settlement_order (
  541. id BIGSERIAL PRIMARY KEY,
  542. settlement_no VARCHAR(32) NOT NULL,
  543. order_id BIGINT NOT NULL,
  544. batch_id BIGINT, -- 逻辑关联 fe_registration_batch.id(无 FK)
  545. enterprise_id BIGINT NOT NULL,
  546. worker_count INTEGER NOT NULL,
  547. gross_amount NUMERIC(14,2) NOT NULL DEFAULT 0, -- 应发总额
  548. deduction_amount NUMERIC(14,2) NOT NULL DEFAULT 0, -- 扣款/个税
  549. net_amount NUMERIC(14,2) NOT NULL DEFAULT 0, -- 实发总额
  550. service_fee_amount NUMERIC(14,2) NOT NULL DEFAULT 0, -- 平台服务费
  551. invoice_amount NUMERIC(14,2) NOT NULL DEFAULT 0, -- 预计开票额
  552. total_outflow NUMERIC(14,2) NOT NULL DEFAULT 0, -- 企业总支出
  553. settlement_status VARCHAR(20) NOT NULL DEFAULT 'pending', -- pending / confirmed / paying / paid / cancelled
  554. compliance_tags JSONB DEFAULT '[]',
  555. compliance_remark TEXT,
  556. confirmed_at TIMESTAMPTZ,
  557. confirmed_by BIGINT,
  558. paid_at TIMESTAMPTZ,
  559. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  560. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  561. del_flag SMALLINT NOT NULL DEFAULT 0
  562. );
  563. CREATE UNIQUE INDEX uk_fe_settlement_no ON fe_settlement_order (settlement_no);
  564. CREATE INDEX idx_fe_settlement_ent ON fe_settlement_order (enterprise_id, settlement_status);
  565. -- 按人结算明细
  566. CREATE TABLE fe_settlement_item (
  567. id BIGSERIAL PRIMARY KEY,
  568. settlement_id BIGINT NOT NULL,
  569. registration_id BIGINT,
  570. worker_id BIGINT,
  571. worker_name_mask VARCHAR(64),
  572. work_days NUMERIC(8,2),
  573. work_hours NUMERIC(8,2),
  574. piece_count NUMERIC(12,2),
  575. gross_amount NUMERIC(12,2) NOT NULL DEFAULT 0,
  576. tax_amount NUMERIC(12,2) NOT NULL DEFAULT 0,
  577. other_deduction NUMERIC(12,2) NOT NULL DEFAULT 0,
  578. net_amount NUMERIC(12,2) NOT NULL DEFAULT 0,
  579. item_status VARCHAR(20) NOT NULL DEFAULT 'pending',
  580. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  581. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
  582. );
  583. CREATE INDEX idx_fe_settlement_item ON fe_settlement_item (settlement_id);
  584. -- 结算费用汇总项
  585. CREATE TABLE fe_settlement_fee (
  586. id BIGSERIAL PRIMARY KEY,
  587. settlement_id BIGINT NOT NULL,
  588. fee_code VARCHAR(50) NOT NULL,
  589. fee_name VARCHAR(100) NOT NULL,
  590. amount NUMERIC(14,2) NOT NULL,
  591. rate NUMERIC(8,4),
  592. sort_order INTEGER NOT NULL DEFAULT 0
  593. );
  594. CREATE INDEX idx_fe_settlement_fee ON fe_settlement_fee (settlement_id);
  595. -- 支付记录
  596. CREATE TABLE fe_payment_record (
  597. id BIGSERIAL PRIMARY KEY,
  598. payment_no VARCHAR(32) NOT NULL,
  599. settlement_id BIGINT NOT NULL,
  600. enterprise_id BIGINT NOT NULL,
  601. payment_channel VARCHAR(50) NOT NULL, -- wechat / alipay / bank
  602. payment_amount NUMERIC(14,2) NOT NULL,
  603. payment_status VARCHAR(20) NOT NULL DEFAULT 'pending', -- pending / success / failed / refunded
  604. external_trade_no VARCHAR(100),
  605. payer_user_id BIGINT,
  606. paid_at TIMESTAMPTZ,
  607. receipt_url VARCHAR(512),
  608. fail_reason TEXT,
  609. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  610. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
  611. );
  612. CREATE UNIQUE INDEX uk_fe_payment_no ON fe_payment_record (payment_no);
  613. CREATE INDEX idx_fe_payment_settlement ON fe_payment_record (settlement_id);
  614. -- 订单开票归档信息(一单一条)
  615. CREATE TABLE fe_order_invoice (
  616. id BIGSERIAL PRIMARY KEY,
  617. order_id BIGINT NOT NULL,
  618. settlement_id BIGINT,
  619. enterprise_id BIGINT,
  620. invoice_type VARCHAR(50) NOT NULL DEFAULT 'vat_special',
  621. tax_rate NUMERIC(8,4) NOT NULL DEFAULT 0.0600,
  622. billable_amount NUMERIC(14,2) NOT NULL DEFAULT 0,
  623. invoiced_amount NUMERIC(14,2) NOT NULL DEFAULT 0,
  624. pending_amount NUMERIC(14,2) NOT NULL DEFAULT 0,
  625. invoice_amount NUMERIC(14,2) NOT NULL DEFAULT 0,
  626. tax_amount NUMERIC(14,2) NOT NULL DEFAULT 0,
  627. total_with_tax NUMERIC(14,2) NOT NULL DEFAULT 0,
  628. company_name VARCHAR(200),
  629. credit_code VARCHAR(32),
  630. bank_account_info VARCHAR(300),
  631. invoice_no VARCHAR(64),
  632. tax_voucher_no VARCHAR(64),
  633. invoice_file_url VARCHAR(512),
  634. tax_file_url VARCHAR(512),
  635. compliance_file_url VARCHAR(512),
  636. invoice_status VARCHAR(20) NOT NULL DEFAULT 'draft',
  637. remark VARCHAR(500),
  638. archived_at TIMESTAMPTZ,
  639. archived_by BIGINT,
  640. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  641. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  642. del_flag SMALLINT NOT NULL DEFAULT 0
  643. );
  644. CREATE UNIQUE INDEX uk_fe_order_invoice_order ON fe_order_invoice (order_id) WHERE del_flag = 0;
  645. CREATE INDEX idx_fe_order_invoice_settlement ON fe_order_invoice (settlement_id);
  646. CREATE INDEX idx_fe_order_invoice_ent ON fe_order_invoice (enterprise_id);
  647. COMMENT ON TABLE fe_order_invoice IS '订单开票归档信息:开票金额、税额、抬头与凭证链接;一单一条。';
  648. COMMENT ON COLUMN fe_order_invoice.id IS '表主键,自增。开票归档落库时生成。非空。';
  649. COMMENT ON COLUMN fe_order_invoice.order_id IS '用工订单 fe_employment_order.id。一单一条有效记录。非空。';
  650. COMMENT ON COLUMN fe_order_invoice.settlement_id IS '关联结算单 fe_settlement_order.id。归档时从有效结算单写入。可空。';
  651. COMMENT ON COLUMN fe_order_invoice.enterprise_id IS '所属企业 fe_enterprise.id。可空。';
  652. COMMENT ON COLUMN fe_order_invoice.invoice_type IS '发票类型:vat_special=增值税专用发票;vat_normal=增值税普通发票。默认 vat_special。';
  653. COMMENT ON COLUMN fe_order_invoice.tax_rate IS '税率。示例:0.0600 表示 6%。默认 0.0600。';
  654. COMMENT ON COLUMN fe_order_invoice.billable_amount IS '可开票金额(元)。通常取自结算单预计开票额。';
  655. COMMENT ON COLUMN fe_order_invoice.invoiced_amount IS '已开票金额(元)。归档办结后一般为本次开票金额。';
  656. COMMENT ON COLUMN fe_order_invoice.pending_amount IS '待开票金额(元)= 可开票 − 已开票。';
  657. COMMENT ON COLUMN fe_order_invoice.invoice_amount IS '本次开票金额不含税(元)。';
  658. COMMENT ON COLUMN fe_order_invoice.tax_amount IS '税额(元)。默认 开票金额 × 税率。';
  659. COMMENT ON COLUMN fe_order_invoice.total_with_tax IS '价税合计(元)= 开票金额 + 税额。';
  660. COMMENT ON COLUMN fe_order_invoice.company_name IS '开票抬头-企业名称。';
  661. COMMENT ON COLUMN fe_order_invoice.credit_code IS '开票抬头-统一社会信用代码/纳税人识别号。';
  662. COMMENT ON COLUMN fe_order_invoice.bank_account_info IS '开户银行及账号(展示用)。';
  663. COMMENT ON COLUMN fe_order_invoice.invoice_no IS '发票号码,可选留痕。';
  664. COMMENT ON COLUMN fe_order_invoice.tax_voucher_no IS '完税凭证号,可选留痕。';
  665. COMMENT ON COLUMN fe_order_invoice.invoice_file_url IS '增值税发票下载 URL。MVP 可为 Mock 路径。';
  666. COMMENT ON COLUMN fe_order_invoice.tax_file_url IS '完税证明下载 URL。MVP 可为 Mock 路径。';
  667. COMMENT ON COLUMN fe_order_invoice.compliance_file_url IS '合规证据链下载 URL。MVP 可为 Mock 路径。';
  668. COMMENT ON COLUMN fe_order_invoice.invoice_status IS '开票状态:draft=草稿/预填;issued=已开具;archived=已归档办结。';
  669. COMMENT ON COLUMN fe_order_invoice.remark IS '备注。';
  670. COMMENT ON COLUMN fe_order_invoice.archived_at IS '开票归档办结时间。';
  671. COMMENT ON COLUMN fe_order_invoice.archived_by IS '办结人用户 ID(fe_user.id)。';
  672. COMMENT ON COLUMN fe_order_invoice.create_time IS '记录创建时间。';
  673. COMMENT ON COLUMN fe_order_invoice.update_time IS '记录更新时间。';
  674. COMMENT ON COLUMN fe_order_invoice.del_flag IS '逻辑删除。0=正常;1=已删除。';
  675. -- -----------------------------------------------------------------------------
  676. -- 九、考勤管理(二期功能,表结构先行预留)
  677. -- 职责:按日考勤核对、语音录入考勤;会议明确一期 MVP 暂不开发,表结构供后续扩展。
  678. -- -----------------------------------------------------------------------------
  679. CREATE TABLE fe_attendance_batch (
  680. id BIGSERIAL PRIMARY KEY,
  681. batch_id BIGINT NOT NULL, -- 逻辑关联 fe_registration_batch.id(无 FK)
  682. order_id BIGINT NOT NULL,
  683. attendance_date DATE NOT NULL,
  684. total_workers INTEGER NOT NULL DEFAULT 0,
  685. normal_count INTEGER NOT NULL DEFAULT 0,
  686. overtime_count INTEGER NOT NULL DEFAULT 0,
  687. leave_count INTEGER NOT NULL DEFAULT 0,
  688. total_hours NUMERIC(10,2) DEFAULT 0,
  689. total_pieces NUMERIC(12,2) DEFAULT 0,
  690. estimated_cost NUMERIC(14,2) DEFAULT 0,
  691. status VARCHAR(20) NOT NULL DEFAULT 'draft', -- draft / confirmed / archived
  692. confirmed_by BIGINT,
  693. confirmed_at TIMESTAMPTZ,
  694. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  695. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
  696. );
  697. CREATE UNIQUE INDEX uk_fe_attendance_batch ON fe_attendance_batch (batch_id, attendance_date);
  698. CREATE TABLE fe_attendance_record (
  699. id BIGSERIAL PRIMARY KEY,
  700. attendance_batch_id BIGINT NOT NULL,
  701. registration_id BIGINT NOT NULL,
  702. worker_id BIGINT,
  703. attendance_type VARCHAR(20) NOT NULL DEFAULT 'normal', -- normal / overtime / leave / piece
  704. work_hours NUMERIC(8,2),
  705. overtime_hours NUMERIC(8,2),
  706. piece_count NUMERIC(12,2),
  707. remark TEXT,
  708. source VARCHAR(30) DEFAULT 'manual', -- manual / voice / import
  709. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  710. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
  711. );
  712. CREATE INDEX idx_fe_attendance_rec ON fe_attendance_record (attendance_batch_id);
  713. -- -----------------------------------------------------------------------------
  714. -- 十、审计与确认
  715. -- 职责:用户确认留痕、关键字段变更记录;草稿确认、方案选择、结算支付、外部提交必写。
  716. -- 说明:会议一期可裁剪完整审计日志模块,但 fe_user_confirmation 建议 MVP 即实现。
  717. -- -----------------------------------------------------------------------------
  718. CREATE TABLE fe_user_confirmation (
  719. id BIGSERIAL PRIMARY KEY,
  720. enterprise_id BIGINT NOT NULL,
  721. user_id BIGINT NOT NULL,
  722. biz_type VARCHAR(50) NOT NULL, -- draft_confirm / plan_select / settlement_pay / external_submit
  723. biz_id BIGINT NOT NULL,
  724. biz_no VARCHAR(32),
  725. action VARCHAR(50) NOT NULL, -- confirm / modify / authorize
  726. confirmed_fields JSONB DEFAULT '{}',
  727. selected_plan_id BIGINT,
  728. client_ip VARCHAR(64),
  729. user_agent VARCHAR(500),
  730. remark TEXT,
  731. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
  732. );
  733. CREATE INDEX idx_fe_user_confirm ON fe_user_confirmation (enterprise_id, biz_type, create_time DESC);
  734. CREATE TABLE fe_field_change_log (
  735. id BIGSERIAL PRIMARY KEY,
  736. biz_type VARCHAR(50) NOT NULL, -- draft / order / registration
  737. biz_id BIGINT NOT NULL,
  738. field_key VARCHAR(100) NOT NULL,
  739. old_value TEXT,
  740. new_value TEXT,
  741. change_source VARCHAR(30) NOT NULL, -- user_edit / nl_edit / ai_regenerate / system
  742. operator_id BIGINT,
  743. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
  744. );
  745. CREATE INDEX idx_fe_field_change ON fe_field_change_log (biz_type, biz_id, create_time);
  746. -- -----------------------------------------------------------------------------
  747. -- 十一、第三方连接器
  748. -- 职责:对接合作灵活用工/税筹平台;保存原始请求响应,技术细节不对用户暴露。
  749. -- 说明:一期采用 Mock 打桩,fe_provider_api_log 可先写本地模拟数据。
  750. -- -----------------------------------------------------------------------------
  751. CREATE TABLE fe_provider (
  752. id BIGSERIAL PRIMARY KEY,
  753. provider_code VARCHAR(50) NOT NULL, -- partner_platform
  754. provider_name VARCHAR(100) NOT NULL,
  755. api_base_url VARCHAR(512),
  756. auth_config_enc TEXT, -- 鉴权配置密文
  757. status VARCHAR(20) NOT NULL DEFAULT 'active',
  758. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  759. update_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
  760. );
  761. CREATE UNIQUE INDEX uk_fe_provider_code ON fe_provider (provider_code);
  762. CREATE TABLE fe_provider_api_log (
  763. id BIGSERIAL PRIMARY KEY,
  764. provider_id BIGINT NOT NULL,
  765. enterprise_id BIGINT,
  766. order_id BIGINT,
  767. action VARCHAR(100) NOT NULL, -- create_requirement / query_status / callback
  768. request_payload JSONB,
  769. response_payload JSONB,
  770. http_status INTEGER,
  771. biz_status VARCHAR(50), -- 转换后的业务状态
  772. audit_required BOOLEAN NOT NULL DEFAULT FALSE,
  773. error_message TEXT,
  774. duration_ms INTEGER,
  775. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
  776. );
  777. CREATE INDEX idx_fe_provider_log ON fe_provider_api_log (provider_id, create_time DESC);
  778. CREATE INDEX idx_fe_provider_log_order ON fe_provider_api_log (order_id);
  779. -- -----------------------------------------------------------------------------
  780. -- 十二、消息与待办
  781. -- 职责:待确认结算、实名失败、登记进度等通知;支撑侧边栏「消息与待办中心」与一键催办。
  782. -- -----------------------------------------------------------------------------
  783. CREATE TABLE fe_notification (
  784. id BIGSERIAL PRIMARY KEY,
  785. enterprise_id BIGINT,
  786. user_id BIGINT,
  787. notify_type VARCHAR(30) NOT NULL, -- pending / error / info / success
  788. category VARCHAR(50) NOT NULL, -- settlement / registration / verify / workflow
  789. title VARCHAR(200) NOT NULL,
  790. content TEXT,
  791. biz_type VARCHAR(50),
  792. biz_id BIGINT,
  793. biz_no VARCHAR(32),
  794. action_url VARCHAR(512), -- 小程序跳转路径
  795. read_flag BOOLEAN NOT NULL DEFAULT FALSE,
  796. handled_flag BOOLEAN NOT NULL DEFAULT FALSE,
  797. create_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  798. read_time TIMESTAMPTZ,
  799. handled_time TIMESTAMPTZ
  800. );
  801. CREATE INDEX idx_fe_notification_user ON fe_notification (user_id, read_flag, create_time DESC);
  802. CREATE INDEX idx_fe_notification_ent ON fe_notification (enterprise_id, handled_flag, create_time DESC);
  803. -- =============================================================================
  804. -- 表与字段注释(COMMENT ON)
  805. -- 说明:每张表含表级注释;每个字段含业务含义、写入时机、枚举、示例、外键与敏感/可空说明
  806. -- =============================================================================
  807. COMMENT ON TABLE fe_user IS '小程序用户主表,企业主与临时工共用账号体系,通过 user_type 区分身份。一期支持短信验证码、微信 code2session、可选账密登录;是 fe_enterprise_user、fe_conversation、fe_worker 等表的用户外键来源。敏感手机号仅存密文与脱敏值,密码仅存 BCrypt 哈希,禁止明文入库。';
  808. COMMENT ON COLUMN fe_user.id IS '表主键,BIGSERIAL 自增。首次登录时由数据库自动生成,后续所有关联表通过本字段引用用户。示例:10001。非空,非敏感,只读展示。';
  809. COMMENT ON COLUMN fe_user.openid IS '微信小程序用户唯一标识,微信 code2session 登录时写入。纯短信登录可为空。示例:oX9k2_abc123def456。建立部分唯一索引 uk_fe_user_openid(del_flag=0 且 openid 非空);不可对外暴露。';
  810. COMMENT ON COLUMN fe_user.unionid IS '微信开放平台 unionid,用于同一主体下多应用用户关联。用户绑定开放平台账号且小程序已接入时写入,否则保持为空。示例:oUZ6w_union789。可空;跨应用场景使用。';
  811. COMMENT ON COLUMN fe_user.user_type IS '用户身份类型,区分企业主与临时工两类业务角色。注册或首次登录时根据入口(企业端/临时工端)由应用层写入。枚举:enterprise=企业主(发单、确认方案、结算);worker=临时工(扫码登记、签署协议)。非空,默认 enterprise;影响菜单权限与 API 鉴权。';
  812. COMMENT ON COLUMN fe_user.nickname IS '用户在微信侧展示的昵称。登录成功后从微信用户信息接口同步,用户可在小程序内修改后更新。示例:张经理、小李。可空;用于消息列表与操作日志展示。';
  813. COMMENT ON COLUMN fe_user.avatar_url IS '用户头像图片 URL。登录时从微信同步或用户上传后由应用层更新。示例:https://thirdwx.qlogo.cn/mmopen/...。可空;CDN 地址,需校验域名白名单。';
  814. COMMENT ON COLUMN fe_user.mobile_enc IS '手机号 AES 等算法加密后的密文,用于实名核验与联系。用户授权获取手机号或企业主填写时,由应用层加密后写入。高度敏感;数据库禁止存明文;解密仅限后端授权接口。可空。';
  815. COMMENT ON COLUMN fe_user.mobile_mask IS '手机号脱敏展示值,供列表、通知、日志使用。与 mobile_enc 同时写入,由应用层按规则生成。示例:138****1234。可空;禁止从脱敏值反推明文。';
  816. COMMENT ON COLUMN fe_user.username IS '登录用户名,用户短信/微信登录后可选择设置。6-20 位字母数字下划线,字母开头,全局唯一。可空;建立部分唯一索引 uk_fe_user_username(del_flag=0 且 username 非空)。';
  817. COMMENT ON COLUMN fe_user.password_hash IS 'BCrypt 密码哈希。前端 RSA 加密传输,服务端解密后 BCrypt 入库。NULL 表示未设置账密登录;禁止存明文密码。';
  818. COMMENT ON COLUMN fe_user.pwd_failed_count IS '账密登录连续失败次数。成功登录或重置/修改密码后清零。非空,默认 0。';
  819. COMMENT ON COLUMN fe_user.pwd_locked_until IS '账密登录锁定截止时间。连续失败达到阈值后写入,超过该时间后允许重试。可空。';
  820. COMMENT ON COLUMN fe_user.password_set_at IS '最近一次成功设置或修改登录密码的时间戳。可空。';
  821. COMMENT ON COLUMN fe_user.session_key IS '微信会话密钥,用于解密用户敏感数据及维持登录态。每次 code2session 成功后由认证服务覆盖写入,需定期刷新。高度敏感;仅后端持有,禁止返回前端或写入日志。可空。';
  822. COMMENT ON COLUMN fe_user.status IS '账号启用状态,控制是否允许登录与业务操作。管理员禁用违规账号时写入 disabled,解禁时改回 active。枚举:active=正常可用;disabled=禁用(拒绝登录)。非空,默认 active。';
  823. COMMENT ON COLUMN fe_user.last_login_at IS '用户最近一次成功登录的时间戳(含时区)。每次登录鉴权通过时由认证中间件更新。示例:2026-07-07T09:30:00+08:00。可空;用于活跃度统计与异常登录检测。';
  824. COMMENT ON COLUMN fe_user.create_time IS '记录创建时间,用户首次入库时刻。INSERT 时由数据库 DEFAULT NOW() 或应用层写入。非空;审计字段,一般不修改。';
  825. COMMENT ON COLUMN fe_user.update_time IS '记录最后更新时间。任意字段变更时由应用层维护刷新。非空;与 create_time 配合追踪变更。';
  826. COMMENT ON COLUMN fe_user.del_flag IS '逻辑删除标记,软删后释放 openid 唯一索引占用。用户注销或管理员删除时置 1,恢复时置 0。枚举:0=正常;1=已逻辑删除。非空,默认 0;查询默认过滤 del_flag=0。';
  827. COMMENT ON TABLE fe_enterprise IS '企业主体表,灵活用工业务归属主体,承载企业认证信息与扩展画像。与 fe_enterprise_user(多管理员)、fe_employment_draft、fe_employment_order 等为一对多关系。注册地址 registered_address 供 AI 草稿默认推断工作地点。';
  828. COMMENT ON COLUMN fe_enterprise.id IS '表主键,BIGSERIAL 自增。企业入驻或管理员创建企业时生成。示例:2001。非空;被草稿、订单、会话等多表外键引用。';
  829. COMMENT ON COLUMN fe_enterprise.enterprise_code IS '企业业务编码,系统内唯一标识,便于对外 API 与日志引用。企业创建时由编号生成器写入。示例:ent_001。非空;唯一索引 uk_fe_enterprise_code(del_flag=0)。';
  830. COMMENT ON COLUMN fe_enterprise.name IS '企业全称,工商注册名称。企业入驻表单或 OCR 识别营业执照时写入。示例:上海某某物流有限公司。非空;用于合同抬头与结算展示。';
  831. COMMENT ON COLUMN fe_enterprise.credit_code IS '统一社会信用代码,企业实名认证核心字段。企业提交认证材料时写入,审核通过后不变更。示例:91310000MA1K3XXXXX。可空;认证前可为空;非敏感但需校验格式。';
  832. COMMENT ON COLUMN fe_enterprise.legal_person IS '法定代表人姓名。认证材料解析或人工填写时写入。示例:王某某。可空;用于合同与开票信息核对。';
  833. COMMENT ON COLUMN fe_enterprise.legal_person_id_card_enc IS '法人身份证号加密密文。企业认证时由应用层加密写入。高度敏感;禁止明文入库。可空。';
  834. COMMENT ON COLUMN fe_enterprise.legal_person_id_card_mask IS '法人身份证号脱敏值。与 legal_person_id_card_enc 同步生成。示例:110***********1234。可空。';
  835. COMMENT ON COLUMN fe_enterprise.registered_address IS '企业注册地址。认证或企业资料维护时写入;AI 生成草稿时优先作为 work_location 默认值来源。示例:上海市浦东新区张江路 88 号。可空;影响草稿地点推断。';
  836. COMMENT ON COLUMN fe_enterprise.contact_name IS '企业日常联系人姓名。企业主维护企业资料时写入。示例:李主管。可空;用于平台客服联系。';
  837. COMMENT ON COLUMN fe_enterprise.contact_mobile_enc IS '联系人/法人手机号加密密文。企业登记时由应用层加密写入。高度敏感;禁止明文入库。可空。';
  838. COMMENT ON COLUMN fe_enterprise.contact_mobile_mask IS '联系人手机号脱敏值。与 contact_mobile_enc 同步生成,供列表展示。示例:139****5678。可空;非敏感。';
  839. COMMENT ON COLUMN fe_enterprise.industry IS '所属行业分类。企业资料维护或 AI 画像推断时写入。示例:仓储物流、制造业。可空;用于方案推荐与风险诊断。';
  840. COMMENT ON COLUMN fe_enterprise.scale IS '企业规模描述。企业资料维护时写入。示例:50-200人、小微企业。可空;辅助成本测算与合规判断。';
  841. COMMENT ON COLUMN fe_enterprise.auth_status IS '企业实名认证状态。提交认证置 pending,审核通过置 verified,驳回置 rejected。枚举:pending=待审核;verified=已认证;rejected=已驳回。非空,默认 pending;未认证企业功能受限。';
  842. COMMENT ON COLUMN fe_enterprise.auth_time IS '认证审核通过时间戳。运营或系统自动审核通过时写入。可空;仅 auth_status=verified 时有值。';
  843. COMMENT ON COLUMN fe_enterprise.profile_json IS '企业扩展画像 JSON,承载行业标签、历史偏好摘要、风险标签等。AI 画像服务或运营标注时增量更新。示例:{"tags":["仓储","旺季用工"]}。可空,默认 {};非敏感;结构由应用层约定。';
  844. COMMENT ON COLUMN fe_enterprise.create_time IS '企业记录创建时间。INSERT 时默认 NOW()。非空;审计字段。';
  845. COMMENT ON COLUMN fe_enterprise.update_time IS '企业资料最后更新时间。任意字段变更时由应用层刷新。非空。';
  846. COMMENT ON COLUMN fe_enterprise.del_flag IS '逻辑删除标记。企业注销或管理员删除时置 1。枚举:0=正常;1=已删除。非空,默认 0;软删后释放 enterprise_code 唯一索引。';
  847. COMMENT ON TABLE fe_enterprise_user IS '企业与用户多对多绑定:一账号可认证多家企业、一企业可多管理员。is_default 为默认企业上下文;不在 fe_user 上冗余存默认企业 ID。';
  848. COMMENT ON COLUMN fe_enterprise_user.id IS '表主键,自增。绑定关系创建时生成。非空。';
  849. COMMENT ON COLUMN fe_enterprise_user.enterprise_id IS '关联企业主键。管理员邀请绑定或企业创建时写入。非空。';
  850. COMMENT ON COLUMN fe_enterprise_user.user_id IS '关联用户主键。非空;索引 idx_fe_enterprise_user_uid。';
  851. COMMENT ON COLUMN fe_enterprise_user.role IS '用户在该企业下的角色。枚举:owner/admin/viewer。非空,默认 owner。';
  852. COMMENT ON COLUMN fe_enterprise_user.is_default IS '是否默认企业。同一 user_id 且 del_flag=0 仅一条为 true;企业认证通过时将该企业置 true 并清除同用户其它默认(最近认证为默认)。';
  853. COMMENT ON COLUMN fe_enterprise_user.bind_time IS '绑定关系建立时间。非空。';
  854. COMMENT ON COLUMN fe_enterprise_user.create_time IS '记录创建时间。非空。';
  855. COMMENT ON COLUMN fe_enterprise_user.update_time IS '角色或默认企业变更时刷新。非空。';
  856. COMMENT ON COLUMN fe_enterprise_user.del_flag IS '逻辑删除标记。0=正常;1=已解除。非空,默认 0。';
  857. COMMENT ON TABLE fe_enterprise_finance IS '企业财务与开票信息表,与企业主体一对一(enterprise_id 唯一)。存储对公账户密文、开票抬头、打款渠道等;小程序端仅展示渠道类型,不展示账户明细等敏感金融信息。';
  858. COMMENT ON COLUMN fe_enterprise_finance.id IS '表主键,自增。企业首次维护财务信息时生成。非空。';
  859. COMMENT ON COLUMN fe_enterprise_finance.enterprise_id IS '关联企业主键,外键。财务信息首次录入时写入。非空;一对一,唯一索引 uk_fe_enterprise_finance。';
  860. COMMENT ON COLUMN fe_enterprise_finance.bank_name IS '对公账户开户银行名称。企业主在财务设置页填写时写入。示例:中国工商银行上海张江支行。可空。';
  861. COMMENT ON COLUMN fe_enterprise_finance.bank_account_enc IS '对公银行账号加密密文。企业提交账户信息时由应用层加密写入。高度敏感;禁止明文入库与前端回显;可空。';
  862. COMMENT ON COLUMN fe_enterprise_finance.bank_account_mask IS '对公账号脱敏展示值。与 bank_account_enc 同时生成。示例:6222****1234。可空;供运营后台列表展示。';
  863. COMMENT ON COLUMN fe_enterprise_finance.invoice_title IS '增值税发票开票抬头,通常与企业全称一致。财务设置时写入。示例:上海某某物流有限公司。可空;结算开票使用。';
  864. COMMENT ON COLUMN fe_enterprise_finance.tax_no IS '纳税人识别号,用于开票与税务合规。财务设置或认证同步时写入。示例:91310000MA1K3XXXXX。可空;需与统一社会信用代码核对。';
  865. COMMENT ON COLUMN fe_enterprise_finance.payment_channel IS '企业偏好打款渠道类型,小程序仅展示此枚举不展示账户号。财务设置时写入。枚举:wechat=微信支付;alipay=支付宝;bank=银行转账。可空。';
  866. COMMENT ON COLUMN fe_enterprise_finance.balance_amount IS '企业在平台虚拟账户余额(元),NUMERIC(14,2)。充值、结算扣款时由账务服务更新。示例:50000.00。可空,默认 0;非敏感。';
  867. COMMENT ON COLUMN fe_enterprise_finance.create_time IS '记录创建时间。非空。';
  868. COMMENT ON COLUMN fe_enterprise_finance.update_time IS '财务信息变更时更新。非空。';
  869. COMMENT ON COLUMN fe_enterprise_finance.del_flag IS '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。';
  870. COMMENT ON TABLE fe_enterprise_preference IS '企业智能偏好配置表,存储工种薪资基准、默认保险档次、发薪结算周期等结构化偏好。支持用户自然语言配置后由 AI 解析入库,供草稿生成引擎复用,关联 fe_enterprise。';
  871. COMMENT ON COLUMN fe_enterprise_preference.id IS '表主键,自增。偏好项创建时生成。非空。';
  872. COMMENT ON COLUMN fe_enterprise_preference.enterprise_id IS '关联企业主键,外键。偏好配置时写入。非空;索引 idx_fe_enterprise_pref(enterprise_id,pref_type)。';
  873. COMMENT ON COLUMN fe_enterprise_preference.pref_type IS '偏好大类。用户或 AI 配置时写入。枚举:work_type=工种薪资基准;insurance=默认保险配置;payment_cycle=发薪/结算周期偏好。非空。';
  874. COMMENT ON COLUMN fe_enterprise_preference.pref_key IS '偏好子键,细分到具体工种或场景。示例:搬运工、仓库分拣。可空;同一 pref_type 下可有多条记录。';
  875. COMMENT ON COLUMN fe_enterprise_preference.pref_value IS '结构化偏好值 JSON,承载薪资区间、保险方案参数等。AI 解析或用户表单提交时写入。示例:{"daily_wage":280,"currency":"CNY"}。非空,默认 {}。';
  876. COMMENT ON COLUMN fe_enterprise_preference.source IS '偏好数据来源,用于前端展示可信度标签。写入时由应用层标记。枚举:user_config=用户主动配置;ai_inferred=AI 从历史订单推断;default=系统默认。可空,默认 user_config。';
  877. COMMENT ON COLUMN fe_enterprise_preference.raw_text IS '用户自然语言配置原文,便于审计与重新解析。用户在对话或设置页输入时保存。示例:「搬运工日薪 280,要标准意外险」。可空。';
  878. COMMENT ON COLUMN fe_enterprise_preference.confirmed IS '用户是否已明确确认该偏好项。用户点击确认后置 TRUE,未确认前草稿生成可提示复核。非空,默认 FALSE。';
  879. COMMENT ON COLUMN fe_enterprise_preference.create_time IS '记录创建时间。非空。';
  880. COMMENT ON COLUMN fe_enterprise_preference.update_time IS '偏好值变更时更新。非空。';
  881. COMMENT ON COLUMN fe_enterprise_preference.del_flag IS '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。';
  882. COMMENT ON TABLE fe_conversation IS 'AI 对话会话主表。会话仅归属用户(user_id),与企业无绑定;企业在草稿/订单企业认证节点绑定。一对多关联 fe_conversation_message。';
  883. COMMENT ON COLUMN fe_conversation.id IS '表主键,自增。用户发起新对话时生成。非空;被消息表、草稿表外键引用。';
  884. COMMENT ON COLUMN fe_conversation.conversation_no IS '会话对外业务编号,API 路径与日志中使用。创建会话时由编号生成器写入。示例:conv_001。非空;唯一索引 uk_fe_conversation_no。';
  885. COMMENT ON COLUMN fe_conversation.user_id IS '发起对话的企业主用户。创建会话时写入。非空;会话仅归属用户。';
  886. COMMENT ON COLUMN fe_conversation.title IS '会话标题,侧边栏展示用。可由首条用户消息摘要或 AI 自动生成,用户可重命名。示例:浦东仓库暑期用工。可空。';
  887. COMMENT ON COLUMN fe_conversation.chat_type IS '对话专题类型,决定加载的子智能体与卡片模板。创建时根据入口或首条意图写入。枚举:employment=用工办理;knowledge=政策知识库;order=订单查询;cost=成本测算;attendance=考勤;emergency=应急咨询。非空,默认 employment。';
  888. COMMENT ON COLUMN fe_conversation.status IS '会话生命周期状态。用户归档或长期无消息时更新。枚举:active=进行中;archived=已归档(只读)。非空,默认 active。';
  889. COMMENT ON COLUMN fe_conversation.last_message_at IS '最后一条消息时间,用于侧边栏按时间排序。每次 INSERT fe_conversation_message 后由应用层刷新。可空;索引排序字段。';
  890. COMMENT ON COLUMN fe_conversation.create_time IS '会话创建时间。非空。';
  891. COMMENT ON COLUMN fe_conversation.update_time IS '会话元数据变更时更新。非空。';
  892. COMMENT ON COLUMN fe_conversation.del_flag IS '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。';
  893. COMMENT ON TABLE fe_conversation_message IS '对话消息明细表,存储用户与助手往返的文本及结构化卡片(草稿卡、成本卡、订单卡)。通过 next_action 驱动小程序路由跳转;关联 fe_conversation,可软链 fe_employment_draft。';
  894. COMMENT ON COLUMN fe_conversation_message.id IS '表主键,自增。每条消息入库时生成。非空。';
  895. COMMENT ON COLUMN fe_conversation_message.conversation_id IS '所属会话,外键。发送消息时写入。非空;索引 idx_fe_conv_msg(conversation_id,create_time)。';
  896. COMMENT ON COLUMN fe_conversation_message.role IS '消息发送方角色。写入时由网关标记。枚举:user=企业主用户;assistant=AI 助手;system=系统提示(如流程引导)。非空。';
  897. COMMENT ON COLUMN fe_conversation_message.content IS '消息正文文本或卡片摘要说明,供聊天气泡展示。用户输入或 AI 生成时写入。非空;长文本需注意截断策略。';
  898. COMMENT ON COLUMN fe_conversation_message.content_type IS '消息内容形态,决定前端渲染组件。写入时标记。枚举:text=纯文本;card_draft=用工草稿卡;card_cost=成本对比卡;card_order=订单进度卡。非空,默认 text。';
  899. COMMENT ON COLUMN fe_conversation_message.card_payload IS '卡片结构化数据 JSON,如草稿字段列表、成本行、订单摘要。AI 子模块返回卡片时写入。示例:{"draft_id":101,"fields":[...]}。可空;仅 content_type 为卡片类型时有值。';
  900. COMMENT ON COLUMN fe_conversation_message.agent_module IS '处理该消息的子智能体模块名,用于排障与统计。路由层写入。示例:flexible_employment、cost_engine。可空。';
  901. COMMENT ON COLUMN fe_conversation_message.next_action IS '建议前端执行的下一步动作编码,用于自动跳转或弹窗。助手回复卡片时写入。示例:show_employment_draft、open_cost_comparison。可空。';
  902. COMMENT ON COLUMN fe_conversation_message.related_draft_id IS '关联的用工草稿 ID,软引用 fe_employment_draft(id)。生成或引用草稿卡时写入。可空;无外键约束,由应用层保证一致性。';
  903. COMMENT ON COLUMN fe_conversation_message.token_usage IS '大模型 token 消耗统计 JSON,含 prompt/completion 分项。AI 调用完成后写入,供成本核算。示例:{"prompt":1200,"completion":800}。可空;不展示给用户。';
  904. COMMENT ON COLUMN fe_conversation_message.create_time IS '消息发送/入库时间,聊天气泡排序依据。非空,默认 NOW()。';
  905. COMMENT ON TABLE fe_agent_action_log IS '智能体与子模块调用审计日志表,记录主智能体、灵活用工模块、成本引擎等的入参出参与耗时。用于技术排障与合规审计,不对小程序用户直接展示;可关联 fe_conversation。';
  906. COMMENT ON COLUMN fe_agent_action_log.id IS '表主键,自增。每次子模块调用时生成。非空。';
  907. COMMENT ON COLUMN fe_agent_action_log.conversation_id IS '关联会话,外键。对话内调用时写入;后台定时任务触发时可为空。可空。';
  908. COMMENT ON COLUMN fe_agent_action_log.enterprise_id IS '所属企业,外键。调用上下文中的企业 ID,必填以便按企业排障。非空;索引 idx_fe_agent_log。';
  909. COMMENT ON COLUMN fe_agent_action_log.module_name IS '被调用的模块名称。调用发起时写入。枚举示例:main_agent=主路由;flexible_employment=用工子模块;cost_engine=成本测算引擎。非空。';
  910. COMMENT ON COLUMN fe_agent_action_log.action IS '模块内具体动作编码。示例:generate_draft、calc_cost、parse_nl_preference。非空;与 module_name 组合定位代码路径。';
  911. COMMENT ON COLUMN fe_agent_action_log.request_json IS '请求体 JSON 快照,含用户输入与上下文参数。调用前由中间件序列化写入。可空;可能含业务敏感字段,访问需授权。';
  912. COMMENT ON COLUMN fe_agent_action_log.response_json IS '响应体 JSON 快照,含 AI 结构化输出。调用成功后写入。可空;失败时可能为空或部分写入。';
  913. COMMENT ON COLUMN fe_agent_action_log.status IS '调用结果状态。调用结束时写入。枚举:success=成功;failed=失败。非空,默认 success。';
  914. COMMENT ON COLUMN fe_agent_action_log.error_message IS '失败时的错误堆栈或业务错误码说明。仅 status=failed 时写入。可空;供研发排障。';
  915. COMMENT ON COLUMN fe_agent_action_log.duration_ms IS '调用耗时(毫秒)。调用结束时计算写入。示例:2350。可空;用于性能监控。';
  916. COMMENT ON COLUMN fe_agent_action_log.create_time IS '调用发生时间。非空;按时间倒序查最近异常。';
  917. COMMENT ON TABLE fe_service_plan IS '用工方案目录表,成本对比页「当前方式 + 方案一二三」的配置数据源。正式环境费率以此表为准;test_only 状态方案仅供 Demo。一对多关联 fe_service_plan_fee_rule,被草稿与订单 selected_plan_id 引用。';
  918. COMMENT ON COLUMN fe_service_plan.id IS '表主键,自增。运营配置或初始化脚本插入时生成。非空。';
  919. COMMENT ON COLUMN fe_service_plan.plan_code IS '方案业务编码,全局唯一(软删条件下)。初始化或运营录入时写入。枚举:current=企业现有处理方式;plan_1/plan_2/plan_3=对比方案。示例:plan_1。非空;唯一索引 uk_fe_service_plan_code。';
  920. COMMENT ON COLUMN fe_service_plan.plan_name IS '前端展示名称。运营配置时写入。示例:合规优先 (A)、传统用工 (B)。非空。';
  921. COMMENT ON COLUMN fe_service_plan.plan_type IS '方案用工模式大类。配置时写入。枚举:flexible=灵活用工;traditional=传统用工;hybrid=混合模式。非空,默认 flexible。';
  922. COMMENT ON COLUMN fe_service_plan.description IS '方案详细说明文案,成本对比页展开区展示。运营维护时写入。可空。';
  923. COMMENT ON COLUMN fe_service_plan.service_fee_rate IS '平台服务费率,NUMERIC(8,4)。示例:0.08 表示 8%。运营配置或费率调整时写入。可空;current 方案可为 NULL 表示按企业现状估算。';
  924. COMMENT ON COLUMN fe_service_plan.insurance_level IS '方案默认保险档次。枚举:basic=基础;standard=标准;premium=高级。可空;影响保险费用项测算。';
  925. COMMENT ON COLUMN fe_service_plan.tax_mode IS '税费代征模式编码,与地方税筹政策对应。运营配置时写入。示例:withhold_standard。可空。';
  926. COMMENT ON COLUMN fe_service_plan.applicable_scenarios IS '适用场景 JSON 数组,供 AI 推荐方案时匹配。示例:["旺季临时工","仓储搬运"]。可空,默认 []。';
  927. COMMENT ON COLUMN fe_service_plan.compliance_tags IS '合规能力标签 JSON 数组,前端展示勾选图标。示例:["业务真实","资金合规","个税申报"]。可空,默认 []。';
  928. COMMENT ON COLUMN fe_service_plan.sort_order IS '前端展示排序权重,越小越靠前。运营配置时写入。非空,默认 0。';
  929. COMMENT ON COLUMN fe_service_plan.status IS '方案生效状态。枚举:active=正式可用;test_only=测试演示默认;disabled=停用。非空,默认 active;生产环境应仅 active 参与正式测算。';
  930. COMMENT ON COLUMN fe_service_plan.effective_from IS '方案生效开始日期。费率版本管理时写入。可空。';
  931. COMMENT ON COLUMN fe_service_plan.effective_to IS '方案生效结束日期,到期后自动不参与测算。可空。';
  932. COMMENT ON COLUMN fe_service_plan.create_time IS '记录创建时间。非空。';
  933. COMMENT ON COLUMN fe_service_plan.update_time IS '方案配置变更时更新。非空。';
  934. COMMENT ON COLUMN fe_service_plan.del_flag IS '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。';
  935. COMMENT ON TABLE fe_service_plan_fee_rule IS '方案费用项计算规则表,定义劳务费、服务费、保险、税费代征等分项的计算方式(固定额/比例/公式)。成本测算引擎读取本表与 fe_service_plan 联合计算;一对多归属 plan_id。';
  936. COMMENT ON COLUMN fe_service_plan_fee_rule.id IS '表主键,自增。运营为方案配置费用项时生成。非空。';
  937. COMMENT ON COLUMN fe_service_plan_fee_rule.plan_id IS '关联方案,外键。配置费用规则时写入。非空;索引 idx_fe_plan_fee。';
  938. 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_name IS '费用项中文展示名。示例:劳务费、服务费。非空。';
  940. 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_expression IS '计算公式或规则描述文本,供引擎解析或人工审计。运营配置时写入。示例:gross * service_fee_rate。可空;calc_type=formula 时建议必填。';
  942. COMMENT ON COLUMN fe_service_plan_fee_rule.default_rate IS '默认费率或系数,NUMERIC(8,4)。rate 类型费用项使用。示例:0.08。可空。';
  943. COMMENT ON COLUMN fe_service_plan_fee_rule.sort_order IS '成本明细展示顺序。非空,默认 0。';
  944. COMMENT ON COLUMN fe_service_plan_fee_rule.create_time IS '记录创建时间。非空。';
  945. COMMENT ON COLUMN fe_service_plan_fee_rule.update_time IS '规则变更时更新。非空。';
  946. COMMENT ON TABLE fe_workflow_definition IS '灵活用工流程定义表,版本化元数据。is_active 标识当前启用版本;一对多关联 fe_workflow_step。';
  947. COMMENT ON COLUMN fe_workflow_definition.id IS '表主键,自增。非空。';
  948. COMMENT ON COLUMN fe_workflow_definition.workflow_code IS '流程业务编码。示例:employment_compliance。非空;与 version 组成唯一索引。';
  949. COMMENT ON COLUMN fe_workflow_definition.workflow_name IS '流程中文名称。示例:灵活用工办理流程。非空。';
  950. COMMENT ON COLUMN fe_workflow_definition.description IS '流程整体说明。可空。';
  951. COMMENT ON COLUMN fe_workflow_definition.version IS '流程版本号。非空,默认 1。';
  952. COMMENT ON COLUMN fe_workflow_definition.is_active IS '是否当前启用版本。同 workflow_code 宜仅一条 TRUE。';
  953. COMMENT ON COLUMN fe_workflow_definition.create_time IS '记录创建时间。非空。';
  954. COMMENT ON COLUMN fe_workflow_definition.update_time IS '流程元数据变更时更新。非空。';
  955. COMMENT ON TABLE fe_workflow_step IS '流程步骤定义;订单 current_step_code 对应本表 step_code。归属 fe_workflow_definition。';
  956. COMMENT ON COLUMN fe_workflow_step.id IS '表主键,自增。非空。';
  957. COMMENT ON COLUMN fe_workflow_step.workflow_id IS '关联流程定义。非空。';
  958. COMMENT ON COLUMN fe_workflow_step.step_code IS '步骤编码:draft/enterprise_auth/worker_registration/worker_recruitment/task_publish/settlement/invoice_archive。登记与招聘互斥。';
  959. COMMENT ON COLUMN fe_workflow_step.step_name IS '步骤中文展示名。非空。';
  960. COMMENT ON COLUMN fe_workflow_step.step_order IS '步骤顺序号;登记与招聘可同为 3。非空。';
  961. COMMENT ON COLUMN fe_workflow_step.required IS '是否必经。登记/招聘为 FALSE(按 worker_source 二选一)。';
  962. COMMENT ON COLUMN fe_workflow_step.auto_advance IS '是否自动推进。非空,默认 FALSE。';
  963. COMMENT ON COLUMN fe_workflow_step.create_time IS '步骤定义创建时间。非空。';
  964. COMMENT ON TABLE fe_policy_rule IS '政策法规规则库表,供规则引擎与 RAG 知识库引用,支撑用工风险诊断、合规提示与智能问答。按 rule_category 分类,支持生效期与优先级排序。';
  965. COMMENT ON COLUMN fe_policy_rule.id IS '表主键,自增。运营或法务录入规则时生成。非空。';
  966. COMMENT ON COLUMN fe_policy_rule.rule_code IS '规则唯一业务编码。示例:TAX_WITHHOLD_001。非空;唯一索引 uk_fe_policy_rule。';
  967. COMMENT ON COLUMN fe_policy_rule.rule_category IS '规则分类。枚举:tax=税务;labor=劳动用工;insurance=保险;invoice=发票开票。非空;用于检索过滤。';
  968. COMMENT ON COLUMN fe_policy_rule.title IS '规则标题,知识库与对话引用时展示。非空。';
  969. COMMENT ON COLUMN fe_policy_rule.content IS '规则正文全文,可含法规条文摘要。非空;可能较长,注意全文检索索引。';
  970. COMMENT ON COLUMN fe_policy_rule.effective_from IS '规则生效开始日期。可空;为空表示无开始限制。';
  971. COMMENT ON COLUMN fe_policy_rule.effective_to IS '规则生效结束日期,过期规则不参与实时诊断。可空。';
  972. COMMENT ON COLUMN fe_policy_rule.priority IS '匹配优先级,数值越大越优先。冲突时取高优先级规则。非空,默认 0。';
  973. COMMENT ON COLUMN fe_policy_rule.status IS '规则启用状态。枚举:active=启用;disabled=停用。非空,默认 active。';
  974. COMMENT ON COLUMN fe_policy_rule.create_time IS '记录创建时间。非空。';
  975. COMMENT ON COLUMN fe_policy_rule.update_time IS '规则内容变更时更新。非空。';
  976. COMMENT ON TABLE fe_employment_draft IS '用工草稿头表(精简):用工事实在 fe_draft_work_item;enterprise_id 可空(企业认证后回填);worker_source 决定登记/招聘分支。';
  977. COMMENT ON COLUMN fe_employment_draft.id IS '表主键。被 fe_draft_work_item、fe_draft_field、fe_draft_cost_snapshot 引用。';
  978. COMMENT ON COLUMN fe_employment_draft.draft_no IS '草稿业务编号。示例:draft_001。唯一索引 uk_fe_draft_no。';
  979. COMMENT ON COLUMN fe_employment_draft.enterprise_id IS '所属企业,可空;企业认证完成后回填。';
  980. COMMENT ON COLUMN fe_employment_draft.user_id IS '发起草稿的企业主用户。非空。';
  981. COMMENT ON COLUMN fe_employment_draft.conversation_id IS '来源 AI 对话。可空。';
  982. COMMENT ON COLUMN fe_employment_draft.title IS '草稿标题。可空。';
  983. COMMENT ON COLUMN fe_employment_draft.status IS 'pending/confirmed/cancelled/expired。默认 pending。';
  984. COMMENT ON COLUMN fe_employment_draft.worker_source IS 'existing=有临时工→人员登记;recruit=无临时工→临时工招聘。可空。';
  985. COMMENT ON COLUMN fe_employment_draft.missing_fields IS '待补充字段名 JSON 数组。可空,默认 []。';
  986. COMMENT ON COLUMN fe_employment_draft.risk_prompts IS '风险提示 JSON 数组。可空,默认 []。';
  987. COMMENT ON COLUMN fe_employment_draft.selected_plan_id IS '用户选中的用工方案。可空。';
  988. COMMENT ON COLUMN fe_employment_draft.confirmed_at IS '确认草稿时间。可空。';
  989. COMMENT ON COLUMN fe_employment_draft.confirmed_by IS '确认操作用户。可空。';
  990. COMMENT ON COLUMN fe_employment_draft.create_time IS '草稿创建时间。非空。';
  991. COMMENT ON COLUMN fe_employment_draft.update_time IS '草稿变更时更新。非空。';
  992. COMMENT ON COLUMN fe_employment_draft.del_flag IS '逻辑删除。0=正常;1=已删除。';
  993. COMMENT ON TABLE fe_draft_work_item IS '草稿用工明细;1 草稿 N 行;列表汇总用 SUM/应用层组装,不回写头表。';
  994. COMMENT ON COLUMN fe_draft_work_item.id IS '主键。';
  995. COMMENT ON COLUMN fe_draft_work_item.draft_id IS '归属草稿。';
  996. COMMENT ON COLUMN fe_draft_work_item.group_no IS '组编号,草稿内唯一。示例:grp_01;对应 API group_id。';
  997. COMMENT ON COLUMN fe_draft_work_item.sort_order IS '展示顺序。';
  998. COMMENT ON COLUMN fe_draft_work_item.job_type IS '工种。';
  999. COMMENT ON COLUMN fe_draft_work_item.worker_count IS '本行人数。';
  1000. COMMENT ON COLUMN fe_draft_work_item.work_days IS '本行工作天数。';
  1001. COMMENT ON COLUMN fe_draft_work_item.work_location IS '本行工作地点。';
  1002. COMMENT ON COLUMN fe_draft_work_item.settlement_cycle IS '结算周期:daily/weekly/monthly。';
  1003. COMMENT ON COLUMN fe_draft_work_item.unit_amount IS '单价(可选)。';
  1004. COMMENT ON COLUMN fe_draft_work_item.total_amount IS '本行劳务费合计。';
  1005. COMMENT ON COLUMN fe_draft_work_item.work_content IS '本行工作内容(可选)。';
  1006. COMMENT ON COLUMN fe_draft_work_item.work_start_date IS '本行计划开工(可选,含时分秒)。';
  1007. COMMENT ON COLUMN fe_draft_work_item.work_end_date IS '本行计划结束(可选,含时分秒)。';
  1008. COMMENT ON COLUMN fe_draft_work_item.create_time IS '创建时间。';
  1009. COMMENT ON COLUMN fe_draft_work_item.update_time IS '更新时间。';
  1010. COMMENT ON COLUMN fe_draft_work_item.del_flag IS '逻辑删除。';
  1011. COMMENT ON TABLE fe_draft_field IS '草稿字段明细细表,逐字段记录值、数据来源与可编辑性,支撑前端「默认生成」角标(is_default=true)与字段级审计。一对多归属 fe_employment_draft。';
  1012. COMMENT ON COLUMN fe_draft_field.id IS '表主键,自增。草稿生成或字段补全时插入。非空。';
  1013. COMMENT ON COLUMN fe_draft_field.draft_id IS '关联草稿,外键。非空;与 field_key 组成唯一索引 uk_fe_draft_field。';
  1014. COMMENT ON COLUMN fe_draft_field.field_key IS '字段键名,与草稿主表列名或扩展字段对应。示例:work_location、daily_wage。非空。';
  1015. COMMENT ON COLUMN fe_draft_field.field_label IS '字段中文标签,表单展示用。示例:工作地点、日薪标准。可空。';
  1016. COMMENT ON COLUMN fe_draft_field.field_value IS '简单文本类型字段值。用户输入或 AI 填充时写入。可空;复杂结构用 value_json。';
  1017. COMMENT ON COLUMN fe_draft_field.value_json IS '复杂类型字段 JSON 值,如多选、地址对象。可空。';
  1018. COMMENT ON COLUMN fe_draft_field.source IS '字段值来源,前端展示可信度。枚举:enterprise_profile=企业画像;history_preference=历史偏好;default=系统默认;user_input=用户输入;ai_inferred=AI 推断。非空,默认 ai_inferred。';
  1019. COMMENT ON COLUMN fe_draft_field.editable IS '用户是否可在草稿编辑页修改该字段。非空,默认 TRUE;系统锁定字段置 FALSE。';
  1020. COMMENT ON COLUMN fe_draft_field.is_default IS '是否 AI/系统默认生成未经用户修改,前端展示「默认」角标。非空,默认 FALSE。';
  1021. COMMENT ON COLUMN fe_draft_field.create_time IS '字段记录创建时间。非空。';
  1022. COMMENT ON COLUMN fe_draft_field.update_time IS '字段值变更时更新。非空。';
  1023. COMMENT ON TABLE fe_draft_cost_snapshot IS '草稿成本对比快照表,一次测算为同一草稿生成多行(current + plan_1/2/3)。核心指标:企业总支出、人均成本、员工到手;一对多关联 fe_draft_cost_detail。';
  1024. COMMENT ON COLUMN fe_draft_cost_snapshot.id IS '表主键,自增。成本引擎每次全量测算时批量插入。非空。';
  1025. COMMENT ON COLUMN fe_draft_cost_snapshot.draft_id IS '关联草稿,外键。非空;索引 idx_fe_cost_snapshot。';
  1026. COMMENT ON COLUMN fe_draft_cost_snapshot.plan_id IS '关联方案目录,外键。current 行可能为空(表示非平台方案)。可空。';
  1027. COMMENT ON COLUMN fe_draft_cost_snapshot.plan_code IS '方案编码快照,防止方案后续改名影响历史展示。示例:plan_1。非空。';
  1028. COMMENT ON COLUMN fe_draft_cost_snapshot.plan_name IS '方案名称快照。示例:合规优先 (A)。非空。';
  1029. COMMENT ON COLUMN fe_draft_cost_snapshot.employer_total_outflow IS '企业总支出(元),含劳务+服务费+保险+税费等。成本引擎计算写入。非空。';
  1030. COMMENT ON COLUMN fe_draft_cost_snapshot.employer_avg_cost_per_worker IS '企业平均每人成本(元)。非空。';
  1031. COMMENT ON COLUMN fe_draft_cost_snapshot.worker_take_home_per_worker IS '员工每人预计到手(元),税后实发估算。可空。';
  1032. COMMENT ON COLUMN fe_draft_cost_snapshot.is_recommended IS '是否 AI/规则推荐的优选方案,前端高亮展示。非空,默认 FALSE。';
  1033. COMMENT ON COLUMN fe_draft_cost_snapshot.status_tag IS '快照数据性质标签。示例:test_only 表示使用测试费率,需向用户提示。可空。';
  1034. COMMENT ON COLUMN fe_draft_cost_snapshot.compliance_tags IS '合规标签 JSON 快照,与方案一致。可空,默认 []。';
  1035. COMMENT ON COLUMN fe_draft_cost_snapshot.notice IS '展示给用户的补充说明文案,如费率仅供参考。可空。';
  1036. COMMENT ON COLUMN fe_draft_cost_snapshot.calc_version IS '测算引擎版本号,便于回放与排障。示例:v1.2.0。可空。';
  1037. COMMENT ON COLUMN fe_draft_cost_snapshot.create_time IS '快照生成时间,同一 draft_id 下多条记录时间相近。非空。';
  1038. COMMENT ON TABLE fe_draft_cost_detail IS '成本对比费用明细细表,对应快照下劳务费、服务费、保险、税费代征等分项金额与费率。归属 fe_draft_cost_snapshot,供前端展开明细列表。';
  1039. COMMENT ON COLUMN fe_draft_cost_detail.id IS '表主键,自增。生成快照时同步插入各费用项。非空。';
  1040. COMMENT ON COLUMN fe_draft_cost_detail.snapshot_id IS '关联成本快照,外键。非空;索引 idx_fe_cost_detail。';
  1041. COMMENT ON COLUMN fe_draft_cost_detail.fee_code IS '费用项编码,与 fe_service_plan_fee_rule.fee_code 对齐。示例:labor_fee、service_fee。非空。';
  1042. COMMENT ON COLUMN fe_draft_cost_detail.fee_name IS '费用项中文名。示例:劳务费、平台服务费。非空。';
  1043. COMMENT ON COLUMN fe_draft_cost_detail.amount IS '该费用项金额(元),NUMERIC(14,2)。非空。';
  1044. COMMENT ON COLUMN fe_draft_cost_detail.rate IS '适用费率或系数,NUMERIC(8,4)。可空;固定额费用项无费率。';
  1045. COMMENT ON COLUMN fe_draft_cost_detail.sort_order IS '明细列表展示顺序。非空,默认 0。';
  1046. COMMENT ON TABLE fe_employment_order IS '用工订单头表(精简):用工明细在 fe_order_work_item;登记进度从业务表聚合;current_step_code 驱动六步流程。';
  1047. COMMENT ON COLUMN fe_employment_order.id IS '表主键。草稿确认时创建。';
  1048. COMMENT ON COLUMN fe_employment_order.order_no IS '订单业务编号。唯一索引 uk_fe_order_no。';
  1049. COMMENT ON COLUMN fe_employment_order.enterprise_id IS '所属企业,可空;确认方案时草稿未绑企业则为空,企业认证后回填。';
  1050. COMMENT ON COLUMN fe_employment_order.user_id IS '下单企业主用户。非空。';
  1051. COMMENT ON COLUMN fe_employment_order.draft_id IS '来源草稿。可空。';
  1052. COMMENT ON COLUMN fe_employment_order.selected_plan_id IS '确认选用的用工方案。可空。';
  1053. COMMENT ON COLUMN fe_employment_order.title IS '订单标题。非空。';
  1054. COMMENT ON COLUMN fe_employment_order.order_status IS '订单业务状态。示例:confirmed、in_progress、settling、completed。';
  1055. COMMENT ON COLUMN fe_employment_order.worker_source IS 'existing→人员登记;recruit→临时工招聘。';
  1056. COMMENT ON COLUMN fe_employment_order.current_step_code IS '当前步骤六步编码,对应 fe_workflow_step.step_code:draft / enterprise_auth / worker_registration|worker_recruitment / task_publish / settlement|settlement_pending / invoice_archive|completed。任务发布写入 task_publish,不再使用 work_started。默认 draft。';
  1057. COMMENT ON COLUMN fe_employment_order.create_time IS '订单创建时间。非空。';
  1058. COMMENT ON COLUMN fe_employment_order.update_time IS '订单状态变更时更新。非空。';
  1059. COMMENT ON COLUMN fe_employment_order.del_flag IS '逻辑删除。0=正常;1=已删除。';
  1060. COMMENT ON TABLE fe_order_work_item IS '订单用工明细快照;确认时从 fe_draft_work_item 复制。';
  1061. COMMENT ON COLUMN fe_order_work_item.id IS '主键。';
  1062. COMMENT ON COLUMN fe_order_work_item.order_id IS '归属订单。';
  1063. COMMENT ON COLUMN fe_order_work_item.draft_item_id IS '来源草稿明细 id(软链,可空)。';
  1064. COMMENT ON COLUMN fe_order_work_item.group_no IS '组编号,订单内唯一。';
  1065. COMMENT ON COLUMN fe_order_work_item.sort_order IS '展示顺序。';
  1066. COMMENT ON COLUMN fe_order_work_item.job_type IS '工种。';
  1067. COMMENT ON COLUMN fe_order_work_item.worker_count IS '本行人数。';
  1068. COMMENT ON COLUMN fe_order_work_item.work_days IS '本行工作天数。';
  1069. COMMENT ON COLUMN fe_order_work_item.work_location IS '本行工作地点。';
  1070. COMMENT ON COLUMN fe_order_work_item.settlement_cycle IS '结算周期。';
  1071. COMMENT ON COLUMN fe_order_work_item.unit_amount IS '单价(可选)。';
  1072. COMMENT ON COLUMN fe_order_work_item.total_amount IS '本行劳务费合计。';
  1073. COMMENT ON COLUMN fe_order_work_item.work_content IS '本行工作内容(可选)。';
  1074. COMMENT ON COLUMN fe_order_work_item.work_start_date IS '本行计划开工(可选,含时分秒)。';
  1075. COMMENT ON COLUMN fe_order_work_item.work_end_date IS '本行计划结束(可选,含时分秒)。';
  1076. COMMENT ON COLUMN fe_order_work_item.create_time IS '创建时间。';
  1077. COMMENT ON COLUMN fe_order_work_item.update_time IS '更新时间。';
  1078. COMMENT ON COLUMN fe_order_work_item.del_flag IS '逻辑删除。';
  1079. COMMENT ON TABLE fe_registration_batch IS '临时工扫码登记批次表(worker_source=existing);含登记链接、二维码与有效期;一对多关联 fe_worker_registration。';
  1080. COMMENT ON COLUMN fe_registration_batch.id IS '表主键,自增。订单进入登记步骤时由后端创建。非空。';
  1081. COMMENT ON COLUMN fe_registration_batch.batch_no IS '登记批次业务编号。示例:BATCH-001。非空;唯一索引 uk_fe_batch_no。';
  1082. COMMENT ON COLUMN fe_registration_batch.order_id IS '关联用工订单 fe_employment_order.id(逻辑关联,无数据库外键)。非空;索引 idx_fe_batch_order。';
  1083. COMMENT ON COLUMN fe_registration_batch.enterprise_id IS '所属企业 fe_enterprise.id(逻辑关联,无数据库外键)。可空;企业认证后回填。';
  1084. COMMENT ON COLUMN fe_registration_batch.expected_count IS '本批次预期登记人数,通常等于订单用工明细 SUM(worker_count)。非空。';
  1085. COMMENT ON COLUMN fe_registration_batch.registered_count IS '已登记总数(含进行中),冗余统计。非空,默认 0。';
  1086. COMMENT ON COLUMN fe_registration_batch.pending_count IS '尚未开始登记人数。非空,默认 0。';
  1087. COMMENT ON COLUMN fe_registration_batch.in_progress_count IS '登记进行中人数(已打开页面未提交)。非空,默认 0。';
  1088. COMMENT ON COLUMN fe_registration_batch.completed_count IS '登记已完成人数。非空,默认 0。';
  1089. COMMENT ON COLUMN fe_registration_batch.abnormal_count IS '登记异常人数(核验失败等)。非空,默认 0。';
  1090. COMMENT ON COLUMN fe_registration_batch.registration_url IS '临时工登记页链接(H5 或小程序 path)。批次创建时由链接服务生成。可空;需配合 qr_token 校验。';
  1091. COMMENT ON COLUMN fe_registration_batch.qr_code_url IS '登记二维码图片 CDN URL。批次创建时生成。可空。';
  1092. COMMENT ON COLUMN fe_registration_batch.qr_token IS '扫码登记安全 token,校验链接有效性与防篡改。创建时随机生成。可空;非空时唯一索引 uk_fe_batch_token。';
  1093. COMMENT ON COLUMN fe_registration_batch.valid_from IS '二维码/链接生效时间。非空,默认 NOW()。';
  1094. COMMENT ON COLUMN fe_registration_batch.valid_until IS '失效时间,过期后拒绝新登记(已登记记录保留)。创建时按 draft.qr_valid_days 计算。非空。';
  1095. COMMENT ON COLUMN fe_registration_batch.status IS '批次状态。枚举:active=有效可登记;expired=已过期;closed=企业关闭或登记招满后关闭(不再接受新登记)。非空,默认 active。';
  1096. COMMENT ON COLUMN fe_registration_batch.create_time IS '批次创建时间。非空。';
  1097. COMMENT ON COLUMN fe_registration_batch.update_time IS '统计或状态变更时更新。非空。';
  1098. COMMENT ON COLUMN fe_registration_batch.del_flag IS '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。';
  1099. COMMENT ON TABLE fe_order_workflow_log IS '订单合规流程状态变更日志表,记录状态机每一步推进的前后步骤、操作人与备注,构成五流合一合规证据链。关联 fe_employment_order,operator_id 可引用 fe_user。';
  1100. COMMENT ON COLUMN fe_order_workflow_log.id IS '表主键,自增。每次步骤推进时追加写入,不可修改。非空。';
  1101. COMMENT ON COLUMN fe_order_workflow_log.order_id IS '关联订单,外键。非空;索引 idx_fe_order_wf_log。';
  1102. COMMENT ON COLUMN fe_order_workflow_log.from_step IS '变更前合规步骤编码。首次创建订单时可为空。可空。';
  1103. COMMENT ON COLUMN fe_order_workflow_log.to_step IS '变更后合规步骤编码,对应 fe_workflow_step.step_code。非空。';
  1104. COMMENT ON COLUMN fe_order_workflow_log.from_status IS '变更前订单业务状态 order_status。可空。';
  1105. COMMENT ON COLUMN fe_order_workflow_log.to_status IS '变更后订单业务状态。非空。';
  1106. COMMENT ON COLUMN fe_order_workflow_log.operator_id IS '操作人用户 ID,外键。系统自动推进时为 NULL。可空。';
  1107. COMMENT ON COLUMN fe_order_workflow_log.operator_type IS '操作方类型。枚举:system=系统自动;enterprise=企业主/管理员;worker=临时工;provider=第三方合作平台。非空,默认 system。';
  1108. COMMENT ON COLUMN fe_order_workflow_log.remark IS '变更说明,如「登记人数已达预期,自动推进」。可空。';
  1109. COMMENT ON COLUMN fe_order_workflow_log.extra_json IS '扩展上下文 JSON,如触发条件、关联合格人数。可空。';
  1110. COMMENT ON COLUMN fe_order_workflow_log.create_time IS '变更发生时间,审计时间轴依据。非空。';
  1111. COMMENT ON TABLE fe_worker IS '临时工自然人档案主表,跨登记批次复用,避免重复录入身份证与银行卡。身份证、银行卡、手机号均加密存储(*_enc),列表仅展示脱敏值(*_mask);可关联 fe_user 实现微信绑定。';
  1112. COMMENT ON COLUMN fe_worker.id IS '表主键,自增。首次登记提交且实名核验通过后创建或匹配已有档案。非空。';
  1113. COMMENT ON COLUMN fe_worker.user_id IS '关联微信用户,外键。临时工首次扫码授权微信后绑定。可空;未授权前仅通过身份证匹配。';
  1114. COMMENT ON COLUMN fe_worker.worker_no IS '临时工业务编号,平台内唯一标识。档案创建时生成。示例:WK20260001。可空。';
  1115. COMMENT ON COLUMN fe_worker.real_name IS '临时工真实姓名,与身份证一致。登记提交时写入。非空。';
  1116. COMMENT ON COLUMN fe_worker.id_card_no_enc IS '身份证号加密密文。登记页提交时应用层加密写入。非空;高度敏感,禁止明文。';
  1117. COMMENT ON COLUMN fe_worker.id_card_no_mask IS '身份证号脱敏展示。示例:310***********1234。可空;列表与结算明细使用。';
  1118. COMMENT ON COLUMN fe_worker.mobile_enc IS '手机号加密密文。登记时写入。非空;高度敏感。';
  1119. COMMENT ON COLUMN fe_worker.mobile_mask IS '手机号脱敏。示例:138****1234。可空。';
  1120. COMMENT ON COLUMN fe_worker.bank_account_enc IS '银行卡号加密密文,用于打款。登记时写入。可空;高度敏感。';
  1121. COMMENT ON COLUMN fe_worker.bank_account_mask IS '银行卡号脱敏。示例:6222****5678。可空。';
  1122. COMMENT ON COLUMN fe_worker.bank_name IS '开户银行名称。示例:中国工商银行。可空。';
  1123. COMMENT ON COLUMN fe_worker.bank_branch IS '开户支行名称。可空。';
  1124. COMMENT ON COLUMN fe_worker.verify_status IS '实名/人脸核验状态。枚举:pending=待核验;passed=通过;failed=失败。非空,默认 pending;failed 时登记流程阻断。';
  1125. COMMENT ON COLUMN fe_worker.verify_message IS '核验失败原因说明,展示给临时工重试。示例:光线不足导致人脸比对失败。可空。';
  1126. COMMENT ON COLUMN fe_worker.create_time IS '档案创建时间。非空。';
  1127. COMMENT ON COLUMN fe_worker.update_time IS '档案信息或核验状态变更时更新。非空。';
  1128. COMMENT ON COLUMN fe_worker.del_flag IS '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。';
  1129. COMMENT ON TABLE fe_worker_registration IS '批次登记记录表,记录每个临时工在某一 fe_registration_batch 下的一次登记全过程。third_party_source 区分是否第三方人力平台匹配;reg_status 驱动进度页统计、催办与审核;关联 fe_worker 档案,敏感证件信息加密存储。';
  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。';
  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 档案后续同步。';
  1136. COMMENT ON COLUMN fe_worker_registration.mobile_enc IS '登记手机号密文。提交时加密写入。可空;高度敏感。';
  1137. COMMENT ON COLUMN fe_worker_registration.mobile_mask IS '登记手机号脱敏。可空。';
  1138. COMMENT ON COLUMN fe_worker_registration.id_card_no_enc IS '登记身份证密文。可空;高度敏感。';
  1139. COMMENT ON COLUMN fe_worker_registration.bank_account_enc IS '登记银行卡密文。可空;高度敏感。';
  1140. COMMENT ON COLUMN fe_worker_registration.confirmed_work_type IS '临时工确认的工种或具体任务描述。提交时勾选或填写。可空。';
  1141. COMMENT ON COLUMN fe_worker_registration.third_party_source IS '是否第三方人力来源。FALSE=否(有临时工/人员登记);TRUE=是(无临时工,从第三方人力平台匹配)。非空,默认 FALSE。';
  1142. COMMENT ON COLUMN fe_worker_registration.reg_status IS '登记流程状态。枚举:pending=待登记;registering=填写中;under_review=待企业审核;contract_signing=待签约(审核通过);completed=已完成;verify_failed=实名核验失败;rejected=企业驳回。非空,默认 pending。';
  1143. COMMENT ON COLUMN fe_worker_registration.fail_reason IS '失败或企业驳回原因。可空。';
  1144. COMMENT ON COLUMN fe_worker_registration.submitted_at IS '临时工点击提交时间。可空。';
  1145. COMMENT ON COLUMN fe_worker_registration.reviewed_at IS '企业审核完成时间。可空。';
  1146. COMMENT ON COLUMN fe_worker_registration.reviewed_by IS '审核人,外键。可空。';
  1147. COMMENT ON COLUMN fe_worker_registration.remind_count IS '企业主催办次数,每次催办 +1。非空,默认 0。';
  1148. COMMENT ON COLUMN fe_worker_registration.last_remind_at IS '最近一次催办时间。可空。';
  1149. COMMENT ON COLUMN fe_worker_registration.create_time IS '登记记录创建时间。非空。';
  1150. COMMENT ON COLUMN fe_worker_registration.update_time IS '状态或资料变更时更新。非空。';
  1151. COMMENT ON COLUMN fe_worker_registration.del_flag IS '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。';
  1152. COMMENT ON TABLE fe_worker_consent IS '临时工协议授权确认表,记录勾选电子劳动合同、隐私政策、信息授权等合规留痕。含同意时间、客户端 IP 与 UA,满足电子证据要求;首次档案登记可不关联 fe_worker_registration。';
  1153. COMMENT ON COLUMN fe_worker_consent.id IS '表主键,自增。临时工勾选协议并提交时插入。非空。';
  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=个人信息处理授权。非空。';
  1157. COMMENT ON COLUMN fe_worker_consent.consent_version IS '协议版本号,对应法务发布的协议版本。示例:v2.1。可空。';
  1158. COMMENT ON COLUMN fe_worker_consent.consent_title IS '协议标题展示文案。示例:《灵活用工电子劳动合同》。可空。';
  1159. COMMENT ON COLUMN fe_worker_consent.agreed IS '是否勾选同意。非空,默认 FALSE;提交时须为 TRUE 否则阻断。';
  1160. COMMENT ON COLUMN fe_worker_consent.agreed_at IS '用户点击同意的时间戳。可空;提交成功时必填。';
  1161. COMMENT ON COLUMN fe_worker_consent.client_ip IS '客户端 IP 地址,合规取证。网关层提取写入。可空。';
  1162. COMMENT ON COLUMN fe_worker_consent.user_agent IS '客户端 User-Agent 字符串。可空;最长 500 字符。';
  1163. COMMENT ON COLUMN fe_worker_consent.create_time IS '记录入库时间。非空。';
  1164. COMMENT ON TABLE fe_contract IS '电子劳动合同表,合规流程「合同签署」节点核心数据。一人一登记一条合同;MVP 阶段 sign_provider 可用 mock,对接电子签平台后替换。关联 fe_employment_order、fe_worker_registration、fe_worker。';
  1165. COMMENT ON COLUMN fe_contract.id IS '表主键,自增。登记完成进入合同签署步骤时创建。非空。';
  1166. COMMENT ON COLUMN fe_contract.contract_no IS '合同业务编号。示例:CT20260707001。非空;唯一索引 uk_fe_contract_no。';
  1167. COMMENT ON COLUMN fe_contract.order_id IS '关联订单,外键。非空;索引 idx_fe_contract_order。';
  1168. COMMENT ON COLUMN fe_contract.registration_id IS '关联登记记录(一人一合同),外键。可空;建议必填。';
  1169. COMMENT ON COLUMN fe_contract.worker_id IS '签约临时工,外键。可空。';
  1170. COMMENT ON COLUMN fe_contract.enterprise_id IS '签约企业,外键。非空。';
  1171. COMMENT ON COLUMN fe_contract.contract_type IS '合同类型编码。非空,默认 labor(劳动合同)。';
  1172. COMMENT ON COLUMN fe_contract.contract_title IS '合同标题。示例:劳务派遣协议-张三。可空。';
  1173. COMMENT ON COLUMN fe_contract.sign_status IS '签署状态。枚举:pending=待签署;signing=签署中;signed=已签署;rejected=拒签;expired=已过期。非空,默认 pending。';
  1174. COMMENT ON COLUMN fe_contract.sign_provider IS '电子签服务商。枚举:mock=MVP 模拟;esign_partner=合作电子签平台。可空。';
  1175. COMMENT ON COLUMN fe_contract.external_contract_id IS '第三方电子签平台返回的合同 ID。对接后写入。可空。';
  1176. COMMENT ON COLUMN fe_contract.sign_url IS '临时工签署页面链接。创建合同时由签章服务返回。可空。';
  1177. COMMENT ON COLUMN fe_contract.signed_at IS '双方签署完成时间。可空。';
  1178. COMMENT ON COLUMN fe_contract.file_url IS '已签署合同 PDF 归档地址。签署完成后写入。可空。';
  1179. COMMENT ON COLUMN fe_contract.create_time IS '合同记录创建时间。非空。';
  1180. COMMENT ON COLUMN fe_contract.update_time IS '签署状态变更时更新。非空。';
  1181. COMMENT ON COLUMN fe_contract.del_flag IS '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。';
  1182. COMMENT ON TABLE fe_settlement_order IS '结算确认单主表,用工结束后按考勤或约定生成,展示应发/扣款/实发、服务费、开票额与企业总支出。企业确认后进入支付环节;一对多关联 fe_settlement_item、fe_settlement_fee、fe_payment_record。';
  1183. COMMENT ON COLUMN fe_settlement_order.id IS '表主键,自增。结算引擎生成结算单时创建。非空。';
  1184. COMMENT ON COLUMN fe_settlement_order.settlement_no IS '结算单业务编号。示例:STL20260707001。非空;唯一索引 uk_fe_settlement_no。';
  1185. COMMENT ON COLUMN fe_settlement_order.order_id IS '关联用工订单,外键。非空。';
  1186. COMMENT ON COLUMN fe_settlement_order.batch_id IS '关联登记批次 fe_registration_batch.id(逻辑关联,无数据库外键)。可空;多批次订单可只关联主批次。';
  1187. COMMENT ON COLUMN fe_settlement_order.enterprise_id IS '所属企业,外键。非空;索引 idx_fe_settlement_ent。';
  1188. COMMENT ON COLUMN fe_settlement_order.worker_count IS '本次结算涵盖人数。非空。';
  1189. COMMENT ON COLUMN fe_settlement_order.gross_amount IS '应发总额(元),税前劳务合计。非空,默认 0。';
  1190. COMMENT ON COLUMN fe_settlement_order.deduction_amount IS '扣款及个税合计(元)。非空,默认 0。';
  1191. COMMENT ON COLUMN fe_settlement_order.net_amount IS '实发总额(元),临时工到手合计。非空,默认 0。';
  1192. COMMENT ON COLUMN fe_settlement_order.service_fee_amount IS '平台服务费(元)。非空,默认 0。';
  1193. COMMENT ON COLUMN fe_settlement_order.invoice_amount IS '预计开票额(元),供企业财务参考。非空,默认 0。';
  1194. COMMENT ON COLUMN fe_settlement_order.total_outflow IS '企业总支出(元)= 实发 + 服务费 + 税费等。非空,默认 0。';
  1195. COMMENT ON COLUMN fe_settlement_order.settlement_status IS '结算单状态。枚举:pending=待企业确认;confirmed=已确认待支付;paying=支付中;paid=已支付;cancelled=已取消。非空,默认 pending。';
  1196. COMMENT ON COLUMN fe_settlement_order.compliance_tags IS '五流合一合规校验结果标签 JSON。示例:["个税已申报","发票合规"]。可空,默认 []。';
  1197. COMMENT ON COLUMN fe_settlement_order.compliance_remark IS '合规说明文案。示例:可全额税前扣除。可空。';
  1198. COMMENT ON COLUMN fe_settlement_order.confirmed_at IS '企业主确认结算单时间。可空。';
  1199. COMMENT ON COLUMN fe_settlement_order.confirmed_by IS '确认人,外键。可空。';
  1200. COMMENT ON COLUMN fe_settlement_order.paid_at IS '支付完成时间,全部打款成功后写入。可空。';
  1201. COMMENT ON COLUMN fe_settlement_order.create_time IS '结算单生成时间。非空。';
  1202. COMMENT ON COLUMN fe_settlement_order.update_time IS '状态或金额变更时更新。非空。';
  1203. COMMENT ON COLUMN fe_settlement_order.del_flag IS '逻辑删除标记。枚举:0=正常;1=已删除。非空,默认 0。';
  1204. COMMENT ON TABLE fe_settlement_item IS '结算单人明细表,按临时工拆分应发、个税、其他扣款与实发金额。支持按天、按小时、计件多种计量维度;关联 fe_settlement_order、fe_worker_registration、fe_worker。';
  1205. COMMENT ON COLUMN fe_settlement_item.id IS '表主键,自增。生成结算单时按登记记录逐人插入。非空。';
  1206. COMMENT ON COLUMN fe_settlement_item.settlement_id IS '关联结算单,外键。非空;索引 idx_fe_settlement_item。';
  1207. COMMENT ON COLUMN fe_settlement_item.registration_id IS '关联登记记录,外键。可空;建议必填以追溯人员。';
  1208. COMMENT ON COLUMN fe_settlement_item.worker_id IS '关联临时工档案,外键。可空。';
  1209. COMMENT ON COLUMN fe_settlement_item.worker_name_mask IS '姓名脱敏展示,如张*三。可空;禁止存明文全名。';
  1210. COMMENT ON COLUMN fe_settlement_item.work_days IS '结算工作天数,NUMERIC(8,2)。可空。';
  1211. COMMENT ON COLUMN fe_settlement_item.work_hours IS '结算工作小时数。可空。';
  1212. COMMENT ON COLUMN fe_settlement_item.piece_count IS '计件数量。可空。';
  1213. COMMENT ON COLUMN fe_settlement_item.gross_amount IS '该人员应发金额(元)。非空,默认 0。';
  1214. COMMENT ON COLUMN fe_settlement_item.tax_amount IS '个税扣款(元)。非空,默认 0。';
  1215. COMMENT ON COLUMN fe_settlement_item.other_deduction IS '其他扣款(元),如工装赔偿。非空,默认 0。';
  1216. COMMENT ON COLUMN fe_settlement_item.net_amount IS '该人员实发金额(元)。非空,默认 0。';
  1217. COMMENT ON COLUMN fe_settlement_item.item_status IS '明细行状态。示例:pending、confirmed、paid。非空,默认 pending。';
  1218. COMMENT ON COLUMN fe_settlement_item.create_time IS '明细创建时间。非空。';
  1219. COMMENT ON COLUMN fe_settlement_item.update_time IS '明细金额调整时更新。非空。';
  1220. COMMENT ON TABLE fe_settlement_fee IS '结算单费用汇总项表,订单级劳务费、服务费、保险、税费等分项金额,对应小程序「资金总览」模块。归属 fe_settlement_order,结构与 fe_draft_cost_detail 类似但为实际结算数据。';
  1221. COMMENT ON COLUMN fe_settlement_fee.id IS '表主键,自增。结算单生成时同步写入各费用分项。非空。';
  1222. COMMENT ON COLUMN fe_settlement_fee.settlement_id IS '关联结算单,外键。非空;索引 idx_fe_settlement_fee。';
  1223. COMMENT ON COLUMN fe_settlement_fee.fee_code IS '费用项编码。示例:labor_fee、service_fee、insurance、tax_withhold。非空。';
  1224. COMMENT ON COLUMN fe_settlement_fee.fee_name IS '费用项中文名。非空。';
  1225. COMMENT ON COLUMN fe_settlement_fee.amount IS '费用金额(元),NUMERIC(14,2)。非空。';
  1226. COMMENT ON COLUMN fe_settlement_fee.rate IS '适用费率,NUMERIC(8,4)。可空。';
  1227. COMMENT ON COLUMN fe_settlement_fee.sort_order IS '资金总览展示顺序。非空,默认 0。';
  1228. COMMENT ON TABLE fe_payment_record IS '支付/打款记录表,企业确认结算后发起付款,记录渠道、金额、第三方交易流水与凭证。小程序仅展示 payment_channel 渠道类型,不展示对公账户;关联 fe_settlement_order、fe_enterprise。';
  1229. COMMENT ON COLUMN fe_payment_record.id IS '表主键,自增。发起支付时创建。非空。';
  1230. COMMENT ON COLUMN fe_payment_record.payment_no IS '支付单业务编号。示例:PAY20260707001。非空;唯一索引 uk_fe_payment_no。';
  1231. COMMENT ON COLUMN fe_payment_record.settlement_id IS '关联结算单,外键。非空;索引 idx_fe_payment_settlement。';
  1232. COMMENT ON COLUMN fe_payment_record.enterprise_id IS '付款企业,外键。非空。';
  1233. COMMENT ON COLUMN fe_payment_record.payment_channel IS '支付渠道类型,前端仅展示此字段。枚举:wechat=微信支付;alipay=支付宝;bank=银行转账。非空。';
  1234. COMMENT ON COLUMN fe_payment_record.payment_amount IS '支付金额(元)。非空。';
  1235. COMMENT ON COLUMN fe_payment_record.payment_status IS '支付状态。枚举:pending=处理中;success=成功;failed=失败;refunded=已退款。非空,默认 pending。';
  1236. COMMENT ON COLUMN fe_payment_record.external_trade_no IS '微信/支付宝/银行等第三方交易流水号。支付回调成功时写入。可空。';
  1237. COMMENT ON COLUMN fe_payment_record.payer_user_id IS '发起付款的企业主用户,外键。可空。';
  1238. COMMENT ON COLUMN fe_payment_record.paid_at IS '支付成功时间戳。可空。';
  1239. COMMENT ON COLUMN fe_payment_record.receipt_url IS '支付凭证或回单下载地址。可空。';
  1240. COMMENT ON COLUMN fe_payment_record.fail_reason IS '支付失败原因。可空。';
  1241. COMMENT ON COLUMN fe_payment_record.create_time IS '支付单创建时间。非空。';
  1242. COMMENT ON COLUMN fe_payment_record.update_time IS '状态变更时更新。非空。';
  1243. COMMENT ON TABLE fe_attendance_batch IS '考勤日报批次表(二期功能),按登记批次与日期汇总当日应考勤人数、出勤/加班/请假统计及预估费用。一期 MVP 可不实现业务逻辑,表结构先行预留;关联 fe_registration_batch、fe_employment_order。';
  1244. COMMENT ON COLUMN fe_attendance_batch.id IS '表主键,自增。每日定时任务或企业主手动生成日报时创建。非空。';
  1245. COMMENT ON COLUMN fe_attendance_batch.batch_id IS '关联登记批次 fe_registration_batch.id(逻辑关联,无数据库外键)。非空;与 attendance_date 组成唯一索引 uk_fe_attendance_batch。';
  1246. COMMENT ON COLUMN fe_attendance_batch.order_id IS '关联订单,外键。冗余便于订单维度查考勤。非空。';
  1247. COMMENT ON COLUMN fe_attendance_batch.attendance_date IS '考勤统计日期,DATE 类型。示例:2026-08-15。非空。';
  1248. COMMENT ON COLUMN fe_attendance_batch.total_workers IS '当日应考勤人数。非空,默认 0。';
  1249. COMMENT ON COLUMN fe_attendance_batch.normal_count IS '正常出勤人数。非空,默认 0。';
  1250. COMMENT ON COLUMN fe_attendance_batch.overtime_count IS '加班人数。非空,默认 0。';
  1251. COMMENT ON COLUMN fe_attendance_batch.leave_count IS '请假人数。非空,默认 0。';
  1252. COMMENT ON COLUMN fe_attendance_batch.total_hours IS '当日总工时(小时)。可空,默认 0。';
  1253. COMMENT ON COLUMN fe_attendance_batch.total_pieces IS '当日总计件数。可空,默认 0。';
  1254. COMMENT ON COLUMN fe_attendance_batch.estimated_cost IS '当日预估劳务费用(元)。可空,默认 0。';
  1255. COMMENT ON COLUMN fe_attendance_batch.status IS '日报状态。枚举:draft=草稿可编辑;confirmed=已确认锁定;archived=已归档。非空,默认 draft。';
  1256. COMMENT ON COLUMN fe_attendance_batch.confirmed_by IS '确认人,外键。企业主确认日报时写入。可空。';
  1257. COMMENT ON COLUMN fe_attendance_batch.confirmed_at IS '日报确认时间。可空。';
  1258. COMMENT ON COLUMN fe_attendance_batch.create_time IS '日报创建时间。非空。';
  1259. COMMENT ON COLUMN fe_attendance_batch.update_time IS '考勤数据变更时更新。非空。';
  1260. COMMENT ON TABLE fe_attendance_record IS '考勤明细表(二期),记录单人单日考勤类型(正常/加班/请假/计件)、工时与计件数。支持 manual/voice/import 多种录入来源;关联 fe_attendance_batch、fe_worker_registration、fe_worker。';
  1261. COMMENT ON COLUMN fe_attendance_record.id IS '表主键,自增。录入或导入单人考勤时插入。非空。';
  1262. COMMENT ON COLUMN fe_attendance_record.attendance_batch_id IS '关联考勤日报,外键。非空;索引 idx_fe_attendance_rec。';
  1263. COMMENT ON COLUMN fe_attendance_record.registration_id IS '关联登记记录,外键。非空;确定考勤对象。';
  1264. COMMENT ON COLUMN fe_attendance_record.worker_id IS '关联临时工档案,外键。可空;冗余加速查询。';
  1265. COMMENT ON COLUMN fe_attendance_record.attendance_type IS '考勤类型。枚举:normal=正常出勤;overtime=加班;leave=请假;piece=计件产量。非空,默认 normal。';
  1266. COMMENT ON COLUMN fe_attendance_record.work_hours IS '正常工作小时数,NUMERIC(8,2)。可空。';
  1267. COMMENT ON COLUMN fe_attendance_record.overtime_hours IS '加班小时数。可空。';
  1268. COMMENT ON COLUMN fe_attendance_record.piece_count IS '计件数量。可空。';
  1269. COMMENT ON COLUMN fe_attendance_record.remark IS '考勤备注,如请假原因。可空。';
  1270. COMMENT ON COLUMN fe_attendance_record.source IS '录入来源。枚举:manual=手工录入;voice=语音录入(AI 解析);import=批量导入。可空,默认 manual。';
  1271. COMMENT ON COLUMN fe_attendance_record.create_time IS '记录创建时间。非空。';
  1272. COMMENT ON COLUMN fe_attendance_record.update_time IS '考勤数据修改时更新。非空。';
  1273. COMMENT ON TABLE fe_user_confirmation IS '用户确认与授权留痕表,草稿确认、方案选择、结算支付、外部平台提交等高风险操作必须写入,满足审计与合规举证。关联 fe_enterprise、fe_user,可引用 fe_service_plan。';
  1274. COMMENT ON COLUMN fe_user_confirmation.id IS '表主键,自增。用户执行确认类操作时同步插入,不可篡改。非空。';
  1275. COMMENT ON COLUMN fe_user_confirmation.enterprise_id IS '所属企业,外键。非空;索引 idx_fe_user_confirm。';
  1276. COMMENT ON COLUMN fe_user_confirmation.user_id IS '操作用户,外键。非空;须为 enterprise 类型企业主或管理员。';
  1277. COMMENT ON COLUMN fe_user_confirmation.biz_type IS '业务场景类型。枚举:draft_confirm=确认用工草稿;plan_select=选定用工方案;settlement_pay=确认并支付结算;external_submit=授权提交第三方平台。非空。';
  1278. COMMENT ON COLUMN fe_user_confirmation.biz_id IS '关联业务主键 ID,如 draft_id、settlement_id。非空;与 biz_type 组合解析。';
  1279. COMMENT ON COLUMN fe_user_confirmation.biz_no IS '关联业务编号冗余,便于人工审计。示例:draft_001。可空。';
  1280. COMMENT ON COLUMN fe_user_confirmation.action IS '用户动作类型。枚举:confirm=确认;modify=修改后确认;authorize=授权。非空。';
  1281. COMMENT ON COLUMN fe_user_confirmation.confirmed_fields IS '用户确认时的关键字段快照 JSON,固化确认瞬间数据。示例:{"worker_count":15,"daily_wage":280}。可空,默认 {}。';
  1282. COMMENT ON COLUMN fe_user_confirmation.selected_plan_id IS '确认选用的方案,外键。biz_type=plan_select 或 draft_confirm 时写入。可空。';
  1283. COMMENT ON COLUMN fe_user_confirmation.client_ip IS '客户端 IP,合规取证。网关提取。可空。';
  1284. COMMENT ON COLUMN fe_user_confirmation.user_agent IS '客户端 UA 字符串。可空。';
  1285. COMMENT ON COLUMN fe_user_confirmation.remark IS '用户填写的备注或系统附注。可空。';
  1286. COMMENT ON COLUMN fe_user_confirmation.create_time IS '确认操作发生时间。非空。';
  1287. COMMENT ON TABLE fe_field_change_log IS '关键字段变更历史表,记录草稿、订单、登记等业务对象重要字段的修改前后值,区分用户手工编辑、自然语言修改、AI 重新生成与系统自动变更,支撑争议追溯。';
  1288. COMMENT ON COLUMN fe_field_change_log.id IS '表主键,自增。字段值发生变更时追加写入。非空。';
  1289. COMMENT ON COLUMN fe_field_change_log.biz_type IS '业务对象类型。枚举:draft=用工草稿;order=用工订单;registration=登记记录。非空。';
  1290. COMMENT ON COLUMN fe_field_change_log.biz_id IS '业务对象主键 ID。非空;与 biz_type 组合查询;索引 idx_fe_field_change。';
  1291. COMMENT ON COLUMN fe_field_change_log.field_key IS '被变更字段键名。示例:work_location、daily_wage。非空。';
  1292. COMMENT ON COLUMN fe_field_change_log.old_value IS '变更前的文本值。可空;首次填入时 old_value 为空。';
  1293. COMMENT ON COLUMN fe_field_change_log.new_value IS '变更后的文本值。可空。';
  1294. COMMENT ON COLUMN fe_field_change_log.change_source IS '变更来源。枚举:user_edit=用户表单编辑;nl_edit=自然语言对话修改;ai_regenerate=AI 重新生成草稿;system=系统自动(如状态联动)。非空。';
  1295. COMMENT ON COLUMN fe_field_change_log.operator_id IS '操作人,外键。系统自动变更时可为空。可空。';
  1296. COMMENT ON COLUMN fe_field_change_log.create_time IS '变更发生时间。非空。';
  1297. COMMENT ON TABLE fe_provider IS '第三方灵活用工/税筹合作平台连接器配置表,存储 API 根地址与加密鉴权信息。不对小程序用户暴露;被 fe_provider_api_log 引用,一期可采用 Mock 打桩。';
  1298. COMMENT ON COLUMN fe_provider.id IS '表主键,自增。运营接入新合作平台时创建。非空。';
  1299. COMMENT ON COLUMN fe_provider.provider_code IS '平台业务编码,全局唯一。示例:partner_platform、tax_partner_a。非空;唯一索引 uk_fe_provider_code。';
  1300. COMMENT ON COLUMN fe_provider.provider_name IS '平台展示名称。非空。';
  1301. COMMENT ON COLUMN fe_provider.api_base_url IS '第三方 API 根地址。示例:https://api.partner.com/v1。可空。';
  1302. COMMENT ON COLUMN fe_provider.auth_config_enc IS 'API Key、Secret 等鉴权配置 JSON 的加密密文。运营配置时加密写入。高度敏感;禁止明文与前端暴露。可空。';
  1303. COMMENT ON COLUMN fe_provider.status IS '连接器启用状态。枚举:active=启用;disabled=停用。非空,默认 active。';
  1304. COMMENT ON COLUMN fe_provider.create_time IS '配置创建时间。非空。';
  1305. COMMENT ON COLUMN fe_provider.update_time IS '配置变更时更新。非空。';
  1306. COMMENT ON TABLE fe_provider_api_log IS '合作平台 API 调用日志表,保存原始 HTTP 请求响应、技术状态码与转换后的业务状态 biz_status。技术细节不对用户展示;audit_required 标识是否需用户确认后才能继续推进订单流程。';
  1307. COMMENT ON COLUMN fe_provider_api_log.id IS '表主键,自增。每次调用第三方 API 时追加。非空。';
  1308. COMMENT ON COLUMN fe_provider_api_log.provider_id IS '合作平台,外键。非空;索引 idx_fe_provider_log。';
  1309. COMMENT ON COLUMN fe_provider_api_log.enterprise_id IS '关联企业,外键。调用上下文企业。可空。';
  1310. COMMENT ON COLUMN fe_provider_api_log.order_id IS '关联订单,外键。可空;索引 idx_fe_provider_log_order。';
  1311. COMMENT ON COLUMN fe_provider_api_log.action IS 'API 动作编码。示例:create_requirement=创建用工需求;query_status=查询办理状态;callback=异步回调。非空。';
  1312. COMMENT ON COLUMN fe_provider_api_log.request_payload IS '请求体 JSON 快照。可空;可能含敏感业务数据,访问受控。';
  1313. COMMENT ON COLUMN fe_provider_api_log.response_payload IS '响应体 JSON 快照。可空。';
  1314. COMMENT ON COLUMN fe_provider_api_log.http_status IS 'HTTP 响应状态码。示例:200、500。可空。';
  1315. COMMENT ON COLUMN fe_provider_api_log.biz_status IS '将技术响应映射后的业务状态,供订单状态机消费。示例:submitted、approved、rejected。可空。';
  1316. COMMENT ON COLUMN fe_provider_api_log.audit_required IS '是否需企业主在用户侧确认后才能继续流程。第三方返回待确认时置 TRUE。非空,默认 FALSE。';
  1317. COMMENT ON COLUMN fe_provider_api_log.error_message IS '调用失败错误信息。可空。';
  1318. COMMENT ON COLUMN fe_provider_api_log.duration_ms IS '请求耗时(毫秒)。可空。';
  1319. COMMENT ON COLUMN fe_provider_api_log.create_time IS '调用时间。非空。';
  1320. COMMENT ON TABLE fe_notification IS '消息与待办中心表,推送结算待确认、实名失败、登记进度、流程节点变更等通知。支持 action_url 跳转小程序对应页面/弹窗;关联 fe_enterprise、fe_user,通过 read_flag 与 handled_flag 区分已读与已办。';
  1321. COMMENT ON COLUMN fe_notification.id IS '表主键,自增。业务事件触发时由通知服务写入。非空。';
  1322. COMMENT ON COLUMN fe_notification.enterprise_id IS '所属企业,外键。企业维度消息筛选。可空;索引 idx_fe_notification_ent。';
  1323. COMMENT ON COLUMN fe_notification.user_id IS '接收用户,外键。可空;索引 idx_fe_notification_user;与 enterprise_id 至少其一有值。';
  1324. COMMENT ON COLUMN fe_notification.notify_type IS '通知展示样式。枚举:pending=待办(橙色);error=异常(红色);info=提示(蓝色);success=成功(绿色)。非空。';
  1325. COMMENT ON COLUMN fe_notification.category IS '业务分类。枚举:settlement=结算;registration=登记;verify=实名核验;workflow=流程进度。非空。';
  1326. COMMENT ON COLUMN fe_notification.title IS '通知标题,列表主文案。非空。';
  1327. COMMENT ON COLUMN fe_notification.content IS '通知正文详细描述。可空。';
  1328. COMMENT ON COLUMN fe_notification.biz_type IS '关联业务对象类型,如 settlement、registration、order。可空。';
  1329. COMMENT ON COLUMN fe_notification.biz_id IS '关联业务主键 ID,用于跳转后加载详情。可空。';
  1330. COMMENT ON COLUMN fe_notification.biz_no IS '关联业务编号冗余。示例:STL20260707001。可空。';
  1331. COMMENT ON COLUMN fe_notification.action_url IS '小程序内跳转路径或 scheme。示例:/pages/settlement/detail?id=123。可空。';
  1332. COMMENT ON COLUMN fe_notification.read_flag IS '是否已读。用户打开消息中心或点击后更新。非空,默认 FALSE。';
  1333. COMMENT ON COLUMN fe_notification.handled_flag IS '待办是否已处理完成。用户完成对应操作后更新。非空,默认 FALSE。';
  1334. COMMENT ON COLUMN fe_notification.create_time IS '通知创建时间。非空。';
  1335. COMMENT ON COLUMN fe_notification.read_time IS '标记已读时间。可空。';
  1336. COMMENT ON COLUMN fe_notification.handled_time IS '待办完成时间。可空。';
  1337. -- -----------------------------------------------------------------------------
  1338. -- 十三、初始化数据(测试阶段默认值,正式费率以后端方案目录为准)
  1339. -- 说明:
  1340. -- 1. fe_workflow_definition / fe_workflow_step : 六步主流程(登记/招聘互斥)
  1341. -- 2. fe_service_plan : current + SCHEME_A/B/C(成本对比 UI)
  1342. -- 3. fe_service_plan_fee_rule : 与 UI 分项对齐的费用规则
  1343. -- 校验场景:浦东仓库搬运 · 10人 × 2天
  1344. -- A:到手500/天 → 合计12800;B:到手480/天 → 合计11500;C:到手500/天 → 合计15200
  1345. -- -----------------------------------------------------------------------------
  1346. INSERT INTO fe_workflow_definition (workflow_code, workflow_name, description, version, is_active)
  1347. VALUES ('employment_compliance', '灵活用工办理流程',
  1348. '六步双分支:草稿→企业认证→(人员登记|临时工招聘)→任务发布→结算打款→开票归档;existing=人员登记,recruit=临时工招聘', 4, TRUE);
  1349. INSERT INTO fe_workflow_step (workflow_id, step_code, step_name, step_order, required)
  1350. SELECT wd.id, s.step_code, s.step_name, s.step_order, s.required
  1351. FROM fe_workflow_definition wd,
  1352. (VALUES
  1353. ('draft', '草稿', 1, TRUE),
  1354. ('enterprise_auth', '企业认证', 2, TRUE),
  1355. ('worker_registration', '人员登记', 3, FALSE),
  1356. ('worker_recruitment', '临时工招聘', 3, FALSE),
  1357. ('task_publish', '任务发布', 4, TRUE),
  1358. ('settlement', '结算打款', 5, TRUE),
  1359. ('invoice_archive', '开票归档', 6, TRUE)
  1360. ) AS s(step_code, step_name, step_order, required)
  1361. WHERE wd.workflow_code = 'employment_compliance' AND wd.version = 4;
  1362. INSERT INTO fe_service_plan (
  1363. plan_code, plan_name, plan_type, description,
  1364. service_fee_rate, insurance_level, tax_mode,
  1365. applicable_scenarios, compliance_tags,
  1366. sort_order, status, del_flag
  1367. ) VALUES
  1368. (
  1369. 'current',
  1370. '当前处理方式',
  1371. 'traditional',
  1372. '企业现有处理方式估算(非平台方案)',
  1373. NULL, NULL, NULL,
  1374. '[]'::jsonb, '[]'::jsonb,
  1375. 0, 'active', 0
  1376. ),
  1377. (
  1378. 'SCHEME_A',
  1379. '方案A 合规优先',
  1380. 'flexible',
  1381. '用工方式:灵活用工协议;税费承担:平台代征;保险配置:高档雇主险;发票处理:平台开具6%专票;合规风险:低。'
  1382. || '核心优势:五流合一全额税前扣除;个税已申报企业无风险;高档雇主险覆盖工伤。'
  1383. || '示例(10人×2天、到手500/天):劳务费10000 + 服务费800 + 保险200 + 税费代征1800 = 企业总支出12800;人均成本640/天。',
  1384. 0.0800, 'premium', 'platform_withhold',
  1385. '["旺季临时工","仓储搬运","短期用工"]'::jsonb,
  1386. '["业务真实","资金合规","个税申报","五流合一"]'::jsonb,
  1387. 1, 'active', 0
  1388. ),
  1389. (
  1390. 'SCHEME_B',
  1391. '方案B 成本优先',
  1392. 'flexible',
  1393. '用工方式:劳务协议;税费承担:企业代扣;保险配置:基础意外险;发票处理:代开发票;合规风险:中。'
  1394. || '注意事项:基础意外险保额较低;服务费率低发票额度有限;适合短期低风险用工。'
  1395. || '示例(10人×2天、到手480/天):劳务费9600 + 服务费576 + 保险100 + 税费代征1224 = 企业总支出11500;人均成本575/天。',
  1396. 0.0600, 'basic', 'enterprise_withhold',
  1397. '["短期低风险用工","仓储搬运"]'::jsonb,
  1398. '["业务真实","资金合规"]'::jsonb,
  1399. 2, 'active', 0
  1400. ),
  1401. (
  1402. 'SCHEME_C',
  1403. '方案C 传统用工',
  1404. 'traditional',
  1405. '用工方式:劳动合同;税费承担:企业全额缴纳;保险配置:社保+商业险;发票处理:工资表+个税;合规风险:高(需审查用工关系)。'
  1406. || '风险提示:需缴纳社保公积金成本高;用工关系复杂合规风险大;适合长期固定岗位。'
  1407. || '示例(10人×2天、到手500/天):劳务费10000 + 社保公积金3200 + 管理成本2000 = 企业总支出15200;人均成本760/天。',
  1408. 0.2000, 'standard', 'enterprise_full',
  1409. '["长期固定岗位"]'::jsonb,
  1410. '["需合规审查"]'::jsonb,
  1411. 3, 'active', 0
  1412. );
  1413. INSERT INTO fe_service_plan_fee_rule (plan_id, fee_code, fee_name, calc_type, calc_expression, default_rate, sort_order)
  1414. SELECT p.id, f.fee_code, f.fee_name, f.calc_type, f.calc_expression, f.default_rate, f.sort_order
  1415. FROM fe_service_plan p
  1416. JOIN (VALUES
  1417. ('SCHEME_A', 'labor_fee', '劳务费', 'formula', 'gross', NULL::numeric, 1),
  1418. ('SCHEME_A', 'service_fee', '平台服务费', 'rate', 'gross * service_fee_rate', 0.0800, 2),
  1419. ('SCHEME_A', 'insurance', '保险(高档雇主险)', 'fixed', 'per_person_period', 10.0000, 3),
  1420. ('SCHEME_A', 'tax_withhold', '税费代征', 'rate', 'gross * 0.18', 0.1800, 4),
  1421. ('SCHEME_B', 'labor_fee', '劳务费', 'formula', 'gross', NULL::numeric, 1),
  1422. ('SCHEME_B', 'service_fee', '平台服务费', 'rate', 'gross * service_fee_rate', 0.0600, 2),
  1423. ('SCHEME_B', 'insurance', '保险(基础意外险)', 'fixed', 'per_person_period', 5.0000, 3),
  1424. ('SCHEME_B', 'tax_withhold', '税费代征', 'rate', 'gross * 0.1275', 0.1275, 4),
  1425. ('SCHEME_C', 'labor_fee', '劳务费', 'formula', 'gross', NULL::numeric, 1),
  1426. ('SCHEME_C', 'insurance', '社保公积金', 'rate', 'gross * 0.32', 0.3200, 2),
  1427. ('SCHEME_C', 'service_fee', '管理成本', 'rate', 'gross * service_fee_rate', 0.2000, 3)
  1428. ) AS f(plan_code, fee_code, fee_name, calc_type, calc_expression, default_rate, sort_order)
  1429. ON p.plan_code = f.plan_code;
  1430. -- -----------------------------------------------------------------------------
  1431. -- 附录 A:核心实体关系(1 对多)
  1432. -- fe_user 1 --- N fe_enterprise_user --- N fe_enterprise
  1433. -- fe_enterprise 1 --- N fe_employment_draft / fe_employment_order
  1434. -- fe_employment_draft 1 --- N fe_draft_work_item / fe_draft_field / fe_draft_cost_snapshot
  1435. -- fe_draft_cost_snapshot 1 --- N fe_draft_cost_detail
  1436. -- fe_employment_draft 1 --- 1 fe_employment_order(确认后)
  1437. -- fe_employment_order 1 --- N fe_order_work_item / fe_registration_batch / fe_settlement_order
  1438. -- fe_registration_batch 1 --- N fe_worker_registration
  1439. -- fe_settlement_order 1 --- N fe_settlement_item / fe_settlement_fee / fe_payment_record
  1440. --
  1441. -- 附录 B:主流程推进顺序
  1442. -- draft -> enterprise_auth -> (worker_registration | worker_recruitment)
  1443. -- -> task_publish -> settlement -> invoice_archive
  1444. -- existing→人员登记;recruit→临时工招聘
  1445. --
  1446. -- 附录 C:一期 MVP 重点表
  1447. -- fe_user, fe_enterprise, fe_enterprise_user, fe_conversation, fe_conversation_message
  1448. -- fe_service_plan, fe_employment_draft, fe_draft_work_item, fe_draft_cost_snapshot
  1449. -- fe_employment_order, fe_order_work_item, fe_registration_batch, fe_worker_registration, fe_worker
  1450. --
  1451. -- 附录 D:二期可延后表
  1452. -- fe_attendance_batch, fe_attendance_record, fe_contract(可 Mock), fe_provider_api_log(可 Mock)
  1453. -- 临时工招聘批次表(recruit 路径)按需新增