feat: 花名册操作联动电子签署 + 修复重复创建

## 修复
- POST /contracts 不再自动创建签署记录(由前端根据signMethod决定),避免与ContractInfo重复创建

## 新增 SignMethodChoice 通用组件
- 花名册操作成功后弹窗选择签署方式:电子签/线下手签/稍后处理
- 电子签:自动创建ESignRecord(PENDING),员工在员工端签署
- 线下手签:跳转签署页面,预填员工/场景/标题,上传扫描件登记
- 稍后处理:跳过,可后续在签署页面手动发起

## 花名册4项操作联动签署方式选择
- 重新入职:操作成功后弹窗(scene=CONTRACT,劳动合同)
- 合同续签:操作成功后弹窗(scene=CONTRACT,续签劳动合同)
- 薪酬变更:操作成功后弹窗(scene=POLICY,薪酬调整确认书)
- 调岗调动:操作成功后弹窗(scene=POLICY,调岗确认书)

## ESign页面支持URL参数
- 读取 ?action=paper-sign 自动打开线下手签登记Modal
- 预填employeeId/scene/documentTitle

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:45:53 +08:00
parent 434c63c6d3
commit 3da61d5a09
4 changed files with 279 additions and 27 deletions
+2 -12
View File
@@ -312,18 +312,8 @@ router.post('/contracts', authMiddleware, async (req: AuthRequest, res, next) =>
createdBy: req.user!.id,
}).catch(() => {})
// 自动创建劳动合同电子签署记录
const esignRecord = await autoCreateEsignRecord({
orgId: req.user!.orgId,
employeeId: data.employeeId,
scene: 'CONTRACT',
documentTitle: `${emp?.name || ''}的劳动合同`,
contractId: result.id,
remark: '新增员工合同时自动发起',
createdBy: req.user!.id,
})
res.json({ success: true, data: result, esignRecord })
// 注意:电子签署记录由前端根据 signMethod 决定是否创建,避免重复
res.json({ success: true, data: result })
} catch (err) {
next(err)
}