weaver-hrm-recruit/src/com/engine/recruit/service/impl/ApplicantResumeServiceImpl....

1079 lines
52 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.engine.recruit.service.impl;
import com.engine.core.impl.Service;
import com.engine.recruit.conn.*;
import com.engine.recruit.constant.RecruitConstant;
import com.engine.recruit.entity.card.*;
import com.engine.recruit.entity.card.process.*;
import com.engine.recruit.entity.record.ApplicantRecordPo;
import com.engine.recruit.enums.ApplicantOperateEnum;
import com.engine.recruit.enums.ApplicationStatusEnum;
import com.engine.recruit.enums.RecordOperateEnum;
import com.engine.recruit.exception.CustomizeRunTimeException;
import com.engine.recruit.service.ApplicantResumeService;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.util.IOUtils;
import weaver.common.DateUtil;
import weaver.conn.RecordSet;
import weaver.file.ImageFileManager;
import weaver.formmode.recruit.modeexpand.util.RecruitModeUtil;
import weaver.formmode.setup.ModeRightInfo;
import weaver.general.Util;
import weaver.hrm.resource.ResourceComInfo;
import java.io.InputStream;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author:dxfeng
* @createTime: 2023/09/20
* @version: 1.0
*/
public class ApplicantResumeServiceImpl extends Service implements ApplicantResumeService {
@Override
public Map<String, Object> getApplicantsName(String ids) {
Map<String, Object> returnMap = new HashMap<>(1);
RecordSet rs = new RecordSet();
String[] split = ids.split(",");
List<Map<String, Object>> list = new ArrayList<>();
for (String id : split) {
rs.executeQuery("select xm from uf_jcl_yppc where id = ?", id);
if (rs.next()) {
Map<String, Object> rowMap = new HashMap<>();
rowMap.put("id", id);
rowMap.put("name", rs.getString("xm"));
list.add(rowMap);
}
}
returnMap.put("rows", list);
return returnMap;
}
@Override
public Map<String, Object> getInterviewInfoById(String id) {
Map<String, Object> returnMap = new HashMap<>(16);
String sql = "select a.ypz,b.xm,a.ypzw,b.tdsj,b.sjhm,b.dzyx,a.msfs,a.mshj ,a.msc,a.msg ,a.ptmsg,a.msrq,a.msdd ,a.msfkr from uf_jcl_ms a inner join uf_jcl_yppc b on a.ypz = b.id where a.id = ?";
RecordSet rs = new RecordSet();
rs.executeQuery(sql, id);
if (rs.next()) {
// 应聘者
returnMap.put("ypz", createApplicantBrowserMap(rs.getString("ypz"), rs.getString("xm")));
// 应聘职位
returnMap.put("ypzw", createAppliedPositionBrowserMap(rs.getString("ypzw")));
// 投递时间
returnMap.put("tdsj", createApplicantBrowserMap(rs.getString("tdsj")));
// 手机号码
returnMap.put("sjhm", createApplicantBrowserMap(rs.getString("sjhm")));
// 电子邮箱
returnMap.put("dzyx", createApplicantBrowserMap(rs.getString("dzyx")));
// 面试方式
returnMap.put("msfs", createApplicantBrowserMap(rs.getString("msfs")));
// 面试环节
returnMap.put("mshj", createApplicantBrowserMap(rs.getString("mshj")));
// 面试轮次
returnMap.put("msc", createApplicantBrowserMap(rs.getString("msc")));
// 面试官
returnMap.put("msg", createResourceBrowserMap(rs.getString("msg")));
// 陪同面试官
returnMap.put("ptmsg", createResourceBrowserMap(rs.getString("ptmsg")));
// 面试日期
returnMap.put("msrq", createApplicantBrowserMap(rs.getString("msrq")));
// 面试地址
returnMap.put("msdd", createApplicantBrowserMap(rs.getString("msdd")));
}
return returnMap;
}
@Override
public Map<String, Object> getDisplayLayoutId(Map<String, Object> params) {
Map<String, Object> returnMap = new HashMap<>();
String layoutId = Util.null2String(params.get("layoutid"));
String modeId = Util.null2String(params.get("modeId"));
returnMap.put("layoutId", layoutId);
RecordSet rs = new RecordSet();
rs.executeQuery("select layoutname from modehtmllayout where modeid = ? and id = ?", modeId, layoutId);
if (rs.next()) {
String layoutName = rs.getString("layoutname");
// 获取相同名称的显示布局ID
rs.executeQuery("select id from modehtmllayout where type = 0 and modeid = ? and layoutname =?", modeId, layoutName);
if (rs.next()) {
returnMap.put("layoutId", rs.getString("id"));
}
}
return returnMap;
}
@Override
public Map<String, Object> getTabCount(Map<String, Object> params) {
Map<String, Object> returnMap = new HashMap<>();
String billId = Util.null2String(params.get("billid"));
List<Integer> countList = new ArrayList<>();
RecordSet rs = new RecordSet();
// 部门筛选反馈
rs.executeQuery("select count(id) as num from uf_jcl_bmsxfk where ypz = ?", billId);
if (rs.next()) {
countList.add(rs.getInt("num"));
}
// 笔试
rs.executeQuery("select count(id) as num from uf_jcl_bs where ypz = ?", billId);
if (rs.next()) {
countList.add(rs.getInt("num"));
}
// 面试
rs.executeQuery("select count(id) as num from uf_jcl_ms where ypz = ?", billId);
if (rs.next()) {
countList.add(rs.getInt("num"));
}
// 背调
rs.executeQuery("select count(id) as num from uf_jcl_bd where ypz = ?", billId);
if (rs.next()) {
countList.add(rs.getInt("num"));
}
// 薪酬谈判
rs.executeQuery("select count(id) as num from uf_jcl_xctp where ypz = ?", billId);
if (rs.next()) {
countList.add(rs.getInt("num"));
}
// 历史投递记录
rs.executeQuery("select xm,sjhm from uf_jcl_yppc where id = ?", billId);
if (rs.next()) {
rs.executeQuery("select count(id) as num from uf_jcl_yppc where xm=? and sjhm =?", rs.getString("xm"), rs.getString("sjhm"));
if (rs.next()) {
countList.add(rs.getInt("num"));
}
} else {
countList.add(0);
}
returnMap.put("countList", countList);
return returnMap;
}
@Override
public Map<String, Object> updateApplicantsInfo(Map<String, Object> params) {
Map<String, Object> returnMap = new HashMap<>();
String operateType = Util.null2String(params.get("operateType"));
RecordSet rs = new RecordSet();
if (ApplicantOperateEnum.ELIMINATE.getOperateType().equals(operateType)) {
// 淘汰
String ids = Util.null2String(params.get("ids"));
rs.executeUpdate("update uf_jcl_yppc set zt = ? where id in (" + ids + ")", ApplicationStatusEnum.OBSOLETE.getValue());
// 插入应聘过程
String dateTime = DateUtil.getDateTime();
for (String s : ids.split(",")) {
ApplicantRecordPo recordPo = ApplicantRecordPo.builder()
.billId(s)
.operateTime(dateTime)
.user(user)
.recordOperateType(RecordOperateEnum.ELIMINATE)
.build();
recordPo.execute();
}
returnMap.put("msg", "操作成功");
} else if (ApplicantOperateEnum.TRANSFER.getOperateType().equals(operateType)) {
// 转移阶段
String dqypjd = Util.null2String(params.get("dqypjd"));
String billid = Util.null2String(params.get("billid"));
Map<String, Object> otherParam = new HashMap<>();
otherParam.put("sourceStep", ApplicantCommonInfo.getCurrentStep(billid).getDescription());
// 查询当前阶段的阶段类型
rs.executeQuery("select jdlx from uf_jcl_zpjdsz where id = ?", dqypjd);
if (rs.next()) {
String jdlx = rs.getString("jdlx");
rs.executeUpdate("update uf_jcl_yppc set zpjd = ?,dqypjd = ? where id = ?", dqypjd, jdlx, billid);
returnMap.put("msg", "操作成功");
} else {
throw new CustomizeRunTimeException("转移阶段失败");
}
rs.executeQuery("select ypzw,zplc from uf_jcl_yppc where id = ?", billid);
if(rs.next()) {
StepMsgCommonInfo.sendMsg(String.valueOf(billid), Util.null2String(rs.getString("ypzw")), Util.null2String(rs.getString("zplc")), dqypjd, user);
}
otherParam.put("targetStep", ApplicantCommonInfo.getCurrentStep(billid).getDescription());
// 插入应聘过程
ApplicantRecordPo recordPo = ApplicantRecordPo.builder()
.billId(billid)
.operateTime(DateUtil.getDateTime())
.user(user)
.recordOperateType(RecordOperateEnum.TRANSFER_STAGE)
.otherParam(otherParam)
.build();
recordPo.execute();
} else if (ApplicantOperateEnum.ASSIGN.getOperateType().equals(operateType)) {
// 分配职位
String billid = Util.null2String(params.get("billid"));
if (StringUtils.isNotBlank(billid)) {
// 兼容V1版本分配职位操作
String ypzw = Util.null2String(params.get("ypzw"));
if (StringUtils.isBlank(ypzw)) {
throw new CustomizeRunTimeException("应聘职位不可为空");
}
String flowId = PositionCommonInfo.getRecruitFlowId(ypzw);
Map<String, String> initialStage = ApplicantCommonInfo.getInitialStage(flowId);
String zpjd = "";
String dqypjd = "";
if (null != initialStage) {
zpjd = initialStage.get("zpjd");
dqypjd = initialStage.get("jdlx");
}
rs.executeUpdate("update uf_jcl_yppc set ypzw = ? , zplc = ? , zpjd = ? , dqypjd = ?, zt = 1 where id = ?", ypzw, flowId, zpjd, dqypjd, billid);
StepMsgCommonInfo.sendMsg(billid, Util.null2String(ypzw), Util.null2String(flowId), Util.null2String(zpjd), user);
} else {
String ids = Util.null2String(params.get("ids"));
// 校验所选
rs.executeQuery("select id from uf_jcl_yppc where zt != 0 and id in(" + ids + ")");
if (rs.next()) {
throw new CustomizeRunTimeException("操作失败,当前存在非待分配简历数据,请刷新后重试");
}
String ypzw = Util.null2String(params.get("ypzw"));
String zplc = Util.null2String(params.get("zplc"));
String zpjd = Util.null2String(params.get("zpjd"));
String dqypjd = Util.null2String(params.get("dqypjd"));
if (StringUtils.isBlank(ypzw)) {
throw new CustomizeRunTimeException("应聘职位不可为空");
}
if (StringUtils.isBlank(zplc)) {
throw new CustomizeRunTimeException("未获取到招聘流程,请检查招聘职位配置");
}
if (StringUtils.isBlank(zpjd)) {
throw new CustomizeRunTimeException("未获取到招聘阶段,请检查招聘流程配置");
}
if (StringUtils.isBlank(dqypjd)) {
throw new CustomizeRunTimeException("当前应聘阶段获取失败");
}
rs.executeUpdate("update uf_jcl_yppc set ypzw = ? , zplc = ? , zpjd = ? , dqypjd = ?, zt = 1 where id in(" + ids + ")", ypzw, zplc, zpjd, dqypjd);
for (String s : ids.split(",")) {
StepMsgCommonInfo.sendMsg(s, Util.null2String(ypzw), Util.null2String(zplc), Util.null2String(zpjd), user);
}
}
returnMap.put("msg", "操作成功");
} else if (ApplicantOperateEnum.ARCHIVE.getOperateType().equals(operateType)) {
// 归档人才库
String gdyy = Util.null2String(params.get("gdyy"));
String gdxxyy = Util.null2String(params.get("gdxxyy"));
String ids = Util.null2String(params.get("ids"));
if (StringUtils.isNotBlank(ids)) {
String[] split = ids.split(",");
String dateTime = DateUtil.getDateTime();
for (String id : split) {
rs.executeUpdate("update uf_jcl_yppc set gdyy = ?,gdxxyy = ? where id = ? ", gdyy, gdxxyy, id);
// 建模推送建模
archiveTalentPool(id, false, "");
// 更新应聘状态为已归档
rs.executeUpdate("update uf_jcl_yppc set zt = ? where id = ? ", ApplicationStatusEnum.ARCHIVED.getValue(), id);
// 插入应聘过程
Map<String, Object> otherParam = new HashMap<>();
otherParam.put("gdyy", gdyy);
otherParam.put("gdxxyy", gdxxyy);
ApplicantRecordPo recordPo = ApplicantRecordPo.builder()
.billId(id)
.operateTime(dateTime)
.user(user)
.recordOperateType(RecordOperateEnum.ARCHIVE_TALENT_POOL)
.otherParam(otherParam)
.build();
recordPo.execute();
}
} else {
throw new CustomizeRunTimeException("请至少选择一条数据");
}
} else if (ApplicantOperateEnum.REFERRAL.getOperateType().equals(operateType)) {
// 转推其他职位
String sourceId = Util.null2String(params.get("sourceId"));
String ypzw = Util.null2String(params.get("ypzw"));
rs.executeQuery("select * from uf_jcl_yppc where id = ?", sourceId);
Map<String, Object> mainDataMap = RecruitRecordSet.getSingleRecordMap(rs);
// 转推其他职位的时候,如果选择的职位存在候选中的
// 提示:该职位已在应聘中,无需重复应聘
String xm = Util.null2String(mainDataMap.get("xm"));
String sjhm = Util.null2String(mainDataMap.get("sjhm"));
if (StringUtils.isNotBlank(sjhm)) {
rs.executeQuery("select id from uf_jcl_yppc where formmodeid is not null and xm = ? and sjhm = ? and ypzw = ? and zt = 1 ", xm, sjhm, ypzw);
} else {
rs.executeQuery("select id from uf_jcl_yppc where formmodeid is not null and xm = ? and (sjhm is null or sjhm = '') and ypzw = ? and zt = 1 ", xm, ypzw);
}
if (rs.next()) {
throw new CustomizeRunTimeException("该职位已在应聘中,无需重复应聘");
}
// 构建新数据
mainDataMap.put("ypzw", ypzw);
String flowId = PositionCommonInfo.getRecruitFlowId(ypzw);
Map<String, String> initialStage = ApplicantCommonInfo.getInitialStage(flowId);
if (null != initialStage) {
String zpjd = initialStage.get("zpjd");
String dqypjd = initialStage.get("jdlx");
if (StringUtils.isNotBlank(zpjd) && StringUtils.isNotBlank(dqypjd)) {
mainDataMap.put("zplc", flowId);
mainDataMap.put("zpjd", zpjd);
mainDataMap.put("dqypjd", dqypjd);
}
} else {
throw new CustomizeRunTimeException("未获取到关联招聘流程的招聘阶段,请检查流程配置");
}
// 投递时间
mainDataMap.put("tdsj", DateUtil.getDateTime());
mainDataMap.put("zt", ApplicationStatusEnum.CANDIDATE.getValue());
RecruitRecordSet.buildModeInsertFields(mainDataMap, user.getUID());
String uuid = UUID.randomUUID().toString();
mainDataMap.put("modeuuid", uuid);
// 移除不需要插入的字段
mainDataMap.remove("id");
mainDataMap.remove("requestId");
mainDataMap.remove("form_biz_id");
// 插入数据
RecruitRecordSet.insertData(mainDataMap, "uf_jcl_yppc");
// 权限重构
rs.executeQuery("select id,formmodeid from uf_jcl_yppc where modeuuid='" + uuid + "'");
if (rs.next()) {
//建模数据的id
int targetId = Util.getIntValue(rs.getString("id"));
int formModeId = Util.getIntValue(rs.getString("formmodeid"));
ModeRightInfo modeRightInfo = new ModeRightInfo();
modeRightInfo.setNewRight(true);
//新建的时候添加共享
modeRightInfo.editModeDataShare(user.getUID(), formModeId, targetId);
// 阶段提醒
StepMsgCommonInfo.sendMsg(String.valueOf(targetId), Util.null2String(ypzw), Util.null2String(flowId), Util.null2String(mainDataMap.get("zpjd")), user);
// 复制明细表数据
rs.executeUpdate("insert into uf_jcl_yppc_dt1 (mainid,xxmc,xl,zy,kssj,jssj) select ?,xxmc,xl,zy,kssj,jssj from uf_jcl_yppc_dt1 where mainid = ?", targetId, sourceId);
rs.executeUpdate("insert into uf_jcl_yppc_dt2 (mainid,gsmc,kssj,jssj,gw,sqyxk,lzyy,gzzz) select ?,gsmc,kssj,jssj,gw,sqyxk,lzyy,gzzz from uf_jcl_yppc_dt2 where mainid = ?", targetId, sourceId);
rs.executeUpdate("insert into uf_jcl_yppc_dt3 (mainid,xmmc,kssj,jssj,drjs,xmms) select ?,xmmc,kssj,jssj,drjs,xmms from uf_jcl_yppc_dt3 where mainid = ?", targetId, sourceId);
rs.executeUpdate("insert into uf_jcl_yppc_dt4 (mainid,yylx,zwcd) select ?,yylx,zwcd from uf_jcl_yppc_dt4 where mainid = ?", targetId, sourceId);
}
}
return returnMap;
}
@Override
public Map<String, Object> checkRepeatResume(Map<String, Object> param) {
String name = Util.null2String(param.get("xm"));
String mobile = Util.null2String(param.get("sjhm"));
String positionId = Util.null2String(param.get("ypzw"));
String billId = Util.null2String(param.get("billid"));
Map<String, Object> returnMap = new HashMap<>();
// 判断是否黑名单
boolean joinBlackList = CheckRepeatResume.joinBlackList(name, mobile);
if (joinBlackList) {
throw new CustomizeRunTimeException("保存失败,当前录入应聘者为黑名单人员");
}
List<Map<String, Object>> repeatPositionResumeList = CheckRepeatResume.getRepeatPositionResumeList(name, mobile, positionId, billId);
if (CollectionUtils.isNotEmpty(repeatPositionResumeList)) {
if (StringUtils.isBlank(positionId)) {
throw new CustomizeRunTimeException("保存失败,该人员已有待分配状态数据");
}
throw new CustomizeRunTimeException("保存失败,该人员已有相同的应聘中的职位");
}
return returnMap;
}
@Override
public Map<String, Object> getResumeCardInfo(Map<String, Object> param) {
String idsString = Util.null2String(param.get("idsString"));
List<ResumeCardInfo> resumeCardInfos = new ArrayList<>();
if (StringUtils.isNotBlank(idsString)) {
String[] ids = idsString.split(",");
for (String id : ids) {
RecordSet rs = new RecordSet();
rs.executeQuery("select id, xm, jlzp, ypzw, xb, nl, zgxl, gzjy, tdsj, jlly, dqypjd from uf_jcl_yppc where id = ?", id);
RecruitDataMap<Object> map = RecruitRecordSet.getSingleRecordMap(rs);
ResumeCardInfo resumeCardInfo = new ResumeCardInfo();
// 基本信息构建
resumeCardInfo.setId(map.getInt("id"));
resumeCardInfo.setLastName(map.getString("xm"));
resumeCardInfo.setApplicantUrl(RecruitConstant.APPLICANT_URL + "?billId=" + id);
resumeCardInfo.setCurrentStage(map.getString("dqypjd"));
String jlzp = map.getString("jlzp");
if (StringUtils.isNotBlank(jlzp)) {
try {
int imageFieldByDocId = ApplicantCommonInfo.getImageFieldByDocId(jlzp);
ImageFileManager manager = new ImageFileManager();
manager.getImageFileInfoById(imageFieldByDocId);
InputStream inputStream = manager.getInputStream();
// 转base64
String base64 = Base64.getEncoder().encodeToString(IOUtils.toByteArray(inputStream));
resumeCardInfo.setImage("data:image/png;base64," + base64);
} catch (Exception e) {
rs.writeLog("简历头像转换失败", e);
}
} else {
resumeCardInfo.setImage("/images/recruit/applicant.png");
}
resumeCardInfo.setJobTitle(ApplicantCommonInfo.getApplicantPosition(map.getString("ypzw")));
resumeCardInfo.setSex(map.getString("xb"));
resumeCardInfo.setAge(map.getString("nl"));
resumeCardInfo.setEducation(map.getString("zgxl"));
resumeCardInfo.setWorkYear(ApplicantCommonInfo.getRecruitCommonBrowserValue(map.getString("gzjy")));
resumeCardInfo.setSubmissionTime(map.getString("tdsj"));
resumeCardInfo.setSubmissionFrom(ApplicantCommonInfo.getRecruitCommonBrowserValue(map.getString("jlly")));
// 标签构建
List<Tags> tags = new ArrayList<>();
List<Map<String, Object>> modeTabs = ApplicantResumeServiceImpl.getModeTabs(id, rs);
if (CollectionUtils.isNotEmpty(modeTabs)) {
for (Map<String, Object> modeTab : modeTabs) {
Tags tag = new Tags();
tag.setTitle(Util.null2String(modeTab.get("tabname")));
tag.setColor(Util.null2String(modeTab.get("color")));
tag.setBgColor(Util.null2String(modeTab.get("bgcolor")));
tag.setBdColor(Util.null2String(modeTab.get("bdcolor")));
tags.add(tag);
}
}
resumeCardInfo.setTags(tags);
// 教育经历 默认取最新的一段,若无,则显示“暂无学习经历”
List<EduInfo> eduInfoList = new ArrayList<>();
rs.executeQuery("select * from uf_jcl_yppc_dt1 where mainid =? order by kssj desc", id);
RecruitDataMap<Object> eduInfoMap = RecruitRecordSet.getSingleRecordMap(rs);
if (!eduInfoMap.isEmpty()) {
EduInfo eduInfo = new EduInfo();
String kssj = eduInfoMap.getString("kssj");
String jssj = eduInfoMap.getString("jssj");
eduInfo.setStart(kssj);
eduInfo.setEnd(jssj);
eduInfo.setProfessional(eduInfoMap.getString("zy"));
eduInfo.setSchool(eduInfoMap.getString("xxmc"));
eduInfoList.add(eduInfo);
}
resumeCardInfo.setEduInfo(eduInfoList);
// 工作经历 默认取最新的两段,时间倒序,若无,则显示“暂无工作经历”,增加工作时间计算(结束时间-开始时间,显示年月)
List<WorkInfo> workInfoList = new ArrayList<>();
rs.executeQuery("select * from uf_jcl_yppc_dt2 where mainid =? order by kssj desc", id);
while (rs.next() && workInfoList.size() < 2) {
WorkInfo workInfo = new WorkInfo();
workInfo.setStart(rs.getString("kssj"));
workInfo.setEnd(rs.getString("jssj"));
workInfo.setCompany(rs.getString("gsmc"));
workInfo.setJob(rs.getString("gw"));
workInfoList.add(workInfo);
}
resumeCardInfo.setWorkInfo(workInfoList);
// 招聘过程
List<RecruitProcess> recruitProcessList = new ArrayList<>();
// 若未发起反馈则不展示,若有且均为待反馈的,则显示待反馈,反馈人;若存在已反馈记录的,则显示,反馈结果,反馈人【取最新反馈的结果】;若存在多条则取最新的【创建时间】
buildScreenProcess(id, rs, recruitProcessList);
// 最近笔试:若未发起,则不显示,若有记录但是无分数和结果的,显示“暂无得分结果”;若有结果则显示“得分、结果”;若存在多条,则显示最新的数据;若存在多条则取最新的【笔试时间】
buildWrittenProcess(id, rs, recruitProcessList);
// 最近面试:若未发起,则不显示,若有记录但是是“待面试”,显示“面试时间、待面试、面试官”;若有结果则显示“面试时间、结果、面试官”;若存在多条,则显示最新的数据;若存在多条则取最新的【面试时间】
buildInterviewProcess(id, rs, recruitProcessList);
// 最近背调:若未发起,则不显示,若有记录但是无结果的,显示“暂无背调结果”;若有结果则显示“背调日期,结果”;若存在多条,则显示最新的数据;若存在多条则取最新的【背调时间】
buildBackProcess(id, rs, recruitProcessList);
// 最近薪酬谈判:若未发起,则不显示,若有记录但是无结果的,显示“暂无薪酬谈判结果”;若有结果则显示“谈判日期,结果”;若存在多条,则显示最新的数据;若存在多条则取最新的【谈判时间】
buildSalaryProcess(id, rs, recruitProcessList);
// offer状态若未产生数据则不显示若有数据了则显示offer状态若反馈时间有数值则显示没数值则不现实
buildOfferProcess(id, rs, recruitProcessList);
recruitProcessList = recruitProcessList.stream().sorted(Comparator.comparing(RecruitProcess::getCreateDateTime)).collect(Collectors.toList());
resumeCardInfo.setRecruitProcess(recruitProcessList);
resumeCardInfos.add(resumeCardInfo);
}
}
Map<String, Object> returnMap = new HashMap<>();
returnMap.put("resumeCardInfos", resumeCardInfos);
return returnMap;
}
@Override
public String getResumeListStatus(Map<String, Object> param) {
int uid = user.getUID();
RecordSet rs = new RecordSet();
rs.executeQuery("select ypzlb from uf_jcl_recruit where userId = ?", uid);
String listType = "1";
if (rs.next()) {
listType = rs.getString("ypzlb");
}
return listType;
}
@Override
public Map<String, Object> updateResumeListStatus(Map<String, Object> param) {
int uid = user.getUID();
String listType = Util.null2String(param.get("listType"));
RecordSet rs = new RecordSet();
rs.executeQuery("select ypzlb from uf_jcl_recruit where userId = ?", uid);
if (rs.next()) {
rs.executeUpdate("update uf_jcl_recruit set ypzlb = ? where userId = ?", listType, uid);
} else {
rs.executeUpdate("insert into uf_jcl_recruit (ypzlb,userId) values (?,?)", listType, uid);
}
return null;
}
/**
* 若未发起反馈则不展示,若有且均为待反馈的,则显示待反馈,反馈人;若存在已反馈记录的,则显示,反馈结果,反馈人【取最新反馈的结果】;若存在多条则取最新的【创建时间】
*
* @param id
* @param rs
* @param recruitProcessList
*/
private void buildScreenProcess(String id, RecordSet rs, List<RecruitProcess> recruitProcessList) {
rs.executeQuery("select zt,fkr,jg,modedatacreatedate,modedatacreatetime from uf_jcl_bmsxfk where ypz = ? order by modedatacreatedate desc,modedatacreatetime desc", id);
if (rs.next()) {
// 状态
String zt = rs.getString("zt");
// 反馈人
String fkr = rs.getString("fkr");
// 结果
String jg = rs.getString("jg");
String date = rs.getString("modedatacreatedate");
String time = rs.getString("modedatacreatetime");
ScreenProcess screenProcess = new ScreenProcess();
screenProcess.setZt(zt);
screenProcess.setFkr(fkr);
screenProcess.setJg(jg);
RecruitProcess process = new RecruitProcess();
process.setTitle(ScreenProcess.TITLE);
process.setIcon(ScreenProcess.ICON_NAME);
process.setValue(screenProcess.toString());
process.setCreateDateTime(DateUtil.parseToDateTime(date + " " + time));
recruitProcessList.add(process);
}
}
/**
* 最近笔试:若未发起,则不显示,若有记录但是无分数和结果的,显示“暂无得分结果”;若有结果则显示“得分、结果”;若存在多条,则显示最新的数据;若存在多条则取最新的【笔试时间】
*
* @param id
* @param rs
* @param recruitProcessList
*/
private void buildWrittenProcess(String id, RecordSet rs, List<RecruitProcess> recruitProcessList) {
rs.executeQuery("select bsmc ,bscj ,bsjg ,modedatacreatedate ,modedatacreatetime from uf_jcl_bs where ypz = ? order by bssj desc", id);
if (rs.next()) {
// 笔试名称
String bsmc = rs.getString("bsmc");
// 笔试成绩
String bscj = rs.getString("bscj");
// 笔试结果
String bsjg = rs.getString("bsjg");
String date = rs.getString("modedatacreatedate");
String time = rs.getString("modedatacreatetime");
WrittenProcess writtenProcess = new WrittenProcess();
writtenProcess.setBsmc(bsmc);
writtenProcess.setBscj(bscj);
writtenProcess.setBsjg(bsjg);
RecruitProcess process = new RecruitProcess();
process.setTitle(WrittenProcess.TITLE);
process.setIcon(WrittenProcess.ICON_NAME);
process.setValue(writtenProcess.toString());
process.setCreateDateTime(DateUtil.parseToDateTime(date + " " + time));
recruitProcessList.add(process);
}
}
/**
* 最近面试:若未发起,则不显示,若有记录但是是“待面试”,显示“面试时间、待面试、面试官”;若有结果则显示“面试时间、结果、面试官”;若存在多条,则显示最新的数据;若存在多条则取最新的【面试时间】
*
* @param id
* @param rs
* @param recruitProcessList
*/
private void buildInterviewProcess(String id, RecordSet rs, List<RecruitProcess> recruitProcessList) {
rs.executeQuery("select id,zt, msrq, msg, ptmsg, jg, modedatacreatedate, modedatacreatetime from uf_jcl_ms where ypz = ? order by msrq desc", id);
if (rs.next()) {
// 面试状态
String zt = rs.getString("zt");
// 面试日期
String msrq = rs.getString("msrq");
// 面试官
String msg = rs.getString("msg");
// 结果
String jg = rs.getString("jg");
String date = rs.getString("modedatacreatedate");
String time = rs.getString("modedatacreatetime");
InterviewProcess interviewProcess = new InterviewProcess();
interviewProcess.setZt(zt);
interviewProcess.setMsrq(msrq);
String msId = rs.getString("id");
// 查询面试评价
rs.executeQuery("select msg,jg from uf_jcl_mspjfk where msid = ?", msId);
while(rs.next()){
interviewProcess.addInterviewDetail(rs.getString("msg"), rs.getString("jg"));
}
List<InterviewProcess.InterviewDetail> interviewDetails = interviewProcess.getInterviewDetails();
if(CollectionUtils.isEmpty(interviewDetails)){
if(StringUtils.isNotBlank(msg)){
String[] split = msg.split(",");
for (String s : split) {
interviewProcess.addInterviewDetail(s, jg);
}
}
}
RecruitProcess process = new RecruitProcess();
process.setTitle(InterviewProcess.TITLE);
process.setIcon(InterviewProcess.ICON_NAME);
process.setValue(interviewProcess.toString());
process.setCreateDateTime(DateUtil.parseToDateTime(date + " " + time));
recruitProcessList.add(process);
}
}
/**
* 最近背调:若未发起,则不显示,若有记录但是无结果的,显示“暂无背调结果”;若有结果则显示“背调日期,结果”;若存在多条,则显示最新的数据;若存在多条则取最新的【背调时间】
*
* @param id
* @param rs
* @param recruitProcessList
*/
private void buildBackProcess(String id, RecordSet rs, List<RecruitProcess> recruitProcessList) {
rs.executeQuery("select dcrq, dcjg, modedatacreatedate, modedatacreatetime from uf_jcl_bd where ypz = ? order by dcrq desc", id);
if (rs.next()) {
// 调查日期
String dcrq = rs.getString("dcrq");
// 调查结果
String dcjg = rs.getString("dcjg");
String date = rs.getString("modedatacreatedate");
String time = rs.getString("modedatacreatetime");
BackProcess backProcess = new BackProcess();
backProcess.setDcjg(dcjg);
backProcess.setDcrq(dcrq);
RecruitProcess process = new RecruitProcess();
process.setTitle(BackProcess.TITLE);
process.setIcon(BackProcess.ICON_NAME);
process.setValue(backProcess.toString());
process.setCreateDateTime(DateUtil.parseToDateTime(date + " " + time));
recruitProcessList.add(process);
}
}
/**
* 最近薪酬谈判:若未发起,则不显示,若有记录但是无结果的,显示“暂无薪酬谈判结果”;若有结果则显示“谈判日期,结果”;若存在多条,则显示最新的数据;若存在多条则取最新的【谈判时间】
*
* @param id
* @param rs
* @param recruitProcessList
*/
private void buildSalaryProcess(String id, RecordSet rs, List<RecruitProcess> recruitProcessList) {
rs.executeQuery("select tpsj, tpjg, modedatacreatedate, modedatacreatetime from uf_jcl_xctp where ypz = ? order by tpsj desc", id);
if (rs.next()) {
// 谈判时间
String tpsj = rs.getString("tpsj");
// 谈判结果
String tpjg = rs.getString("tpjg");
String date = rs.getString("modedatacreatedate");
String time = rs.getString("modedatacreatetime");
SalaryProcess salaryProcess = new SalaryProcess();
salaryProcess.setTpjg(tpjg);
salaryProcess.setTpsj(tpsj);
RecruitProcess process = new RecruitProcess();
process.setTitle(SalaryProcess.TITLE);
process.setIcon(SalaryProcess.ICON_NAME);
process.setValue(salaryProcess.toString());
process.setCreateDateTime(DateUtil.parseToDateTime(date + " " + time));
recruitProcessList.add(process);
}
}
/**
* offer状态若未产生数据则不显示若有数据了则显示offer状态若反馈时间有数值则显示没数值则不现实
*
* @param id
* @param rs
* @param recruitProcessList
*/
private void buildOfferProcess(String id, RecordSet rs, List<RecruitProcess> recruitProcessList) {
rs.executeQuery("select zt, fksj, modedatacreatedate, modedatacreatetime from uf_jcl_offer where xm = ? order by modedatacreatedate desc,modedatacreatetime desc", id);
if (rs.next()) {
// offer状态
String zt = rs.getString("zt");
// 反馈时间
String fksj = rs.getString("fksj");
String date = rs.getString("modedatacreatedate");
String time = rs.getString("modedatacreatetime");
OfferProcess offerProcess = new OfferProcess();
offerProcess.setFksj(fksj);
offerProcess.setZt(zt);
RecruitProcess process = new RecruitProcess();
process.setTitle(OfferProcess.TITLE);
process.setIcon(OfferProcess.ICON_NAME);
process.setValue(offerProcess.toString());
process.setCreateDateTime(DateUtil.parseToDateTime(date + " " + time));
recruitProcessList.add(process);
}
}
/**
* 构建普通数据格式
*
* @param value
* @return
*/
private Map<String, Object> createApplicantBrowserMap(String value) {
if (StringUtils.isBlank(value)) {
return null;
}
Map<String, Object> browserMap = new HashMap<>(1);
browserMap.put("value", value);
return browserMap;
}
/**
* 构建应聘者浏览按钮值
*
* @param id
* @param name
* @return
*/
private Map<String, Object> createApplicantBrowserMap(String id, String name) {
Map<String, Object> browserMap = new HashMap<>(2);
if (StringUtils.isBlank(id)) {
return browserMap;
}
browserMap.put("value", id);
List<Map<String, Object>> objList = new ArrayList<>();
Map<String, Object> obj = new HashMap<>(2);
obj.put("id", id);
obj.put("name", name);
objList.add(obj);
browserMap.put("specialobj", objList);
return browserMap;
}
/**
* 构建应聘职位浏览按钮
*
* @param id
* @return
*/
private Map<String, Object> createAppliedPositionBrowserMap(String id) {
Map<String, Object> browserMap = new HashMap<>(2);
if (StringUtils.isBlank(id)) {
return browserMap;
}
browserMap.put("value", id);
RecordSet rs = new RecordSet();
rs.executeQuery("select zpzwmc from uf_jcl_zp_zpzw where id = ?", id);
if (rs.next()) {
List<Map<String, Object>> objList = new ArrayList<>();
Map<String, Object> obj = new HashMap<>(2);
obj.put("id", id);
obj.put("name", rs.getString("zpzwmc"));
objList.add(obj);
browserMap.put("specialobj", objList);
}
return browserMap;
}
/**
* 构建人员浏览按钮值
*
* @param ids
* @return
*/
private Map<String, Object> createResourceBrowserMap(String ids) {
Map<String, Object> browserMap = new HashMap<>(2);
if (StringUtils.isBlank(ids)) {
return browserMap;
}
browserMap.put("value", ids);
List<Map<String, Object>> objList = new ArrayList<>();
String[] split = ids.split(",");
try {
ResourceComInfo resourceComInfo = new ResourceComInfo();
for (String s : split) {
Map<String, Object> obj = new HashMap<>(2);
obj.put("id", s);
obj.put("name", resourceComInfo.getLastname(s));
objList.add(obj);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
browserMap.put("specialobj", objList);
return browserMap;
}
/**
* 归档人才库
*
* @param applicantId 应聘者ID
* @param joinBlacklist 是否加入黑名单
* @param gdyy 归档原因
*/
public void archiveTalentPool(String applicantId, boolean joinBlacklist, String gdyy) {
RecordSet rs = new RecordSet();
String name = "";
String mobile = "";
String talentPoolId = "";
rs.executeQuery("select xm,sjhm from uf_jcl_yppc where id = ?", applicantId);
if (rs.next()) {
name = rs.getString("xm");
mobile = rs.getString("sjhm");
}
rs.executeQuery("select id from uf_jcl_rck where xm = ? and sjhm = ?", name, mobile);
if (rs.next()) {
talentPoolId = rs.getString("id");
}
// 推送建模主表数据
Map<String, Object> dataMap = new RecruitDataMap<>();
String uuid = UUID.randomUUID().toString();
dataMap.put("modeuuid", uuid);
int formModeId = ApplicantCommonInfo.getModeIdByTableName("uf_jcl_rck");
dataMap.put("formmodeid", formModeId);
// 构建建模表基本数据
RecruitRecordSet.buildModeInsertFields(dataMap, user.getUID());
rs.executeQuery("select * from uf_jcl_yppc where id = ?", applicantId);
if (rs.next()) {
dataMap.put("sfz", RecruitModeUtil.parseBlankToNull(rs.getString("sfz")));
dataMap.put("jlzp", RecruitModeUtil.parseBlankToNull(rs.getString("jlzp")));
dataMap.put("zhypzw", RecruitModeUtil.parseBlankToNull(rs.getString("ypzw")));
dataMap.put("ysjl", RecruitModeUtil.parseBlankToNull(rs.getString("ysjl")));
dataMap.put("jlly", RecruitModeUtil.parseBlankToNull(rs.getString("jlly")));
dataMap.put("xm", RecruitModeUtil.parseBlankToNull(rs.getString("xm")));
dataMap.put("xb", RecruitModeUtil.parseBlankToNull(rs.getString("xb")));
dataMap.put("sjhm", RecruitModeUtil.parseBlankToNull(rs.getString("sjhm")));
dataMap.put("dzyx", RecruitModeUtil.parseBlankToNull(rs.getString("dzyx")));
dataMap.put("csrq", RecruitModeUtil.parseBlankToNull(rs.getString("csrq")));
dataMap.put("nl", RecruitModeUtil.parseBlankToNull(rs.getString("nl")));
dataMap.put("zgxl", RecruitModeUtil.parseBlankToNull(rs.getString("zgxl")));
dataMap.put("zgxw", RecruitModeUtil.parseBlankToNull(rs.getString("zgxw")));
dataMap.put("byyx", RecruitModeUtil.parseBlankToNull(rs.getString("byyx")));
dataMap.put("zy", RecruitModeUtil.parseBlankToNull(rs.getString("zy")));
dataMap.put("hyzk", RecruitModeUtil.parseBlankToNull(rs.getString("hyzk")));
dataMap.put("gzjy", RecruitModeUtil.parseBlankToNull(rs.getString("gzjy")));
dataMap.put("zzzt", RecruitModeUtil.parseBlankToNull(rs.getString("zzzt")));
dataMap.put("dqszd", RecruitModeUtil.parseBlankToNull(rs.getString("dqszd")));
dataMap.put("zhtdsj", RecruitModeUtil.parseBlankToNull(rs.getString("tdsj")));
dataMap.put("cjr", RecruitModeUtil.parseBlankToNull(rs.getString("cjr")));
dataMap.put("zwpj", RecruitModeUtil.parseBlankToNull(rs.getString("zwpj")));
dataMap.put("mz", RecruitModeUtil.parseBlankToNull(rs.getString("mz")));
dataMap.put("jg", RecruitModeUtil.parseBlankToNull(rs.getString("jg")));
dataMap.put("zzmm", RecruitModeUtil.parseBlankToNull(rs.getString("zzmm")));
dataMap.put("sgcm", RecruitModeUtil.parseBlankToNull(rs.getString("sgcm")));
dataMap.put("tzkg", RecruitModeUtil.parseBlankToNull(rs.getString("tzkg")));
// 归档阶段
dataMap.put("gdjd", RecruitModeUtil.parseBlankToNull(rs.getString("dqypjd")));
dataMap.put("gdyy", RecruitModeUtil.parseBlankToNull(rs.getString("gdyy")));
dataMap.put("gdxxyy", RecruitModeUtil.parseBlankToNull(rs.getString("gdxxyy")));
}
// 历史投递次数
rs.executeQuery("select count(id) as num from uf_jcl_yppc where xm=? and sjhm =?", rs.getString("xm"), rs.getString("sjhm"));
if (rs.next()) {
dataMap.put("lstdcs", rs.getInt("num"));
}
// 是否加入黑名单
if (joinBlacklist) {
dataMap.put("sfjrhmd", 0);
// 归档原因黑名单
dataMap.put("gdyy", 16);
} else {
dataMap.put("sfjrhmd", 1);
}
if (StringUtils.isNotBlank(gdyy)) {
dataMap.put("gdyy", gdyy);
dataMap.put("gdxxyy", "");
}
RecruitRecordSet.insertData(dataMap, "uf_jcl_rck");
refreshRight(uuid, formModeId, applicantId);
// 删除人才库原来的数据
rs.executeUpdate("delete from uf_jcl_rck where id = ? ", talentPoolId);
rs.executeUpdate("delete from uf_jcl_rck_dt1 where mainid = ? ", talentPoolId);
rs.executeUpdate("delete from uf_jcl_rck_dt2 where mainid = ? ", talentPoolId);
rs.executeUpdate("delete from uf_jcl_rck_dt3 where mainid = ? ", talentPoolId);
rs.executeUpdate("delete from uf_jcl_rck_dt4 where mainid = ? ", talentPoolId);
}
/**
* 权限重构
*
* @param uuid UUID
* @param formModeId 建模ID
* @param applicantId 应聘者ID
*/
private void refreshRight(String uuid, int formModeId, String applicantId) {
RecordSet rs = new RecordSet();
rs.executeQuery("select id from uf_jcl_rck where modeuuid='" + uuid + "'");
if (rs.next()) {
//建模数据的id
int bid = Util.getIntValue(rs.getString("id"));
ModeRightInfo modeRightInfo = new ModeRightInfo();
modeRightInfo.setNewRight(true);
//新建的时候添加共享
modeRightInfo.editModeDataShare(user.getUID(), formModeId, bid);
// 插入明细表数据
rs.executeQuery("select * from uf_jcl_yppc_dt1 where mainid = ? ", applicantId);
List<List<Object>> insertList = new ArrayList<>();
while (rs.next()) {
List<Object> paramList = new ArrayList<>();
// mainid
paramList.add(bid);
paramList.add(RecruitModeUtil.parseBlankToNull(rs.getString("xxmc")));
paramList.add(RecruitModeUtil.parseBlankToNull(rs.getString("xl")));
paramList.add(RecruitModeUtil.parseBlankToNull(rs.getString("zy")));
paramList.add(RecruitModeUtil.parseBlankToNull(rs.getString("kssj")));
paramList.add(RecruitModeUtil.parseBlankToNull(rs.getString("jssj")));
insertList.add(paramList);
}
for (List<Object> list : insertList) {
rs.executeUpdate("insert into uf_jcl_rck_dt1 (mainid, xxmc, xl, zy, kssj, jssj) values (?, ?, ?, ?, ?, ?)", list);
}
rs.executeQuery("select * from uf_jcl_yppc_dt2 where mainid = ? ", applicantId);
insertList = new ArrayList<>();
while (rs.next()) {
List<Object> paramList = new ArrayList<>();
// mainid
paramList.add(bid);
paramList.add(RecruitModeUtil.parseBlankToNull(rs.getString("gsmc")));
paramList.add(RecruitModeUtil.parseBlankToNull(rs.getString("kssj")));
paramList.add(RecruitModeUtil.parseBlankToNull(rs.getString("jssj")));
paramList.add(RecruitModeUtil.parseBlankToNull(rs.getString("gw")));
paramList.add(RecruitModeUtil.parseBlankToNull(rs.getString("gzzz")));
paramList.add(RecruitModeUtil.parseBlankToNull(rs.getString("sqyxk")));
paramList.add(RecruitModeUtil.parseBlankToNull(rs.getString("lzyy")));
insertList.add(paramList);
}
for (List<Object> list : insertList) {
rs.executeUpdate("insert into uf_jcl_rck_dt2 (mainid, gsmc, kssj, jssj, gw, gzzz, sqyxk, lzyy) values (?, ?, ?, ?, ?, ?, ?, ?)", list);
}
rs.executeQuery("select * from uf_jcl_yppc_dt3 where mainid = ? ", applicantId);
insertList = new ArrayList<>();
while (rs.next()) {
List<Object> paramList = new ArrayList<>();
// mainid
paramList.add(bid);
paramList.add(RecruitModeUtil.parseBlankToNull(rs.getString("xmmc")));
paramList.add(RecruitModeUtil.parseBlankToNull(rs.getString("kssj")));
paramList.add(RecruitModeUtil.parseBlankToNull(rs.getString("jssj")));
paramList.add(RecruitModeUtil.parseBlankToNull(rs.getString("drjs")));
paramList.add(RecruitModeUtil.parseBlankToNull(rs.getString("xmms")));
insertList.add(paramList);
}
for (List<Object> list : insertList) {
rs.executeUpdate("insert into uf_jcl_rck_dt3 (mainid, xmmc, kssj, jssj, drjs, xmms) values (?, ?, ?, ?, ?, ?)", list);
}
rs.executeQuery("select * from uf_jcl_yppc_dt4 where mainid = ? ", applicantId);
insertList = new ArrayList<>();
while (rs.next()) {
List<Object> paramList = new ArrayList<>();
// mainid
paramList.add(bid);
paramList.add(RecruitModeUtil.parseBlankToNull(rs.getString("yylx")));
paramList.add(RecruitModeUtil.parseBlankToNull(rs.getString("zwcd")));
insertList.add(paramList);
}
for (List<Object> list : insertList) {
rs.executeUpdate("insert into uf_jcl_rck_dt4 (mainid, yylx, zwcd) values (?, ?, ?)", list);
}
// 同步设置的标签
List<Map<String, Object>> modeTabList = getModeTabs(applicantId, rs);
String dateTime = DateUtil.getFullDate();
String[] dateSplit = dateTime.split(" ");
String createdate = dateSplit[0];
String createtime = dateSplit[1];
Set<String> tabIdSet = new HashSet<>();
for (Map<String, Object> modeTab : modeTabList) {
String tabName = Util.null2String(modeTab.get("tabname"));
// 查询人才库是否有此标签
rs.executeQuery("select id from modeTabs_" + formModeId + " where tabname = ?", tabName);
String tabid = null;
if (rs.next()) {
tabid = rs.getString("id");
} else {
// 不存在,则插入数据
RecruitRecordSet.insertData(modeTab, "modeTabs_" + formModeId);
rs.executeQuery("select id from modeTabs_" + formModeId + " where tabname = ?", tabName);
if (rs.next()) {
tabid = rs.getString("id");
}
}
// 插入标签数据
if (StringUtils.isNotBlank(tabid)) {
Map<String, Object> tabsLogMap = new RecruitDataMap<>();
tabsLogMap.put("tabid", tabid);
tabsLogMap.put("operate", 0);
tabsLogMap.put("modeid", formModeId);
tabsLogMap.put("billid", bid);
tabsLogMap.put("creator", user.getUID());
tabsLogMap.put("createdate", createdate);
tabsLogMap.put("createtime", createtime);
RecruitRecordSet.insertData(tabsLogMap, "modetabslog_" + formModeId);
tabIdSet.add(tabid);
}
}
// 更新标签信息
rs.executeUpdate("update uf_jcl_rck set modelableid=? where id = ? ", StringUtils.join(tabIdSet, ","), bid);
}
}
/**
* 获取标签信息
*
* @param applicantId
* @return
*/
private static List<Map<String, Object>> getModeTabs(String applicantId, RecordSet rs) {
int applicantModeId = ApplicantCommonInfo.getModeIdByTableName("uf_jcl_yppc");
rs.executeQuery(" select modelableid from uf_jcl_yppc where id = ?", applicantId);
String modelableid = "";
if (rs.next()) {
modelableid = rs.getString("modelableid");
}
if (StringUtils.isNotBlank(modelableid)) {
rs.executeQuery("select a.tabname , a.color , a.bgcolor , a.bdcolor , a.type , a.creator , a.orderid from modeTabs_" + applicantModeId + " a where a.id in (" + modelableid + ")");
return RecruitRecordSet.getRecordMapList(rs);
}
return new ArrayList<>();
}
}