From 35db37b352d3b70ce515bc5ac47e66d9b9750f75 Mon Sep 17 00:00:00 2001 From: sh Date: Mon, 6 Jul 2026 10:28:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=92=E8=81=94=E7=BD=91?= =?UTF-8?q?=E5=B2=97=E4=BD=8D=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cms/service/impl/JobServiceImpl.java | 73 +------------------ .../com/ruoyi/cms/util/ExcelToObject.java | 39 ++++++---- .../java/com/ruoyi/cms/util/StringUtil.java | 30 ++++++++ .../main/resources/mapper/app/JobMapper.xml | 9 +++ .../com/ruoyi/common/utils/DateUtils.java | 25 +++++++ 5 files changed, 94 insertions(+), 82 deletions(-) diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobServiceImpl.java index 445a0ae..466df15 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobServiceImpl.java @@ -1000,30 +1000,12 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe logger.info("生成唯一标识符: {}", string); LocalDateTime now = LocalDateTime.now(); String formattedDate = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - Job jobOne = null; - int repeatJobCount = 0; - List repeatJobInfoList = new ArrayList<>(); for (RowWork rowWork : rowWorks) { try { Job job = new Job(); if(StringUtil.isEmptyOrNull(rowWork.getAca112())){ 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.setMinSalary(Long.valueOf(rowWork.getSalaryLow())); job.setMaxSalary(Long.valueOf(rowWork.getSalaryHight())); @@ -1114,17 +1096,6 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe } else { 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) { logger.error("导入数据过程中发生异常: {}", e.getMessage(), e); throw new RuntimeException(e); @@ -1186,30 +1157,12 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe logger.info("生成唯一标识符: {}", string); LocalDateTime now = LocalDateTime.now(); String formattedDate = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - Job jobOne = null; - int repeatJobCount = 0; - List repeatJobInfoList = new ArrayList<>(); for (RowWork rowWork : rowWorks) { try { Job job = new Job(); if(StringUtil.isEmptyOrNull(rowWork.getAca112())){ 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.setMinSalary(Long.valueOf(rowWork.getSalaryLow())); job.setMaxSalary(Long.valueOf(rowWork.getSalaryHight())); @@ -1225,20 +1178,13 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe } job.setCompanyName(rowWork.getAAB004()); 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()); if (rowWork.getAcb240() == null) { job.setVacancies(-1L); } else { - String v = rowWork.getAcb240().replace("人", "").replace("以上", ""); - if (v.contains("若干")) { - 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); - } + Long vacancies = StringUtil.extractVacancyNum(rowWork.getAcb240()); + job.setVacancies(vacancies); } if (rowWork.getLatitude() != null && !rowWork.getLatitude().isEmpty()) { job.setLatitude(new BigDecimal(rowWork.getLatitude())); @@ -1282,7 +1228,7 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe job.setCreateTime(formattedDate); job.setRowId(Long.valueOf(rowWork.getId())); 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())){ job.setRegionCode(StringUtil.getAreaToRegionCode(job.getJobLocationAreaCode()));//行政区划 } @@ -1315,17 +1261,6 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe } else { 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) { logger.error("导入数据过程中发生异常: {}", e.getMessage(), e); throw new RuntimeException(e); diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/ExcelToObject.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/ExcelToObject.java index 84d817f..80be0ad 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/ExcelToObject.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/ExcelToObject.java @@ -5,16 +5,16 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook; // 改为XSSFWorkbook import java.io.File; import java.io.FileInputStream; -import java.io.IOException; import java.lang.reflect.Field; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.math.RoundingMode; +import java.text.SimpleDateFormat; +import java.util.*; public class ExcelToObject { + private static final DataFormatter DATA_FORMATTER = new DataFormatter(); + public static List readExcelToObjects(String filePath, Class clazz) throws Exception { List resultList = new ArrayList<>(); @@ -65,14 +65,27 @@ public class ExcelToObject { } break; case NUMERIC: - if (field.getType() == int.class || field.getType() == Integer.class) { - field.set(obj, (int) cell.getNumericCellValue()); - } else if (field.getType() == double.class || field.getType() == Double.class) { - field.set(obj, cell.getNumericCellValue()); - } else if (field.getType() == String.class) { - // Special handling for phone numbers and other numeric fields as strings - BigDecimal bigDecimalValue = new BigDecimal(cell.getNumericCellValue()); - field.set(obj, bigDecimalValue.toPlainString()); + if (DateUtil.isCellDateFormatted(cell)) { + Date cellDate = cell.getDateCellValue(); + if (Date.class.equals(field.getType())) { + field.set(obj, cellDate); + } else if (String.class.equals(field.getType())) { + SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", Locale.CHINA); + field.set(obj, sdf.format(cellDate)); + } + }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; case BOOLEAN: diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/StringUtil.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/StringUtil.java index 50ced80..564b193 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/StringUtil.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/StringUtil.java @@ -8,6 +8,8 @@ import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.Period; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; public class StringUtil { @@ -122,6 +124,8 @@ public class StringUtil { //求职者、网格员 public static final List COMPANY_TYPES = Arrays.asList("1", "2"); + private static final Pattern DIGIT_PATTERN = Pattern.compile("\\d+"); + static { Map tempMap = new HashMap<>(); tempMap.put("中专及以上", "1"); @@ -440,4 +444,30 @@ public class StringUtil { 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; + } } diff --git a/ruoyi-bussiness/src/main/resources/mapper/app/JobMapper.xml b/ruoyi-bussiness/src/main/resources/mapper/app/JobMapper.xml index d6cbb09..c6e251a 100644 --- a/ruoyi-bussiness/src/main/resources/mapper/app/JobMapper.xml +++ b/ruoyi-bussiness/src/main/resources/mapper/app/JobMapper.xml @@ -318,6 +318,15 @@ from job where job.row_id = row_work.id ) 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) + )