From eb58bc4b09417d7de0811ea3d99b9010f5954abb Mon Sep 17 00:00:00 2001 From: freedakgmail Date: Thu, 23 Jul 2026 18:34:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96:=20=E5=90=88=E5=90=8C?= =?UTF-8?q?=E5=BC=80=E5=A7=8B=E6=97=A5=E6=9C=9F=E9=9A=8F=E5=85=A5=E8=81=8C?= =?UTF-8?q?=E6=97=A5=E6=9C=9F=E8=87=AA=E5=8A=A8=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 添加员工和重新入职:入职日期变更时自动同步合同开始日期和结束日期 2. 合同开始日期改为只读显示(始终等于入职日期) 3. 花名册列表增加离职日期列:已离职显示日期,待离职显示预计日期 4. 重新入职弹窗对齐添加员工:移除孕期/医疗期/工伤,合同双向计算,试用期校验 5. 后端 rehireEmployee 重置特殊状态为 false --- frontend/src/pages/Roster.tsx | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/frontend/src/pages/Roster.tsx b/frontend/src/pages/Roster.tsx index 7648f57..93dcc40 100644 --- a/frontend/src/pages/Roster.tsx +++ b/frontend/src/pages/Roster.tsx @@ -879,6 +879,19 @@ function RehireModal({ employee, onClose, onSubmit, loading, error }: { setForm({ ...form, endDate, contractYears: Math.max(1, Math.round(months / 12)) }) } + // 入职日期变更 → 同步合同开始日期 + 重算结束日期 + const handleHireDateChange = (hireDate: string) => { + if (form.contractType === 'FIXED' && form.contractYears > 0 && hireDate) { + const start = new Date(hireDate) + const end = new Date(start) + end.setFullYear(end.getFullYear() + form.contractYears) + end.setDate(end.getDate() - 1) + setForm({ ...form, hireDate, startDate: hireDate, endDate: end.toISOString().slice(0, 10) }) + } else { + setForm({ ...form, hireDate, startDate: hireDate }) + } + } + // 开始日期变更 → 重新计算结束日期 const handleStartDateChange = (startDate: string) => { if (form.contractType === 'FIXED' && form.contractYears > 0 && startDate) { @@ -932,7 +945,7 @@ function RehireModal({ employee, onClose, onSubmit, loading, error }: {
- setForm({ ...form, hireDate: e.target.value })} /> + handleHireDateChange(e.target.value)} />
@@ -950,7 +963,7 @@ function RehireModal({ employee, onClose, onSubmit, loading, error }: { setForm({ ...form, signDate: e.target.value })} />
留空表示尚未签订
-
handleStartDateChange(e.target.value)} />
+
{form.startDate || '随入职日期'}
{form.contractType === 'FIXED' && ( <> @@ -1022,6 +1035,19 @@ function AddEmployeeModal({ onClose, onSubmit, loading, error }: { contractYears: 3, probationMonths: 0, probationSalary: 0, }) + // 入职日期变更 → 同步合同开始日期 + 重算结束日期 + const handleHireDateChange = (hireDate: string) => { + if (form.contractType === 'FIXED' && form.contractYears > 0 && hireDate) { + const start = new Date(hireDate) + const end = new Date(start) + end.setFullYear(end.getFullYear() + form.contractYears) + end.setDate(end.getDate() - 1) + setForm({ ...form, hireDate, startDate: hireDate, endDate: end.toISOString().slice(0, 10) }) + } else { + setForm({ ...form, hireDate, startDate: hireDate }) + } + } + // 根据身份证号自动计算性别(第17位:奇数=男,偶数=女) const handleIdCardChange = (idCard: string) => { let gender = form.gender @@ -1148,7 +1174,7 @@ function AddEmployeeModal({ onClose, onSubmit, loading, error }: {
{form.idCardNumber.length >= 17 ? form.gender : '由身份证号自动识别'}
-
setForm({ ...form, hireDate: e.target.value })} />
+
handleHireDateChange(e.target.value)} />
setForm({ ...form, monthlySalary: e.target.value })} placeholder="元" />
@@ -1168,7 +1194,7 @@ function AddEmployeeModal({ onClose, onSubmit, loading, error }: { setForm({ ...form, signDate: e.target.value })} />
留空表示尚未签订
-
handleStartDateChange(e.target.value)} />
+
{form.startDate || '随入职日期'}
{form.contractType === 'FIXED' && ( <>