添加岗位模板下载,岗位模板上传功能
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user