feat: 待签合同支持登记线下签署日期

- 线下手签合同:展开后可点击「登记签署日期」选择日期并保存
  保存后合同从待签列表移除(signDate 已填写)
- 电子签合同:签署日期由电签系统自动回写,不可手动修改
- 后端新增 POST /esign/sign-date 接口
  电子签合同拒绝手动修改签署日期

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-16 12:13:07 +08:00
parent 79145b47b9
commit 040c5a3ab9
8 changed files with 344 additions and 50 deletions
+6 -2
View File
@@ -3,6 +3,7 @@ import prisma from '../lib/prisma'
import { decrypt } from '../lib/crypto'
import { authMiddleware, AuthRequest } from '../middleware/auth'
import { z } from 'zod'
import { isInProbation } from '../services/contract.service'
const router = Router()
router.use(authMiddleware)
@@ -377,8 +378,11 @@ router.post('/payslip/batch-generate', async (req: AuthRequest, res: Response, n
const deduction = deductions[emp.id] || 0
let baseSalary = 0
if (emp.contracts[0]?.probationSalary && new Date(emp.contracts[0].startDate) > new Date(Date.now() - 365 * 24 * 60 * 60 * 1000)) {
baseSalary = emp.contracts[0].probationSalary
// 按月份判定是否仍在试用期
const monthEnd = new Date(`${month}-28T23:59:59`)
const latestContract = emp.contracts[0]
if (isInProbation(latestContract, monthEnd) && latestContract?.probationSalary > 0) {
baseSalary = latestContract.probationSalary
} else if (emp.monthlySalary) {
try {
baseSalary = Number(decrypt(emp.monthlySalary)) || 0