From 68a9345c6630ce07ce04db06664c4ff89c43ea98 Mon Sep 17 00:00:00 2001 From: sh Date: Tue, 30 Jun 2026 20:07:31 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=B7=BB=E5=8A=A0=E6=A0=B9=E6=8D=AE=E5=8C=BA?= =?UTF-8?q?=E5=88=92=E6=9F=A5=E8=AF=A2code=202.=E6=B7=BB=E5=8A=A0=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E5=85=A8=E7=96=86=E5=B2=97=E4=BD=8D=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E2=80=94=E2=80=94=E6=9C=AA=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cms/controller/cms/CmsJobController.java | 1 + .../com/ruoyi/cms/mapper/SysAreaMapper.java | 2 + .../com/ruoyi/cms/service/IJobService.java | 4 + .../cms/service/impl/JobServiceImpl.java | 261 +++++++++++++++++- .../resources/mapper/app/SysAreaMapper.xml | 7 + .../common/core/domain/entity/SysArea.java | 4 + 6 files changed, 275 insertions(+), 4 deletions(-) diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsJobController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsJobController.java index fee33f4..30edee0 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsJobController.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsJobController.java @@ -757,6 +757,7 @@ public class CmsJobController extends BaseController } String path = filePath + File.separator + fileName.replace("profile/upload/", ""); jobService.importRow(path); +// jobService.importRowOne(path); return success(); } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/SysAreaMapper.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/SysAreaMapper.java index d5a9aff..765d7c2 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/SysAreaMapper.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/SysAreaMapper.java @@ -16,4 +16,6 @@ public interface SysAreaMapper{ List getList(SysArea sysArea); List getCityList(SysArea sysArea); + + SysArea getAreaByName(SysArea sysArea); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IJobService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IJobService.java index 460f64b..c49ae92 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IJobService.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IJobService.java @@ -71,6 +71,8 @@ public interface IJobService void importData(); + void importDataOne(); + List recommend(ESJobSearch esJobSearch); EsPageInfo countyJobList(ESJobSearch job); @@ -85,6 +87,8 @@ public interface IJobService void importRow(String path); + void importRowOne(String path); + List candidates(Long jobId); void updateLon(); 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 177e48a..4c95d3f 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 @@ -13,7 +13,7 @@ import com.ruoyi.cms.util.DictUtils; import com.ruoyi.cms.util.encrypt.QuickValidUtils; import com.ruoyi.cms.util.notice.NoticeUtils; import com.ruoyi.common.constant.SM4Constants; -import com.ruoyi.common.core.domain.entity.File; +import com.ruoyi.common.core.domain.entity.*; import com.ruoyi.cms.domain.query.ESJobSearch; import com.ruoyi.cms.domain.vo.CandidateVO; import com.ruoyi.cms.mapper.*; @@ -22,9 +22,7 @@ import com.ruoyi.cms.util.*; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.TreeSelect; -import com.ruoyi.common.core.domain.entity.AppUser; -import com.ruoyi.common.core.domain.entity.Company; -import com.ruoyi.common.core.domain.entity.JobTitle; +import com.ruoyi.common.core.domain.entity.File; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.*; @@ -95,6 +93,8 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe private CompanyCollectionMapper companyCollectionMapper; @Autowired private NoticeMapper noticeMapper; + @Autowired + private SysAreaMapper sysAreaMapper; /** * 更新工作地址的经纬度信息 @@ -894,6 +894,58 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe throw new RuntimeException(e); } } + + @Override + public void importRowOne(String path) { + try { + logger.info("开始导入Excel数据..."); + //先清理旧数据 + Long oldDataNum = jobMapper.delRowWork(); + logger.info("删除旧的row-work..." + oldDataNum); + logger.info("文件路径path..." + path); + // 读取Excel文件中的数据 + List rowWorks = ExcelToObject.readExcelToObjects(path, RowWork.class); + logger.info("从Excel中读取到 {} 条数据", rowWorks.size()); + + // 批量插入数据 + int batchSize = 50; + int totalInserted = 0; + List batchList = new ArrayList<>(); + + for (RowWork rowWork : rowWorks) { +// Thread.sleep(500); // 控制处理速度(可选) + batchList.add(rowWork); + if (batchList.size() >= batchSize) { + try { + jobMapper.insertBatchRowWork(batchList); + totalInserted += batchList.size(); + logger.info("成功插入 {} 条数据,当前总共插入 {} 条数据", batchList.size(), totalInserted); + batchList.clear(); + } catch (Exception e) { + logger.error("批量插入失败: " + e.getMessage(), e); + } + } + } + + // 插入剩余数据 + if (!batchList.isEmpty()) { + try { + jobMapper.insertBatchRowWork(batchList); + totalInserted += batchList.size(); + logger.info("成功插入剩余的 {} 条数据,当前总共插入 {} 条数据", batchList.size(), totalInserted); + } catch (Exception e) { + logger.error("批量插入剩余数据失败: " + e.getMessage(), e); + } + } + //插入岗位表 + importDataOne(); + logger.info("数据导入完成,总共插入 {} 条数据", totalInserted); + } catch (Exception e) { + logger.error("导入数据过程中发生异常: " + e.getMessage(), e); + throw new RuntimeException(e); + } + } + @Override public void importData() { try { @@ -1080,6 +1132,207 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe iesJobSearchService.resetTextCache(); } + @Override + public void importDataOne() { + try { + logger.info("开始导入数据..."); + + // 获取字典数据 + List dictData = iBussinessDictTypeService.selectDictDataByType("education"); + List expData = iBussinessDictTypeService.selectDictDataByType("experience"); + List areaData = iBussinessDictTypeService.selectDictDataByType("area"); + logger.info("成功获取字典数据: education={}, experience={}, area={}", dictData.size(), expData.size(), areaData.size()); + + // 获取需要插入的行数据 + List rowWorks = this.baseMapper.selectAllInsertRowWork(); + logger.info("从数据库中获取到 {} 条待插入的行数据", rowWorks.size()); + + // 获取公司数据并转换 + List companyRowList = this.baseMapper.selectRowCompany(); + List companyList = company2New(companyRowList); + logger.info("成功转换 {} 条公司数据", companyList.size()); + + // 批量插入公司数据 + int batchSizeCompany = 50; // 每批次插入50条数据 + List companyBatch = new ArrayList<>(); + int totalCompanyInserted = 0; + + for (Company company : companyList) { + companyBatch.add(company); + if (companyBatch.size() == batchSizeCompany) { + companyMapper.batchInsert(companyBatch); // 批量插入 + totalCompanyInserted += companyBatch.size(); + logger.info("成功插入 {} 条公司数据,当前总共插入 {} 条", companyBatch.size(), totalCompanyInserted); + companyBatch.clear(); // 清空批次 + } + } + + // 插入剩余的记录 + if (!companyBatch.isEmpty()) { + companyMapper.batchInsert(companyBatch); + totalCompanyInserted += companyBatch.size(); + logger.info("成功插入剩余的 {} 条公司数据,当前总共插入 {} 条", companyBatch.size(), totalCompanyInserted); + } + + // 获取所有公司数据 + List allCompany = companyMapper.selectCompanyList(new Company()); + logger.info("从数据库中获取到 {} 条公司数据", allCompany.size()); + + // 批量插入职位数据 + List jobBatch = new ArrayList<>(); + int batchSize = 50; + int totalJobInserted = 0; + String string = UUID.randomUUID().toString(); + 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())); + if(Objects.isNull(rowWork.getAac011())){ + job.setEducation("-1"); + }else { + job.setEducation(iBussinessDictDataService.findCode(dictData, rowWork.getAac011())); + } + if(Objects.isNull(rowWork.getExperience())){ + job.setExperience("0"); + }else { + job.setExperience(iBussinessDictDataService.findCode(expData, rowWork.getExperience())); + } + job.setCompanyName(rowWork.getAAB004()); + job.setJobLocation(rowWork.getAAE006()); + job.setPostingDate(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); + } + } + if (rowWork.getLatitude() != null && !rowWork.getLatitude().isEmpty()) { + job.setLatitude(new BigDecimal(rowWork.getLatitude())); + job.setLongitude(new BigDecimal(rowWork.getLongitude())); + } + job.setView(0L); + job.setCompanyId(getCompanyId(allCompany, rowWork.getAAB004())); + job.setIsHot(0); + job.setApplyNum(0); + if(Objects.isNull(rowWork.getCounty())){ + job.setJobLocationAreaCode(null); + job.setRegionCode(null); + }else { + String countyName = rowWork.getCounty(); + String provName = rowWork.getProvince(); + String areaCode = null; + areaCode = iBussinessDictDataService.findCode(areaData, countyName); + if (Objects.isNull(areaCode)) { + SysArea sysAreaParm = new SysArea(); + sysAreaParm.setParentName(provName); + sysAreaParm.setName(countyName); + SysArea sysArea = sysAreaMapper.getAreaByName(sysAreaParm); + if (Objects.nonNull(sysArea) && StringUtils.isNotBlank(sysArea.getCode())) { + areaCode = sysArea.getCode(); + } + job.setRegionCode(areaCode); + job.setJobLocationAreaCode(areaCode); + }else{ + job.setJobLocationAreaCode(areaCode); + job.setRegionCode(StringUtil.getAreaToRegionCode(areaCode)); + } + } + job.setDescription(rowWork.getAcb22a()); + job.setIsPublish(1); + //job.setDataSource(rowWork.getORG()); + job.setDataSource("4");//互联网抓取 + job.setJobUrl(rowWork.getACE760()); + job.setRemark(string); + job.setDelFlag("0"); + job.setCreateBy(string); + 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个月 + if(StringUtils.isBlank(job.getJobLocationAreaCode())){ + job.setRegionCode(StringUtil.getAreaToRegionCode(job.getJobLocationAreaCode()));//行政区划 + } + + jobBatch.add(job); + + // 当批次达到50条时,执行批量插入 + if (jobBatch.size() == batchSize) { + this.baseMapper.batchInsert(jobBatch); + totalJobInserted += jobBatch.size(); + logger.info("成功插入 {} 条职位数据,当前总共插入 {} 条", jobBatch.size(), totalJobInserted); + jobBatch.clear(); // 清空批次 + } + } catch (Exception e) { + logger.error("处理职位数据时发生异常: {}", e.getMessage(), e); + } + } + + // 插入剩余的记录 + if (!jobBatch.isEmpty()) { + this.baseMapper.batchInsert(jobBatch); + totalJobInserted += jobBatch.size(); + logger.info("成功插入剩余的 {} 条职位数据,当前总共插入 {} 条", jobBatch.size(), 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("不存在新插入的数据:"); + } + 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); + } +// iesJobSearchService.resetTextCache(); + } + private Long getCompanyId(List allCompany, String aab004) { for (Company company:allCompany){ if(company.getName().equals(aab004)){ diff --git a/ruoyi-bussiness/src/main/resources/mapper/app/SysAreaMapper.xml b/ruoyi-bussiness/src/main/resources/mapper/app/SysAreaMapper.xml index cc2803d..0308d1c 100644 --- a/ruoyi-bussiness/src/main/resources/mapper/app/SysAreaMapper.xml +++ b/ruoyi-bussiness/src/main/resources/mapper/app/SysAreaMapper.xml @@ -33,4 +33,11 @@ SELECT sa.*,get_name_first_pinyin(sa.name) AS zm FROM sys_area sa INNER JOIN top_area ta ON sa.parent_code = ta.code WHERE ta.is_municipality = FALSE + + diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysArea.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysArea.java index 3eace72..95ef66d 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysArea.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysArea.java @@ -43,6 +43,10 @@ public class SysArea extends BaseEntity { @ApiModelProperty("父级地区编码(顶级为NULL)") private String parentCode; + @TableField(exist = false) + @ApiModelProperty("父级名称") + private String parentName; + @TableField(exist = false) @ApiModelProperty("字母") private String zm;