编辑 | blame | 历史 | 原始文档

员工合同管理 - 前端联调方案

涉及页面

  • 新增「员工合同」管理页:views/hrm/employee/contract/index.vue
  • 新增「员工合同」菜单(已配置后端菜单,挂载在 HRM → 人力资源 下、与「员工管理」平级,component = hrm/employee/contract/index;不要挂到「员工管理」下,否则该菜单会变成目录导致员工列表页无法直达)
  • 选择员工下拉:复用现有员工精简列表接口
  • 员工详情页:新增「员工合同」Tab,展示该员工签订的全部合同(复用 /hrm/employee-contract/page,按 employeeId 过滤)

业务流程与数据带入

  1. 创建合同:员工从 /hrm/employee/simple-list 下拉选择 → 自动带入员工(无需再选部门/岗位)
  2. 续签合同:合同列表操作列「续签」按钮 → 自动带入该员工 + 上份合同的类型/期限/签约主体/工资,日期需重新填写;提交时显式传 parentId 指向被续签合同
  3. 合同列表:按合同编号、员工、合同类型、期限类型、合同状态、到期类型筛选
  4. 解除/终止:仅对"待生效/生效中/即将到期"的合同可操作,弹出确认框填写解除日期与原因
  5. 到期提醒:列表支持「即将到期 / 已到期」快捷筛选;HRM 首页可调用 expiring-count 展示即将到期合同数量

API

方法 路径 说明
POST /hrm/employee-contract/create 新增合同
PUT /hrm/employee-contract/update 修改合同
PUT /hrm/employee-contract/terminate 解除/终止合同
DELETE /hrm/employee-contract/delete 删除合同
GET /hrm/employee-contract/get 合同详情(含附件)
GET /hrm/employee-contract/page 合同分页
GET /hrm/employee-contract/expiring-count 即将到期合同数量(供待办/首页提醒)

创建/修改合同

请求参数(create/update 共用):

参数 类型 必填 说明
id Long 合同ID(修改时必传)
employeeId Long 员工ID
parentId Long 续签上一份合同ID。**续签按钮**点击时前端会传(指向被续签的合同);普通新增不传,后端自动关联该员工最近一份合同
contractType Integer 合同类型,字典 hrm_contract_type:1-劳动合同 2-劳务合同 3-实习协议 4-劳务派遣 5-其他
contractTermType Integer 期限类型,字典 hrm_contract_term_type:1-固定期限 2-无固定期限 3-以完成一定工作任务为期限
signCompany String 签约主体(公司全称)
signDate date 签订日期
startDate date 合同开始日期
endDate date 合同结束日期(无固定期限可为空)
probationStartDate date 试用期开始日期
probationEndDate date 试用期结束日期
probationSalary BigDecimal 试用期工资
regularSalary BigDecimal 转正工资
remark String 备注
blobIds Array 合同附件 blobId 列表

校验规则(后端强制):
- 期限类型 ≠ 无固定期限(2) 时,endDate 必填
- startDate 不能晚于 endDate;试用期开始不能晚于试用期结束
- 合同编号由后端自动生成(HT + 日期 + 序号),前端无需填写、不可修改

响应示例:

{
  "code": 0,
  "data": 1
}

解除/终止合同

请求参数:

参数 类型 必填 说明
id Long 合同ID
terminateStatus Integer 1-已解除 2-已终止
terminateDate date 解除/终止日期
terminateReason String 解除/终止原因

响应: { "code": 0, "data": true }

合同分页

请求参数(筛选):

参数 类型 说明
pageNo / pageSize Integer 分页参数
contractNo String 合同编号(模糊匹配)
employeeId Long 员工ID
contractType Integer 合同类型
contractTermType Integer 期限类型
terminateStatus Integer 0-正常 1-已解除 2-已终止
status Integer 合同状态(动态计算):1-待生效 2-生效中 3-即将到期 4-已到期 5-已解除 6-已终止
expiryType Integer 到期类型:1-即将到期 2-已到期(待办提醒用,与 status 互斥)

响应字段新增:

