package com.engine.recruit.service.impl; import cn.hutool.core.convert.Convert; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.engine.core.impl.Service; import com.engine.recruit.conn.ApplicantCommonInfo; import com.engine.recruit.conn.RecruitRecordSet; import com.engine.recruit.entity.position.PositionRelease; import com.engine.recruit.entity.position.PositionSdkInstance; import com.engine.recruit.entity.position.PositionSelectItem; import com.engine.recruit.enums.PositionReleaseStatusEnum; import com.engine.recruit.enums.PositionThirdChannelEnum; import com.engine.recruit.exception.CustomizeRunTimeException; import com.engine.recruit.service.RecruitPositionService; import com.weaver.formmodel.data.model.Formfield; import com.weaver.rpa.sdk.clients.application.resume.ERPAResumeSDKClient; import com.weaver.rpa.sdk.clients.application.resume.common.ResumeJobStatus; import com.weaver.rpa.sdk.clients.application.resume.entity.ResumeJobDynamicField; import com.weaver.rpa.sdk.clients.application.resume.entity.ResumeJobV2Dto; import com.weaver.rpa.sdk.clients.application.resume.exception.RpaResumeException; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import weaver.conn.RecordSet; import weaver.erpa.apps.entity.application.resume.dto.ResumeTaskResult; import weaver.erpa.apps.entity.application.resume.enums.TaskResult; import weaver.formmode.recruit.modeexpand.util.RecruitModeUtil; import weaver.formmode.recruit.modeexpand.util.RecruitPositionUtil; import weaver.general.BaseBean; import weaver.general.Util; import java.util.*; import java.util.stream.Collectors; /** * @author:dxfeng * @createTime: 2023/10/09 * @version: 1.0 */ public class RecruitPositionServiceImpl extends Service implements RecruitPositionService { @Override public Map updatePostInfo(Map param) { Map returnMap = new HashMap<>(); String zpzwfzr = Util.null2String(param.get("zpzwfzr")); String zpxzr = Util.null2String(param.get("zpxzr")); String ids = Util.null2String(param.get("ids")); if (StringUtils.isBlank(ids)) { throw new CustomizeRunTimeException("数据有误,请重试"); } RecordSet rs = new RecordSet(); if (StringUtils.isNotBlank(zpzwfzr)) { rs.executeUpdate(" update uf_jcl_zp_zpzw set zpzwfzr = ? where id in (" + ids + ")", zpzwfzr); } if (StringUtils.isNotBlank(zpxzr)) { rs.executeUpdate(" update uf_jcl_zp_zpzw set zpxzr = ? where id in (" + ids + ")", zpxzr); } return returnMap; } @Override public Map getFormCondition(Map param) { Map apidatas = new HashMap<>(); apidatas.put("hasRight", true); String conditionType = Util.null2String(param.get("conditionType")); String selectValue = Util.null2String(param.get("selectValue")); boolean enableSdkClient = PositionSdkInstance.enableSdkClient(); if (!enableSdkClient) { throw new CustomizeRunTimeException("千里聆SDK校验失败,无法获取职位动态字段,请检查千里聆非标配置"); } PositionSdkInstance positionSdkInstance = PositionSdkInstance.getPositionSdkInstance(); // 获取职位类别表单 if ("positionType".equals(conditionType)) { String dsfqd = Util.null2String(param.get("dsfqd")); getPositionType(dsfqd, selectValue, apidatas, positionSdkInstance); } // 前程无忧-发布城市 if ("job51City".equals(conditionType)) { getCityType(selectValue, apidatas, positionSdkInstance); } // 前程无忧-所属行业 if ("industryType".equals(conditionType)) { getIndustryType(selectValue, apidatas, positionSdkInstance); } // BOSS直聘-驻外语言要求 if ("residentLanguage".equals(conditionType)) { getResidentLanguage(selectValue, apidatas, positionSdkInstance); } // BOSS直聘-驻外国家或地区 if ("residentCountry".equals(conditionType)) { getResidentCountry(selectValue, apidatas, positionSdkInstance); } // BOSS直聘-是否驻外 if ("multiSelect".equals(conditionType)) { getMultiSelect(apidatas, positionSdkInstance); } return apidatas; } @Override public Map releaseResumeJob(Map param) { try { String billId = Util.null2String(param.get("billId")); String platformIds = Util.null2String(param.get("platformIds")); if (StringUtils.isBlank(platformIds)) { throw new CustomizeRunTimeException("请选择要发布的平台"); } RecordSet rs = new RecordSet(); rs.executeQuery("select * from uf_jcl_zp_zpzw where id = ?", billId); Map map = RecruitRecordSet.getSingleRecordMap(rs); String msg = ""; boolean enableSdkClient = PositionSdkInstance.enableSdkClient(); if (enableSdkClient) { long jobId = -1; String qllgwid = Util.null2String(map.get("qllgwid")); if (StringUtils.isNotBlank(qllgwid)) { jobId = Long.parseLong(qllgwid); } ERPAResumeSDKClient client = PositionSdkInstance.getPositionSdkInstance().getResumeSDKClient(); ResumeJobV2Dto resumeJobDto = RecruitPositionUtil.convertMap2ResumeJobV2Dto(user, map); RecruitPositionUtil.checkRequiredFields(resumeJobDto); String userId = String.valueOf(user.getUID()); // 未创建职位,则先创建职位 if (jobId == -1) { rs.writeLog("【创建职位】,[id=" + billId + "],resumeJobDto=" + JSON.toJSONString(resumeJobDto)); // 创建千里聆职位 jobId = client.addResumeJobV2(userId, resumeJobDto); // 更新千里聆ID到建模表单 rs.executeUpdate("update uf_jcl_zp_zpzw set qllgwid = ? where id = ?", jobId, billId); } else { rs.writeLog("【更新职位】,[id=" + billId + "],[qllgwid=" + jobId + "],resumeJobDto=" + JSON.toJSONString(resumeJobDto)); // 已发布的职位,更新职位信息 client.editResumeJobV2(userId, jobId, jobDto -> { BeanUtils.copyProperties(resumeJobDto, jobDto); }); } String[] split = platformIds.split(","); for (String platformId : split) { PositionThirdChannelEnum positionThirdChannelEnum = PositionThirdChannelEnum.getEnumByValue(platformId); ResumeTaskResult result = client.releaseResumeJob(userId, jobId, positionThirdChannelEnum.getResumePlatformId()); // 直接查看结果,正在执行中会返回PENGING,成功后会返回SUCCEED,失败后会返回FAILED TaskResult current = result.getResult(); rs.writeLog(current); // 使用回调函数获取成功或者失败时的消息 result.onResult(() -> { rs.writeLog("发布成功回调"); }, (reason) -> { rs.writeLog("发布失败回调,原因:" + reason); }); // 等待直到状态不再是PENDING TaskResult taskResult = result.waitResult(); rs.writeLog(taskResult); Integer status; if (taskResult == TaskResult.SUCCEED) { status = PositionReleaseStatusEnum.PUBLISHED.getValue(); } else { rs.writeLog("发布操作完成," + result.getFailReason()); status = PositionReleaseStatusEnum.PUBLISHING_FAILED.getValue(); } msg = "发布操作完成"; recordPublishingStatus(billId, platformId, status, result.getFailReason()); } } else { msg = "未配置发布插件,第三方平台请至各招聘网站自行发布"; String[] splits = platformIds.split(","); for (String platformId : splits) { recordPublishingStatus(billId, platformId, PositionReleaseStatusEnum.PUBLISHED.getValue(), msg); } } Map reportList = getReportList(param); reportList.put("msg", msg); return reportList; } catch (InterruptedException | RpaResumeException e) { throw new CustomizeRunTimeException(e.getMessage(),e); } } @Override public Map closeResumeJob(Map param) { try { String billId = Util.null2String(param.get("billId")); // 当前仅支持所有渠道一键下架 //String platformIds = Util.null2String(param.get("platformIds")); //if (StringUtils.isBlank(platformIds)) { // throw new CustomizeRunTimeException("请选择要发布的平台"); //} RecordSet rs = new RecordSet(); // 查询已发布渠道的信息 String platformIds = Util.null2String(param.get("platformIds")); List platformList = new ArrayList<>(); rs.executeQuery("select inner_channel from uf_jcl_qdfb where position = ? and status = ? ", billId, PositionReleaseStatusEnum.PUBLISHED.getValue()); while (rs.next()) { platformList.add(rs.getString("inner_channel")); } // 判断是否配置千里聆,若未配置千里聆信息,则不执行下架职位操作,只更新状态 boolean enableSdkClient = PositionSdkInstance.enableSdkClient(); String msg = ""; if (enableSdkClient) { rs.executeQuery("select qllgwid from uf_jcl_zp_zpzw where id = ?", billId); if (rs.next()) { String qllgwid = rs.getString("qllgwid"); // 第三方渠道未发布,不调用千里聆执行职位下架操作 if (StringUtils.isBlank(qllgwid)) { throw new CustomizeRunTimeException("billId=" + billId + ",当前职位暂未同步至千里聆发布,无需进行下架操作"); } if (CollectionUtils.isEmpty(platformList)) { throw new CustomizeRunTimeException("当前职位暂未发布,无需进行下架操作"); } long jobId = Long.parseLong(qllgwid); ERPAResumeSDKClient client = PositionSdkInstance.getPositionSdkInstance().getResumeSDKClient(); String userId = String.valueOf(user.getUID()); ResumeTaskResult result = client.closeResumeJob(userId, jobId); TaskResult current = result.getResult(); rs.writeLog(current); // 使用回调函数获取成功或者失败时的消息 result.onResult(() -> { rs.writeLog("下架成功回调"); }, (reason) -> { rs.writeLog("下架失败回调,原因:" + reason); }); // 等待直到状态不再是PENDING TaskResult taskResult = result.waitResult(); rs.writeLog(taskResult); if (taskResult == TaskResult.SUCCEED) { msg = "下架操作完成"; } else { msg = result.getFailReason(); } syncResumePlatformStatus(billId, jobId, client); } } else { msg = "未配置下架插件,第三方平台请至各招聘网站自行下架"; for (String platformId : platformList) { recordPublishingStatus(billId, platformId, PositionReleaseStatusEnum.PUBLISHED.getValue(), msg); } } Map reportList = getReportList(param); reportList.put("msg", msg); return reportList; } catch (InterruptedException | RpaResumeException e) { throw new CustomizeRunTimeException(e.getMessage(),e); } } @Override public Map refreshResumeJob(Map param) { String billId = Util.null2String(param.get("billId")); RecordSet rs = new RecordSet(); try { long jobId = -1; rs.executeQuery("select qllgwid from uf_jcl_zp_zpzw where id = ?", billId); if (rs.next()) { String qllgwid = rs.getString("qllgwid"); // 第三方渠道未发布,不调用千里聆执行职位下架操作 if (StringUtils.isBlank(qllgwid)) { throw new CustomizeRunTimeException("billId=" + billId + ",当前职位暂未同步至千里聆发布,无需进行下架操作"); } jobId = Long.parseLong(qllgwid); } ERPAResumeSDKClient client = PositionSdkInstance.getPositionSdkInstance().getResumeSDKClient(); ResumeTaskResult result = client.refreshResumeJob(String.valueOf(user.getUID()), jobId); String msg = ""; TaskResult current = result.getResult(); rs.writeLog(current); // 使用回调函数获取成功或者失败时的消息 result.onResult(() -> { rs.writeLog("刷新成功回调"); }, (reason) -> { rs.writeLog("刷新失败回调,原因:" + reason); }); // 等待直到状态不再是PENDING TaskResult taskResult = result.waitResult(); rs.writeLog(taskResult); if (taskResult == TaskResult.SUCCEED) { msg = "刷新操作完成"; syncResumePlatformStatus(billId, jobId, client); } else { msg = "刷新操作完成," + result.getFailReason(); } Map reportList = getReportList(param); reportList.put("msg", msg); return reportList; } catch (InterruptedException | RpaResumeException e) { throw new CustomizeRunTimeException(e.getMessage(),e); } } @Override public Map getReportList(Map param) { String billId = Util.null2String(param.get("billId")); RecordSet rs = new RecordSet(); rs.executeQuery("select * from uf_jcl_qdfb where position = ?", billId); List list = new ArrayList<>(); Map returnMap = new HashMap<>(); while (rs.next()) { Integer status = Convert.toInt(rs.getString("status"), 0); PositionReleaseStatusEnum releaseStatusEnum = PositionReleaseStatusEnum.getEnumByValue(status); PositionRelease positionRelease = new PositionRelease(); positionRelease.setId(rs.getInt("inner_channel")); positionRelease.setStatus(releaseStatusEnum.getLabel()); String tips = rs.getString("tips"); if (StringUtils.isNotBlank(tips)) { positionRelease.setTips(tips); } list.add(positionRelease); } returnMap.put("list", list); return returnMap; } @Override public Map saveAndReleaseResumeJob(Map param) { String billId = Util.null2String(param.get("billId")); String submitDataStr = Util.null2String(param.get("submitData")); if (StringUtils.isAnyBlank(billId, submitDataStr)) { throw new CustomizeRunTimeException("职位发布失败,接口传参有误"); } JSONObject submitData = JSONObject.parseObject(submitDataStr); List fieldList = RecruitModeUtil.getFieldList("uf_jcl_zp_zpzw"); Map fieldIdMap = fieldList.stream().collect(Collectors.toMap(item -> "field" + item.getId() , item -> item, (k1, k2) -> k1)); Map mainDataMap = new HashMap<>(); Map innerMap = submitData.getInnerMap(); BaseBean baseBean = new BaseBean(); for (Map.Entry entry : innerMap.entrySet()) { String key = entry.getKey(); String value = Util.null2String(entry.getValue()); Formfield formfield = fieldIdMap.get(key); if (null != formfield) { String fieldName = formfield.getFieldname(); if (StringUtils.isNotBlank(value)) { mainDataMap.put(fieldName, value); } else { mainDataMap.put(fieldName, null); if ("text".equals(formfield.getFielddbtype())) { mainDataMap.put(fieldName, ""); } } } else { baseBean.writeLog("未匹配到对应字段,key==" + key); } } mainDataMap.put("id", billId); RecruitRecordSet.updateDataById(mainDataMap, "uf_jcl_zp_zpzw"); return releaseResumeJob(param); } /** * 获取职位类别 * * @param dsfqd * @param selectValue * @param apidatas * @param positionSdkInstance */ private void getPositionType(String dsfqd, String selectValue, Map apidatas, PositionSdkInstance positionSdkInstance) { String[] split = selectValue.split("#"); Map selectValueMap = new HashMap<>(); for (String s : split) { String[] split1 = s.split(":"); if (split1.length == 2) { selectValueMap.put(split1[0], split1[1]); } } String boss_value = selectValueMap.get("BOSS直聘"); apidatas.put("boss_value", StringUtils.isBlank(boss_value) ? null : Arrays.asList(boss_value.split("-"))); String liepin_value = selectValueMap.get("猎聘"); apidatas.put("liepin_value", StringUtils.isBlank(liepin_value) ? null : Arrays.asList(liepin_value.split("-"))); String lagou_value = selectValueMap.get("拉勾"); apidatas.put("lagou_value", StringUtils.isBlank(lagou_value) ? null : Arrays.asList(lagou_value.split("-"))); String job51_value = selectValueMap.get("前程无忧"); apidatas.put("job51_value", StringUtils.isBlank(job51_value) ? null : Arrays.asList(job51_value.split("-"))); String zhilian_value = selectValueMap.get("智联"); apidatas.put("zhilian_value", StringUtils.isBlank(zhilian_value) ? null : Arrays.asList(zhilian_value.split("-"))); boolean bossShow = false; boolean liepinShow = false; boolean lagouShow = false; boolean job51Show = false; boolean zhilianShow = false; if (dsfqd.contains("0")) { List boss_type = positionSdkInstance.getBoss_type(); apidatas.put("boss", boss_type); bossShow = true; } if (dsfqd.contains("4")) { List liepin_type = positionSdkInstance.getLiepin_type(); apidatas.put("liepin", liepin_type); liepinShow = true; } if (dsfqd.contains("3")) { List lagou_type = positionSdkInstance.getLagou_type(); apidatas.put("lagou", lagou_type); lagouShow = true; } if (dsfqd.contains("2")) { List job51_type = positionSdkInstance.getJob51_type(); apidatas.put("job51", job51_type); job51Show = true; } if (dsfqd.contains("1")) { List zhilian_type = positionSdkInstance.getZhilian_type(); apidatas.put("zhilian", zhilian_type); zhilianShow = true; } apidatas.put("bossShow", bossShow); apidatas.put("liepinShow", liepinShow); apidatas.put("lagouShow", lagouShow); apidatas.put("job51Show", job51Show); apidatas.put("zhilianShow", zhilianShow); } /** * 获取发布城市 * * @param selectValue * @param apidatas * @param positionSdkInstance */ private void getCityType(String selectValue, Map apidatas, PositionSdkInstance positionSdkInstance) { List valueList = new ArrayList<>(); if (StringUtils.isNotBlank(selectValue)) { String[] split = selectValue.split(","); valueList = Arrays.asList(split); } List job51_city = positionSdkInstance.getJob51_city(); apidatas.put("job51_city", job51_city); apidatas.put("job51CityValue", valueList); } /** * 获取所属行业 * * @param selectValue * @param apidatas * @param positionSdkInstance */ private void getIndustryType(String selectValue, Map apidatas, PositionSdkInstance positionSdkInstance) { List> valueList = new ArrayList<>(); if (StringUtils.isNotBlank(selectValue)) { String[] split = selectValue.split("#"); for (String s : split) { String[] split1 = s.split("-"); valueList.add(Arrays.asList(split1)); } } List job51_industry = positionSdkInstance.getJob51_industry(); apidatas.put("job51_industry", job51_industry); apidatas.put("job51IndustryValue", valueList); } /** * 驻外语言要求 * * @param selectValue * @param apidatas * @param positionSdkInstance */ private void getResidentLanguage(String selectValue, Map apidatas, PositionSdkInstance positionSdkInstance) { List valueList = new ArrayList<>(); if (StringUtils.isNotBlank(selectValue)) { String[] split = selectValue.split(","); valueList = Arrays.asList(split); } List boss_resident_language = positionSdkInstance.getBoss_resident_language(); apidatas.put("boss_resident_language", boss_resident_language); apidatas.put("bossResidentLanguage", valueList); } /** * 驻外国家或地区 * * @param selectValue * @param apidatas * @param positionSdkInstance */ private void getResidentCountry(String selectValue, Map apidatas, PositionSdkInstance positionSdkInstance) { List valueList = new ArrayList<>(); if (StringUtils.isNotBlank(selectValue)) { String[] split = selectValue.split(","); valueList = Arrays.asList(split); } List boss_resident_country = positionSdkInstance.getBoss_resident_country(); apidatas.put("boss_resident_country", boss_resident_country); apidatas.put("bossResidentCountry", valueList); } /** * 获取招聘职位,多线下拉框字段信息 * * @param apidatas * @param positionSdkInstance */ private void getMultiSelect(Map apidatas, PositionSdkInstance positionSdkInstance) { apidatas.put("boss_resident", PositionSelectItem.convertDynamicFieldItem(positionSdkInstance.getBoss_resident())); //apidatas.put("boss_resident_country", PositionSelectItem.convertDynamicFieldItem(positionSdkInstance.getBoss_resident_country())); //apidatas.put("boss_resident_language", PositionSelectItem.convertDynamicFieldItem(positionSdkInstance.getBoss_resident_language())); apidatas.put("boss_resident_time", PositionSelectItem.convertDynamicFieldItem(positionSdkInstance.getBoss_resident_time())); apidatas.put("boss_resident_time_2", PositionSelectItem.convertDynamicFieldItem(positionSdkInstance.getBoss_resident_time_2())); //apidatas.put("job51_city", PositionSelectItem.convertDynamicFieldItem(positionSdkInstance.getJob51_city())); } /** * 记录发布状态 * * @param position * @param innerChannel * @param status * @param tips */ private void recordPublishingStatus(String position, String innerChannel, Integer status, String tips) { String tableName = "uf_jcl_qdfb"; Map insertMap = new HashMap<>(); String uuid = UUID.randomUUID().toString(); insertMap.put("modeuuid", uuid); int formModeId = ApplicantCommonInfo.getModeIdByTableName(tableName); insertMap.put("formmodeid", formModeId); RecruitRecordSet.buildModeInsertFields(insertMap, user.getUID()); insertMap.put("position", position); insertMap.put("inner_channel", innerChannel); insertMap.put("status", status); if (StringUtils.isNotBlank(tips)) { insertMap.put("tips", tips); } RecruitRecordSet.insertData(insertMap, tableName); int id = RecruitRecordSet.refreshRight(uuid, tableName, formModeId, user.getUID()); // 删除原来该职位下,该渠道的数据 String deleteSql = "delete from uf_jcl_qdfb where position = '" + position + "' and inner_channel = " + innerChannel + " and id != " + id; RecruitRecordSet.deleteData(deleteSql); } private void syncResumePlatformStatus(String billId, long jobId, ERPAResumeSDKClient client) { Map integerResumeJobStatusMap = client.syncResumePlatformStatus(String.valueOf(user.getUID()), jobId); for (Map.Entry entry : integerResumeJobStatusMap.entrySet()) { Integer key = entry.getKey(); ResumeJobStatus value = entry.getValue(); Integer status = PositionReleaseStatusEnum.UNPUBLISHED.getValue(); if (null == value) { status = PositionReleaseStatusEnum.CLOSED.getValue(); } else if (value.equals(ResumeJobStatus.RELEASED)) { status = PositionReleaseStatusEnum.PUBLISHED.getValue(); } else if (value.equals(ResumeJobStatus.UNRELEASED)) { status = PositionReleaseStatusEnum.UNPUBLISHED.getValue(); } PositionThirdChannelEnum positionThirdChannelEnum = PositionThirdChannelEnum.getEnumByPlatformId(key); recordPublishingStatus(billId, positionThirdChannelEnum.getValue(), status, null); } } }