修改互联网岗位上传

This commit is contained in:
sh
2026-07-06 10:28:34 +08:00
parent 8e6761eeb3
commit 35db37b352
5 changed files with 94 additions and 82 deletions

View File

@@ -1000,30 +1000,12 @@ 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;
int repeatJobCount = 0;
List<String> repeatJobInfoList = new ArrayList<>();
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) {
//统计重复
repeatJobCount++;
String repeatInfo = String.format("岗位名称:%s公司%s地点%s薪资区间%s-%s",
rowWork.getAca112(),
rowWork.getAAB004(),
rowWork.getAAE006(),
rowWork.getSalaryLow(),
rowWork.getSalaryHight());
repeatJobInfoList.add(repeatInfo);
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()));
@@ -1114,17 +1096,6 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
} else { } else {
logger.info("不存在新插入的数据:"); logger.info("不存在新插入的数据:");
} }
System.out.println("====================岗位重复统计结果====================");
System.out.println("本次导入重复岗位总数量:" + repeatJobCount);
if (repeatJobCount > 0) {
System.out.println("重复岗位明细列表:");
for (String info : repeatJobInfoList) {
System.out.println(info);
}
} else {
System.out.println("本次导入无重复岗位");
}
System.out.println("========================================================");
} catch (Exception e) { } catch (Exception e) {
logger.error("导入数据过程中发生异常: {}", e.getMessage(), e); logger.error("导入数据过程中发生异常: {}", e.getMessage(), e);
throw new RuntimeException(e); throw new RuntimeException(e);
@@ -1186,30 +1157,12 @@ 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;
int repeatJobCount = 0;
List<String> repeatJobInfoList = new ArrayList<>();
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) {
//统计重复
repeatJobCount++;
String repeatInfo = String.format("岗位名称:%s公司%s地点%s薪资区间%s-%s",
rowWork.getAca112(),
rowWork.getAAB004(),
rowWork.getAAE006(),
rowWork.getSalaryLow(),
rowWork.getSalaryHight());
repeatJobInfoList.add(repeatInfo);
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()));
@@ -1225,20 +1178,13 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
} }
job.setCompanyName(rowWork.getAAB004()); job.setCompanyName(rowWork.getAAB004());
job.setJobLocation(rowWork.getAAE006()); job.setJobLocation(rowWork.getAAE006());
job.setPostingDate(formattedDate); job.setPostingDate(rowWork.getAae397() != null ? DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,rowWork.getAae397()) : formattedDate);
job.setJobCategory(rowWork.getJobCategory()); job.setJobCategory(rowWork.getJobCategory());
if (rowWork.getAcb240() == null) { if (rowWork.getAcb240() == null) {
job.setVacancies(-1L); job.setVacancies(-1L);
} else { } else {
String v = rowWork.getAcb240().replace("", "").replace("以上", ""); Long vacancies = StringUtil.extractVacancyNum(rowWork.getAcb240());
if (v.contains("若干")) { job.setVacancies(vacancies);
job.setVacancies(20L);
}else 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);
}else {
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()));
@@ -1282,7 +1228,7 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
job.setCreateTime(formattedDate); job.setCreateTime(formattedDate);
job.setRowId(Long.valueOf(rowWork.getId())); job.setRowId(Long.valueOf(rowWork.getId()));
job.setJobStatus(StringUtil.HIRE_LY);//上架 job.setJobStatus(StringUtil.HIRE_LY);//上架
job.setDownTime(DateUtils.getMonthThree(DateUtils.YYYY_MM_DD_HH_MM_SS));//下架时间当前时间+3个月 job.setDownTime(DateUtils.getMonthThree(rowWork.getAae397(),DateUtils.YYYY_MM_DD_HH_MM_SS));//下架时间当前时间+3个月
if(StringUtils.isBlank(job.getJobLocationAreaCode())){ if(StringUtils.isBlank(job.getJobLocationAreaCode())){
job.setRegionCode(StringUtil.getAreaToRegionCode(job.getJobLocationAreaCode()));//行政区划 job.setRegionCode(StringUtil.getAreaToRegionCode(job.getJobLocationAreaCode()));//行政区划
} }
@@ -1315,17 +1261,6 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
} else { } else {
logger.info("不存在新插入的数据:"); logger.info("不存在新插入的数据:");
} }
System.out.println("====================岗位重复统计结果====================");
System.out.println("本次导入重复岗位总数量:" + repeatJobCount);
if (repeatJobCount > 0) {
System.out.println("重复岗位明细列表:");
for (String info : repeatJobInfoList) {
System.out.println(info);
}
} else {
System.out.println("本次导入无重复岗位");
}
System.out.println("========================================================");
} 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

