From ba0a6e6acbe0558329db8726f0bed3a9d8f7418d Mon Sep 17 00:00:00 2001 From: dxfeng Date: Tue, 20 Aug 2024 09:31:24 +0800 Subject: [PATCH] =?UTF-8?q?ADD-#3189154=20=E5=BA=94=E8=81=98=E8=80=85?= =?UTF-8?q?=E3=80=81=E7=AE=80=E5=8E=86=E5=BA=93=E5=88=97=E8=A1=A8=E5=8D=A1?= =?UTF-8?q?=E7=89=87=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../recruit/conn/ApplicantCommonInfo.java | 15 + .../recruit/conn/ModeBrowserCommonInfo.java | 29 ++ .../engine/recruit/conn/RecruitDataMap.java | 31 ++ .../engine/recruit/conn/RecruitRecordSet.java | 6 +- .../controller/ApplicantResumeController.java | 28 ++ .../engine/recruit/entity/card/EduInfo.java | 86 +++++ .../recruit/entity/card/RecruitProcess.java | 24 ++ .../recruit/entity/card/ResumeCardInfo.java | 100 +++++ src/com/engine/recruit/entity/card/Tags.java | 22 ++ .../engine/recruit/entity/card/WorkInfo.java | 97 +++++ .../entity/card/process/BackProcess.java | 46 +++ .../entity/card/process/InterviewProcess.java | 96 +++++ .../entity/card/process/OfferProcess.java | 59 +++ .../entity/card/process/SalaryProcess.java | 46 +++ .../entity/card/process/ScreenProcess.java | 67 ++++ .../entity/card/process/WrittenProcess.java | 54 +++ .../service/ApplicantResumeService.java | 24 ++ .../impl/ApplicantResumeServiceImpl.java | 359 ++++++++++++++++++ .../wrapper/ApplicantResumeWrapper.java | 12 + 19 files changed, 1198 insertions(+), 3 deletions(-) create mode 100644 src/com/engine/recruit/entity/card/EduInfo.java create mode 100644 src/com/engine/recruit/entity/card/RecruitProcess.java create mode 100644 src/com/engine/recruit/entity/card/ResumeCardInfo.java create mode 100644 src/com/engine/recruit/entity/card/Tags.java create mode 100644 src/com/engine/recruit/entity/card/WorkInfo.java create mode 100644 src/com/engine/recruit/entity/card/process/BackProcess.java create mode 100644 src/com/engine/recruit/entity/card/process/InterviewProcess.java create mode 100644 src/com/engine/recruit/entity/card/process/OfferProcess.java create mode 100644 src/com/engine/recruit/entity/card/process/SalaryProcess.java create mode 100644 src/com/engine/recruit/entity/card/process/ScreenProcess.java create mode 100644 src/com/engine/recruit/entity/card/process/WrittenProcess.java diff --git a/src/com/engine/recruit/conn/ApplicantCommonInfo.java b/src/com/engine/recruit/conn/ApplicantCommonInfo.java index 319e930..f0aa25a 100644 --- a/src/com/engine/recruit/conn/ApplicantCommonInfo.java +++ b/src/com/engine/recruit/conn/ApplicantCommonInfo.java @@ -238,4 +238,19 @@ public class ApplicantCommonInfo { } return null; } + + /** + * 获取ImageField + * + * @param docId + * @return + */ + public static int getImageFieldByDocId(String docId) { + RecordSet rs = new RecordSet(); + rs.executeQuery("select imagefileid from docimagefile where docid = ? ", docId); + if (rs.next()) { + return rs.getInt("imagefileid"); + } + return -1; + } } diff --git a/src/com/engine/recruit/conn/ModeBrowserCommonInfo.java b/src/com/engine/recruit/conn/ModeBrowserCommonInfo.java index 6cac13b..af6fc70 100644 --- a/src/com/engine/recruit/conn/ModeBrowserCommonInfo.java +++ b/src/com/engine/recruit/conn/ModeBrowserCommonInfo.java @@ -78,6 +78,17 @@ public class ModeBrowserCommonInfo { return getBrowserId(TYPE_WORK_EXPERIENCE, name); } + + /** + * 获取学位ID + * + * @param name + * @return + */ + public static String getDegreeId(String name) { + return getBrowserId(TYPE_DEGREE, name); + } + /** * 获取学历ID * @@ -97,6 +108,24 @@ public class ModeBrowserCommonInfo { return id; } + /** + * 获取学历名称 + * @param id + * @return + */ + public static String getEducationLevelById(String id) { + if (StringUtils.isBlank(id)) { + return null; + } + String name = null; + RecordSet rs = new RecordSet(); + rs.executeQuery("select name from hrmeducationlevel where id = ?", id); + if (rs.next()) { + name = rs.getString("name"); + } + return name; + } + public static String getBrowserId(String zdlxmc, String xxnr) { diff --git a/src/com/engine/recruit/conn/RecruitDataMap.java b/src/com/engine/recruit/conn/RecruitDataMap.java index a369b56..bee7603 100644 --- a/src/com/engine/recruit/conn/RecruitDataMap.java +++ b/src/com/engine/recruit/conn/RecruitDataMap.java @@ -1,5 +1,8 @@ package com.engine.recruit.conn; +import cn.hutool.core.convert.Convert; +import weaver.general.Util; + import java.util.HashMap; /** @@ -26,4 +29,32 @@ public class RecruitDataMap extends HashMap { // 将键转为小写形式后作为真正的键 return super.put(key.toLowerCase(), value); } + + /** + * 获取int类型数据 + * + * @param key + * @return + */ + public Integer getInt(Object key) { + if (key instanceof String) { + // 将键转为小写形式再进行查找 + return Convert.toInt(super.get(((String) key).toLowerCase()),null); + } + return 0; + } + + /** + * 获取String类型数据 + * + * @param key + * @return + */ + public String getString(Object key) { + if (key instanceof String) { + // 将键转为小写形式再进行查找 + return Util.null2String(super.get(((String) key).toLowerCase())); + } + return null; + } } diff --git a/src/com/engine/recruit/conn/RecruitRecordSet.java b/src/com/engine/recruit/conn/RecruitRecordSet.java index 7504fd6..e921103 100644 --- a/src/com/engine/recruit/conn/RecruitRecordSet.java +++ b/src/com/engine/recruit/conn/RecruitRecordSet.java @@ -25,12 +25,12 @@ public class RecruitRecordSet { * @param rs RecordSet * @return */ - public static Map getSingleRecordMap(RecordSet rs) { - Map dataMap = new RecruitDataMap<>(); + public static RecruitDataMap getSingleRecordMap(RecordSet rs) { + RecruitDataMap dataMap = new RecruitDataMap<>(); if (rs.next()) { String[] columnNames = rs.getColumnName(); for (String columnName : columnNames) { - dataMap.put(columnName.toLowerCase(), RecruitModeUtil.parseBlankToNull(rs.getString(columnName))); + dataMap.put(columnName, RecruitModeUtil.parseBlankToNull(rs.getString(columnName))); } } return dataMap; diff --git a/src/com/engine/recruit/controller/ApplicantResumeController.java b/src/com/engine/recruit/controller/ApplicantResumeController.java index c5d52b2..7f13cab 100644 --- a/src/com/engine/recruit/controller/ApplicantResumeController.java +++ b/src/com/engine/recruit/controller/ApplicantResumeController.java @@ -10,6 +10,7 @@ import weaver.hrm.User; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; @@ -91,4 +92,31 @@ public class ApplicantResumeController { Map param = ParamUtil.request2Map(request); return new ResponseResult, Map>(user).run(getApplicantResumeWrapper(user)::checkRepeatResume, param); } + + @GET + @Path("/getResumeCardInfo") + @Produces(MediaType.APPLICATION_JSON) + public String getResumeCardInfo(@Context HttpServletRequest request, @Context HttpServletResponse response) { + User user = HrmUserVarify.getUser(request, response); + Map param = ParamUtil.request2Map(request); + return new ResponseResult, Map>(user).run(getApplicantResumeWrapper(user)::getResumeCardInfo, param); + } + + @GET + @Path("/getResumeListStatus") + @Produces(MediaType.APPLICATION_JSON) + public String getResumeListStatus(@Context HttpServletRequest request, @Context HttpServletResponse response) { + User user = HrmUserVarify.getUser(request, response); + Map param = ParamUtil.request2Map(request); + return new ResponseResult, String>(user).run(getApplicantResumeWrapper(user)::getResumeListStatus, param); + } + + @POST + @Path("/updateResumeListStatus") + @Produces(MediaType.APPLICATION_JSON) + public String updateResumeListStatus(@Context HttpServletRequest request, @Context HttpServletResponse response) { + User user = HrmUserVarify.getUser(request, response); + Map param = ParamUtil.request2Map(request); + return new ResponseResult, Map>(user).run(getApplicantResumeWrapper(user)::updateResumeListStatus, param); + } } diff --git a/src/com/engine/recruit/entity/card/EduInfo.java b/src/com/engine/recruit/entity/card/EduInfo.java new file mode 100644 index 0000000..649bd56 --- /dev/null +++ b/src/com/engine/recruit/entity/card/EduInfo.java @@ -0,0 +1,86 @@ +package com.engine.recruit.entity.card; + +import org.apache.commons.lang3.StringUtils; +import weaver.general.BaseBean; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @author:dxfeng + * @createTime: 2024/08/01 + * @version: 1.0 + */ +public class EduInfo { + private String time; + private String start; + private String end; + private String school; + private String professional; + + public void setStart(String start) { + this.start = start; + } + + public void setEnd(String end) { + this.end = end; + } + + public String getTime() { + String dateTimeStart = formatEduDateTime(start); + String dateTimeEnd = formatEduDateTime(end); + if (StringUtils.isNotBlank(dateTimeStart) && StringUtils.isNotBlank(dateTimeEnd)) { + return dateTimeStart + " - " + dateTimeEnd; + } + if (StringUtils.isNotBlank(dateTimeStart) && StringUtils.isBlank(dateTimeEnd)) { + return dateTimeStart + " - 至今"; + } + return ""; + + } + + public void setTime(String time) { + this.time = time; + } + + public String getSchool() { + return school; + } + + public void setSchool(String school) { + this.school = school; + } + + public String getProfessional() { + return professional; + } + + public void setProfessional(String professional) { + this.professional = professional; + } + + /** + * 日期格式化 + * + * @param dateStr + * @return + */ + private String formatEduDateTime(String dateStr) { + if(StringUtils.isBlank(dateStr)){ + return ""; + } + String dateTime = ""; + SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy.MM"); + + try { + // 解析输入日期字符串 + Date date = inputFormat.parse(dateStr); + // 格式化为目标格式 + dateTime = outputFormat.format(date); + } catch (Exception e) { + new BaseBean().writeLog("教育信息日期格式化失败", e); + } + return dateTime; + } +} diff --git a/src/com/engine/recruit/entity/card/RecruitProcess.java b/src/com/engine/recruit/entity/card/RecruitProcess.java new file mode 100644 index 0000000..629783c --- /dev/null +++ b/src/com/engine/recruit/entity/card/RecruitProcess.java @@ -0,0 +1,24 @@ +package com.engine.recruit.entity.card; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @author:dxfeng + * @createTime: 2024/08/01 + * @version: 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class RecruitProcess { + private String title; + private String value; + private String icon; + private Date createDateTime; +} diff --git a/src/com/engine/recruit/entity/card/ResumeCardInfo.java b/src/com/engine/recruit/entity/card/ResumeCardInfo.java new file mode 100644 index 0000000..1992151 --- /dev/null +++ b/src/com/engine/recruit/entity/card/ResumeCardInfo.java @@ -0,0 +1,100 @@ +package com.engine.recruit.entity.card; + +import com.engine.recruit.conn.ModeBrowserCommonInfo; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; + +/** + * @author:dxfeng + * @createTime: 2024/08/01 + * @version: 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ResumeCardInfo { + private Integer id; + private String image; + private String lastName; + private String applicantUrl; + private String jobTitle; + private String currentStage; + private String sex; + private String age; + private String education; + private String workYear; + private String submissionTime; + private String submissionFrom; + private List tags; + private List recruitProcess; + private List workInfo; + private List eduInfo; + + public String getSex() { + if (StringUtils.isNotBlank(sex)) { + if ("0".equals(sex)) { + return "男"; + } else { + return "女"; + } + } + return sex; + } + + public String getAge() { + if (StringUtils.isNotBlank(age)) { + return age + "岁"; + } + return age; + } + + public String getWorkYear() { + if (StringUtils.isNotBlank(workYear)) { + return "工作" + workYear; + } + return workYear; + } + + public String getEducation() { + return ModeBrowserCommonInfo.getEducationLevelById(education); + } + + public String getCurrentStage() { + String stageStr = ""; + if (StringUtils.isNotBlank(currentStage)) { + switch (currentStage) { + case "0": + stageStr = "初筛"; + break; + case "1": + stageStr = "笔试"; + break; + case "2": + stageStr = "面试"; + break; + case "3": + stageStr = "测评"; + break; + case "4": + stageStr = "薪酬谈判"; + break; + case "5": + stageStr = "背调"; + break; + case "6": + stageStr = "offer"; + break; + default: + break; + } + + } + return stageStr; + } +} diff --git a/src/com/engine/recruit/entity/card/Tags.java b/src/com/engine/recruit/entity/card/Tags.java new file mode 100644 index 0000000..b0ad517 --- /dev/null +++ b/src/com/engine/recruit/entity/card/Tags.java @@ -0,0 +1,22 @@ +package com.engine.recruit.entity.card; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author:dxfeng + * @createTime: 2024/08/01 + * @version: 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class Tags { + private String color; + private String bgColor; + private String bdColor; + private String title; +} diff --git a/src/com/engine/recruit/entity/card/WorkInfo.java b/src/com/engine/recruit/entity/card/WorkInfo.java new file mode 100644 index 0000000..c9094ed --- /dev/null +++ b/src/com/engine/recruit/entity/card/WorkInfo.java @@ -0,0 +1,97 @@ +package com.engine.recruit.entity.card; + +import org.apache.commons.lang3.StringUtils; +import weaver.common.DateUtil; +import weaver.general.BaseBean; + +import java.time.LocalDate; +import java.time.Period; +import java.time.format.DateTimeFormatter; + +/** + * @author:dxfeng + * @createTime: 2024/08/01 + * @version: 1.0 + */ +public class WorkInfo { + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + private String start; + private String end; + private String time; + private String company; + private String job; + + public void setStart(String start) { + this.start = start; + } + + public void setEnd(String end) { + this.end = end; + } + + public String getTime() { + if (StringUtils.isBlank(start)) { + return ""; + } + if (StringUtils.isBlank(end)) { + return getDatePeriod(start, ""); + } + return getDatePeriod(start, end); + } + + public void setTime(String time) { + this.time = time; + } + + public String getCompany() { + return company; + } + + public void setCompany(String company) { + this.company = company; + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job; + } + + + private String getDatePeriod(String start, String end) { + try { + String dateStr = start + " ~ " + end; + // 解析日期字符串为 LocalDate 对象 + LocalDate startDate = LocalDate.parse(start, DATE_FORMATTER); + if (StringUtils.isBlank(end)) { + end = DateUtil.getCurrentDate(); + dateStr = start + " ~ 至今"; + } + LocalDate endDate = LocalDate.parse(end, DATE_FORMATTER); + + // 计算两个日期之间的 Period 对象 + Period period = Period.between(startDate, endDate); + + String periodStr = ""; + // 提取相差的年和月 + int years = period.getYears(); + int months = period.getMonths(); + if (years > 0) { + if (months == 0) { + periodStr = years + "年"; + } else { + periodStr = years + "年" + months + "个月"; + } + } else { + periodStr = months + "个月"; + } + return dateStr + "(" + periodStr + ")"; + + } catch (Exception e) { + new BaseBean().writeLog("工作信息日期计算失败", e); + return ""; + } + } +} diff --git a/src/com/engine/recruit/entity/card/process/BackProcess.java b/src/com/engine/recruit/entity/card/process/BackProcess.java new file mode 100644 index 0000000..ce3104d --- /dev/null +++ b/src/com/engine/recruit/entity/card/process/BackProcess.java @@ -0,0 +1,46 @@ +package com.engine.recruit.entity.card.process; + +import org.apache.commons.lang3.StringUtils; + +/** + * @author:dxfeng + * @createTime: 2024/08/07 + * @version: 1.0 + */ +public class BackProcess { + public static final String ICON_NAME = "back.png"; + public static final String TITLE = "最近背调"; + + private String dcrq; + private String dcjg; + + public String getDcrq() { + return dcrq; + } + + public void setDcrq(String dcrq) { + this.dcrq = dcrq; + } + + public String getDcjg() { + if ("0".equals(dcjg)) { + return "通过"; + } else if ("1".equals(dcjg)) { + return "不通过"; + } + return "待定"; + } + + public void setDcjg(String dcjg) { + this.dcjg = dcjg; + } + + @Override + public String toString() { + if (StringUtils.isBlank(dcjg)) { + return "暂无背调结果"; + } else { + return getDcrq() + " " + getDcjg(); + } + } +} diff --git a/src/com/engine/recruit/entity/card/process/InterviewProcess.java b/src/com/engine/recruit/entity/card/process/InterviewProcess.java new file mode 100644 index 0000000..62f8f9b --- /dev/null +++ b/src/com/engine/recruit/entity/card/process/InterviewProcess.java @@ -0,0 +1,96 @@ +package com.engine.recruit.entity.card.process; + +import org.apache.commons.lang3.StringUtils; +import weaver.general.BaseBean; +import weaver.hrm.resource.ResourceComInfo; + +/** + * @author:dxfeng + * @createTime: 2024/08/07 + * @version: 1.0 + */ +public class InterviewProcess { + public static final String ICON_NAME = "interview.png"; + public static final String TITLE = "最近面试"; + + private String zt; + private String msrq; + private String msg; + private String ptmsg; + private String jg; + + + public String getZt() { + if ("0".equals(zt)) { + return "待面试"; + } else if ("1".equals(zt)) { + return "已反馈"; + } + return "已取消"; + } + + public void setZt(String zt) { + this.zt = zt; + } + + public String getMsrq() { + return msrq; + } + + public void setMsrq(String msrq) { + this.msrq = msrq; + } + + public String getMsg() { + try { + String lastnames = new ResourceComInfo().getLastnames(msg); + if (StringUtils.isNotBlank(lastnames)) { + return "面试官:" + lastnames; + } + } catch (Exception e) { + new BaseBean().writeLog("人员姓名转换失败", e); + } + return ""; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public String getPtmsg() { + try { + String lastnames = new ResourceComInfo().getLastnames(ptmsg); + if (StringUtils.isNotBlank(lastnames)) { + return "陪同面试官:" + lastnames; + } + } catch (Exception e) { + new BaseBean().writeLog("人员姓名转换失败", e); + } + return ""; + } + + public void setPtmsg(String ptmsg) { + this.ptmsg = ptmsg; + } + + public String getJg() { + if ("0".equals(jg)) { + return "通过"; + } else if ("1".equals(jg)) { + return "不通过"; + } + return "待定"; + } + + public void setJg(String jg) { + this.jg = jg; + } + + @Override + public String toString() { + if ("0".equals(zt)) { + return getMsrq() + " " + getZt() + " (" + getMsg() + ")"; + } + return getMsrq() + " " + getJg() + " (" + getMsg() + ")"; + } +} diff --git a/src/com/engine/recruit/entity/card/process/OfferProcess.java b/src/com/engine/recruit/entity/card/process/OfferProcess.java new file mode 100644 index 0000000..9819875 --- /dev/null +++ b/src/com/engine/recruit/entity/card/process/OfferProcess.java @@ -0,0 +1,59 @@ +package com.engine.recruit.entity.card.process; + +import org.apache.commons.lang3.StringUtils; + +/** + * @author:dxfeng + * @createTime: 2024/08/07 + * @version: 1.0 + */ +public class OfferProcess { + public static final String ICON_NAME = "offer.png"; + public static final String TITLE = "offer状态"; + + private String zt; + private String fksj; + + public String getZt() { + String ztStr = ""; + if (StringUtils.isNotBlank(zt)) { + switch (zt) { + case "0": + ztStr = "未发送"; + break; + case "1": + ztStr = "已发送待反馈"; + break; + case "2": + ztStr = "已拒绝"; + break; + case "3": + ztStr = "已接受"; + break; + case "5": + ztStr = "逾期未回复"; + break; + default: + break; + } + } + return ztStr; + } + + public void setZt(String zt) { + this.zt = zt; + } + + public String getFksj() { + return fksj; + } + + public void setFksj(String fksj) { + this.fksj = fksj; + } + + @Override + public String toString() { + return getZt() + " " + getFksj(); + } +} diff --git a/src/com/engine/recruit/entity/card/process/SalaryProcess.java b/src/com/engine/recruit/entity/card/process/SalaryProcess.java new file mode 100644 index 0000000..69da6e4 --- /dev/null +++ b/src/com/engine/recruit/entity/card/process/SalaryProcess.java @@ -0,0 +1,46 @@ +package com.engine.recruit.entity.card.process; + +import org.apache.commons.lang3.StringUtils; + +/** + * @author:dxfeng + * @createTime: 2024/08/07 + * @version: 1.0 + */ +public class SalaryProcess { + public static final String ICON_NAME = "salray.png"; + public static final String TITLE = "最近薪酬谈判"; + + private String tpsj; + private String tpjg; + + public String getTpsj() { + return tpsj; + } + + public void setTpsj(String tpsj) { + this.tpsj = tpsj; + } + + public String getTpjg() { + if ("0".equals(tpjg)) { + return "成功"; + } else if ("1".equals(tpjg)) { + return "失败"; + } + return "待定"; + } + + public void setTpjg(String tpjg) { + this.tpjg = tpjg; + } + + @Override + public String toString() { + if (StringUtils.isBlank(tpjg)) { + return "暂无薪酬谈判结果"; + } else { + return getTpsj() + " " + getTpjg(); + } + } +} diff --git a/src/com/engine/recruit/entity/card/process/ScreenProcess.java b/src/com/engine/recruit/entity/card/process/ScreenProcess.java new file mode 100644 index 0000000..b8b5c7e --- /dev/null +++ b/src/com/engine/recruit/entity/card/process/ScreenProcess.java @@ -0,0 +1,67 @@ +package com.engine.recruit.entity.card.process; + +import org.apache.commons.lang3.StringUtils; +import weaver.general.BaseBean; +import weaver.hrm.resource.ResourceComInfo; + +/** + * @author:dxfeng + * @createTime: 2024/08/07 + * @version: 1.0 + */ +public class ScreenProcess { + private String zt; + private String jg; + private String fkr; + + public static final String ICON_NAME = "screen.png"; + public static final String TITLE = "最近筛选结果"; + + public String getZt() { + if("1".equals(zt)){ + return "已反馈"; + } + return "待反馈"; + } + + public void setZt(String zt) { + this.zt = zt; + } + + public String getJg() { + if ("0".equals(jg)) { + return "通过"; + } else if ("1".equals(jg)) { + return "不通过"; + } + return "待定"; + } + + public void setJg(String jg) { + this.jg = jg; + } + + public String getFkr() { + try { + String lastnames = new ResourceComInfo().getLastnames(fkr); + if (StringUtils.isNotBlank(lastnames)) { + return "反馈人:" + lastnames; + } + } catch (Exception e) { + new BaseBean().writeLog("人员姓名转换失败", e); + } + return ""; + } + + public void setFkr(String fkr) { + this.fkr = fkr; + } + + @Override + public String toString() { + if ("1".equals(zt)) { + return getJg() + "(" + getFkr() + ")"; + } + return getZt() + "(" + getFkr() + ")"; + } +} diff --git a/src/com/engine/recruit/entity/card/process/WrittenProcess.java b/src/com/engine/recruit/entity/card/process/WrittenProcess.java new file mode 100644 index 0000000..89a3ffb --- /dev/null +++ b/src/com/engine/recruit/entity/card/process/WrittenProcess.java @@ -0,0 +1,54 @@ +package com.engine.recruit.entity.card.process; + +import org.apache.commons.lang3.StringUtils; + +/** + * @author:dxfeng + * @createTime: 2024/08/07 + * @version: 1.0 + */ +public class WrittenProcess { + private String bsmc; + private String bscj; + private String bsjg; + + public static final String ICON_NAME = "written.png"; + public static final String TITLE = "最近笔试"; + + public String getBsmc() { + return bsmc; + } + + public void setBsmc(String bsmc) { + this.bsmc = bsmc; + } + + public String getBscj() { + return bscj; + } + + public void setBscj(String bscj) { + this.bscj = bscj; + } + + public String getBsjg() { + if ("0".equals(bsjg)) { + return "通过"; + } else if ("1".equals(bsjg)) { + return "不通过"; + } + return "待定"; + } + + public void setBsjg(String bsjg) { + this.bsjg = bsjg; + } + + @Override + public String toString() { + if (StringUtils.isBlank(bscj) || StringUtils.isBlank(bsjg)) { + return getBsmc() + " 暂无得分结果"; + } + return getBsmc() + " " + getBscj() + "分 " + getBsjg(); + } +} diff --git a/src/com/engine/recruit/service/ApplicantResumeService.java b/src/com/engine/recruit/service/ApplicantResumeService.java index adb6fdf..6a0c47a 100644 --- a/src/com/engine/recruit/service/ApplicantResumeService.java +++ b/src/com/engine/recruit/service/ApplicantResumeService.java @@ -70,4 +70,28 @@ public interface ApplicantResumeService { * @return */ Map checkRepeatResume(Map param); + + /** + * 获取简历卡片信息 + * + * @param param + * @return + */ + Map getResumeCardInfo(Map param); + + /** + * 获取简历列表状态 + * + * @param param + * @return + */ + String getResumeListStatus(Map param); + + /** + * 更新简历列表状态 + * + * @param param + * @return + */ + Map updateResumeListStatus(Map param); } diff --git a/src/com/engine/recruit/service/impl/ApplicantResumeServiceImpl.java b/src/com/engine/recruit/service/impl/ApplicantResumeServiceImpl.java index 92ef058..af5b9ad 100644 --- a/src/com/engine/recruit/service/impl/ApplicantResumeServiceImpl.java +++ b/src/com/engine/recruit/service/impl/ApplicantResumeServiceImpl.java @@ -3,6 +3,8 @@ package com.engine.recruit.service.impl; import cn.hutool.core.convert.Convert; import com.engine.core.impl.Service; import com.engine.recruit.conn.*; +import com.engine.recruit.entity.card.*; +import com.engine.recruit.entity.card.process.*; import com.engine.recruit.entity.record.ApplicantRecordPo; import com.engine.recruit.entity.resume.OcrResumePo; import com.engine.recruit.enums.ApplicantOperateEnum; @@ -12,14 +14,18 @@ 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 @@ -340,6 +346,339 @@ public class ApplicantResumeServiceImpl extends Service implements ApplicantResu } return returnMap; } + @Override + public Map getResumeCardInfo(Map param) { + String idsString = Util.null2String(param.get("idsString")); + List 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 map = RecruitRecordSet.getSingleRecordMap(rs); + ResumeCardInfo resumeCardInfo = new ResumeCardInfo(); + // 基本信息构建 + resumeCardInfo.setId(map.getInt("id")); + resumeCardInfo.setLastName(map.getString("xm")); + 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 = new ArrayList<>(); + List> modeTabs = getModeTabs(id, rs); + if (CollectionUtils.isNotEmpty(modeTabs)) { + for (Map 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 eduInfoList = new ArrayList<>(); + rs.executeQuery("select * from uf_jcl_yppc_dt1 where mainid =? order by kssj desc", id); + RecruitDataMap 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 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 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 returnMap = new HashMap<>(); + returnMap.put("resumeCardInfos", resumeCardInfos); + return returnMap; + } + + @Override + public String getResumeListStatus(Map param) { + int uid = user.getUID(); + RecordSet rs = new RecordSet(); + rs.executeQuery("select ypzlb from uf_jcl_recruit where userId = ?", uid); + String listType = "0"; + if (rs.next()) { + listType = rs.getString("ypzlb"); + } + return listType; + } + + @Override + public Map updateResumeListStatus(Map 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 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 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 recruitProcessList) { + rs.executeQuery("select 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 ptmsg = rs.getString("ptmsg"); + // 结果 + 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); + interviewProcess.setMsg(msg); + interviewProcess.setPtmsg(ptmsg); + interviewProcess.setJg(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 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 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 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); + } + } /** * 构建普通数据格式 @@ -667,4 +1006,24 @@ public class ApplicantResumeServiceImpl extends Service implements ApplicantResu insertMap.put("zt", zt); return insertMap; } + + /** + * 获取标签信息 + * + * @param applicantId + * @return + */ + private static List> 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<>(); + } } diff --git a/src/com/engine/recruit/wrapper/ApplicantResumeWrapper.java b/src/com/engine/recruit/wrapper/ApplicantResumeWrapper.java index 70bc552..2f31cfe 100644 --- a/src/com/engine/recruit/wrapper/ApplicantResumeWrapper.java +++ b/src/com/engine/recruit/wrapper/ApplicantResumeWrapper.java @@ -45,4 +45,16 @@ public class ApplicantResumeWrapper extends Service { public Map checkRepeatResume(Map params) { return getApplicantResumeService(user).checkRepeatResume(params); } + + public Map getResumeCardInfo(Map params) { + return getApplicantResumeService(user).getResumeCardInfo(params); + } + + public String getResumeListStatus(Map params) { + return getApplicantResumeService(user).getResumeListStatus(params); + } + + public Map updateResumeListStatus(Map params) { + return getApplicantResumeService(user).updateResumeListStatus(params); + } }