添加岗位模板下载,岗位模板上传功能

This commit is contained in:
sh
2026-01-21 15:35:15 +08:00
parent 90c553a31d
commit 5e3ec6ddae
10 changed files with 388 additions and 5 deletions

View File

@@ -18,4 +18,9 @@ public class JobContactServiceImpl extends ServiceImpl<JobContactMapper, JobCont
public List<JobContact> getSelectList(JobContact jobContact){
return jobContactMapper.getSelectList(jobContact);
}
@Override
public int batchInsert(List<JobContact> list) {
return jobContactMapper.batchInsert(list);
}
}

View File

@@ -1,7 +1,5 @@
package com.ruoyi.cms.service.impl;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -10,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.cms.domain.*;
import com.ruoyi.cms.domain.vo.JobExcelVo;
import com.ruoyi.cms.util.notice.NoticeUtils;
import com.ruoyi.common.core.domain.entity.File;
import com.ruoyi.cms.domain.query.ESJobSearch;
@@ -25,6 +24,7 @@ import com.ruoyi.common.core.domain.entity.Company;
import com.ruoyi.common.core.domain.entity.JobTitle;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.SiteSecurityUtils;
import com.ruoyi.common.utils.StringUtils;
@@ -1137,4 +1137,166 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
public Integer getTotals(Job job) {
return jobMapper.getTotals(job);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void uploadFileJob(List<JobExcelVo> list) {
//查询所有企业
Map<String, Long> companyNameToIdMap = companyNameToIdMap(list);
//岗位字典转换
List<Job> jobList = buildJobList(list, companyNameToIdMap);
//岗位去重
List<Job> dedupedJobList = dedupJobList(jobList);
//批量保存岗
jobMapper.updateFileBatchInsert(dedupedJobList);
//构建联系人列表(关联去重后的岗位)
List<JobContact> contactList = buildJobContactList(dedupedJobList, list, companyNameToIdMap);
//联系人去重企业ID+联系人手机号 去重企业ID为0/null时仅按手机号去重
List<JobContact> dedupedContactList = dedupContactList(contactList, dedupedJobList);
//批量保存联系人
if (CollectionUtils.isNotEmpty(dedupedContactList)) {
jobContactMapper.batchInsert(dedupedContactList);
}
}
/**
* 企业名称查询关联(核心业务逻辑)
*/
private Map<String, Long> companyNameToIdMap(List<JobExcelVo> allExcelVoList) {
Set<String> companyNameSet = allExcelVoList.stream()
.map(JobExcelVo::getCompanyName)
.filter(StringUtils::hasText)
.collect(Collectors.toSet());
if (companyNameSet.isEmpty()) {
return Collections.emptyMap();
}
List<Company> companies = companyMapper.selectByNames(new ArrayList<>(companyNameSet));
if (CollectionUtils.isEmpty(companies)) {
return Collections.emptyMap();
}
return companies.stream()
.collect(Collectors.toMap(
Company::getName,
Company::getCompanyId,
(v1, v2) -> v1
));
}
/**
* 字典转换 + Job对象构建业务数据转换
*/
private List<Job> buildJobList(List<JobExcelVo> allExcelVoList, Map<String, Long> companyNameToIdMap) {
return allExcelVoList.stream().map(it -> {
Job job = new Job();
BeanUtils.copyProperties(it, job);
//字典转换
String education = DictUtils.getDictValue("education", it.getEducation());
String experience = DictUtils.getDictValue("experience", it.getExperience());
String jobType = DictUtils.getDictValue("job_type", it.getJobType());
String type = DictUtils.getDictValue("position_type", it.getType());
String areaCode = DictUtils.getDictValue("area", it.getJobLocation());
// 字段赋值
job.setEducation(education);
job.setExperience(experience);
job.setJobType(jobType);
job.setType(type);
job.setJobLocation(StringUtils.isBlank(it.getJobAddress()) ? it.getJobLocation() : it.getJobAddress());
job.setJobLocationAreaCode(StringUtils.isBlank(areaCode) ? 0 : Integer.valueOf(areaCode));
job.setIsPublish(1);
job.setDataSource("1");
job.setPostingDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD_HH_MM_SS));
String companyName = it.getCompanyName();
job.setCompanyName(companyName);
job.setCompanyId(companyNameToIdMap.getOrDefault(companyName, null));
return job;
}).collect(Collectors.toList());
}
/**
* 岗位去重业务规则企业ID+岗位名称+工作地点唯一)
*/
private List<Job> dedupJobList(List<Job> jobList) {
Map<String, Job> dedupMap = new LinkedHashMap<>();
for (Job job : jobList) {
String dedupKey = String.format(
"%s_%s_%s",
Optional.ofNullable(job.getCompanyId()).orElse(null),
job.getJobTitle().trim(),
job.getJobLocation().trim()
);
dedupMap.putIfAbsent(dedupKey, job);
}
return new ArrayList<>(dedupMap.values());
}
/**
* 构建联系人列表(业务关联)
*/
private List<JobContact> buildJobContactList(List<Job> dedupedJobList, List<JobExcelVo> allExcelVoList, Map<String, Long> companyNameToIdMap) {
List<JobContact> contactList = new ArrayList<>();
Map<String, Job> jobMatchMap = dedupedJobList.stream()
.collect(Collectors.toMap(
job -> String.format(
"%s_%s",
job.getJobTitle().trim(),
job.getJobLocation().trim()
),
job -> job
));
for (JobExcelVo vo : allExcelVoList) {
String jobTitle = vo.getJobTitle().trim();
String jobLocation = StringUtils.isBlank(vo.getJobAddress()) ? vo.getJobLocation().trim() : vo.getJobAddress().trim();
String matchKey = String.format("%s_%s", jobTitle, jobLocation);
Job matchedJob = jobMatchMap.get(matchKey);
if (matchedJob == null) {
continue;
}
JobContact contact = new JobContact();
contact.setJobId(matchedJob.getJobId());
contact.setContactPerson(vo.getContactPerson());
contact.setContactPersonPhone(vo.getContactPersonPhone());
contactList.add(contact);
}
return contactList;
}
/**
* 联系人去重兼容企业ID为0的情况
*/
private List<JobContact> dedupContactList(List<JobContact> contactList, List<Job> dedupedJobList) {
if (CollectionUtils.isEmpty(contactList)) {
return new ArrayList<>();
}
Set<Long> validJobIds = dedupedJobList.stream().map(Job::getJobId).filter(Objects::nonNull).collect(Collectors.toSet());
Map<String, JobContact> dedupMap = new LinkedHashMap<>();
for (JobContact contact : contactList) {
if (StringUtils.isBlank(contact.getContactPersonPhone())) {
System.out.printf("跳过联系人:姓名=%s手机号为空%n", contact.getContactPerson());
continue;
}
Long jobId = contact.getJobId();
if (jobId == null || !validJobIds.contains(jobId)) {
System.out.printf("跳过联系人:姓名=%s岗位ID无效或不存在%n", contact.getContactPerson());
continue;
}
String dedupKey = String.format("%s_%s",jobId,contact.getContactPersonPhone().trim());
dedupMap.putIfAbsent(dedupKey, contact);
}
return new ArrayList<>(dedupMap.values());
}
}