feat: 完成23项系统优化 - 花名册社保状态列/身份证复制/附件类型扩展, 用工办理姓名检索/直接提交/文书查看/批量证明, 风险中心跳转筛选+批量处理, 日历7/15/35天分组+逾期统计, 考勤单条编辑+按人导出, 工资条查看状态+工资流水导出, 辞职申请附件上传, 交接清单PDF下载, 操作完成下一步引导, 休假审批入口, 人效成本分部门
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import { useState, useMemo, useEffect } from 'react'
|
||||
import { usePageSize } from '../hooks/usePageSize'
|
||||
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
|
||||
import { toast } from 'sonner'
|
||||
import { AlertTriangle, Check, ChevronRight, ChevronLeft, Shield, Info, Calculator, FileText, Printer, Trash2, List, Download, Plus, Edit, Send, CheckCircle, XCircle, Play, Ban, CheckCheck } from 'lucide-react'
|
||||
@@ -204,8 +205,8 @@ export default function Termination() {
|
||||
const [filterStatus, setFilterStatus] = useState('')
|
||||
const [filterDepartment, setFilterDepartment] = useState('')
|
||||
const [searchTerm, setSearchTerm] = useState('')
|
||||
const draftPageSize = usePageSize()
|
||||
const [draftPage, setDraftPage] = useState(1)
|
||||
const [draftPageSize, setDraftPageSize] = useState(20)
|
||||
|
||||
const { data: employees } = useQuery<any[]>({
|
||||
queryKey: ['roster-for-termination'],
|
||||
@@ -697,7 +698,7 @@ export default function Termination() {
|
||||
{view === 'list' && (
|
||||
<>
|
||||
<PageGuide>
|
||||
解聘补偿页面用于规范处理离职、解聘审批及补偿核算。流程:①新建解聘草稿,选择员工和解聘原因 → ②系统自动计算经济补偿金 → ③合规检查(合同状态、医疗期、孕期等) → ④确认补偿方案 → ⑤生成解聘协议等法律文书。支持协商解除、过错解除、非过错解除、经济性裁员等场景。
|
||||
解聘补偿页面用于规范处理离职、解聘审批及补偿核算。流程:①新建解聘草稿,选择员工和解聘原因 → ②系统自动计算经济补偿金 → ③合规检查(合同状态、医疗期、孕期等) → ④确认补偿方案 → ⑤生成解聘协议等法律文书。支持协商解除、过错解除、非过错解除、经济性裁员等场景。关联:完成后可下载离职证明;社保截止请前往「社保公积金」处理;档案状态更新请前往「花名册」确认。
|
||||
</PageGuide>
|
||||
<div className="flex gap-2 flex-wrap items-center">
|
||||
<Input
|
||||
@@ -886,7 +887,7 @@ export default function Termination() {
|
||||
pageSize={draftPageSize}
|
||||
total={draftsTotal}
|
||||
onPageChange={setDraftPage}
|
||||
onPageSizeChange={(s) => { setDraftPageSize(s); setDraftPage(1) }}
|
||||
onPageSizeChange={() => setDraftPage(1)}
|
||||
/>
|
||||
</Card>
|
||||
</>
|
||||
@@ -1017,6 +1018,62 @@ export default function Termination() {
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* 下载离职证明 & 交接清单 */}
|
||||
{draftDetail.status === 'COMPLETED' && (
|
||||
<div className="border-t pt-3 flex gap-2 flex-wrap">
|
||||
<Button
|
||||
variant="secondary"
|
||||
onClick={() => {
|
||||
const doc = new jsPDF()
|
||||
doc.setFontSize(18)
|
||||
doc.text('解除/终止劳动合同证明书', 105, 25, { align: 'center' })
|
||||
doc.setFontSize(11)
|
||||
let y = 45
|
||||
doc.text(`兹证明 ${draftDetail.employeeName}(身份证号:${draftDetail.idCardNumber || '—'}),`, 14, y); y += 8
|
||||
doc.text(`原系我公司 ${draftDetail.department} 部门员工,`, 14, y); y += 8
|
||||
doc.text(`于 ${draftDetail.terminationDate} 因 ${REASONS.find(r => r.value === draftDetail.reason)?.label || draftDetail.reason} 原因,`, 14, y); y += 8
|
||||
doc.text(`正式解除/终止劳动合同。`, 14, y); y += 8
|
||||
doc.text(`经济补偿金已结清:¥${fmt(draftDetail.compensation)}。`, 14, y); y += 8
|
||||
doc.text(`社保截止月份:${draftDetail.socialInsEndMonth || '—'},公积金截止月份:${draftDetail.housingFundEndMonth || '—'}。`, 14, y); y += 16
|
||||
doc.text('特此证明。', 14, y); y += 24
|
||||
doc.text('公司(盖章)', 140, y)
|
||||
doc.text(new Date().toISOString().slice(0, 10), 140, y + 8)
|
||||
doc.save(`离职证明-${draftDetail.employeeName}-${draftDetail.terminationDate}.pdf`)
|
||||
}}
|
||||
>
|
||||
<Download className="w-4 h-4 mr-1" />下载离职证明
|
||||
</Button>
|
||||
{draftDetail.handoverItems && draftDetail.handoverItems.length > 0 && (
|
||||
<Button
|
||||
variant="secondary"
|
||||
onClick={() => {
|
||||
const doc = new jsPDF()
|
||||
doc.setFontSize(16)
|
||||
doc.text('工作交接清单', 105, 25, { align: 'center' })
|
||||
doc.setFontSize(11)
|
||||
let y = 40
|
||||
doc.text(`员工姓名:${draftDetail.employeeName}`, 14, y); y += 8
|
||||
doc.text(`部门:${draftDetail.department || '—'}`, 14, y); y += 8
|
||||
doc.text(`离职日期:${draftDetail.terminationDate}`, 14, y); y += 12
|
||||
doc.setFontSize(10)
|
||||
draftDetail.handoverItems.forEach((item: any, i: number) => {
|
||||
if (y > 270) { doc.addPage(); y = 20 }
|
||||
doc.text(`${item.done ? '[√]' : '[ ]'} ${item.label}${item.remark ? '(' + item.remark + ')' : ''}`, 14, y); y += 7
|
||||
})
|
||||
y += 16
|
||||
doc.text('交接人签字:____________', 14, y)
|
||||
doc.text('接收人签字:____________', 100, y)
|
||||
y += 12
|
||||
doc.text('日期:____________', 14, y)
|
||||
doc.save(`交接清单-${draftDetail.employeeName}-${draftDetail.terminationDate}.pdf`)
|
||||
}}
|
||||
>
|
||||
<Download className="w-4 h-4 mr-1" />下载交接清单
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</Card>
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user