diff --git a/src/com/api/recruit/controller/WorkBenchPortalController.java b/src/com/api/recruit/controller/WorkBenchPortalController.java new file mode 100644 index 0000000..8f43b3e --- /dev/null +++ b/src/com/api/recruit/controller/WorkBenchPortalController.java @@ -0,0 +1,13 @@ +package com.api.recruit.controller; + +import javax.ws.rs.Path; + +/** + * @Author liang.cheng + * @Date 2023/10/18 4:31 PM + * @Description: 招聘工作台 + * @Version 1.0 + */ +@Path("/jcl/recruit/workbench") +public class WorkBenchPortalController extends com.engine.recruit.controller.WorkBenchPortalController { +} diff --git a/src/com/engine/recruit/controller/WorkBenchPortalController.java b/src/com/engine/recruit/controller/WorkBenchPortalController.java new file mode 100644 index 0000000..7b33b6a --- /dev/null +++ b/src/com/engine/recruit/controller/WorkBenchPortalController.java @@ -0,0 +1,75 @@ +package com.engine.recruit.controller; + +import com.engine.common.util.ServiceUtil; +import com.engine.recruit.entity.workbench.OptionVO; +import com.engine.recruit.entity.workbench.RecruitPortalCommonVO; +import com.engine.recruit.service.WorkBenchPortalService; +import com.engine.recruit.service.impl.WorkBenchPortalServiceImpl; +import com.engine.recruit.util.ResponseResult; +import weaver.hrm.HrmUserVarify; +import weaver.hrm.User; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import java.util.List; + +/** + * @Author liang.cheng + * @Date 2023/10/18 4:34 PM + * @Description: TODO + * @Version 1.0 + */ +public class WorkBenchPortalController { + + public WorkBenchPortalService getWorkBenchPortal(User user) { + return ServiceUtil.getService(WorkBenchPortalServiceImpl.class, user); + } + + + @GET + @Path("/top") + @Produces(MediaType.APPLICATION_JSON) + public String getRecruitPortalTop(@Context HttpServletRequest request, @Context HttpServletResponse response) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getWorkBenchPortal(user) :: getRecruitPortalTop); + } + + + @GET + @Path("/jobTenure") + @Produces(MediaType.APPLICATION_JSON) + public String getJobTenure(@Context HttpServletRequest request, @Context HttpServletResponse response) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getWorkBenchPortal(user) :: getJobTenure); + } + + @GET + @Path("/waitStepPerson") + @Produces(MediaType.APPLICATION_JSON) + public String getWaitStepPerson(@Context HttpServletRequest request, @Context HttpServletResponse response) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getWorkBenchPortal(user) :: getWaitStepPerson); + } + + @GET + @Path("/recruitTransform") + @Produces(MediaType.APPLICATION_JSON) + public String getRecruitTransform(@Context HttpServletRequest request, @Context HttpServletResponse response) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getWorkBenchPortal(user) :: getRecruitTransform); + } + + + @GET + @Path("/peopleFrom") + @Produces(MediaType.APPLICATION_JSON) + public String getPeopleFrom(@Context HttpServletRequest request, @Context HttpServletResponse response) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getWorkBenchPortal(user) :: getPeopleFrom); + } +} diff --git a/src/com/engine/recruit/controller/WorkPlanController.java b/src/com/engine/recruit/controller/WorkPlanController.java index 80c165f..b908fa3 100644 --- a/src/com/engine/recruit/controller/WorkPlanController.java +++ b/src/com/engine/recruit/controller/WorkPlanController.java @@ -25,7 +25,7 @@ import javax.ws.rs.core.MediaType; */ public class WorkPlanController { - public WorkPlanSerivice getRecruitPositionWrapper(User user) { + public WorkPlanSerivice getWorkPlan(User user) { return ServiceUtil.getService(WorkPlanServiceImpl.class, user); } @@ -34,7 +34,7 @@ public class WorkPlanController { @Produces(MediaType.APPLICATION_JSON) public String operateWorkPlan(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody WorkPlanCreateParams workPlanCreateParams) { User user = HrmUserVarify.getUser(request, response); - return new ResponseResult(user).run(getRecruitPositionWrapper(user)::operate, workPlanCreateParams); + return new ResponseResult(user).run(getWorkPlan(user)::operate, workPlanCreateParams); } diff --git a/src/com/engine/recruit/entity/workbench/OptionVO.java b/src/com/engine/recruit/entity/workbench/OptionVO.java new file mode 100644 index 0000000..f35d5e8 --- /dev/null +++ b/src/com/engine/recruit/entity/workbench/OptionVO.java @@ -0,0 +1,32 @@ +package com.engine.recruit.entity.workbench; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.LinkedList; +import java.util.List; + +/** + * @Author liang.cheng + * @Date 2023/10/19 3:03 PM + * @Description: TODO + * @Version 1.0 + */ + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class OptionVO { + + private String text; + + private List xData; + + private List barSeriesData; + + private LinkedList seriesData; + +} diff --git a/src/com/engine/recruit/entity/workbench/RecruitInterviewPO.java b/src/com/engine/recruit/entity/workbench/RecruitInterviewPO.java new file mode 100644 index 0000000..eb8b1e5 --- /dev/null +++ b/src/com/engine/recruit/entity/workbench/RecruitInterviewPO.java @@ -0,0 +1,24 @@ +package com.engine.recruit.entity.workbench; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author liang.cheng + * @Date 2023/10/19 11:39 AM + * @Description: TODO + * @Version 1.0 + */ + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class RecruitInterviewPO { + + private String ids; + + private String interviewDate; +} diff --git a/src/com/engine/recruit/entity/workbench/RecruitPortalCommonVO.java b/src/com/engine/recruit/entity/workbench/RecruitPortalCommonVO.java new file mode 100644 index 0000000..d4d3718 --- /dev/null +++ b/src/com/engine/recruit/entity/workbench/RecruitPortalCommonVO.java @@ -0,0 +1,30 @@ +package com.engine.recruit.entity.workbench; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author liang.cheng + * @Date 2023/10/19 10:31 AM + * @Description: TODO + * @Version 1.0 + */ + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class RecruitPortalCommonVO { + + private Integer id; + + private String title; + + private Integer count; + + private String icon; + + +} diff --git a/src/com/engine/recruit/entity/workbench/SeriesParam.java b/src/com/engine/recruit/entity/workbench/SeriesParam.java new file mode 100644 index 0000000..5244d90 --- /dev/null +++ b/src/com/engine/recruit/entity/workbench/SeriesParam.java @@ -0,0 +1,28 @@ +package com.engine.recruit.entity.workbench; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author liang.cheng + * @Date 2023/9/28 2:02 PM + * @Description: TODO + * @Version 1.0 + */ + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SeriesParam { + + private Double value; + + private String name; + + private String color; + + +} diff --git a/src/com/engine/recruit/service/WorkBenchPortalService.java b/src/com/engine/recruit/service/WorkBenchPortalService.java new file mode 100644 index 0000000..d7d73d4 --- /dev/null +++ b/src/com/engine/recruit/service/WorkBenchPortalService.java @@ -0,0 +1,61 @@ +package com.engine.recruit.service; + +import com.engine.recruit.entity.workbench.OptionVO; +import com.engine.recruit.entity.workbench.RecruitPortalCommonVO; + +import java.util.List; + +/** + * @Author liang.cheng + * @Date 2023/10/18 4:43 PM + * @Description: + * @Version 1.0 + */ +public interface WorkBenchPortalService { + + /** + * @Description: 顶部元素 + * @Author: liang.cheng + * @Date: 2023/10/19 10:47 AM + * @param: [] + * @return: com.engine.recruit.entity.workbench.RecruitPortalCommonVO + */ + List getRecruitPortalTop(); + + /** + * @Description: 职位年限要求分布 + * @Author: liang.cheng + * @Date: 2023/10/19 3:15 PM + * @param: [] + * @return: com.engine.recruit.entity.workbench.OptionVO + */ + OptionVO getJobTenure(); + + + /** + * @Description: 候选中应聘者各阶段数 + * @Author: liang.cheng + * @Date: 2023/10/20 9:35 AM + * @param: [] + * @return: com.engine.recruit.entity.workbench.OptionVO + */ + OptionVO getWaitStepPerson(); + + /** + * @Description: 招聘转化 + * @Author: liang.cheng + * @Date: 2023/10/20 10:04 AM + * @param: [] + * @return: com.engine.recruit.entity.workbench.OptionVO + */ + OptionVO getRecruitTransform(); + + /** + * @Description: 人才来源 + * @Author: liang.cheng + * @Date: 2023/10/20 11:07 AM + * @param: [] + * @return: com.engine.recruit.entity.workbench.OptionVO + */ + OptionVO getPeopleFrom(); +} diff --git a/src/com/engine/recruit/service/impl/WorkBenchPortalServiceImpl.java b/src/com/engine/recruit/service/impl/WorkBenchPortalServiceImpl.java new file mode 100644 index 0000000..94c37c2 --- /dev/null +++ b/src/com/engine/recruit/service/impl/WorkBenchPortalServiceImpl.java @@ -0,0 +1,224 @@ +package com.engine.recruit.service.impl; + +import com.engine.core.impl.Service; +import com.engine.recruit.entity.workbench.OptionVO; +import com.engine.recruit.entity.workbench.RecruitInterviewPO; +import com.engine.recruit.entity.workbench.RecruitPortalCommonVO; +import com.engine.recruit.entity.workbench.SeriesParam; +import weaver.conn.RecordSet; +import weaver.general.Util; + +import java.text.DecimalFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Author liang.cheng + * @Date 2023/10/18 4:44 PM + * @Description: TODO + * @Version 1.0 + */ +public class WorkBenchPortalServiceImpl extends Service implements com.engine.recruit.service.WorkBenchPortalService { + + private final DecimalFormat df = new DecimalFormat("#.00"); + + @Override + public List getRecruitPortalTop() { + RecordSet rs = new RecordSet(); + List recruitList = new ArrayList<>(); + List list = new ArrayList<>(); + rs.executeQuery("select b.zpzwfzr,b.zpxzr from uf_jcl_yppc a left join uf_jcl_zp_zpzw b on a.ypzw = b.id\n" + + "where a.zt = 1"); + while (rs.next()) { + String zpzwfzr = Util.null2String(rs.getString("zpzwfzr")); + String zpxzr = Util.null2String(rs.getString("zpxzr")); + list.add(mergeStrings(zpzwfzr, zpxzr)); + } + String uId = String.valueOf(user.getUID()); + + List filteredList = list.stream() + .filter(s -> s.contains(uId)) + .collect(Collectors.toList()); + recruitList.add(RecruitPortalCommonVO.builder().title("待处理简历").count(filteredList.size()).icon("${appRes}/1.png").build()); + recruitList.add(selectRecruitInterview("select msg,ptmsg,msrq from uf_jcl_ms", "今日面试", "${appRes}/2.png", uId)); + recruitList.add(selectRecruitInterview("select msg,ptmsg,msrq from uf_jcl_ms where zt = 0", "待评价面试", "${appRes}/3.png", uId)); + recruitList.add(selectOffer("select b.zpzwfzr,b.zpxzr from uf_jcl_offer a left join uf_jcl_zp_zpzw b on a.ypzw = b.id where a.zt = 0", + "待发offer", "${appRes}/4.png", uId)); + recruitList.add(selectOffer("select b.zpzwfzr,b.zpxzr from uf_jcl_offer a left join uf_jcl_zp_zpzw b on a.ypzw = b.id where a.zt = 1", + "待反馈offer", "${appRes}/5.png", uId)); + recruitList.add(RecruitPortalCommonVO.builder().title("待入职").count(waitHired()).icon("${appRes}/6.png").build()); + + + return recruitList; + } + + @Override + public OptionVO getJobTenure() { + RecordSet rs = new RecordSet(); + List list = new ArrayList<>(); + rs.executeQuery("select id,xxnr from uf_sjzd where zdlxmc = 9"); + while (rs.next()) { + list.add(RecruitPortalCommonVO.builder().id(Util.getIntValue(rs.getString("id)"))).title(Util.null2String(rs.getString("xxnr"))).count(0).build()); + } + + List list1 = new ArrayList<>(); + rs.executeQuery("select gznx,count(1) as sum from uf_jcl_zp_zpzw group by gznx;"); + while (rs.next()) { + list1.add(RecruitPortalCommonVO.builder().id(Util.getIntValue(rs.getString("gznx)"))).count(Util.getIntValue(rs.getString("sum"))).build()); + } + + for (RecruitPortalCommonVO item1 : list) { + for (RecruitPortalCommonVO item2 : list1) { + if (item1.getId().equals(item2.getId())) { + item1.setCount(item2.getCount()); + break; + } + } + } + + List xData = list.stream() + .map(RecruitPortalCommonVO::getTitle) + .collect(Collectors.toList()); + + List barSeriesData = list.stream() + .map(RecruitPortalCommonVO::getCount) + .collect(Collectors.toList()); + + return OptionVO.builder() + .text("职位年限要求分布") + .xData(xData) + .barSeriesData(barSeriesData) + .build(); + } + + @Override + public OptionVO getWaitStepPerson() { + RecordSet rs = new RecordSet(); + rs.executeQuery("select a.xxnr,b.sum from uf_sjzd a \n" + + "left join (select gznx,count(1) as sum from uf_jcl_zp_zpzw group by gznx) b \n" + + "on a.id = b.gznx where a.zdlxmc = 9"); + List xData = new ArrayList<>(); + List barSeriesData = new ArrayList<>(); + while (rs.next()) { + xData.add(Util.null2String(rs.getString("xxnr"))); + barSeriesData.add(Util.getIntValue(rs.getString("sum")),0); + } + + return OptionVO.builder() + .text("候选中应聘者各阶段数") + .xData(xData) + .barSeriesData(barSeriesData) + .build(); + } + + @Override + public OptionVO getRecruitTransform() { + List colorList = Arrays.asList("#6e94f3","#faf0e6","#7cfc00","#ao20f0","#00ced1","#83d8ae","#697695","#8ac9e9","#9933fa","#c0ff3e","#ffe4c4","#cd6090"); + RecordSet rs = new RecordSet(); + rs.executeQuery("select a.xxnr,b.sum from uf_sjzd a \n" + + "left join (select gznx,count(1) as sum from uf_jcl_zp_zpzw group by gznx) b \n" + + "on a.id = b.gznx where a.zdlxmc = 9"); + LinkedList seriesData = new LinkedList<>(); + while (rs.next()) { + String name = Util.null2String(rs.getString("xxnr")); + double value = Util.getDoubleValue(rs.getString("sum"), 0); + Random r = new Random(); + seriesData.add(SeriesParam.builder().value(value).name(name).color(colorList.get(r.nextInt(colorList.size()))).build()); + + } + + return OptionVO.builder() + .text("招聘转化") + .seriesData(seriesData) + .build(); + } + + @Override + public OptionVO getPeopleFrom() { + List colorList = Arrays.asList("#6e94f3","#faf0e6","#7cfc00","#ao20f0","#00ced1","#83d8ae","#697695","#8ac9e9","#9933fa","#c0ff3e","#ffe4c4","#cd6090"); + RecordSet rs = new RecordSet(); + rs.executeQuery("select a.xxnr,b.sum from uf_sjzd a \n" + + "left join (select jlly,count(1) as sum from uf_jcl_yppc group by jlly) b \n" + + "on a.id = b.jlly where a.zdlxmc = 2"); + LinkedList seriesData = new LinkedList<>(); + while (rs.next()) { + Random r = new Random(); + String name = Util.null2String(rs.getString("xxnr")); + double value = Util.getDoubleValue(rs.getString("sum"), 0); + seriesData.add(SeriesParam.builder().value(value).name(name).color(colorList.get(r.nextInt(colorList.size()))).build()); + } + + List values = seriesData.stream().map(SeriesParam:: getValue).collect(Collectors.toList()); + double percentage = values.stream().mapToDouble(Double::doubleValue).sum(); + seriesData.forEach(item -> item.setValue(Double.valueOf(df.format((item.getValue() * 100) / percentage)))); + + return OptionVO.builder() + .text("人才来源") + .seriesData(seriesData) + .build(); + } + + + private Integer waitHired() { + RecordSet rs = new RecordSet(); + rs.executeQuery("select count(1) as sum from uf_jcl_rzgl where rzzt = 0"); + rs.next(); + return Util.getIntValue(rs.getString("sum")); + } + + + private RecruitPortalCommonVO selectOffer(String sql, String title, String icon, String uId) { + RecordSet rs = new RecordSet(); + List list = new ArrayList<>(); + rs.executeQuery(sql); + while (rs.next()) { + String zpzwfzr = Util.null2String(rs.getString("zpzwfzr")); + String zpxzr = Util.null2String(rs.getString("zpxzr")); + list.add(mergeStrings(zpzwfzr, zpxzr)); + } + + List filteredList = list.stream() + .filter(s -> s.contains(uId)) + .collect(Collectors.toList()); + return RecruitPortalCommonVO.builder().title(title).count(filteredList.size()).icon(icon).build(); + } + + + private RecruitPortalCommonVO selectRecruitInterview(String sql, String title, String icon, String uId) { + RecordSet rs = new RecordSet(); + List recruitInterview = new ArrayList<>(); + rs.executeQuery(sql); + while (rs.next()) { + String msg = Util.null2String(rs.getString("msg")); + String ptmsg = Util.null2String(rs.getString("ptmsg")); + String msrq = Util.null2String(rs.getString("msrq")).substring(0,9); + recruitInterview.add(RecruitInterviewPO.builder().ids(mergeStrings(msg, ptmsg)).interviewDate(msrq).build()); + } + + LocalDate currentDate = LocalDate.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + String dateString = currentDate.format(formatter); + + List filterInterview = recruitInterview.stream() + .filter(s -> s.getIds().contains(uId)) + .filter(s -> dateString.equals(s.getInterviewDate())) + .collect(Collectors.toList()); + return RecruitPortalCommonVO.builder().title(title).count(filterInterview.size()).icon(icon).build(); + } + + private String mergeStrings(String string1, String string2) { + boolean isString1Empty = string1.isEmpty(); + boolean isString2Empty = string2.isEmpty(); + if (isString1Empty && isString2Empty) { + return ""; + } else if (isString1Empty) { + return string2; + } else if (isString2Empty) { + return string1; + } else { + return string1 + "," + string2; + } + } +} diff --git a/src/com/engine/recruit/service/impl/WorkPlanServiceImpl.java b/src/com/engine/recruit/service/impl/WorkPlanServiceImpl.java index dc5a82d..5b7d885 100644 --- a/src/com/engine/recruit/service/impl/WorkPlanServiceImpl.java +++ b/src/com/engine/recruit/service/impl/WorkPlanServiceImpl.java @@ -7,7 +7,6 @@ import com.engine.recruit.enums.InterviewOperateTypeEnum; import com.engine.recruit.service.WorkPlanSerivice; import com.engine.workplan.service.WorkPlanBaseService; import com.engine.workplan.service.impl.WorkPlanBaseServiceImpl; -import com.icbc.api.internal.apache.http.impl.cookie.S; import weaver.conn.RecordSet; import weaver.hrm.User; @@ -51,7 +50,7 @@ public class WorkPlanServiceImpl extends Service implements WorkPlanSerivice { maps.put("beginDateTime",workPlanCreateParams.getBeginDateTime()); maps.put("endDateTime",workPlanCreateParams.getEndDateTime()); maps.put("isEnableSecondAuth","0"); - maps.put("from","workplan"); + //maps.put("from","workplan"); } @@ -74,8 +73,7 @@ public class WorkPlanServiceImpl extends Service implements WorkPlanSerivice { // 调整面试 }else if (InterviewOperateTypeEnum.ADJUSTMENT.getOperateType().equals(operateType)){ maps.put("workid",workPlanCreateParams.getWorkId()); - Map result = getService(user).addWorkPlan(maps); - Integer workplanId = (Integer)result.get("workplanid"); + getService(user).addWorkPlan(maps); // 安排面试 }else if (InterviewOperateTypeEnum.ARRANGE.getOperateType().equals(operateType)) { Map result = getService(user).addWorkPlan(maps); diff --git a/src/weaver/formmode/recruit/modeexpand/CreateWorkPlanModeExpand.java b/src/weaver/formmode/recruit/modeexpand/CreateWorkPlanModeExpand.java new file mode 100644 index 0000000..f94e153 --- /dev/null +++ b/src/weaver/formmode/recruit/modeexpand/CreateWorkPlanModeExpand.java @@ -0,0 +1,32 @@ +package weaver.formmode.recruit.modeexpand; + +import com.engine.common.util.ServiceUtil; +import com.engine.recruit.service.WorkPlanSerivice; +import com.engine.recruit.service.impl.WorkPlanServiceImpl; +import weaver.formmode.customjavacode.AbstractModeExpandJavaCodeNew; +import weaver.hrm.User; + +import java.util.Map; + +/** + * @Author liang.cheng + * @Date 2023/10/18 11:18 AM + * @Description: 保存并新建触发日程 + * @Version 1.0 + */ +public class CreateWorkPlanModeExpand extends AbstractModeExpandJavaCodeNew { + + public WorkPlanSerivice getWorkPlan(User user) { + return ServiceUtil.getService(WorkPlanServiceImpl.class, user); + } + + @Override + public Map doModeExpand(Map map) { + + + + + + return null; + } +}