上传岗位添加新接口以及处理上传数据等。

This commit is contained in:
chenyanchang
2026-06-08 23:42:00 +08:00
parent 715cc55a8c
commit cf858f7bf5
5 changed files with 87 additions and 5 deletions

View File

@@ -2,14 +2,21 @@ package com.ruoyi.cms.controller.app;
import com.ruoyi.cms.service.ICompanyService; import com.ruoyi.cms.service.ICompanyService;
import com.ruoyi.cms.service.IJobService; import com.ruoyi.cms.service.IJobService;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/** /**
* 岗位Controller * 岗位Controller
@@ -46,6 +53,24 @@ public class AppScriptController extends BaseController
jobService.importRow(path); jobService.importRow(path);
return success(); return success();
} }
//导入原始数据
@GetMapping("/importRow/v2")
public AjaxResult importRowV2(@RequestParam("file") MultipartFile file)
{
// 上传文件路径
String filePath = RuoYiConfig.getUploadPath();
// 上传并返回新文件名称
String fileName = null;
try {
fileName = FileUploadUtils.upload(filePath, file);
} catch (IOException e) {
error("读取文件出错");
}
String path = filePath + fileName.replace("profile/upload/", "");
jobService.importRow(path);
return success();
}
// 导入500强 // 导入500强
@GetMapping("/importLabel500") @GetMapping("/importLabel500")
public void importLabel() public void importLabel()

View File

@@ -1,5 +1,6 @@
package com.ruoyi.cms.domain.query; package com.ruoyi.cms.domain.query;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.cms.domain.Job; import com.ruoyi.cms.domain.Job;
import lombok.Data; import lombok.Data;
@@ -10,7 +11,9 @@ import lombok.Data;
@Data @Data
public class JobSearch extends Job { public class JobSearch extends Job {
//查询开始时间 //查询开始时间
@TableField(exist = false)
private String startDate; private String startDate;
//查询结束时间 //查询结束时间
@TableField(exist = false)
private String endDate; private String endDate;
} }

View File

@@ -1,5 +1,6 @@
package com.ruoyi.cms.mapper; package com.ruoyi.cms.mapper;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -64,4 +65,8 @@ public interface JobMapper extends BaseMapper<Job>
Integer getTotals(Job job); Integer getTotals(Job job);
Long updateReviewStatus(@Param("jobId") Long jobId, @Param("reviewStatus") String reviewStatus); Long updateReviewStatus(@Param("jobId") Long jobId, @Param("reviewStatus") String reviewStatus);
//删除岗位
@InterceptorIgnore(blockAttack = "true")
Long delRowWork();
} }

View File

@@ -3,6 +3,7 @@ package com.ruoyi.cms.service.impl;
import cn.hutool.http.HttpUtil; import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONArray;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -743,6 +744,10 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
public void importRow(String path) { public void importRow(String path) {
try { try {
logger.info("开始导入Excel数据..."); logger.info("开始导入Excel数据...");
//先清理旧数据
Long oldDataNum = jobMapper.delRowWork();
logger.info("删除旧的row-work..." + oldDataNum);
// 读取Excel文件中的数据 // 读取Excel文件中的数据
List<RowWork> rowWorks = ExcelToObject.readExcelToObjects(path, RowWork.class); List<RowWork> rowWorks = ExcelToObject.readExcelToObjects(path, RowWork.class);
logger.info("从Excel中读取到 {} 条数据", rowWorks.size()); logger.info("从Excel中读取到 {} 条数据", rowWorks.size());
@@ -753,6 +758,11 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
orgDataMap.put("58同城", new ArrayList<>()); orgDataMap.put("58同城", new ArrayList<>());
orgDataMap.put("前程无忧", new ArrayList<>()); orgDataMap.put("前程无忧", new ArrayList<>());
orgDataMap.put("猎聘网", new ArrayList<>()); orgDataMap.put("猎聘网", new ArrayList<>());
orgDataMap.put("石河子人才网2", new ArrayList<>());
orgDataMap.put("石河子招聘网", new ArrayList<>());
orgDataMap.put("天互招聘网", new ArrayList<>());
orgDataMap.put("乌鲁木齐快聘网", new ArrayList<>());
orgDataMap.put("新疆人才网", new ArrayList<>());
// 遍历数据按ORG分类每类最多取20000条 // 遍历数据按ORG分类每类最多取20000条
for (RowWork rowWork : rowWorks) { for (RowWork rowWork : rowWorks) {
@@ -769,11 +779,23 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
int zlCount = orgDataMap.get("智联招聘").size(); int zlCount = orgDataMap.get("智联招聘").size();
int tcCount = orgDataMap.get("58同城").size(); int tcCount = orgDataMap.get("58同城").size();
int qcCount = orgDataMap.get("前程无忧").size(); int qcCount = orgDataMap.get("前程无忧").size();
int lpCount = orgDataMap.get("前程无忧").size(); int lpCount = orgDataMap.get("猎聘网").size();
int shzrc2Count = orgDataMap.get("石河子人才网2").size();
int shzzpCount = orgDataMap.get("石河子招聘网").size();
int thzpCount = orgDataMap.get("天互招聘网").size();
int wlmqkpCount = orgDataMap.get("乌鲁木齐快聘网").size();
int xjrcCount = orgDataMap.get("新疆人才网").size();
logger.info("智联招聘数据量: {}", zlCount); logger.info("智联招聘数据量: {}", zlCount);
logger.info("58同城数据量: {}", tcCount); logger.info("58同城数据量: {}", tcCount);
logger.info("前程无忧数据量: {}", qcCount); logger.info("前程无忧数据量: {}", qcCount);
logger.info("猎聘网数据量: {}", lpCount); logger.info("猎聘网数据量: {}", lpCount);
logger.info("石河子人才网2数据量: {}", shzrc2Count);
logger.info("石河子招聘网数据量: {}", shzzpCount);
logger.info("天互招聘网数据量: {}", thzpCount);
logger.info("乌鲁木齐快聘网数据量: {}", wlmqkpCount);
logger.info("新疆人才网数据量: {}", xjrcCount);
// 合并所有数据(智联招聘 + 58同城 + 前程无忧) // 合并所有数据(智联招聘 + 58同城 + 前程无忧)
List<RowWork> allData = new ArrayList<>(); List<RowWork> allData = new ArrayList<>();
@@ -781,6 +803,11 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
allData.addAll(orgDataMap.get("58同城")); allData.addAll(orgDataMap.get("58同城"));
allData.addAll(orgDataMap.get("前程无忧")); allData.addAll(orgDataMap.get("前程无忧"));
allData.addAll(orgDataMap.get("猎聘网")); allData.addAll(orgDataMap.get("猎聘网"));
allData.addAll(orgDataMap.get("石河子人才网2"));
allData.addAll(orgDataMap.get("石河子招聘网"));
allData.addAll(orgDataMap.get("天互招聘网"));
allData.addAll(orgDataMap.get("乌鲁木齐快聘网"));
allData.addAll(orgDataMap.get("新疆人才网"));
// 批量插入数据 // 批量插入数据
int batchSize = 50; int batchSize = 50;
@@ -873,12 +900,19 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
logger.info("生成唯一标识符: {}", string); logger.info("生成唯一标识符: {}", string);
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
String formattedDate = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); String formattedDate = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
Job jobOne = null;
for (RowWork rowWork : rowWorks) { for (RowWork rowWork : rowWorks) {
try { try {
Job job = new Job(); Job job = new Job();
if(StringUtil.isEmptyOrNull(rowWork.getAca112())){ if(StringUtil.isEmptyOrNull(rowWork.getAca112())){
continue; continue;
} }
//去重
jobOne = jobMapper.selectOne(Wrappers.lambdaQuery(Job.class).eq(Job::getJobTitle, rowWork.getAca112()).eq(Job::getMinSalary, Long.valueOf(rowWork.getSalaryLow())).eq(Job::getMaxSalary, rowWork.getSalaryHight())
.eq(Job::getCompanyName, rowWork.getAAB004()).eq(Job::getJobLocation, rowWork.getAAE006()).orderByDesc(Job::getCreateTime).last("LIMIT 1"));
if (jobOne != null) {
continue;
}
job.setJobTitle(rowWork.getAca112()); job.setJobTitle(rowWork.getAca112());
job.setMinSalary(Long.valueOf(rowWork.getSalaryLow())); job.setMinSalary(Long.valueOf(rowWork.getSalaryLow()));
job.setMaxSalary(Long.valueOf(rowWork.getSalaryHight())); job.setMaxSalary(Long.valueOf(rowWork.getSalaryHight()));
@@ -896,10 +930,14 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
job.setJobLocation(rowWork.getAAE006()); job.setJobLocation(rowWork.getAAE006());
job.setPostingDate(formattedDate); job.setPostingDate(formattedDate);
job.setJobCategory(rowWork.getJobCategory()); job.setJobCategory(rowWork.getJobCategory());
if (rowWork.getAcb240() == null) { if (org.apache.commons.lang3.StringUtils.isEmpty(rowWork.getAcb240())) {
job.setVacancies(-1L); job.setVacancies(-1L);
} else { } else {
job.setVacancies(Long.valueOf(rowWork.getAcb240().replace("", ""))); String v = rowWork.getAcb240().replace("", "").replace("以上", "");
if (org.apache.commons.lang3.StringUtils.isNotEmpty(v) && v.contains("-")) {
v = v.split("-")[1];
}
job.setVacancies(org.apache.commons.lang3.StringUtils.isNotEmpty(v) ? Long.valueOf(v) : -1L);
} }
if (rowWork.getLatitude() != null && !rowWork.getLatitude().isEmpty()) { if (rowWork.getLatitude() != null && !rowWork.getLatitude().isEmpty()) {
job.setLatitude(new BigDecimal(rowWork.getLatitude())); job.setLatitude(new BigDecimal(rowWork.getLatitude()));
@@ -912,7 +950,8 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
if(Objects.isNull(rowWork.getCounty())){ if(Objects.isNull(rowWork.getCounty())){
job.setJobLocationAreaCode(null); job.setJobLocationAreaCode(null);
}else { }else {
job.setJobLocationAreaCode(Integer.valueOf(Objects.requireNonNull(iBussinessDictDataService.findCode(areaData, rowWork.getCounty())))); String code = iBussinessDictDataService.findCode(areaData, rowWork.getCounty());
job.setJobLocationAreaCode(org.apache.commons.lang3.StringUtils.isNotEmpty(code) ? Integer.valueOf(code) : null);
} }
job.setDescription(rowWork.getAcb22a()); job.setDescription(rowWork.getAcb22a());
job.setIsPublish(1); job.setIsPublish(1);
@@ -946,6 +985,12 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
} }
logger.info("数据导入完成,总共插入 {} 条公司数据和 {} 条职位数据", totalCompanyInserted, totalJobInserted); logger.info("数据导入完成,总共插入 {} 条公司数据和 {} 条职位数据", totalCompanyInserted, totalJobInserted);
Job job = jobMapper.selectOne(Wrappers.lambdaQuery(Job.class).eq(Job::getCreateTime, formattedDate).last("LIMIT 1"));
if (job != null) {
logger.info("存在新插入的数据,日期为:" + formattedDate);
} else {
logger.info("不存在新插入的数据:");
}
} catch (Exception e) { } catch (Exception e) {
logger.error("导入数据过程中发生异常: {}", e.getMessage(), e); logger.error("导入数据过程中发生异常: {}", e.getMessage(), e);
throw new RuntimeException(e); throw new RuntimeException(e);

View File

@@ -129,7 +129,7 @@
job_title, min_salary, max_salary, education, experience, company_name, job_location, job_title, min_salary, max_salary, education, experience, company_name, job_location,
job_location_area_code, posting_date, vacancies, latitude, longitude, "view", company_id, job_location_area_code, posting_date, vacancies, latitude, longitude, "view", company_id,
is_hot, apply_num, description, is_publish, data_source, job_url, remark, del_flag, is_hot, apply_num, description, is_publish, data_source, job_url, remark, del_flag,
create_by, create_time, row_id, job_category,jobType,job_address create_by, create_time, row_id, job_category,job_type,job_address
) VALUES ) VALUES
<foreach collection="list" item="job" separator=","> <foreach collection="list" item="job" separator=",">
( (
@@ -360,4 +360,8 @@
<update id="updateReviewStatus"> <update id="updateReviewStatus">
update job set review_status = #{reviewStatus} where job_id = #{jobId} update job set review_status = #{reviewStatus} where job_id = #{jobId}
</update> </update>
<delete id="delRowWork">
delete from row_work
</delete>
</mapper> </mapper>