字段 类型 说明
contractNo String 合同编号(自动生成)
parentId Long 续签上一份合同ID
parentNo String 续签上一份合同编号(前端展示"续签自")
isCurrent Boolean 是否员工当前生效合同(true 时前端打标)
employeeName String 员工姓名(自动填充)
employeeNo String 员工工号(自动填充)
deptName String 部门名称(自动填充)
status Integer 合同状态(后端按当前日期动态计算)
attachmentList Array 附件列表(仅详情接口返回)

响应示例:

{
  "code": 0,
  "data": {
    "list": [
      {
        "id": 1,
        "contractNo": "HT202608100001",
        "employeeId": 1,
        "employeeName": "张三",
        "employeeNo": "EMP202401010001",
        "deptName": "研发部",
        "contractType": 1,
        "contractTermType": 1,
        "startDate": "2026-01-01",
        "endDate": "2027-01-01",
        "status": 2,
        "terminateStatus": 0
      }
    ],
    "total": 1
  }
}

字段展示规则

字段 列表 表单 详情 说明
合同编号 只读自动生成 HT + 日期 + 序号
员工姓名 下拉选择 复用员工精简列表
部门名称 自动带入 选择员工后展示
合同类型 下拉 字典 hrm_contract_type
期限类型 下拉 字典 hrm_contract_term_type
签订日期 日期
开始/结束日期 日期 无固定期限结束日期可空
试用期起止 日期
试用期/转正工资 数字

| 合同状态 | ✅ 标签 | - | ✅ | 动态计算,按颜色区分:生效中(绿)/即将到期(橙)/已到期(灰)/已解除·已终止(红)/待生效(蓝) |
| 附件 | - | 上传 | ✅ | 走系统附件上传 |
| 操作 | ✅ | - | - | 编辑 / 解除/终止 / 删除 |

附件对接流程

  1. 上传:调用 POST /system/storage-blob/upload 获取 blobId
  2. 保存合同:表单 blobIds 字段传 blobId 数组,后端绑定
  3. 查询:详情接口返回 attachmentList;列表页如需单独刷新附件,可调用 GET /system/storage-attachment/list?recordType=hrm_employee_contract&recordId=xxx
  4. 业务表不存文件地址,禁止在前端调用 /infra/file/* 旧接口

业务规则说明

多合同设计:一个员工可签订多次合同(续签/换签)。数据表通过 parent_id(续签上一份合同ID)形成续签链,通过 is_current(是否当前生效合同)标识员工当前合同;同一员工任意时刻仅一份 is_current=true 的合同。

场景 规则
状态计算 已解除(5)/已终止(6) > 已到期(4) > 待生效(1) > 即将到期(3) > 生效中(2),后端按当前日期动态计算,前端无需维护
即将到期 结束日期在当天起的 30 天内(含当天)且未解除/终止
续签关联 操作列「续签」按钮点击时前端显式传 parent_id 指向被续签合同;普通新增不传,后端自动把该员工最近一份合同作为 parent_id(续签链)。前端列表/详情展示"续签自 xxx"
当前合同 创建新合同时,后端自动清除该员工旧合同的 is_current 并置新合同为 true;解除/终止当前合同时自动清除标记
时间重叠 后端强制校验:同一员工不能存在时间重叠的未解除/未终止合同(无固定期限视为无限长),报错"该员工在所选时间段已存在生效合同",需先解除/终止旧合同或调整日期
解除/终止 仅未解除/未终止的合同可操作;已解除/已终止合同不可重复操作;操作后状态固定为已解除/已终止
编辑限制 已解除/已终止的合同建议只读展示,不允许修改起止日期(后端未强制,前端提示即可)
删除 直接删除记录并级联删除附件
到期提醒 列表「即将到期」筛选 = status=3 或 expiryType=1;首页可通过 expiring-count 展示数量
员工维度 合同页按员工筛选可查看某员工全部合同;员工详情页「员工合同」Tab 展示该员工全部合同并标记当前合同

注意事项

  • 合同编号唯一,由后端生成,前端不能修改
  • 新增/编辑合同的校验(固定期限必须填结束日期、日期先后)由后端返回明确错误提示,前端表单校验可同步加上
  • 列表状态列需根据 status 值映射字典 hrm_contract_status 展示中文与颜色
  • 解除/终止操作需二次确认,避免误操作
  • 分页查询附件列表为空时不返回该字段,前端需做空值兼容