@@ -5,16 +5,16 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook; // 改为XSSFWorkbook
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.math.RoundingMode;
import java.util.HashMap; import java.text.SimpleDateFormat;
import java.util.List; import java.util.*;
import java.util.Map;
public class ExcelToObject { public class ExcelToObject {
private static final DataFormatter DATA_FORMATTER = new DataFormatter();
public static <T> List<T> readExcelToObjects(String filePath, Class<T> clazz) throws Exception { public static <T> List<T> readExcelToObjects(String filePath, Class<T> clazz) throws Exception {
List<T> resultList = new ArrayList<>(); List<T> resultList = new ArrayList<>();
@@ -65,14 +65,27 @@ public class ExcelToObject {
} }
break; break;
case NUMERIC: case NUMERIC:
if (field.getType() == int.class || field.getType() == Integer.class) { if (DateUtil.isCellDateFormatted(cell)) {
field.set(obj, (int) cell.getNumericCellValue()); Date cellDate = cell.getDateCellValue();
} else if (field.getType() == double.class || field.getType() == Double.class) { if (Date.class.equals(field.getType())) {
field.set(obj, cell.getNumericCellValue()); field.set(obj, cellDate);
} else if (field.getType() == String.class) { } else if (String.class.equals(field.getType())) {
// Special handling for phone numbers and other numeric fields as strings SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", Locale.CHINA);
BigDecimal bigDecimalValue = new BigDecimal(cell.getNumericCellValue()); field.set(obj, sdf.format(cellDate));
field.set(obj, bigDecimalValue.toPlainString()); }
}else{
String numStr = DATA_FORMATTER.formatCellValue(cell);
BigDecimal numBig = new BigDecimal(numStr);
BigDecimal numInt = numBig.setScale(0, RoundingMode.HALF_UP);
Class<?> fieldType = field.getType();
if (fieldType == int.class || fieldType == Integer.class) {
field.set(obj, numInt.intValue());
} else if (fieldType == double.class || fieldType == Double.class) {
field.set(obj, numInt.doubleValue());
} else if (String.class.equals(fieldType)) {
field.set(obj, numInt.toPlainString());
}
} }
break; break;
case BOOLEAN: case BOOLEAN:

View File

@@ -8,6 +8,8 @@ import java.text.SimpleDateFormat;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.Period; import java.time.Period;
import java.util.*; import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public class StringUtil { public class StringUtil {
@@ -122,6 +124,8 @@ public class StringUtil {
//求职者、网格员 //求职者、网格员
public static final List<String> COMPANY_TYPES = Arrays.asList("1", "2"); public static final List<String> COMPANY_TYPES = Arrays.asList("1", "2");
private static final Pattern DIGIT_PATTERN = Pattern.compile("\\d+");
static { static {
Map<String, String> tempMap = new HashMap<>(); Map<String, String> tempMap = new HashMap<>();
tempMap.put("中专及以上", "1"); tempMap.put("中专及以上", "1");
@@ -440,4 +444,30 @@ public class StringUtil {
return age >= 16 && age <= 24; return age >= 16 && age <= 24;
} }
/**
* 处理上传中人数问题
* @param source
* @return
*/
public static Long extractVacancyNum(String source) {
if (StringUtils.isBlank(source)) {
return -1L;
}
String text = source.trim();
if (text.contains("若干")) {
return 20L;
}
Matcher matcher = DIGIT_PATTERN.matcher(text);
Long maxNum = null;
while (matcher.find()) {
String numStr = matcher.group();
try {
long num = Long.parseLong(numStr);
if (maxNum == null || num > maxNum) {
maxNum = num;
}
} catch (NumberFormatException ignored) {}
}
return maxNum == null ? -1L : maxNum;
}
} }

View File

@@ -318,6 +318,15 @@
from job from job
where job.row_id = row_work.id where job.row_id = row_work.id
) AND id IN ( SELECT max(id) FROM row_work GROUP BY Aca112,Acb22a,AAE006) ) AND id IN ( SELECT max(id) FROM row_work GROUP BY Aca112,Acb22a,AAE006)
AND NOT EXISTS (
SELECT 1 FROM job j
WHERE j.job_title = row_work.Aca112
AND j.company_name = row_work.AAB004
AND j.job_location = row_work.AAE006
AND j.min_salary = CAST(row_work.SalaryLow AS BIGINT)
AND j.max_salary = row_work.SalaryHight
AND (j.down_time IS NULL OR j.down_time > CURRENT_DATE)
)
</select> </select>
<select id="selectVectorJob" resultType="com.ruoyi.cms.domain.VectorJob"> <select id="selectVectorJob" resultType="com.ruoyi.cms.domain.VectorJob">
SELECT SELECT

View File

@@ -265,4 +265,29 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
System.out.println("当前时间+3个月" + sdf.format(threeMonthsLater)); System.out.println("当前时间+3个月" + sdf.format(threeMonthsLater));
return sdf.format(threeMonthsLater); return sdf.format(threeMonthsLater);
} }
/**
* 获取指定日期往后推3个月的格式化字符串
* @param baseDate 基准日期(传入要计算的原始日期,不再取系统当前时间)
* @param fmt 日期格式化模板yyyy-MM-dd、yyyy-MM-dd HH:mm:ss
* @return 加3个月后的日期字符串
*/
/**
* 获取基准日期3个月之后的日期字符串
* @param baseDate 基准日期传null则自动使用当前系统时间
* @param fmt 日期格式化模板,如 yyyy-MM-dd
* @return 偏移3个月后的格式化日期
*/
public static String getMonthThree(Date baseDate, String fmt) {
// 初始化日历,默认就是系统当前时间
Calendar calendar = Calendar.getInstance();
// 判断:传入日期不为空,就覆盖基准时间;为空则保留默认当前时间
if (baseDate != null) {
calendar.setTime(baseDate);
}
// 向后加3个月
calendar.add(Calendar.MONTH, 3);
SimpleDateFormat sdf = new SimpleDateFormat(fmt);
return sdf.format(calendar.getTime());
}
} }