Files
shz-backend/docs/cms-public-job-fair-api.md
lapuda 5060fb0557 feat: Implement job fair company registration review workflow
- Added review status fields to the public_job_fair_company table to manage company registration states (pending, approved, rejected).
- Enhanced PublicJobFairServiceImpl to handle company registration, review, and job management for companies.
- Updated PublicJobFairMapper.xml with new SQL queries for managing company relations and reviews.
- Created migration script to add review fields and set default values for existing records.
- Introduced new permissions for company users to manage job postings and registration status.
- Added utility methods for ensuring proper role checks and company retrieval.
2026-07-15 11:34:31 +08:00

508 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# CMS 公共招聘会管理接口文档
## 基础路径
`/cms/publicJobFair`
---
## 界面功能操作指南
### 页面一:招聘会列表页
```
┌─────────────────────────────────────────────────────────────────┐
│ 公共招聘会管理 │
├─────────────────────────────────────────────────────────────────┤
│ 招聘会标题: [________] 类型: [全部▼] [搜索] [重置] [+新增] │
├─────────────────────────────────────────────────────────────────┤
│ □ | 标题 | 地址 | 类型 | 开始时间 | 操作 │
│ ───────────────────────────────────────────────────────────── │
│ □ | 春风行动招聘会 | 人力市场 | 线下 | 2026-01-20 | 编辑 删除 │
│ □ | 高校毕业生专场 | 线上 | 线上 | 2026-02-15 | 编辑 删除 │
├─────────────────────────────────────────────────────────────────┤
│ 共 2 条 < 1 > │
└─────────────────────────────────────────────────────────────────┘
```
| 操作 | 触发方式 | 调用接口 |
|------|---------|---------|
| 搜索 | 点击【搜索】按钮 | `GET /list` |
| 重置 | 点击【重置】按钮 | 清空条件后调用 `GET /list` |
| 新增 | 点击【+新增】按钮 | 打开新增弹窗 |
| 编辑 | 点击行内【编辑】 | `GET /{id}` 获取详情后打开编辑弹窗 |
| 删除 | 点击行内【删除】 | 确认后调用 `DELETE /{ids}` |
| 批量删除 | 勾选多行后点击【删除】 | `DELETE /{ids}` (逗号分隔) |
---
### 页面二:新增/编辑招聘会弹窗
```
┌─────────────────────────────────────────────────────────────────┐
│ 新增招聘会 [×] │
├─────────────────────────────────────────────────────────────────┤
│ 招聘会标题*: [________________________________] │
│ 招聘会地址*: [________________________________] │
│ 招聘会类型*: ○线上 ●线下 │
│ 开始时间*: [2026-01-20 09:00:00 📅] │
│ 结束时间*: [2026-01-20 17:00:00 📅] │
│ 报名开始时间: [2026-01-10 00:00:00 📅] │
│ 报名结束时间: [2026-01-19 23:59:59 📅] │
│ 主办单位: [________________________________] │
│ 协办单位: [________________________________] │
│ 承办单位: [________________________________] │
│ 联系电话: [________________] │
│ 招聘会简介: [________________________________] │
│ [________________________________] │
│ │
│ 地图选点: [点击选择位置 🗺️] │
│ ┌─────────────────────────────────────────┐ │
│ │ │ │
│ │ 高德地图选点组件 │ │
│ │ 📍 │ │
│ │ │ │
│ └─────────────────────────────────────────┘ │
│ 经度: [86.0419 ] 纬度: [44.3066 ] │
├─────────────────────────────────────────────────────────────────┤
│ [取消] [确定] │
└─────────────────────────────────────────────────────────────────┘
```
| 操作 | 触发方式 | 调用接口 |
|------|---------|---------|
| 地图选点 | 点击地图或搜索地址 | 高德地图API自动填充经纬度 |
| 确定(新增) | 填写表单后点击【确定】 | `POST /` |
| 确定(编辑) | 修改表单后点击【确定】 | `PUT /` |
| 取消 | 点击【取消】或【×】 | 关闭弹窗 |
---
### 页面三:招聘会详情页(含企业岗位管理)
```
┌─────────────────────────────────────────────────────────────────┐
│ 招聘会详情: 春风行动专场招聘会 [返回列表] │
├─────────────────────────────────────────────────────────────────┤
│ 基本信息 │
│ ───────────────────────────────────────────────────────────── │
│ 标题: 春风行动专场招聘会 类型: 线下 │
│ 地址: 石河子市人力资源市场 电话: 0993-2012345 │
│ 时间: 2026-01-20 09:00 ~ 17:00 │
│ 报名时间: 2026-01-10 ~ 2026-01-19 │
├─────────────────────────────────────────────────────────────────┤
│ 参会企业及岗位 [+添加企业] │
│ ───────────────────────────────────────────────────────────── │
│ ▼ 新疆某某科技有限公司 (互联网/100-499人) [移除企业] │
│ ├─ Java开发工程师 | 8K-15K | 本科 | 招2人 [+添加岗位] [移除]│
│ └─ 前端开发工程师 | 7K-12K | 大专 | 招3人 [移除]│
│ ▼ 石河子农业发展有限公司 (农业/50-99人) [移除企业] │
│ └─ 农业技术员 | 5K-8K | 大专 | 招5人 [移除]│
├─────────────────────────────────────────────────────────────────┤
│ 报名人员 [查看全部报名] │
│ ───────────────────────────────────────────────────────────── │
│ 张三 | 13800138000 | 2026-01-15 10:30 | 已报名 │
│ 李四 | 13900139000 | 2026-01-16 14:20 | 已报名 │
└─────────────────────────────────────────────────────────────────┘
```
| 操作 | 触发方式 | 调用接口 |
|------|---------|---------|
| 进入详情 | 列表页点击【编辑】或行 | `GET /{jobFairId}` |
| 添加企业 | 点击【+添加企业】 | 打开企业选择弹窗 |
| 移除企业 | 点击企业行【移除企业】 | `DELETE /company/{id}` |
| 添加岗位 | 点击企业下【+添加岗位】 | 打开岗位选择弹窗 |
| 移除岗位 | 点击岗位行【移除】 | `DELETE /job/{id}` |
| 查看全部报名 | 点击【查看全部报名】 | 跳转报名列表页 |
---
### 页面四:添加企业弹窗
```
┌─────────────────────────────────────────────────────────────────┐
│ 选择企业 [×] │
├─────────────────────────────────────────────────────────────────┤
│ 企业名称: [________] [搜索] │
├─────────────────────────────────────────────────────────────────┤
│ □ | 企业名称 | 行业 | 规模 | 类型 │
│ ───────────────────────────────────────────────────────────── │
│ ☑ | 新疆某某科技有限公司 | 互联网 | 100-499人 | 民营 │
│ ☑ | 石河子农业发展有限公司 | 农业 | 50-99人 | 国企 │
│ □ | 某某建筑工程公司 | 建筑 | 500-999人 | 民营 │
├─────────────────────────────────────────────────────────────────┤
│ [取消] [确定添加] │
└─────────────────────────────────────────────────────────────────┘
```
| 操作 | 触发方式 | 调用接口 |
|------|---------|---------|
| 搜索企业 | 输入名称点击【搜索】 | 调用企业列表接口 |
| 确定添加(单个) | 勾选1个企业点击【确定添加】 | `POST /company` |
| 确定添加(多个) | 勾选多个企业点击【确定添加】 | `POST /company/batch` |
---
### 页面五:添加岗位弹窗
```
┌─────────────────────────────────────────────────────────────────┐
│ 选择岗位 - 新疆某某科技有限公司 [×] │
├─────────────────────────────────────────────────────────────────┤
│ 岗位名称: [________] [搜索] │
├─────────────────────────────────────────────────────────────────┤
│ □ | 岗位名称 | 薪资 | 学历 | 经验 | 招聘人数 │
│ ───────────────────────────────────────────────────────────── │
│ ☑ | Java开发工程师 | 8K-15K | 本科 | 3-5年 | 2人 │
│ ☑ | 前端开发工程师 | 7K-12K | 大专 | 1-3年 | 3人 │
│ □ | 产品经理 | 10K-20K | 本科 | 5年以上| 1人 │
├─────────────────────────────────────────────────────────────────┤
│ [取消] [确定添加] │
└─────────────────────────────────────────────────────────────────┘
```
| 操作 | 触发方式 | 调用接口 |
|------|---------|---------|
| 搜索岗位 | 输入名称点击【搜索】 | 调用该企业岗位列表接口 |
| 确定添加(单个) | 勾选1个岗位点击【确定添加】 | `POST /job` |
| 确定添加(多个) | 勾选多个岗位点击【确定添加】 | `POST /job/batch` |
---
### 页面六:报名人员列表页
```
┌─────────────────────────────────────────────────────────────────┐
│ 报名人员 - 春风行动专场招聘会 [返回详情] │
├─────────────────────────────────────────────────────────────────┤
│ 用户名: [________] 状态: [全部▼] [搜索] [重置] [导出] │
├─────────────────────────────────────────────────────────────────┤
│ 用户名 | 姓名 | 手机号 | 报名时间 | 状态 │
│ ───────────────────────────────────────────────────────────── │
│ zhangsan | 张三 | 13800138000 | 2026-01-15 10:30:00 | 已报名 │
│ lisi | 李四 | 13900139000 | 2026-01-16 14:20:00 | 已报名 │
│ wangwu | 王五 | 13700137000 | 2026-01-17 09:15:00 | 已取消 │
├─────────────────────────────────────────────────────────────────┤
│ 共 3 条 < 1 > │
└─────────────────────────────────────────────────────────────────┘
```
| 操作 | 触发方式 | 调用接口 |
|------|---------|---------|
| 搜索 | 点击【搜索】按钮 | `GET /signups/{jobFairId}` |
| 重置 | 点击【重置】按钮 | 清空条件后调用 `GET /signups/{jobFairId}` |
| 导出 | 点击【导出】按钮 | 可扩展导出接口 |
---
## 接口详情
### 1. 查询招聘会列表
- **URL**: `GET /cms/publicJobFair/list`
- **权限**: `cms:publicJobFair:list`
- **请求参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| pageNum | Integer | 否 | 页码默认1 |
| pageSize | Integer | 否 | 每页条数默认10 |
| jobFairTitle | String | 否 | 招聘会标题(模糊查询) |
| jobFairType | String | 否 | 招聘会类型1-线上 2-线下) |
- **响应示例**:
```json
{
"code": 200,
"rows": [{
"jobFairId": "1",
"jobFairTitle": "2026年春风行动专场招聘会",
"jobFairAddress": "石河子市人力资源市场",
"jobFairType": "2",
"jobFairStartTime": "2026-01-20 10:00:00",
"jobFairEndTime": "2026-01-20 16:00:00",
"enterpriseNum": "3",
"boothNum": "10"
}],
"total": 1
}
```
---
### 2. 获取招聘会详情(含企业及岗位)
- **URL**: `GET /cms/publicJobFair/{jobFairId}`
- **权限**: `cms:publicJobFair:query`
- **响应示例**:
```json
{
"code": 200,
"data": {
"jobFairId": "1",
"jobFairTitle": "2026年春风行动专场招聘会",
"jobFairAddress": "石河子市人力资源市场",
"jobFairType": "2",
"jobFairStartTime": "2026-01-20 10:00:00",
"jobFairEndTime": "2026-01-20 16:00:00",
"jobFairHostUnit": "石河子市人社局",
"jobFairIntroduction": "招聘会简介...",
"latitude": 44.3066,
"longitude": 86.0419,
"companyList": [{
"id": "company-relation-id",
"companyId": 100,
"companyName": "新疆某某科技有限公司",
"scale": "100-499人",
"industry": "互联网/IT",
"companyType": "民营企业",
"jobInfoList": [{
"jobId": 200,
"jobTitle": "Java开发工程师",
"minSalary": 8000,
"maxSalary": 15000,
"education": "本科",
"experience": "3-5年",
"vacancies": 2
}]
}]
}
}
```
---
### 3. 新增招聘会
- **URL**: `POST /cms/publicJobFair`
- **权限**: `cms:publicJobFair:add`
- **请求体**:
```json
{
"jobFairTitle": "招聘会标题",
"jobFairAddress": "招聘会地址",
"jobFairType": "2",
"jobFairStartTime": "2026-02-01 09:00:00",
"jobFairEndTime": "2026-02-01 17:00:00",
"jobFairHostUnit": "主办单位",
"jobFairIntroduction": "招聘会简介",
"jobFairPhone": "联系电话",
"jobFairSignUpStartTime": "2026-01-20 00:00:00",
"jobFairSignUpEndTime": "2026-01-31 23:59:59",
"latitude": 44.3066,
"longitude": 86.0419
}
```
---
### 4. 修改招聘会
- **URL**: `PUT /cms/publicJobFair`
- **权限**: `cms:publicJobFair:edit`
- **请求体**: 同新增,需包含 `jobFairId`
---
### 5. 删除招聘会
- **URL**: `DELETE /cms/publicJobFair/{jobFairIds}`
- **权限**: `cms:publicJobFair:remove`
- **说明**: 支持批量删除多个ID用逗号分隔
---
### 6. 添加企业到招聘会
- **URL**: `POST /cms/publicJobFair/company`
- **权限**: `cms:publicJobFair:company:add`
- **请求体**:
```json
{
"jobFairId": "1",
"companyId": 100
}
```
---
### 7. 批量添加企业
- **URL**: `POST /cms/publicJobFair/company/batch`
- **请求体**:
```json
[
{"jobFairId": "1", "companyId": 100},
{"jobFairId": "1", "companyId": 101}
]
```
---
### 8. 移除招聘会企业
- **URL**: `DELETE /cms/publicJobFair/company/{id}`
- **权限**: `cms:publicJobFair:company:remove`
- **说明**: `id` 为关联表主键
---
### 9. 添加岗位到招聘会
- **URL**: `POST /cms/publicJobFair/job`
- **权限**: `cms:publicJobFair:job:add`
- **说明**: CMS 后台将已有岗位关联到招聘会;该接口不是企业端报名接口。
- **请求体**:
```json
{
"jobFairId": "1",
"jobId": 200,
"companyId": 100
}
```
---
### 10. 批量添加岗位
- **URL**: `POST /cms/publicJobFair/job/batch`
- **权限**: `cms:publicJobFair:job:add`
- **说明**: CMS 后台批量将已有岗位关联到招聘会;该接口不是企业端报名接口。
- **请求体**:
```json
[
{"jobFairId": "1", "jobId": 200, "companyId": 100},
{"jobFairId": "1", "jobId": 201, "companyId": 100}
]
```
---
### 11. 移除招聘会岗位
- **URL**: `DELETE /cms/publicJobFair/job/{id}`
- **权限**: `cms:publicJobFair:job:remove`
---
### 12. 查询招聘会报名列表
- **URL**: `GET /cms/publicJobFair/signups/{jobFairId}`
- **权限**: `cms:publicJobFair:query`
- **响应示例**:
```json
{
"code": 200,
"rows": [{
"id": 1,
"jobFairId": 1,
"userId": 1,
"userName": "zhangsan",
"realName": "张三",
"phone": "13800138000",
"signUpTime": "2026-01-15 10:30:00",
"status": "0"
}],
"total": 1
}
```
---
### 13. 查询招聘会企业及岗位
- **URL**: `GET /cms/publicJobFair/companies/{jobFairId}`
- **权限**: `cms:publicJobFair:query`
---
## 企业端报名并添加岗位
CMS 企业角色现在支持分阶段报名:
1. 企业在招聘会列表看到【报名】按钮和报名审核状态;
2. 报名后状态为 `0-待审核`,企业可以查看招聘会详情,但不能维护报名岗位;
3. 管理员审核通过后状态为 `1-通过`,企业列表显示【编辑报名岗位】,可以新增、修改、删除本企业岗位;
4. 驳回状态为 `2-驳回`,列表显示审核意见,并允许企业重新报名。
列表接口在企业角色下会补充以下字段:
| 字段 | 说明 |
|------|------|
| `isSignUp` | 是否已有报名记录,`0` 否,`1` 是 |
| `enterpriseId` | 当前企业 ID |
| `enterpriseReviewStatus` | `0` 待审核、`1` 通过、`2` 驳回 |
| `enterpriseReviewComments` | 管理员审核意见 |
| `canSignUp` | 是否显示报名按钮 |
| `canEditJobs` | 审核通过后是否显示编辑报名岗位 |
### CMS 企业报名
- **URL**: `POST /cms/publicJobFair/{jobFairId}/company/signup`
- **权限**: `cms:publicJobFair:signup`
- **说明**: 只允许企业角色调用,创建或重新提交企业报名记录,状态为 `0` 待审核。
### CMS 企业新增报名岗位
- **URL**: `POST /cms/publicJobFair/{jobFairId}/company/jobs`
- **权限**: `cms:publicJobFair:job:add`
- **请求体**: `Job` 对象,服务端强制使用当前企业 ID。
- **限制**: 当前企业报名审核通过后才允许新增。
### CMS 企业修改报名岗位
- **URL**: `PUT /cms/publicJobFair/{jobFairId}/company/jobs/{jobId}`
- **权限**: `cms:publicJobFair:job:edit`
- **限制**: 只能修改当前企业自己的岗位,且企业报名审核必须通过。
### CMS 企业删除报名岗位
- **URL**: `DELETE /cms/publicJobFair/{jobFairId}/company/jobs/{jobId}`
- **权限**: `cms:publicJobFair:job:remove`
- **限制**: 只能删除当前企业自己的报名岗位,且企业报名审核必须通过;同时移除招聘会岗位关联并逻辑删除岗位。
### 管理员审核参会企业
- **URL**: `PUT /cms/publicJobFair/{jobFairId}/companies/{relationId}/review`
- **权限**: `cms:publicJobFair:review`
- **请求体**:
```json
{
"reviewStatus": "1",
"reviewRemark": ""
}
```
`reviewStatus` 取值:`0` 待审核、`1` 通过、`2` 驳回。驳回时 `reviewRemark` 必填。
管理员详情接口 `GET /cms/publicJobFair/{jobFairId}` 返回企业项的 `canReview``canAddJob``canRemoveCompany`;只有 `reviewStatus=1` 时,`canAddJob``canRemoveCompany``true`。服务端也会再次校验该状态。
企业用户报名公共招聘会并填写参会岗位,使用以下企业端接口,不调用 CMS 的岗位关联接口:
- **URL**: `POST /app/fair/company/signUp`
- **认证**: 企业端 `Bearer` token
- **请求体**:
```json
{
"jobFairId": "1051",
"jobList": [
{
"jobTitle": "Java开发工程师",
"minSalary": 8000,
"maxSalary": 15000,
"education": "本科",
"experience": "1-3年",
"vacancies": 5,
"jobAddress": "石河子市",
"description": "负责核心系统开发",
"type": "0"
}
]
}
```
该接口会校验企业身份、企业信息和重复报名,并在一次事务中完成企业报名、岗位创建及招聘会-岗位关联。完整字段和错误响应见 [企业报名招聘会接口文档](app-company-job-fair-signup-api.md)。
---
## 数据字典
### 招聘会类型 (jobFairType)
| 值 | 说明 |
|---|------|
| 1 | 线上招聘会 |
| 2 | 线下招聘会 |
### 报名状态 (status)
| 值 | 说明 |
|---|------|
| 0 | 已报名 |
| 1 | 已取消 |