|
@@ -33,11 +33,13 @@ import com.citu.module.menduner.system.dal.mysql.job.JobAdvertisedExtendMapper;
|
|
|
import com.citu.module.menduner.system.dal.mysql.job.JobAdvertisedMapper;
|
|
|
import com.citu.module.menduner.system.enums.job.JobSourceEnum;
|
|
|
import com.citu.module.menduner.system.enums.job.JobStatusEnum;
|
|
|
+import com.citu.module.menduner.system.enums.sync.OperateTypeEnum;
|
|
|
import com.citu.module.menduner.system.enums.sync.SyncConstants;
|
|
|
import com.citu.module.menduner.system.mq.producer.ESProducer;
|
|
|
import com.citu.module.menduner.system.mq.producer.GraphProducer;
|
|
|
import com.citu.module.menduner.system.service.area.AreaService;
|
|
|
import com.citu.module.menduner.system.service.enterprise.EnterpriseService;
|
|
|
+import com.citu.module.menduner.system.service.job.handler.JobOperateHandler;
|
|
|
import com.citu.module.menduner.system.service.share.ShareService;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
@@ -48,7 +50,10 @@ import org.springframework.validation.annotation.Validated;
|
|
|
import javax.annotation.Resource;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.temporal.ChronoUnit;
|
|
|
-import java.util.*;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Comparator;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
@@ -57,6 +62,8 @@ import static com.citu.module.menduner.common.util.TimeUtils.generateDateTimeRan
|
|
|
import static com.citu.module.menduner.system.dal.redis.RedisKeyConstants.JOB_SHARE;
|
|
|
import static com.citu.module.menduner.system.enums.DictTypeConstants.*;
|
|
|
import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
|
|
|
+import static com.citu.module.menduner.system.service.job.handler.JobDefaultOperateHandler.DEFAULT_ENTERPRISE_ID;
|
|
|
+import static com.citu.module.menduner.system.service.job.handler.JobOperateHandler.DEFAULT_USER_ID;
|
|
|
import static com.citu.module.menduner.system.util.RecruitAnalysisUtils.packBarCount;
|
|
|
|
|
|
/**
|
|
@@ -70,11 +77,7 @@ import static com.citu.module.menduner.system.util.RecruitAnalysisUtils.packBarC
|
|
|
@Validated
|
|
|
public class JobAdvertisedServiceImpl implements JobAdvertisedService {
|
|
|
|
|
|
- /**
|
|
|
- * 默认管理员的企业id和用户id
|
|
|
- **/
|
|
|
- private static final Long DEFAULT_ENTERPRISE_ID = 1L;
|
|
|
- private static final Long DEFAULT_USER_ID = 1L;
|
|
|
+
|
|
|
@Resource
|
|
|
private JobAdvertisedMapper mapper;
|
|
|
@Resource
|
|
@@ -95,6 +98,8 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
|
|
|
private RedisTemplate<String, Object> redisTemplate;
|
|
|
@Resource
|
|
|
private VipEntitlementCheckAspect vipEntitlementCheckAspect;
|
|
|
+ @Resource
|
|
|
+ private List<JobOperateHandler> jobOperateHandlers;
|
|
|
|
|
|
@Override
|
|
|
public Long createJobAdvertised(JobAdvertisedSaveReqVO createReqVO) {
|
|
@@ -103,9 +108,7 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
|
|
|
jobAdvertised.setStatus(JobStatusEnum.ENABLE.getStatus());
|
|
|
jobAdvertised.setTop(false);
|
|
|
jobAdvertised.setHire(true);
|
|
|
- jobAdvertised.setEnterpriseId(DEFAULT_ENTERPRISE_ID);
|
|
|
- jobAdvertised.setUserId(DEFAULT_USER_ID);
|
|
|
- return save(jobAdvertised, DEFAULT_ENTERPRISE_ID, DEFAULT_USER_ID, false);
|
|
|
+ return save(jobAdvertised);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -114,12 +117,10 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
|
|
|
JobAdvertisedDO jobAdvertised = validateJobAdvertisedExists(updateReqVO.getId());
|
|
|
// 更新
|
|
|
JobAdvertisedDO updateObj = BeanUtils.toBean(updateReqVO, JobAdvertisedDO.class);
|
|
|
- updateObj.setEnterpriseId(DEFAULT_ENTERPRISE_ID);
|
|
|
- updateObj.setUserId(DEFAULT_USER_ID);
|
|
|
updateObj.setHire(jobAdvertised.getHire());
|
|
|
updateObj.setTop(jobAdvertised.getTop());
|
|
|
updateObj.setStatus(jobAdvertised.getStatus());
|
|
|
- save(updateObj, DEFAULT_ENTERPRISE_ID, DEFAULT_USER_ID, false);
|
|
|
+ save(updateObj);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -128,7 +129,8 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
|
|
|
JobAdvertisedDO jobAdvertised = validateJobAdvertisedExists(id);
|
|
|
// 删除
|
|
|
mapper.deleteById(id);
|
|
|
- jobDataSync(jobAdvertised, SyncConstants.DELETE);
|
|
|
+ // 数据同步逻辑
|
|
|
+ jobOperateHandlers.forEach(handler -> handler.dataSync(jobAdvertised, OperateTypeEnum.DELETE));
|
|
|
}
|
|
|
|
|
|
private JobAdvertisedDO validateJobAdvertisedExists(Long id) {
|
|
@@ -194,82 +196,11 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
|
|
|
|
|
|
AppJobAdvertisedPageReqVO pageReqVO =
|
|
|
new AppJobAdvertisedPageReqVO(pageParam, AppJobAdvertisedPageReqVO.RECOMMEND);
|
|
|
-// pageReqVO.setTop(true);
|
|
|
-// pageReqVO.setHire(false);
|
|
|
-// Long userId = LoginUserContext.getUserId2();
|
|
|
-// if (null == userId) {
|
|
|
-// // 未登录
|
|
|
-// PageResult<AppJobAdvertisedHomeRespVO> result = mapper.selectPage(pageReqVO);
|
|
|
-// if (CollUtil.isEmpty(result.getList())) {
|
|
|
-// // 没有数据, 再算一遍
|
|
|
-// pageReqVO.setTop(null);
|
|
|
-// return mapper.selectPage(pageReqVO);
|
|
|
-// }
|
|
|
-// }
|
|
|
-//
|
|
|
-// // 基于求职意向计算
|
|
|
-// List<JobInterestedDO> interestList = jobInterestedMapper.selectByUserIdList(userId);
|
|
|
-// if (CollUtil.isEmpty(interestList)) {
|
|
|
-// return mapper.selectPage(pageReqVO);
|
|
|
-// }
|
|
|
-// // 感兴趣的职位
|
|
|
-// List<Long> positionIds = interestList.stream()
|
|
|
-// .map(JobInterestedDO::getPositionId).collect(Collectors.toList());
|
|
|
-// // 希望工作的城市
|
|
|
-// List<Long> workAreaIds = interestList.stream()
|
|
|
-// .map(JobInterestedDO::getWorkAreaId).collect(Collectors.toList());
|
|
|
-// // 感兴趣的城市
|
|
|
-// List<Long> interestedAreaIds = interestList.stream()
|
|
|
-// .map(JobInterestedDO::getInterestedAreaIdList)
|
|
|
-// .filter(CollUtil::isNotEmpty)
|
|
|
-// .flatMap(Collection::stream) // 将嵌套列表展平为一个流
|
|
|
-// .map(Long::valueOf)
|
|
|
-// .distinct()
|
|
|
-// .collect(Collectors.toList());
|
|
|
-// // 感兴趣的行业
|
|
|
-// List<Long> inductionIds = interestList.stream()
|
|
|
-// .map(JobInterestedDO::getIndustryIdList)
|
|
|
-// .filter(CollUtil::isNotEmpty)
|
|
|
-// .flatMap(Collection::stream) // 将嵌套列表展平为一个流
|
|
|
-// .map(Long::valueOf)
|
|
|
-// .distinct()
|
|
|
-// .collect(Collectors.toList());
|
|
|
-//
|
|
|
-// pageReqVO.setJobTypes(interestList
|
|
|
-// .stream()
|
|
|
-// .map(JobInterestedDO::getJobType)
|
|
|
-// .collect(Collectors.toList())
|
|
|
-// );
|
|
|
-// pageReqVO.setPositionIds(positionIds);
|
|
|
-// pageReqVO.setIndustryIds(inductionIds);
|
|
|
-// pageReqVO.setAreaIds(
|
|
|
-// CollUtil.union(workAreaIds, interestedAreaIds)
|
|
|
-// .stream().distinct()
|
|
|
-// .collect(Collectors.toList())
|
|
|
-// );
|
|
|
-// pageReqVO.setAcquainted(true);
|
|
|
-// pageReqVO.setTop(false);
|
|
|
- try {
|
|
|
-// if (null != LoginUserContext.getUserId2()) {
|
|
|
-// Long[] ids = graphApi.queryRecommendJob(GraphQueryPageDTO
|
|
|
-// .builder()
|
|
|
-// .id(pageReqVO.getId())
|
|
|
-// .type(GraphQueryPageDTO.JOB)
|
|
|
-// .current(pageReqVO.getPageNo())
|
|
|
-// .size(pageReqVO.getPageSize())
|
|
|
-// .userId(LoginUserContext.getUserId2())
|
|
|
-// .build()
|
|
|
-// ).getCheckedData();
|
|
|
-// pageReqVO.setIds(ids);
|
|
|
-// } else {
|
|
|
- // 取最多发布职位的职位类型id
|
|
|
- pageReqVO.setPositionIds(mapper.selectTopPositionIdsByFrequency(pageParam.getPageSize()));
|
|
|
- pageReqVO.setNotNameList(List.of("厨师", "预订员", "实习生", "拉面师", "前台接待", "空调工", "楼层服务员", "礼宾员", "销售协调员"));
|
|
|
- pageReqVO.setHire(false);
|
|
|
-// }
|
|
|
- } catch (Exception ex) {
|
|
|
- ex.printStackTrace();
|
|
|
- }
|
|
|
+ // 取最多发布职位的职位类型id
|
|
|
+ pageReqVO.setPositionIds(mapper.selectTopPositionIdsByFrequency(pageParam.getPageSize()));
|
|
|
+ pageReqVO.setNotNameList(List.of("厨师", "预订员", "实习生", "拉面师", "前台接待", "空调工", "楼层服务员", "礼宾员", "销售协调员"));
|
|
|
+ pageReqVO.setHire(false);
|
|
|
+
|
|
|
PageResult<AppJobAdvertisedHomeRespVO> result = mapper.selectPage2(pageReqVO);
|
|
|
fillArea(result);
|
|
|
return result;
|
|
@@ -427,32 +358,36 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
|
|
|
@DSTransactional
|
|
|
public Long save(AppRecruitJobSaveReqVO reqVO) {
|
|
|
JobAdvertisedDO job = JobAdvertisedConvert.INSTANCE.convert3(reqVO);
|
|
|
- Long userId = LoginUserContext.getUserId();
|
|
|
- Long enterpriseId = LoginUserContext.getEnterpriseId();
|
|
|
- return save(job, enterpriseId, userId, reqVO.isFair());
|
|
|
+ return save(job);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 保存或更新职位信息。
|
|
|
+ * 保存或更新职位信息
|
|
|
*
|
|
|
- * @param job 职位信息对象
|
|
|
- * @param enterpriseId 企业ID
|
|
|
- * @param userId 用户ID
|
|
|
+ * @param job 职位信息对象
|
|
|
* @return 保存或更新后的职位ID
|
|
|
* @throws RuntimeException 如果职位名称重复或其他验证失败
|
|
|
*/
|
|
|
- public Long save(JobAdvertisedDO job, Long enterpriseId, Long userId, boolean fair) {
|
|
|
- // 检查职位名称是否重复
|
|
|
- if (mapper.existByName(enterpriseId, userId, job.getId(), job.getName())) {
|
|
|
- throw exception(MDE_JOB_ADVERTISED_NAME_DUPLICATE, job.getName());
|
|
|
- }
|
|
|
-
|
|
|
+ public Long save(JobAdvertisedDO job) {
|
|
|
if (null == job.getId()) {
|
|
|
- // 新增职位
|
|
|
- processNewJob(job, enterpriseId, userId, fair);
|
|
|
+ // 职位创建前的逻辑
|
|
|
+ jobOperateHandlers.forEach(handler -> handler.beforeCreate(job));
|
|
|
+ // 执行
|
|
|
+ mapper.insert(job);
|
|
|
+ // 职位创建后的逻辑
|
|
|
+ jobOperateHandlers.forEach(handler -> handler.afterCreate(job));
|
|
|
+ // 数据同步逻辑
|
|
|
+ jobOperateHandlers.forEach(handler -> handler.dataSync(job, OperateTypeEnum.ADD));
|
|
|
} else {
|
|
|
- // 修改职位
|
|
|
- processExistingJob(job, enterpriseId, userId, fair);
|
|
|
+ JobAdvertisedDO oldJob = get(job.getId());
|
|
|
+ // 职位修改前的逻辑
|
|
|
+ jobOperateHandlers.forEach(handler -> handler.beforeUpdate(job, oldJob));
|
|
|
+ // 执行
|
|
|
+ mapper.updateById(job);
|
|
|
+ // 职位创建后的逻辑
|
|
|
+ jobOperateHandlers.forEach(handler -> handler.afterUpdate(job, oldJob));
|
|
|
+ // 数据同步逻辑
|
|
|
+ jobOperateHandlers.forEach(handler -> handler.dataSync(job, OperateTypeEnum.UPDATE));
|
|
|
}
|
|
|
|
|
|
return job.getId();
|
|
@@ -473,11 +408,14 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
|
|
|
// 扣除额度
|
|
|
vipEntitlementCheckAspect.deductQuota(VipEntitlementCheck.OPERATE_PUBLISH_JOB, triggerVip);
|
|
|
}
|
|
|
+ // 职位从哪个模块新增
|
|
|
if (null == job.getSource()) {
|
|
|
job.setSource(JobSourceEnum.MANAGER.getType());
|
|
|
} else {
|
|
|
- if (null == job.getBizId() && JobSourceEnum.FAIR.getType().equals(job.getSource())) {
|
|
|
- throw exception(MDE_JOB_ADVERTISED_SOURCE_ID_NOT_NULL);
|
|
|
+ if (JobSourceEnum.FAIR.getType().equals(job.getSource())) {
|
|
|
+ if (null == job.getBizId()) {
|
|
|
+ throw exception(MDE_JOB_ADVERTISED_SOURCE_ID_NOT_NULL);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -568,7 +506,8 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
|
|
|
job.setStatus(JobStatusEnum.ENABLE.getStatus());
|
|
|
job.setUpdateTime(LocalDateTime.now());
|
|
|
mapper.updateById(job);
|
|
|
- jobDataSync(job, SyncConstants.UPDATE);
|
|
|
+ // 数据同步逻辑
|
|
|
+ jobOperateHandlers.forEach(handler -> handler.dataSync(job, OperateTypeEnum.UPDATE));
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -584,7 +523,8 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
|
|
|
}
|
|
|
job.setUpdateTime(LocalDateTime.now());
|
|
|
mapper.updateById(job);
|
|
|
- jobDataSync(job, SyncConstants.UPDATE);
|
|
|
+ // 数据同步逻辑
|
|
|
+ jobOperateHandlers.forEach(handler -> handler.dataSync(job, OperateTypeEnum.UPDATE));
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -605,7 +545,8 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
|
|
|
job.setStatus(JobStatusEnum.DISABLE.getStatus());
|
|
|
job.setUpdateTime(LocalDateTime.now());
|
|
|
mapper.updateById(job);
|
|
|
- jobDataSync(job, SyncConstants.UPDATE);
|
|
|
+ // 数据同步逻辑
|
|
|
+ jobOperateHandlers.forEach(handler -> handler.dataSync(job, OperateTypeEnum.UPDATE));
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -617,7 +558,8 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
|
|
|
job.setRefreshTime(time);
|
|
|
job.setUpdateTime(time);
|
|
|
mapper.updateById(job);
|
|
|
- jobDataSync(job, SyncConstants.UPDATE);
|
|
|
+ // 数据同步逻辑
|
|
|
+ jobOperateHandlers.forEach(handler -> handler.dataSync(job, OperateTypeEnum.UPDATE));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -657,7 +599,8 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
|
|
|
job.setUpdateTime(LocalDateTime.now());
|
|
|
job.setTop(true);
|
|
|
mapper.updateById(job);
|
|
|
- jobDataSync(job, SyncConstants.UPDATE);
|
|
|
+ // 数据同步逻辑
|
|
|
+ jobOperateHandlers.forEach(handler -> handler.dataSync(job, OperateTypeEnum.UPDATE));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -673,7 +616,8 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
|
|
|
job.setUpdateTime(LocalDateTime.now());
|
|
|
job.setTop(false);
|
|
|
mapper.updateById(job);
|
|
|
- jobDataSync(job, SyncConstants.UPDATE);
|
|
|
+ // 数据同步逻辑
|
|
|
+ jobOperateHandlers.forEach(handler -> handler.dataSync(job, OperateTypeEnum.UPDATE));
|
|
|
}
|
|
|
}
|
|
|
|