feat: 北京解聘合规增强 — 政策法规库+地区过滤+工会回执证据链

1. 政策法规库(RAG知识库):
   - 新增6条北京地区单方解除劳动合同工作指引种子数据
   - 涵盖通知工会程序、函件内容要求、回执要求、监督提示函、仲裁审查等
   - 企业用户通过AI问答可检索到北京地区工会通知规定

2. 地区差异化合规检查:
   - getChecklistForReason 增加 orgCity 参数
   - 工会通知检查项仅北京地区显示(FAULT/NONFAULT/LAYOFF)
   - 前端解聘方式说明中北京工会提示仅北京地区动态显示
   - 非北京地区不显示工会通知检查项,避免误导

3. 工会回执上传+证据链留存:
   - 后端新增3个接口:上传回执文件、保存回执信息、获取回执信息
   - 回执信息保存到草稿 checklistOverrides
   - 自动追加到证据链(appendEvidence),作为劳动仲裁举证材料
   - 前端合规检查步骤增加工会回执上传区域
   - 确认提交步骤展示回执文件链接
   - 新增 uploads 静态文件服务

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
selfrelease
2026-08-15 16:01:02 +08:00
parent e8c6d27979
commit 7e720d9bfc
6 changed files with 332 additions and 34 deletions
+23 -19
View File
@@ -16,7 +16,9 @@ export interface ChecklistItem {
suggestionType?: 'info' | 'warning' | 'required'
}
export function getChecklistForReason(reason: string, employee?: any): ChecklistItem[] {
export function getChecklistForReason(reason: string, employee?: any, orgCity?: string): ChecklistItem[] {
// 北京地区单方解除须通知工会(依据《规范用人单位单方解除劳动合同工作指引》)
const isBeijing = !orgCity || orgCity === '北京' || orgCity === '北京市' || orgCity?.includes('北京')
switch (reason) {
case 'NEGOTIATED':
return [
@@ -33,14 +35,14 @@ export function getChecklistForReason(reason: string, employee?: any): Checklist
return [
{ key: 'has_rules', label: '是否有规章制度依据', autoChecked: null },
{ key: 'has_evidence', label: '是否有违纪证据', autoChecked: null },
{
...(isBeijing ? [{
key: 'notify_union',
label: '是否提前5个工作日书面通知工会',
autoChecked: null,
autoChecked: null as any,
suggestion: '北京地区要求:单方解除劳动合同须提前5个工作日将理由书面通知本单位工会;未建立工会的通知上一级工会(用人单位实际经营地的乡镇/街道/园区/开发区总工会)。可在「文本模板库」中使用《拟解除劳动合同通知工会函》模板。',
suggestionType: 'required',
},
{ key: 'union_receipt', label: '是否收到工会书面回执', autoChecked: null },
suggestionType: 'required' as const,
}] : []),
...(isBeijing ? [{ key: 'union_receipt', label: '是否收到工会书面回执', autoChecked: null as any }] : []),
{ key: 'written_notice', label: '是否出具书面解除通知', autoChecked: null },
]
case 'NONFAULT': {
@@ -94,18 +96,20 @@ export function getChecklistForReason(reason: string, employee?: any): Checklist
})
// 通知工会 — 北京地区单方解除必经程序
items.push({
key: 'notify_union',
label: '是否提前5个工作日书面通知工会',
autoChecked: null,
suggestion: '北京地区要求:单方解除须提前5个工作日将理由书面通知本单位工会;未建立工会的通知上一级工会。可在「文本模板库」中使用《拟解除劳动合同通知工会函》模板。',
suggestionType: 'required',
})
items.push({
key: 'union_receipt',
label: '是否收到工会书面回执',
autoChecked: null,
})
if (isBeijing) {
items.push({
key: 'notify_union',
label: '是否提前5个工作日书面通知工会',
autoChecked: null,
suggestion: '北京地区要求:单方解除须提前5个工作日将理由书面通知本单位工会;未建立工会的通知上一级工会。可在「文本模板库」中使用《拟解除劳动合同通知工会函》模板。',
suggestionType: 'required',
})
items.push({
key: 'union_receipt',
label: '是否收到工会书面回执',
autoChecked: null,
})
}
return items
}
@@ -113,7 +117,7 @@ export function getChecklistForReason(reason: string, employee?: any): Checklist
return [
{ key: 'advance_notice_30', label: '是否提前30天向工会或全体职工说明', autoChecked: null },
{ key: 'listen_opinions', label: '是否听取工会或职工意见', autoChecked: null },
{ key: 'union_receipt', label: '是否收到工会书面回执', autoChecked: null },
...(isBeijing ? [{ key: 'union_receipt', label: '是否收到工会书面回执', autoChecked: null as any }] : []),
{ key: 'report_labor_dept', label: '是否向劳动行政部门报告', autoChecked: null },
{
key: 'compensation_paid', label: '是否支付经济补偿金',