From 922a19da2ce99358b6ccf218dc9fb98d3dc4ec10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=A1=BA=E4=B8=9C?= <577732344@qq.com> Date: Tue, 13 Jan 2026 20:16:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=81=E4=B8=9A=E6=8A=A5=E5=90=8D=E6=8B=9B?= =?UTF-8?q?=E8=81=98=E4=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/app-company-job-fair-signup-api.md | 152 +++++++++++++++++ docs/app-company-login-register-api.md | 156 ++++++++++++++++++ .../cms/controller/app/AppFairController.java | 12 ++ .../cms/domain/vo/CompanyJobFairSignUpVO.java | 25 +++ .../cms/service/rc/IJobFairSignUpService.java | 8 + .../rc/impl/JobFairSignUpServiceImpl.java | 106 ++++++++++++ .../java/com/ruoyi/cms/util/RoleUtils.java | 34 ++++ 7 files changed, 493 insertions(+) create mode 100644 docs/app-company-job-fair-signup-api.md create mode 100644 docs/app-company-login-register-api.md create mode 100644 ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/CompanyJobFairSignUpVO.java diff --git a/docs/app-company-job-fair-signup-api.md b/docs/app-company-job-fair-signup-api.md new file mode 100644 index 0000000..e77c526 --- /dev/null +++ b/docs/app-company-job-fair-signup-api.md @@ -0,0 +1,152 @@ +# 企业报名招聘会接口文档 + +## 企业报名招聘会并填写岗位 + +**接口地址:** `POST /app/fair/company/signUp` + +**接口说明:** 企业用户报名公共招聘会(PublicJobFair),同时填写参会岗位信息 + +**请求头:** +``` +Authorization: Bearer {token} +Content-Type: application/json +``` + +**请求参数(Body JSON):** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| jobFairId | String | 是 | 招聘会ID | +| jobList | Array | 是 | 岗位列表 | + +**岗位对象(jobList中的元素)字段:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| jobTitle | String | 是 | 职位名称 | +| minSalary | Long | 否 | 最小薪资(元) | +| maxSalary | Long | 否 | 最大薪资(元) | +| education | String | 否 | 学历要求(对应字典education) | +| experience | String | 否 | 工作经验要求(对应字典experience) | +| vacancies | Long | 否 | 招聘人数 | +| jobLocation | String | 否 | 岗位区划 | +| jobAddress | String | 否 | 工作地点 | +| description | String | 否 | 岗位描述 | +| jobCategory | String | 否 | 岗位分类 | +| type | String | 否 | 类型(0常规岗位 1就业见习岗位 2实习实训岗位 3社区实践岗位 4零工) | + +**请求示例:** + +```json +{ + "jobFairId": "1", + "jobList": [ + { + "jobTitle": "Java开发工程师", + "minSalary": 8000, + "maxSalary": 15000, + "education": "本科", + "experience": "1-3年", + "vacancies": 5, + "jobLocation": "石河子市", + "jobAddress": "石河子市北四路", + "description": "负责公司核心系统开发", + "type": "0" + }, + { + "jobTitle": "前端开发工程师", + "minSalary": 7000, + "maxSalary": 12000, + "education": "大专", + "experience": "1年以下", + "vacancies": 3, + "jobAddress": "石河子市北四路", + "description": "负责公司前端页面开发", + "type": "0" + } + ] +} +``` + +**响应参数:** + +| 参数名 | 类型 | 说明 | +|--------|------|------| +| code | Number | 状态码,200 表示成功 | +| msg | String | 提示信息 | +| data | Number | 成功创建的岗位数量 | + +**响应示例(成功):** + +```json +{ + "code": 200, + "msg": "报名成功", + "data": 2 +} +``` + +**错误响应示例:** + +```json +{ + "code": 500, + "msg": "仅企业用户可报名招聘会" +} +``` + +```json +{ + "code": 500, + "msg": "您的企业已报名该招聘会,请勿重复报名" +} +``` + +--- + +## cURL 测试示例 + +```bash +curl -X POST http://localhost:9091/app/fair/company/signUp \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer {your_token}" \ + -d '{ + "jobFairId": "1", + "jobList": [ + { + "jobTitle": "Java开发工程师", + "minSalary": 8000, + "maxSalary": 15000, + "education": "本科", + "experience": "1-3年", + "vacancies": 5, + "jobAddress": "石河子市北四路", + "description": "负责公司核心系统开发" + } + ] + }' +``` + +--- + +## 业务逻辑说明 + +1. 校验当前用户是否为企业用户(is_company_user=0) +2. 通过用户的 idCard(企业信用代码)查询企业信息 +3. 检查企业是否已报名该招聘会(查询 public_job_fair_company 表) +4. 创建企业-招聘会关联记录(public_job_fair_company 表) +5. 批量插入岗位信息(job 表) +6. 创建岗位-招聘会关联记录(public_job_fair_job 表) + +## 数据表关系 + +``` +public_job_fair (招聘会主表) + │ + ├── public_job_fair_company (企业关联表) + │ └── company_id → company 表 + │ + └── public_job_fair_job (岗位关联表) + ├── job_id → job 表 + └── company_id → company 表 +``` diff --git a/docs/app-company-login-register-api.md b/docs/app-company-login-register-api.md new file mode 100644 index 0000000..7f4ee12 --- /dev/null +++ b/docs/app-company-login-register-api.md @@ -0,0 +1,156 @@ +# 企业用户登录注册二合一接口文档 + +## 接口说明 + +**接口地址:** `POST /app/company/loginOrRegister` + +**接口说明:** +- 根据手机号查询企业用户,存在则登录,不存在则注册 +- 登录时只需传手机号和密码 +- 注册时需额外传企业信用代码和企业名称 +- 注册时会根据企业信用代码判断企业是否已注册 + +--- + +## 请求参数(Body JSON) + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| username | String | 是 | 手机号码 | +| password | String | 是 | 登录密码 | +| companyCode | String | 注册时必填 | 企业信用代码(统一社会信用代码) | +| companyName | String | 注册时必填 | 企业名称 | + +--- + +## 登录场景 + +**请求示例:** + +```json +{ + "username": "13800138000", + "password": "123456" +} +``` + +**响应示例(登录成功):** + +```json +{ + "code": 200, + "msg": "操作成功", + "token": "eyJhbGciOiJIUzUxMiJ9...", + "isNewUser": false, + "companyCode": "91110000MA00ABCD1X", + "companyName": "北京某某科技有限公司" +} +``` + +**错误响应:** + +```json +{ + "code": 500, + "msg": "密码错误,请重新输入!" +} +``` + +--- + +## 注册场景 + +**请求示例:** + +```json +{ + "username": "13800138000", + "password": "123456", + "companyCode": "91110000MA00ABCD1X", + "companyName": "北京某某科技有限公司" +} +``` + +**响应示例(注册成功):** + +```json +{ + "code": 200, + "msg": "注册成功!", + "token": "eyJhbGciOiJIUzUxMiJ9...", + "isNewUser": true, + "companyCode": "91110000MA00ABCD1X", + "companyName": "北京某某科技有限公司" +} +``` + +**错误响应(企业已注册):** + +```json +{ + "code": 500, + "msg": "该企业已注册,请联系企业管理员加入组织!" +} +``` + +**错误响应(缺少企业信息):** + +```json +{ + "code": 500, + "msg": "企业信用代码不能为空!" +} +``` + +--- + +## 响应参数 + +| 参数名 | 类型 | 说明 | +|--------|------|------| +| code | Number | 状态码,200 表示成功 | +| msg | String | 提示信息 | +| token | String | 登录令牌 | +| isNewUser | Boolean | 是否新用户(true=注册,false=登录) | +| companyCode | String | 企业信用代码 | +| companyName | String | 企业名称 | + +--- + +## cURL 测试示例 + +**登录(已注册用户):** + +```bash +curl -X POST http://localhost:8080/app/company/loginOrRegister \ + -H "Content-Type: application/json" \ + -d '{"username":"13800138000","password":"123456"}' +``` + +**注册(新用户):** + +```bash +curl -X POST http://localhost:8080/app/company/loginOrRegister \ + -H "Content-Type: application/json" \ + -d '{"username":"13800138000","password":"123456","companyCode":"91110000MA00ABCD1X","companyName":"北京某某科技有限公司"}' +``` + +--- + +## 业务逻辑流程 + +``` +1. 根据手机号 + is_company_user=0 查询 app_user + │ + ├── 用户存在 → 校验密码 → 登录成功(isNewUser=false) + │ + └── 用户不存在 → 检查是否传了 companyCode/companyName + │ + ├── 未传 → 返回错误"企业信用代码不能为空!" + │ + └── 已传 → 根据 companyCode 查询 company 表 + │ + ├── 企业已存在 → 返回错误"该企业已注册,请联系企业管理员加入组织!" + │ + └── 企业不存在 → 创建 company + app_user → 注册成功(isNewUser=true) +``` diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppFairController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppFairController.java index 1f408d0..e3d8725 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppFairController.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppFairController.java @@ -2,6 +2,7 @@ package com.ruoyi.cms.controller.app; import com.ruoyi.cms.domain.JobFair; +import com.ruoyi.cms.domain.vo.CompanyJobFairSignUpVO; import com.ruoyi.cms.service.IFairCollectionService; import com.ruoyi.cms.service.IJobFairService; import com.ruoyi.cms.service.rc.IJobFairSignUpService; @@ -123,4 +124,15 @@ public class AppFairController extends BaseController List results = jobFairService.getCurrentMonthFairs(jobFair); return getDataTable(results); } + + /** + * 企业报名招聘会并填写岗位 + */ + @BussinessLog(title = "企业报名招聘会") + @ApiOperation("企业报名招聘会并填写岗位") + @PostMapping("/company/signUp") + public AjaxResult companySignUp(@RequestBody CompanyJobFairSignUpVO signUpVO) + { + return jobFairSignUpService.companySignUp(signUpVO); + } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/CompanyJobFairSignUpVO.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/CompanyJobFairSignUpVO.java new file mode 100644 index 0000000..cd358a7 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/CompanyJobFairSignUpVO.java @@ -0,0 +1,25 @@ +package com.ruoyi.cms.domain.vo; + +import com.ruoyi.cms.domain.Job; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 企业报名招聘会请求VO + */ +@Data +@ApiModel("企业报名招聘会请求") +public class CompanyJobFairSignUpVO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "招聘会ID", required = true) + private String jobFairId; + + @ApiModelProperty(value = "岗位列表", required = true) + private List jobList; +} diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/rc/IJobFairSignUpService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/rc/IJobFairSignUpService.java index 017b3d4..12bcab7 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/rc/IJobFairSignUpService.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/rc/IJobFairSignUpService.java @@ -1,5 +1,8 @@ package com.ruoyi.cms.service.rc; +import com.ruoyi.cms.domain.vo.CompanyJobFairSignUpVO; +import com.ruoyi.common.core.domain.AjaxResult; + /** * 招聘会报名Service接口 */ @@ -14,4 +17,9 @@ public interface IJobFairSignUpService { * 取消报名 */ int cancelSignUp(Long jobFairId); + + /** + * 企业报名招聘会并填写岗位 + */ + AjaxResult companySignUp(CompanyJobFairSignUpVO signUpVO); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/rc/impl/JobFairSignUpServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/rc/impl/JobFairSignUpServiceImpl.java index e0a36d5..069e675 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/rc/impl/JobFairSignUpServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/rc/impl/JobFairSignUpServiceImpl.java @@ -1,15 +1,32 @@ package com.ruoyi.cms.service.rc.impl; +import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.cms.domain.Job; import com.ruoyi.cms.domain.rc.JobFairSignUp; +import com.ruoyi.cms.domain.rc.PublicJobFairCompany; +import com.ruoyi.cms.domain.rc.PublicJobFairJob; +import com.ruoyi.cms.domain.vo.CompanyJobFairSignUpVO; +import com.ruoyi.cms.mapper.JobMapper; import com.ruoyi.cms.mapper.rc.JobFairSignUpMapper; +import com.ruoyi.cms.mapper.rc.PublicJobFairMapper; +import com.ruoyi.cms.service.ICompanyService; import com.ruoyi.cms.service.rc.IJobFairSignUpService; +import com.ruoyi.cms.util.RoleUtils; +import com.ruoyi.cms.util.StringUtil; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.AppUser; +import com.ruoyi.common.core.domain.entity.Company; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SiteSecurityUtils; +import com.ruoyi.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.Date; +import java.util.List; /** * 招聘会报名Service业务层处理 @@ -20,6 +37,15 @@ public class JobFairSignUpServiceImpl extends ServiceImpl existCompanies = publicJobFairMapper.selectCompanyListByJobFairId(jobFairId); + boolean alreadySignUp = existCompanies.stream().anyMatch(c -> companyId.equals(c.getCompanyId())); + if (alreadySignUp) { + return AjaxResult.error("您的企业已报名该招聘会,请勿重复报名"); + } + + // 5. 创建企业-招聘会关联 (public_job_fair_company) + PublicJobFairCompany fairCompany = new PublicJobFairCompany(); + fairCompany.setId(IdUtil.simpleUUID()); + fairCompany.setJobFairId(jobFairId); + fairCompany.setCompanyId(companyId); + fairCompany.setCreateTime(new Date()); + publicJobFairMapper.insertJobFairCompany(fairCompany); + + // 6. 批量插入岗位到job表,并创建岗位-招聘会关联 + List jobList = signUpVO.getJobList(); + List fairJobList = new ArrayList<>(); + + for (Job job : jobList) { + // 插入岗位 + job.setJobId(null); + job.setCompanyId(companyId); + job.setCompanyName(company.getName()); + job.setIsPublish(1); + job.setView(0L); + job.setApplyNum(0); + jobMapper.insert(job); + + // 创建岗位-招聘会关联 + PublicJobFairJob fairJob = new PublicJobFairJob(); + fairJob.setId(IdUtil.simpleUUID()); + fairJob.setJobFairId(jobFairId); + fairJob.setJobId(job.getJobId()); + fairJob.setCompanyId(companyId); + fairJob.setCreateTime(new Date()); + fairJobList.add(fairJob); + } + + // 批量插入岗位-招聘会关联 + if (!fairJobList.isEmpty()) { + publicJobFairMapper.insertJobFairJobBatch(fairJobList); + } + + return AjaxResult.success("报名成功", jobList.size()); + } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/RoleUtils.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/RoleUtils.java index d101fa4..0d86f0b 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/RoleUtils.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/RoleUtils.java @@ -1,6 +1,7 @@ package com.ruoyi.cms.util; import com.ruoyi.common.core.domain.entity.AppUser; +import com.ruoyi.common.core.domain.entity.Company; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginSiteUser; import com.ruoyi.common.core.domain.model.LoginUser; @@ -74,4 +75,37 @@ public class RoleUtils { } return appUser.getIsCompanyUser(); } + + /** + * 获取当前登录的App用户 + * @return AppUser + */ + public static AppUser getAppUser() { + if (!SiteSecurityUtils.isLogin()) { + return null; + } + LoginSiteUser loginSiteUser = SiteSecurityUtils.getLoginUser(); + return loginSiteUser.getUser(); + } + + /** + * 判断当前用户是否是企业用户 + * @return true=企业用户 + */ + public static boolean isCompanyUser() { + AppUser appUser = getAppUser(); + return appUser != null && StringUtil.IS_COMPANY_USER.equals(appUser.getIsCompanyUser()); + } + + /** + * 获取当前企业用户的企业信用代码 + * @return 企业信用代码,非企业用户返回null + */ + public static String getCompanyCode() { + AppUser appUser = getAppUser(); + if (appUser != null && StringUtil.IS_COMPANY_USER.equals(appUser.getIsCompanyUser())) { + return appUser.getIdCard(); + } + return null; + } } \ No newline at end of file