Merge pull request 'feature/dxf' (#9) from feature/dxf into develop

Reviewed-on: http://221.226.25.34:3000/dxfeng/weaver-hrm-recruit/pulls/9
This commit is contained in:
dxfeng 2024-03-18 10:53:56 +08:00
commit e85cbf66bf
250 changed files with 4420 additions and 513 deletions

Binary file not shown.

Binary file not shown.

View File

@ -1,8 +1,17 @@
#\u805A\u624D\u6797\u62DB\u8058\u6D88\u606F\u63D0\u9192\uFF0C\u6D88\u606F\u6765\u6E90
#############################\u975E\u6807\u5305\u57FA\u7840\u914D\u7F6E\u76F8\u5173\u914D\u7F6E##############################
defaultCloseNonStandard163=true
#############################\u670D\u52A1\u5668\u76F8\u5173\u4FE1\u606F##############################
#\u5916\u7F51\u6620\u5C04\u5730\u5740
#HTTP_URL=http://221.226.25.34:8086
HTTP_URL=http://127.0.0.1:8089
#############################\u6D88\u606F\u63D0\u9192\u76F8\u5173\u914D\u7F6E##############################
#\u805A\u624D\u6797\u9ED8\u8BA4\u62DB\u8058\u6D88\u606F\u63D0\u9192\uFF0C\u6D88\u606F\u6765\u6E90(\u6D88\u606F\u6765\u6E90ID\u83B7\u53D6\u65B9\u5F0F\uFF1A==\u300B\u5E94\u7528\u4E2D\u5FC3-\u6D88\u606F\u4E2D\u5FC3-\u6D88\u606F\u7C7B\u578B\u8BBE\u7F6E>>>>\u6D88\u606F\u6765\u6E90-\u5217\u4E2D\u5B57\u6BB5\u4E2D\u7684\u7ED1\u5B9A\u6807\u8BC6)
RECRUIT_MESSAGE_TYPE=2022061063
#\u9762\u8BD5\u76F8\u5173\u6D88\u606F\u63D0\u9192\uFF0C\u6D88\u606F\u6765\u6E90
#\u9762\u8BD5\u53CD\u9988\u6D88\u606F\u63D0\u9192\uFF0C\u6D88\u606F\u6765\u6E90
INTERVIEW_MESSAGE_TYPE=2022061063
#\u6DFB\u52A0\u9762\u8BD5\u6D88\u606F\u63D0\u9192\u6807\u9898
INTERVIEW_ADD_MESSAGE_TITLE=\u9762\u8BD5\u5B89\u6392\u63D0\u9192
@ -16,9 +25,48 @@ INTERVIEW_EVALUATE_MESSAGE_TITLE=\u9762\u8BD5\u8BC4\u4EF7\u63D0\u9192
JOIN_BLACKLIST_MESSAGE_TITLE=\u4EBA\u624D\u9ED1\u540D\u5355\u901A\u77E5
#\u7B5B\u9009\u53CD\u9988
#\u7B5B\u9009\u53CD\u9988\u6D88\u606F\u63D0\u9192\uFF0C\u6D88\u606F\u6765\u6E90
SCREENING_MESSAGE_TYPE=2022061063
#\u7B5B\u9009\u53CD\u9988\uFF0C\u6D88\u606F\u63D0\u9192\u6807\u9898
SCREENING_MESSAGE_TITLE=\u7B80\u5386\u7B5B\u9009
SCREENING_MESSAGE_URL=/wui/index.html#/main/cube/search?customid=65
#\u7B5B\u9009\u53CD\u9988\uFF0C\u6D88\u606F\u63D0\u9192\u94FE\u63A5\u5730\u5740(\u9700\u66FF\u6362\u4E0B\u9762\u94FE\u63A5\u5730\u5740\u7684ID\uFF0CID\u83B7\u53D6\u65B9\u5F0F\uFF1A==\u300B\u5EFA\u6A21\u5F15\u64CE-\u5E94\u7528\u5EFA\u6A21-\u67E5\u8BE2>>>>\u805A\u624D\u6797\u62DB\u8058\u7BA1\u7406-\u5E94\u8058\u8005\u7B80\u5386-\u7B5B\u9009\u53CD\u9988)
SCREENING_MESSAGE_URL=/wui/index.html#/main/cube/search?customid=64
#\u5E94\u8058\u8005\u7B80\u5386\u5B58\u653E\u76EE\u5F55ID
APPLICANTS_RESUMES_CATEGORY=110
#############################\u79FB\u52A8\u5EFA\u6A21\u76F8\u5173\u914D\u7F6E##############################
#\u914D\u7F6E\u83B7\u53D6\u8DEF\u5F84\uFF1A\u79FB\u52A8\u5F15\u64CE-\u5E94\u7528\u5EFA\u6A21-\u5E94\u7528
#APPID\u83B7\u53D6\u65B9\u5F0F\uFF1A\u9009\u62E9\u5BF9\u5E94\u7684\u5E94\u7528\uFF0C\u9875\u9762\u5373\u5C55\u793A\u5BF9\u5E94ID
#\u79FB\u52A8\u5EFA\u6A21\u5730\u5740\u83B7\u53D6\u65B9\u5F0F\uFF1A\u9009\u62E9\u5BF9\u5E94\u7684\u5E94\u7528\uFF0C\u9F20\u6807\u53F3\u952E>>\u514D\u767B\u9646\u8BBF\u95EE\u8BBE\u7F6E\uFF0C\u5373\u53EF\u590D\u5236\u5E94\u7528\u8BBF\u95EE\u5730\u5740
#\u4FE1\u606F\u91C7\u96C6\u79FB\u52A8\u5EFA\u6A21APPID
MOBILE_APPID_COLLECT=3
#\u4FE1\u606F\u91C7\u96C6\u79FB\u52A8\u5EFA\u6A21\u5730\u5740
COLLECT_MESSAGE_LINK=http://ip:port/mobilemode/mobile/view.html?appid=3&mTokenFrom=anonymous&mToken=6B56BDC3C4233A984BA4BCE626FD44CF
#offer\u79FB\u52A8\u5EFA\u6A21APPID
MOBILE_APPID_OFFER=2
#offer\u53CD\u9988\u79FB\u52A8\u5EFA\u6A21\u5730\u5740
OFFER_MOBILE_URL=http://ip:port/mobilemode/mobile/view.html?appid=2&mTokenFrom=anonymous&mToken=C13059E5D6B68D0F23BC30B80E440C42
#############################\u6587\u6863\u76EE\u5F55\u76F8\u5173\u914D\u7F6E##############################
#\u539F\u59CB\u7B80\u5386\u9644\u4EF6\u76EE\u5F55ID\uFF08\u540E\u7AEF\u5F15\u64CE-\u5185\u5BB9\u5F15\u64CE-\u76EE\u5F55\u8BBE\u7F6E-\u6587\u6863\u76EE\u5F55>>>>\u62DB\u8058-\u539F\u59CB\u7B80\u5386\u9644\u4EF6\uFF09
APPLICANTS_RESUMES_CATEGORY=110
#############################\u53CD\u9988\u5730\u5740\u76F8\u5173\u914D\u7F6E##############################
#\u9762\u8BD5\u53CD\u9988\u5730\u5740\uFF0C\u5982\u672A\u81EA\u884C\u8C03\u6574ecode,\u65E0\u9700\u4FEE\u6539\u8BE5\u5730\u5740
INTERVIEW_FEEDBACK_URL=/spa/custom/static/index.html#/main/cs/app/9277c228302347dc88a958b69ee96234_Interview
#############################\u5E94\u8058\u8005\u5361\u7247\u7B80\u5386\u8BC6\u522B\u914D\u7F6E##############################
#\u5E94\u8058\u8005\u5361\u7247\uFF0C\u7B80\u5386\u8BC6\u522B\u5B9E\u73B0\u7C7B\uFF0C\u5982\u672A\u8D2D\u4E70OCR\u670D\u52A1\uFF0C\u65E0\u9700\u914D\u7F6E
#\u5343\u91CC\u8046\u5B9E\u73B0\u7C7B\uFF1Acom.engine.recruit.service.impl.ResumeRecognitionServiceImpl
OCR_TYPE=com.engine.recruit.service.impl.ResumeRecognitionServiceImpl
#\u7B80\u5386\u667A\u80FD\u62BD\u53D6\u670D\u52A1-\u5343\u91CC\u8046\u5730\u5740
OCR_URL=https://open.easst.cn/openapi/rest/resume
#appid
APP_ID=84th31r9
#appSecret
APP_SECRET=b43c83ea6f2169f2fd20e691bcdfa6f6

View File

@ -0,0 +1,12 @@
package com.api.recruit.controller;
import javax.ws.rs.Path;
/**
* @author:dxfeng
* @createTime: 2023/12/12
* @version: 1.0
*/
@Path("/jcl/recruit/resume")
public class ResumeRecognitionController extends com.engine.recruit.controller.ResumeRecognitionController {
}

View File

@ -0,0 +1,12 @@
package com.api.recruit.controller;
import javax.ws.rs.Path;
/**
* @author:dxfeng
* @createTime: 2024/03/13
* @version: 1.0
*/
@Path("/jcl/recruit/remind")
public class ResumeRemindController extends com.engine.recruit.controller.ResumeRemindController {
}

View File

@ -5,7 +5,7 @@ import javax.ws.rs.Path;
/**
* @Author liang.cheng
* @Date 2023/10/17 10:49 AM
* @Description: TODO
* @Description:
* @Version 1.0
*/

View File

@ -0,0 +1,12 @@
package com.api.recruit.controller;
import javax.ws.rs.Path;
/**
* @author:dxfeng
* @createTime: 2023/10/23
* @version: 1.0
*/
@Path("/jcl/recruit/written")
public class WrittenResultsController extends com.engine.recruit.controller.WrittenResultsController{
}

View File

@ -0,0 +1,54 @@
package com.api.recruit.listener;
import com.sun.jersey.api.model.AbstractResourceModelContext;
import com.sun.jersey.api.model.AbstractResourceModelListener;
import com.weaver.upgrade.FunctionUpgradeUtil;
import org.apache.commons.lang3.StringUtils;
import weaver.conn.RecordSet;
import weaver.general.BaseBean;
import weaver.system.License;
import javax.ws.rs.ext.Provider;
@Provider
public class InitListener implements AbstractResourceModelListener {
@Override
public void onLoaded(AbstractResourceModelContext abstractResourceModelContext) {
int menuid = 100188;
BaseBean bb = new BaseBean();
String cId = new License().getCId();
if(cId.length() > 7) {
cId = cId.substring(cId.length() - 7);
}
String defaultCloseNonStandard151 = bb.getPropValue("jclRecruit", "defaultCloseNonStandard163");
if(StringUtils.isNotBlank(cId) && "true".equals(defaultCloseNonStandard151)) {
int cid = Integer.parseInt(cId);
if(!hasMenuInfo(cid, "left", menuid)) {
bb.writeLog("163招聘管理 添加默认菜单控制");
insertMenuInfo(cid, "left", menuid);
}
}
}
private void insertMenuInfo(int cid,String type,int id){
RecordSet rs = new RecordSet();
BaseBean bb = new BaseBean();
bb.writeLog("FunctionUpgradeUtil.getMenuId(cid,id):" + FunctionUpgradeUtil.getMenuId(cid,id));
String sql ="INSERT INTO menucontrollist (type,menuid,isopen) VALUES('"+type+"','"+FunctionUpgradeUtil.getMenuId(cid,id)+"','"+FunctionUpgradeUtil.getMenuStatus(id,-1,cid)+"')";
rs.execute(sql);
}
private boolean hasMenuInfo(int cid, String type, int id) {
RecordSet rs = new RecordSet();
String sql = "select count(1) as count from menucontrollist where type = ? and menuid = ?";
rs.executeQuery(sql,type, FunctionUpgradeUtil.getMenuId(cid,id));
if(rs.next()) {
int count = rs.getInt("count");
if(count > 0) {
return true;
}
}
return false;
}
}

View File

@ -63,6 +63,41 @@ public class ApplicantCommonInfo {
return cancelReason;
}
/**
* 获取表单下拉框值
*
* @param formId 表单ID
* @param fieldName 字段明湖曾
* @param selectName 下拉框展示内容
* @return
*/
public static String getSelectValue(String formId, String fieldName, String selectName) {
String selectValue = "";
RecordSet rs = new RecordSet();
rs.executeQuery("select selectvalue from workflow_selectitem where fieldid =( select id from workflow_billfield where billid = ? and fieldname = ? ) and selectname = ?", formId, fieldName, selectName);
if (rs.next()) {
selectValue = rs.getString("selectvalue");
}
return selectValue;
}
/**
* 获取表单下拉框展示文本
*
* @param formId 表单ID
* @param fieldName 字段明湖曾
* @return
*/
public static Map<String, String> getSelectMap(String formId, String fieldName) {
Map<String, String> selectMap = new HashMap<>();
RecordSet rs = new RecordSet();
rs.executeQuery("select selectvalue,selectname from workflow_selectitem where fieldid =( select id from workflow_billfield where billid = ? and fieldname = ? ) ", formId, fieldName);
while (rs.next()) {
selectMap.put(rs.getString("selectvalue"), rs.getString("selectname"));
}
return selectMap;
}
/**
* 获取招聘通用浏览按钮展示内容
@ -78,7 +113,7 @@ public class ApplicantCommonInfo {
RecordSet rs = new RecordSet();
String[] split = id.split(",");
for (String s : split) {
rs.executeQuery("select xxnr from uf_sjzd where id = ?", id);
rs.executeQuery("select xxnr from uf_sjzd where id = ?", s);
if (rs.next()) {
value.add(rs.getString("xxnr"));
}
@ -95,7 +130,7 @@ public class ApplicantCommonInfo {
public static int getModeIdByTableName(String modeTable) {
int formModeId = -1;
RecordSet rs = new RecordSet();
rs.executeQuery("select id from modeinfo where formid =( select id from workflow_bill where tablename = ? )", modeTable);
rs.executeQuery("select id from modeinfo where formid =( select id from workflow_bill where tablename = ? ) order by id", modeTable);
if (rs.next()) {
formModeId = rs.getInt("id");
}
@ -238,4 +273,52 @@ 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;
}
/**
* 根据customSearchCode获取查询列表的id
*
* @param customSearchCode customSearchCode
* @return ID
*/
public static String getCustomSearchId(String customSearchCode) {
RecordSet rs = new RecordSet();
rs.executeQuery("select id from mode_customsearch where customsearchcode = ? ", customSearchCode);
if (rs.next()) {
return rs.getString("id");
}
return "";
}
/**
* 根据customSearchCode获取查询列表的地址
*
* @param customSearchCode customSearchCode
* @param linkUrl 自定义的URL
* @return 查询列表的地址
*/
public static String getCustomSearchLink(String customSearchCode, String linkUrl) {
if (StringUtils.isNotBlank(linkUrl)) {
return linkUrl;
}
String customSearchId = getCustomSearchId(customSearchCode);
if (StringUtils.isNotBlank(customSearchId)) {
return "/spa/cube/index.html#/main/cube/search?customid=" + customSearchId;
}
return "";
}
}

View File

@ -2,7 +2,9 @@ package com.engine.recruit.conn;
import com.engine.recruit.enums.ApplicationStatusEnum;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import weaver.conn.RecordSet;
import weaver.general.BaseBean;
import weaver.general.Util;
import java.util.HashMap;
@ -53,7 +55,6 @@ public class CheckRepeatResume {
}
/**
*
* @param name
* @param mobile
* @param positionId
@ -63,7 +64,13 @@ public class CheckRepeatResume {
public static List<Map<String, Object>> getRepeatPositionResumeList(String name, String mobile, String positionId, String billId) {
RecordSet rs = new RecordSet();
// 查询状态为待分配候选中的且未隐藏的数据
rs.executeQuery("select * from uf_jcl_yppc where formmodeid is not null and zt != 2 and zt != 3 and xm = ? and sjhm = ? and ypzw = ? and id != ? order by zt", name, mobile, positionId, billId);
String whereSql = "";
if (StringUtils.isBlank(positionId)) {
whereSql = " and (ypzw = ? or ypzw is null) ";
} else {
whereSql = " and ypzw = ? ";
}
rs.executeQuery("select * from uf_jcl_yppc where formmodeid is not null and zt != 2 and zt != 3 and xm = ? and sjhm = ? " + whereSql + " and id != ? order by zt", name, mobile, positionId, billId);
return RecruitRecordSet.getRecordMapList(rs);
}
@ -92,6 +99,42 @@ public class CheckRepeatResume {
return Util.getIntValue(Util.null2String(map.get("mainId")));
}
/**
* 插入更新明细表数据
*
* @param detailDataList
* @param tableName
* @param mainId
* @param sourceId
*/
public void insertResumeDetailTable(List<RecruitDataMap<Object>> detailDataList, String tableName, String mainId, String sourceId) {
if (CollectionUtils.isEmpty(detailDataList)) {
return;
}
boolean isUpdate = false;
if (StringUtils.isNotBlank(sourceId)) {
RecordSet rs = new RecordSet();
rs.executeQuery("select * from " + tableName + " where mainid = ? ", sourceId);
isUpdate = rs.getCounts() == 0;
}
try {
for (RecruitDataMap<Object> dataMap : detailDataList) {
// 明细表关联新数据
dataMap.put("mainid", mainId);
RecruitRecordSet.insertData(dataMap, tableName);
// 明细表关联已有数据
if (isUpdate) {
dataMap.put("mainid", sourceId);
RecruitRecordSet.insertData(dataMap, tableName);
}
}
} catch (Exception e) {
new BaseBean().writeLog(tableName + "明细表数据插入失败", e);
}
}
/**
* 插入简历数据
*
@ -175,12 +218,7 @@ public class CheckRepeatResume {
private int insertData(Map<String, Object> dataMap) {
String uuid = UUID.randomUUID().toString();
dataMap.put("modeuuid", uuid);
RecordSet rs = new RecordSet();
int formModeId = -1;
rs.executeQuery("select id from modeinfo where formid =( select id from workflow_bill where tablename = 'uf_jcl_yppc' )");
if (rs.next()) {
formModeId = rs.getInt("id");
}
int formModeId = ApplicantCommonInfo.getModeIdByTableName("uf_jcl_yppc");
dataMap.put("formmodeid", formModeId);
RecruitRecordSet.buildModeInsertFields(dataMap, 1);
RecruitRecordSet.insertData(dataMap, "uf_jcl_yppc");
@ -244,4 +282,60 @@ public class CheckRepeatResume {
}
/**
* 获取开始时间和结束时间
*
* @param date
* @return
*/
public static RecruitDataMap<Object> getDateRange(String date, boolean isStudy) {
RecruitDataMap<Object> dataRangeMap = new RecruitDataMap<>();
if (StringUtils.isBlank(date)) {
return dataRangeMap;
}
String[] split = date.split("-");
if (split.length == 2) {
String start = getFormatDate(split[0]);
String end = getFormatDate(split[1]);
if (start.length() == 4) {
if (isStudy) {
start += "-09-01";
} else {
start = "";
}
}
if (end.length() == 4) {
if (isStudy) {
end += "-07-01";
} else {
end = "";
}
}
dataRangeMap.put("kssj", start);
dataRangeMap.put("jssj", end);
}
return dataRangeMap;
}
/**
* 获取yyyy-MM-dd时间格式日期
*
* @param dateStr
* @return
*/
private static String getFormatDate(String dateStr) {
//
dateStr = dateStr.replace(".", "-").replace("\\/", "-");
if (dateStr.length() == 7) {
return dateStr + "-01";
} else if (dateStr.length() == 10) {
return dateStr;
} else if (dateStr.length() == 4) {
return dateStr;
}
return "";
}
}

View File

@ -22,7 +22,7 @@ public class ModeBrowserCommonInfo {
}
/**
* 根据名称获取简历来源ID
* 根据名称获取工作经验ID
*
* @param name
* @return
@ -31,6 +31,23 @@ public class ModeBrowserCommonInfo {
return getBrowserId("10", name);
}
/**
* 获取学位ID
*
* @param name
* @return
*/
public static String getDegreeId(String name) {
return getBrowserId("12", name);
}
/**
* 获取学历ID
*
* @param name
* @return
*/
public static String getEducationLevelId(String name) {
if (StringUtils.isBlank(name)) {
return null;

View File

@ -1,7 +1,13 @@
package com.engine.recruit.conn;
import com.engine.recruit.entity.position.PositionPo;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import weaver.conn.RecordSet;
import java.util.*;
import java.util.stream.Collectors;
/**
* 招聘职位信息
*
@ -36,6 +42,9 @@ public class PositionCommonInfo {
*/
public static String getRecruitFlowId(String positionId) {
String recruitFlowId = "";
if (StringUtils.isBlank(positionId)) {
return recruitFlowId;
}
RecordSet rs = new RecordSet();
rs.executeQuery("select zplc from uf_jcl_zp_zpzw where id = ?", positionId);
if (rs.next()) {
@ -44,4 +53,58 @@ public class PositionCommonInfo {
return recruitFlowId;
}
/**
* 根据职位名称获取职位ID
*
* @param positionName 职位名称
* @param mobile 职位跟进人手机号
* @return
*/
public static String getPositionIdByName(String positionName, String mobile) {
RecordSet rs = new RecordSet();
// 根据职位名称查询招聘中的数据
rs.executeQuery("select id ,zpzwmc ,zpzt ,modedatacreater ,modedatacreatedate ,modedatacreatetime from uf_jcl_zp_zpzw where zpzt = 0 and zpzwmc = ? ", positionName);
List<PositionPo> positionPoList = new ArrayList<>();
while (rs.next()) {
PositionPo positionPo = PositionPo.builder()
.id(rs.getString("id"))
.name(rs.getString("zpzwmc"))
.status(rs.getString("zpzt"))
.creator(rs.getString("modedatacreater"))
.createDate(rs.getString("modedatacreatedate"))
.createTime(rs.getString("modedatacreatetime"))
.build();
positionPoList.add(positionPo);
}
// 未查询到数据返回空
if (CollectionUtils.isEmpty(positionPoList)) {
return "";
}
// 只有一条数据直接返回当前数据,如果有多个再添加其他条件过滤
if (positionPoList.size() == 1) {
return positionPoList.get(0).getId();
}
// 根据手机号查询人员ID
Set<String> userIds = new HashSet<>();
rs.executeQuery("select id from hrmresource where mobile = ? ", mobile);
while (rs.next()) {
userIds.add(rs.getString("id"));
}
// 筛选跟进人手机号匹配的职位数据并按创建时间倒序排序
List<PositionPo> filterList = positionPoList.stream().filter(item -> userIds.contains(item.getCreator())).sorted(Comparator.comparing(PositionPo::getCreationTime).reversed()).collect(Collectors.toList());
if (CollectionUtils.isEmpty(filterList)) {
// 跟进人手机号未获取到选择最新的一条数据
return positionPoList.stream().sorted(Comparator.comparing(PositionPo::getCreationTime).reversed()).collect(Collectors.toList()).get(0).getId();
} else {
// 再一样就默认匹配到创建时间最新的职位
return filterList.get(0).getId();
}
}
}

View File

@ -61,9 +61,11 @@ public class RecruitRecordSet {
List<String> paramList = new ArrayList<>();
dataMap.forEach((key, value) -> {
fieldList.add(key);
dataList.add(value);
paramList.add("?");
if (null != value) {
fieldList.add(key);
dataList.add(value);
paramList.add("?");
}
});
String insertSql = " insert into " + tableName + "(" + StringUtils.join(fieldList, ",") + ") values (" + StringUtils.join(paramList, ",") + ")";
RecordSet rs = new RecordSet();
@ -82,14 +84,12 @@ public class RecruitRecordSet {
public static void updateDataById(Map<String, Object> dataMap, String tableName) {
List<String> fieldList = new ArrayList<>();
List<Object> dataList = new ArrayList<>();
List<String> paramList = new ArrayList<>();
String id = Util.null2String(dataMap.get("id"));
dataMap.remove("id");
dataMap.forEach((key, value) -> {
fieldList.add(key + " = ? ");
dataList.add(value);
paramList.add("?");
});
dataList.add(id);
String updateSql = "update " + tableName + " set " + StringUtils.join(fieldList, ",") + " where id = ? ";
@ -100,6 +100,20 @@ public class RecruitRecordSet {
}
}
/**
* 删除数据
*
* @param deleteSql
*/
public static void deleteData(String deleteSql) {
RecordSet rs = new RecordSet();
rs.executeUpdate(deleteSql);
if (StringUtils.isNotBlank(rs.getExceptionMsg())) {
throw new CustomizeRunTimeException(rs.getExceptionMsg());
}
}
/**
* 构建建模表基本数据
*

View File

@ -0,0 +1,94 @@
package com.engine.recruit.constant;
/**
* @author:dxfeng
* @createTime: 2024/03/12
* @version: 1.0
*/
public class ModeSearchCodeConstant {
/**
* 招聘需求管理
*/
public static final String RECRUITMENT_DEMAND_MANAGEMENT = "b129634bf72d46b8bed0291f84efd2e0";
/**
* 招聘职位
*/
public static final String RECRUITMENT_POSITIONS = "c024e527c964437bb568bebbb48d89a5";
/**
* 应聘者
*/
public static final String APPLICANTS = "1d48211cd1634b19bdc6f7df40cd1337";
/**
* 筛选反馈
*/
//public static final String SCREENING_FEEDBACK = "b746e3cf80454289a3ade2b17147e297";
public static final String SCREENING_FEEDBACK = "669a72259c0c47e49a97f5b68692ed34";
/**
* 笔试结果
*/
public static final String WRITTEN_RESULTS = "1b56a7492fb84f2b9e5ae022fde333f0";
/**
* 面试
*/
public static final String INTERVIEW = "496ecc32a87045888f224ad3151e635b";
/**
* 薪酬谈判
*/
public static final String SALARY_NEGOTIATION = "ffe1bafcef5942f5853e68b76e5098d2";
/**
* 背调
*/
public static final String BACK_TONE = "33be832e81eb4cf5a5686213918e769b";
/**
* offer
*/
public static final String OFFER = "4d4d8f9761474333907bacb81d98fc3c";
/**
* 人才库
*/
public static final String TALENT_POOL = "bdeb379900e5475c87306862dfb9d0b9";
/**
* 简历库
*/
public static final String RESUME_LIBRARY = "9bc41dbc69ee43a1976910008d7fdfe3";
/**
* 工作地点
*/
public static final String WORK_LOCATION = "af9c9eee65a84e82bf3a423506ef1f38";
/**
* 数据字典类型名称
*/
public static final String DATA_DICTIONARY_TYPE_NAME = "034d7bcea5634e458854a1c70580ca6d";
/**
* 邮件通知模板
*/
public static final String EMAIL_NOTIFICATION_TEMPLATE = "ea3b7ae0e3134c65be740eee629070af";
/**
* 千里聆邮箱配置
*/
public static final String QLL_EMAIL_CONFIG = "a97c0154ea5b43c8b17fc7a1dfdb195f";
/**
* 我参与的面试
*/
public static final String PARTICIPATE_IN_INTERVIEWS = "b8c509d648124c068f11fca338b2eea2";
/**
* 招聘流程列表
*/
public static final String RECRUITMENT_PROCESS_LIST = "32cea1924ceb45d8aa8622dbdf935a58";
/**
* 招聘阶段列表
*/
public static final String RECRUITMENT_STAGE_LIST = "06443dd4afa84831ae9d9c1b76450313";
/**
* 操作按钮列表
*/
public static final String LIST_OF_OPERATION_BUTTONS = "e14a2ce232d844239c00a0b3ead1af04";
/**
* 入职管理
*/
public static final String ENTRY_MANAGEMENT = "073e0628016a46b588d76fdd872a7369";
/**
* 简历订阅
*/
public static final String RESUME_SUBSCRIPTION = "e672681f989f4ba18fdc02cb89049293";
}

View File

@ -0,0 +1,13 @@
package com.engine.recruit.constant;
/**
* @author:dxfeng
* @createTime: 2024/03/13
* @version: 1.0
*/
public class ModeTreeCodeConstant {
/**
* 数据字典树
*/
public static final String DATA_DICTIONARY_TREE = "31717568fca8435f9e55eb08c1fbed4b";
}

View File

@ -0,0 +1,120 @@
package com.engine.recruit.constant;
import com.engine.recruit.exception.CustomizeRunTimeException;
import org.apache.commons.lang.StringUtils;
import weaver.general.BaseBean;
import java.net.URI;
import java.nio.charset.StandardCharsets;
/**
* @author:dxfeng
* @createTime: 2024/01/17
* @version: 1.0
*/
public class RecruitConstant {
/**
* URL分隔符
*/
private static final String URL_SPLIT = "/";
public static final String HTTP_URL;
public static final String RECRUIT_MESSAGE_TYPE;
public static final String INTERVIEW_MESSAGE_TYPE;
public static final String INTERVIEW_ADD_MESSAGE_TITLE;
public static final String INTERVIEW_CANCEL_MESSAGE_TITLE;
public static final String INTERVIEW_EVALUATE_MESSAGE_TITLE;
public static final String INTERVIEW_ADJUSTMENT_MESSAGE_TITLE;
public static final String JOIN_BLACKLIST_MESSAGE_TITLE;
public static final String SCREENING_MESSAGE_TYPE;
public static final String SCREENING_MESSAGE_TITLE;
public static final String SCREENING_MESSAGE_URL;
public static final String MOBILE_APPID_COLLECT;
public static final String COLLECT_MESSAGE_LINK;
public static final String MOBILE_APPID_OFFER;
public static final String OFFER_MOBILE_URL;
public static final String APPLICANTS_RESUMES_CATEGORY;
public static final String INTERVIEW_FEEDBACK_URL;
public static final String REMIND_SEARCH_LINK;
public static final String OCR_TYPE;
public static final String OCR_URL;
public static final String APP_ID;
public static final String APP_SECRET;
static BaseBean baseBean = new BaseBean();
static {
HTTP_URL = getRecruitPropValue("HTTP_URL");
RECRUIT_MESSAGE_TYPE = getRecruitPropValue("RECRUIT_MESSAGE_TYPE");
INTERVIEW_MESSAGE_TYPE = getRecruitPropValue("INTERVIEW_MESSAGE_TYPE");
INTERVIEW_ADD_MESSAGE_TITLE = getRecruitPropValue("INTERVIEW_ADD_MESSAGE_TITLE");
INTERVIEW_CANCEL_MESSAGE_TITLE = getRecruitPropValue("INTERVIEW_CANCEL_MESSAGE_TITLE");
INTERVIEW_EVALUATE_MESSAGE_TITLE = getRecruitPropValue("INTERVIEW_EVALUATE_MESSAGE_TITLE");
INTERVIEW_ADJUSTMENT_MESSAGE_TITLE = getRecruitPropValue("INTERVIEW_ADJUSTMENT_MESSAGE_TITLE");
JOIN_BLACKLIST_MESSAGE_TITLE = getRecruitPropValue("JOIN_BLACKLIST_MESSAGE_TITLE");
SCREENING_MESSAGE_TYPE = getRecruitPropValue("SCREENING_MESSAGE_TYPE");
SCREENING_MESSAGE_TITLE = getRecruitPropValue("SCREENING_MESSAGE_TITLE");
SCREENING_MESSAGE_URL = getRecruitPropValue("SCREENING_MESSAGE_URL");
MOBILE_APPID_COLLECT = getRecruitPropValue("MOBILE_APPID_COLLECT");
// 信息采集移动建模地址
COLLECT_MESSAGE_LINK = getCompleteUrl(getRecruitPropValue("COLLECT_MESSAGE_LINK"));
MOBILE_APPID_OFFER = getRecruitPropValue("MOBILE_APPID_OFFER");
// offer反馈移动建模地址
OFFER_MOBILE_URL = getCompleteUrl(getRecruitPropValue("OFFER_MOBILE_URL"));
APPLICANTS_RESUMES_CATEGORY = getRecruitPropValue("APPLICANTS_RESUMES_CATEGORY");
// 面试反馈地址
INTERVIEW_FEEDBACK_URL = getCompleteUrl(getRecruitPropValue("INTERVIEW_FEEDBACK_URL"));
// 简历订阅相关
REMIND_SEARCH_LINK = getCompleteUrl(getRecruitPropValue("REMIND_SEARCH_LINK"));
// OCR相关
OCR_TYPE = getRecruitPropValue("OCR_TYPE");
OCR_URL = getRecruitPropValue("OCR_URL");
APP_ID = getRecruitPropValue("APP_ID");
APP_SECRET = getRecruitPropValue("APP_SECRET");
}
/**
* 读取jclRecruit.properties配置文件的配置项
*
* @param key
* @return
*/
public static String getRecruitPropValue(String key) {
String value = baseBean.getPropValue("jclRecruit", key);
value = new String(value.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
return value;
}
/**
* 对外发布的URL地址处理域名
*
* @param url
* @return
*/
public static String getCompleteUrl(String url) {
if (StringUtils.isBlank(url)) {
return "";
}
try {
URI u = new URI(url);
// 如果URL对象的getHost()方法获取到了域名则直接返回原始URL
if (u.getHost() != null) {
return url;
} else {
// 否则判断URL是否以"/"开头如果是则在它前面拼接上域名
if (url.startsWith(URL_SPLIT)) {
return HTTP_URL + url;
} else {
// 如果URL既不是完整URL也不是以"/"开头则在URL开头添加"/"再拼接上域名
return HTTP_URL + URL_SPLIT + url;
}
}
} catch (Exception e) {
throw new CustomizeRunTimeException(e);
}
}
}

View File

@ -74,14 +74,6 @@ public class ApplicantResumeController {
return new ResponseResult<Map<String, Object>, Map<String, Object>>(user).run(getApplicantResumeWrapper(user)::updateApplicantsInfo, params);
}
@POST
@Path("/fullOriginalResumeId")
@Produces(MediaType.APPLICATION_JSON)
public String fullOriginalResumeId(@Context HttpServletRequest request, @Context HttpServletResponse response) {
User user = HrmUserVarify.getUser(request, response);
Map<String, Object> param = ParamUtil.request2Map(request);
return new ResponseResult<Map<String, Object>, Map<String, Object>>(user).run(getApplicantResumeWrapper(user)::fullOriginalResumeId, param);
}
@POST
@Path("/checkRepeatResume")

View File

@ -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;
import javax.ws.rs.core.Context;
@ -43,4 +44,13 @@ public class RecruitFlowController {
Map<String, Object> params = ParamUtil.request2Map(request);
return new ResponseResult<Map<String, Object>, Map<String, Object>>(user).run(getRecruitFlowWrapper(user)::getRecruitStepList, params);
}
@POST
@Path("/syncRecruitStepInfo")
@Produces(MediaType.APPLICATION_JSON)
public String syncRecruitStepInfo(@Context HttpServletRequest request, @Context HttpServletResponse response) {
User user = HrmUserVarify.getUser(request, response);
Map<String, Object> params = ParamUtil.request2Map(request);
return new ResponseResult<Map<String, Object>, Map<String, Object>>(user).run(getRecruitFlowWrapper(user)::syncRecruitStepInfo, params);
}
}

View File

@ -5,6 +5,7 @@ import com.engine.common.util.ServiceUtil;
import com.engine.recruit.util.ResponseResult;
import com.engine.recruit.wrapper.InductionManageWrapper;
import com.engine.recruit.wrapper.OfferWrapper;
import com.engine.recruit.wrapper.RecruitInterviewWrapper;
import weaver.hrm.HrmUserVarify;
import weaver.hrm.User;
@ -29,6 +30,10 @@ public class RecruitMobileModeController {
return ServiceUtil.getService(InductionManageWrapper.class, user);
}
public RecruitInterviewWrapper getRecruitInterviewWrapper(User user) {
return ServiceUtil.getService(RecruitInterviewWrapper.class, user);
}
@POST
@Path("/getOfferContent")
@Produces(MediaType.APPLICATION_JSON)
@ -63,4 +68,14 @@ public class RecruitMobileModeController {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<String, Map<String, Object>>(user).run(getInductionManageWrapper(user)::infoSubmit, id);
}
@POST
@Path("/updateInterviewStatus")
@Produces(MediaType.APPLICATION_JSON)
public String updateInterviewStatus(@Context HttpServletRequest request, @Context HttpServletResponse response) {
User user = HrmUserVarify.getUser(request, response);
Map<String, Object> param = ParamUtil.request2Map(request);
return new ResponseResult<Map<String, Object>, Map<String, Object>>(user).run(getRecruitInterviewWrapper(user)::updateInterviewStatus, param);
}
}

View File

@ -0,0 +1,56 @@
package com.engine.recruit.controller;
import com.engine.common.util.ParamUtil;
import com.engine.common.util.ServiceUtil;
import com.engine.recruit.util.ResponseResult;
import com.engine.recruit.wrapper.ResumeRecognitionWrapper;
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.POST;
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.Map;
/**
* @author:dxfeng
* @createTime: 2023/12/12
* @version: 1.0
*/
public class ResumeRecognitionController {
public ResumeRecognitionWrapper getResumeRecognitionWrapper(User user) {
return ServiceUtil.getService(ResumeRecognitionWrapper.class, user);
}
@POST
@Path("/resumeUpload")
@Produces(MediaType.APPLICATION_JSON)
public String resumeUpload(@Context HttpServletRequest request, @Context HttpServletResponse response) {
User user = HrmUserVarify.getUser(request, response);
Map<String, Object> param = ParamUtil.request2Map(request);
return new ResponseResult<Map<String, Object>, Map<String, Object>>(user).run(getResumeRecognitionWrapper(user)::resumeUpload, param);
}
@POST
@Path("/importResume")
@Produces(MediaType.APPLICATION_JSON)
public String importResume(@Context HttpServletRequest request, @Context HttpServletResponse response) {
User user = HrmUserVarify.getUser(request, response);
Map<String, Object> param = ParamUtil.request2Map(request);
return new ResponseResult<Map<String, Object>, Map<String, Object>>(user).run(getResumeRecognitionWrapper(user)::importResume, param);
}
@GET
@Path("/fetchResume")
@Produces(MediaType.APPLICATION_JSON)
public String fetchResume(@Context HttpServletRequest request, @Context HttpServletResponse response) {
User user = HrmUserVarify.getUser(request, response);
Map<String, Object> param = ParamUtil.request2Map(request);
return new ResponseResult<Map<String, Object>, Map<String, Object>>(user).run(getResumeRecognitionWrapper(user)::fetchResume, param);
}
}

View File

@ -0,0 +1,37 @@
package com.engine.recruit.controller;
import com.engine.common.util.ParamUtil;
import com.engine.common.util.ServiceUtil;
import com.engine.recruit.util.ResponseResult;
import com.engine.recruit.wrapper.ResumeRemindWrapper;
import weaver.hrm.HrmUserVarify;
import weaver.hrm.User;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.POST;
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.Map;
/**
* @author:dxfeng
* @createTime: 2024/03/13
* @version: 1.0
*/
public class ResumeRemindController {
public ResumeRemindWrapper getResumeRemindWrapper(User user) {
return ServiceUtil.getService(ResumeRemindWrapper.class, user);
}
@POST
@Path("/doRemindJob")
@Produces(MediaType.APPLICATION_JSON)
public String doRemindJob(@Context HttpServletRequest request, @Context HttpServletResponse response) {
User user = HrmUserVarify.getUser(request, response);
Map<String, Object> param = ParamUtil.request2Map(request);
return new ResponseResult<Map<String, Object>, Map<String, Object>>(user).run(getResumeRemindWrapper(user)::doRemindJob, param);
}
}

View File

@ -0,0 +1,47 @@
package com.engine.recruit.controller;
import com.engine.common.util.ParamUtil;
import com.engine.common.util.ServiceUtil;
import com.engine.recruit.util.ResponseResult;
import com.engine.recruit.wrapper.WrittenResultsWrapper;
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.POST;
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.Map;
/**
* @author:dxfeng
* @createTime: 2024/01/24
* @version: 1.0
*/
public class WrittenResultsController {
public WrittenResultsWrapper getWrittenResultsWrapper(User user) {
return ServiceUtil.getService(WrittenResultsWrapper.class, user);
}
@GET
@Path("/getFormCondition")
@Produces(MediaType.APPLICATION_JSON)
public String getFormCondition(@Context HttpServletRequest request, @Context HttpServletResponse response) {
User user = HrmUserVarify.getUser(request, response);
Map<String, Object> params = ParamUtil.request2Map(request);
return new ResponseResult<Map<String, Object>, Map<String, Object>>(user).run(getWrittenResultsWrapper(user)::getFormCondition, params);
}
@POST
@Path("/importExcel")
@Produces(MediaType.APPLICATION_JSON)
public String importExcel(@Context HttpServletRequest request, @Context HttpServletResponse response) {
User user = HrmUserVarify.getUser(request, response);
Map<String, Object> params = ParamUtil.request2Map(request);
return new ResponseResult<Map<String, Object>, Map<String, Object>>(user).run(getWrittenResultsWrapper(user)::importExcel, params);
}
}

View File

@ -0,0 +1,23 @@
package com.engine.recruit.entity.common;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author:dxfeng
* @createTime: 2024/01/26
* @version: 1.0
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ImportLog {
private Integer rowIndex;
private String status;
private String description;
}

View File

@ -0,0 +1,29 @@
package com.engine.recruit.entity.position;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author:dxfeng
* @createTime: 2024/02/05
* @version: 1.0
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PositionPo {
private String id;
private String name;
private String status;
private String creator;
private String createDate;
private String createTime;
private String creationTime;
public String getCreationTime() {
return createDate + " " + createTime;
}
}

View File

@ -0,0 +1,42 @@
package com.engine.recruit.entity.recruitflow.po;
import lombok.*;
import java.util.Objects;
/**
* @author:dxfeng
* @createTime: 2024/02/29
* @version: 1.0
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class RecruitStepDt1 {
private String id;
private String mainid;
private String czan;
private String zdyxsmc;
private String tzymdz;
private String sfqy;
private String tzymbt;
private String zssx;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
RecruitStepDt1 stepDt1 = (RecruitStepDt1) o;
return czan.equals(stepDt1.czan);
}
@Override
public int hashCode() {
return Objects.hash(czan);
}
}

View File

@ -0,0 +1,23 @@
package com.engine.recruit.entity.recruitflow.po;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author:dxfeng
* @createTime: 2024/02/29
* @version: 1.0
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class RecruitStepDt2 {
private String id;
private String mainid;
private String ymbt;
private String ymdz;
private String zssx;
}

View File

@ -48,7 +48,8 @@ public class RecruitTabPo {
if ("uf_jcl_yppc".equalsIgnoreCase(tableName)) {
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"));
// 只统计展示入库的数据即formmodeid不为null的数据
rs.executeQuery("select count(id) as num from uf_jcl_yppc where formmodeid is not null and xm=? and sjhm =?", rs.getString("xm"), rs.getString("sjhm"));
}
} else {
rs.executeQuery("select count(1) as num from " + tableName + " where ypz = ? ", billId);

View File

@ -6,7 +6,10 @@ import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.engine.recruit.conn.CheckRepeatResume;
import com.engine.recruit.conn.ModeBrowserCommonInfo;
import com.engine.recruit.conn.RecruitDataMap;
import com.engine.recruit.constant.RecruitConstant;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -17,6 +20,8 @@ import weaver.general.BaseBean;
import weaver.hrm.User;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* @author:dxfeng
@ -28,7 +33,6 @@ import java.io.InputStream;
@NoArgsConstructor
@Builder
public class QllResumePo {
private static final int SEC_CATEGORY = Convert.toInt(RecruitModeUtil.getRecruitPropValue("APPLICANTS_RESUMES_CATEGORY"));
private String id;
private String xm;
@ -65,23 +69,29 @@ public class QllResumePo {
return null;
}
String resumeId = null;
BaseBean baseBean = new BaseBean();
try {
JSONArray jsonArray = JSON.parseArray(jlfj);
JSONObject jsonObject = (JSONObject) jsonArray.get(0);
String name = jsonObject.getString("name");
String content = jsonObject.getString("content");
baseBean.writeLog("千里聆简历附件解析id=" + id + ",jslf=" + jlfj);
HttpResponse response = HttpRequest.get(content).execute();
if (response.isOk()) {
String disposition = response.header("Content-Disposition");
if (StringUtils.isNotBlank(disposition)) {
InputStream inputStream = response.bodyStream();
int imageFileId = RecruitModeUtil.generateImageFileId(inputStream, name);
int docId = RecruitModeUtil.createDocId(SEC_CATEGORY, imageFileId, new User(1));
int docId = RecruitModeUtil.createDocId(Convert.toInt(RecruitConstant.APPLICANTS_RESUMES_CATEGORY), imageFileId, new User(1));
resumeId = String.valueOf(docId);
} else {
baseBean.writeLog("千里聆附件下载失败" + response.body());
}
} else {
baseBean.writeLog("千里聆附件下载失败,URL响应失败");
}
} catch (Exception e) {
new BaseBean().writeLog("千里聆附件下载失败", e);
baseBean.writeLog("千里聆附件下载失败", e);
}
return resumeId;
}
@ -103,7 +113,6 @@ public class QllResumePo {
if (StringUtils.isBlank(gzjy)) {
return null;
}
;
int parseInt = Integer.parseInt(gzjy);
String year = parseInt + "";
if (0 == parseInt) {
@ -118,4 +127,84 @@ public class QllResumePo {
public String getZgxl() {
return ModeBrowserCommonInfo.getEducationLevelId(zgxl);
}
public List<RecruitDataMap<Object>> getGzjl() {
List<RecruitDataMap<Object>> list = new ArrayList<>();
if (StringUtils.isNotBlank(gzjl)) {
try {
JSONArray jsonArray = JSONArray.parseArray(gzjl);
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String gsmc = jsonObject.getString("公司名称:");
String zwmc = jsonObject.getString("职位名称:");
String sj = jsonObject.getString("时间:");
String gznr = jsonObject.getString("工作内容:");
RecruitDataMap<Object> map = CheckRepeatResume.getDateRange(sj, false);
map.put("gsmc", gsmc);
map.put("gw", zwmc);
map.put("gzzz", formatStr(gznr));
list.add(map);
}
} catch (Exception e) {
new BaseBean().writeLog("工作经历解析失败", e);
}
}
return list;
}
public List<RecruitDataMap<Object>> getXmjl() {
List<RecruitDataMap<Object>> list = new ArrayList<>();
if (StringUtils.isNotBlank(xmjl)) {
try {
JSONArray jsonArray = JSONArray.parseArray(xmjl);
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String xmmc = jsonObject.getString("项目名称:");
//String rzgs = jsonObject.getString("任职公司:");
String sj = jsonObject.getString("时间:");
String xmnr = jsonObject.getString("项目内容:");
RecruitDataMap<Object> map = CheckRepeatResume.getDateRange(sj, false);
map.put("xmmc", xmmc);
map.put("xmms", formatStr(xmnr));
list.add(map);
}
} catch (Exception e) {
new BaseBean().writeLog("项目经历解析失败", e);
}
}
return list;
}
public List<RecruitDataMap<Object>> getJyjl() {
List<RecruitDataMap<Object>> list = new ArrayList<>();
if (StringUtils.isNotBlank(jyjl)) {
try {
JSONArray jsonArray = JSONArray.parseArray(jyjl);
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String byyx = jsonObject.getString("毕业院校:");
String xl = jsonObject.getString("学历:");
String sj = jsonObject.getString("时间:");
String zy = jsonObject.getString("专业:");
RecruitDataMap<Object> map = CheckRepeatResume.getDateRange(sj, true);
map.put("xxmc", byyx);
map.put("xl", ModeBrowserCommonInfo.getEducationLevelId(xl));
map.put("zy", zy);
list.add(map);
}
} catch (Exception e) {
new BaseBean().writeLog("教育经历解析失败", e);
}
}
return list;
}
private String formatStr(String str) {
if (StringUtils.isBlank(str)) {
return "";
}
return str.replace("\\n", "\n");
}
}

View File

@ -13,16 +13,16 @@ public enum HighestDegreeEnum {
*/
OTHER(1, "其他"),
JUNIOR_MIDDLE_SCHOOL(2, "初中"),
HIGH_SCHOOL(2, "高中"),
SECONDARY_TECHNOLOGY(2, "中技"),
SECONDARY_SPECIALIZED_SCHOOL(2, "中专"),
JUNIOR_COLLEGE(2, "大专"),
UNDERGRADUATE(2, "本科"),
MASTER_DEGREE(2, "硕士研究生"),
DOCTORAL_STUDENTS(2, "博士研究生"),
MBA(2, "MBA"),
EMBA(2, "EMBA"),
POST_DOCTORAL(2, "博士后");
HIGH_SCHOOL(3, "高中"),
SECONDARY_TECHNOLOGY(4, "中技"),
SECONDARY_SPECIALIZED_SCHOOL(5, "中专"),
JUNIOR_COLLEGE(6, "大专"),
UNDERGRADUATE(7, "本科"),
MASTER_DEGREE(8, "硕士研究生"),
DOCTORAL_STUDENTS(9, "博士研究生"),
MBA(10, "MBA"),
EMBA(11, "EMBA"),
POST_DOCTORAL(12, "博士后");
HighestDegreeEnum(Integer id, String name) {
this.id = id;

View File

@ -1,7 +1,9 @@
package com.engine.recruit.factory;
import com.engine.core.impl.Service;
import com.engine.recruit.exception.CustomizeRunTimeException;
import com.engine.recruit.service.RecruitButtonService;
import weaver.general.BaseBean;
/**
* <p>聚才林招聘</p>
@ -29,7 +31,8 @@ public class RecruitButtonFactory {
}
return (Class<T>) clazz;
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
new BaseBean().writeLog(e);
throw new CustomizeRunTimeException("操作按钮配置出错,未获取到按钮实现类[" + className + "]");
}

View File

@ -0,0 +1,37 @@
package com.engine.recruit.factory;
import com.engine.core.impl.Service;
import com.engine.recruit.exception.CustomizeRunTimeException;
import com.engine.recruit.service.ResumeRecognitionService;
import weaver.general.BaseBean;
/**
* @author:dxfeng
* @createTime: 2024/01/09
* @version: 1.0
*/
public class ResumeRecognitionFactory {
/**
* 根据类的全路径获取类对象
*
* @param className 类全路径
* @param <T>
* @return
*/
public static <T extends Service> Class<T> getClass(String className) {
Class<?> clazz;
try {
clazz = Class.forName(className);
if (!ResumeRecognitionService.class.isAssignableFrom(clazz)) {
throw new IllegalArgumentException("该类未实现ResumeRecognitionService");
}
return (Class<T>) clazz;
} catch (ClassNotFoundException e) {
new BaseBean().writeLog(e);
throw new CustomizeRunTimeException("简历识别配置出错,未获取到解析实现类[" + className + "]");
}
}
}

View File

@ -55,13 +55,6 @@ public interface ApplicantResumeService {
Map<String, Object> updateApplicantsInfo(Map<String, Object> params);
/**
* 完善OCR导入的简历原始简历字段
*
* @param params
* @return
*/
Map<String, Object> fullOriginalResumeId(Map<String, Object> params);
/**
* 判断是否重复简历是否可以新增

View File

@ -26,4 +26,13 @@ public interface RecruitFlowService {
* @return 招聘阶段
*/
Map<String, Object> getRecruitStepList(Map<String, Object> param);
/**
* 同步招聘阶段
*
* @param param
* @return
*/
Map<String, Object> syncRecruitStepInfo(Map<String, Object> param);
}

View File

@ -0,0 +1,18 @@
package com.engine.recruit.service;
import java.util.Map;
/**
* @author:dxfeng
* @createTime: 2023/11/28
* @version: 1.0
*/
public interface RecruitInterviewService {
/**
* 更新面试状态
*
* @param param
* @return
*/
Map<String, Object> updateInterviewStatus(Map<String, Object> param);
}

View File

@ -0,0 +1,38 @@
package com.engine.recruit.service;
import java.util.Map;
/**
* 简历识别服务类
*
* @author:dxfeng
* @createTime: 2023/12/12
* @version: 1.0
*/
public interface ResumeRecognitionService {
/**
* 简历上传简历解析
*
* @param param
* @return
*/
Map<String, Object> resumeUpload(Map<String, Object> param);
/**
* 简历上传解析
*
* @param param
* @return
*/
Map<String, Object> importResume(Map<String, Object> param);
/**
* 获取简历
*
* @param param
* @return
*/
Map<String, Object> fetchResume(Map<String, Object> param);
}

View File

@ -0,0 +1,19 @@
package com.engine.recruit.service;
import java.util.Map;
/**
* @author:dxfeng
* @createTime: 2024/03/13
* @version: 1.0
*/
public interface ResumeRemindService {
/**
* doRemindJob
*
* @param param
* @return
*/
Map<String, Object> doRemindJob(Map<String, Object> param);
}

View File

@ -6,7 +6,6 @@ import com.engine.recruit.entity.workplan.WorkPlanCreateParams;
/**
* @Author liang.cheng
* @Date 2023/10/17 10:50 AM
* @Description: TODO
* @Version 1.0
*/
public interface WorkPlanSerivice {

View File

@ -0,0 +1,26 @@
package com.engine.recruit.service;
import java.util.Map;
/**
* @author:dxfeng
* @createTime: 2024/01/24
* @version: 1.0
*/
public interface WrittenResultsService {
/**
* 获取表单结构
*
* @return
*/
Map<String, Object> getFormCondition();
/**
* 导入Excel
*
* @param params
* @return
*/
Map<String, Object> importExcel(Map<String, Object> params);
}

View File

@ -1,16 +1,13 @@
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.record.ApplicantRecordPo;
import com.engine.recruit.entity.resume.OcrResumePo;
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 com.engine.recruit.util.RecruitUtil;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import weaver.common.DateUtil;
@ -201,20 +198,29 @@ public class ApplicantResumeServiceImpl extends Service implements ApplicantResu
recordPo.execute();
} else if (ApplicantOperateEnum.ASSIGN.getOperateType().equals(operateType)) {
// 分配职位
String billid = Util.null2String(params.get("billid"));
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("应聘职位不可为空");
}
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");
if (StringUtils.isBlank(zplc)) {
throw new CustomizeRunTimeException("未获取到招聘流程,请检查招聘职位配置");
}
rs.executeUpdate("update uf_jcl_yppc set ypzw = ? , zplc = ? , zpjd = ? , dqypjd = ?, zt = 1 where id = ?", ypzw, flowId, zpjd, dqypjd, billid);
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);
returnMap.put("msg", "操作成功");
} else if (ApplicantOperateEnum.ARCHIVE.getOperateType().equals(operateType)) {
// 归档人才库
@ -268,6 +274,8 @@ public class ApplicantResumeServiceImpl extends Service implements ApplicantResu
mainDataMap.put("zpjd", zpjd);
mainDataMap.put("dqypjd", dqypjd);
}
} else {
throw new CustomizeRunTimeException("未获取到关联招聘流程的招聘阶段,请检查流程配置");
}
mainDataMap.put("zt", ApplicationStatusEnum.CANDIDATE.getValue());
@ -304,38 +312,6 @@ public class ApplicantResumeServiceImpl extends Service implements ApplicantResu
return returnMap;
}
@Override
public Map<String, Object> fullOriginalResumeId(Map<String, Object> params) {
Map<String, Object> returnMap = new HashMap<>();
int imageFileId = Convert.toInt(params.get("imageFileId"));
int resumeId = Convert.toInt(params.get("resumeId"));
int secCategory = Convert.toInt(RecruitModeUtil.getRecruitPropValue("APPLICANTS_RESUMES_CATEGORY"));
RecordSet rs = new RecordSet();
try {
int docId = RecruitModeUtil.createDocId(secCategory, imageFileId, user);
// 更新原始简历信息
rs.executeUpdate("update uf_jcl_jlzjb set jlfj=?,ocr=1 where id = ?", docId, resumeId);
// 简历入库并返回展示的应聘者简历ID
rs.executeQuery("select id,xm, xb, csrq, jg, yx, wx, qq, xjzd, ah, grys , jyjl , bysj , zgxl , zyjn , sxjl , yysp , zs, gzjl, ypzw, gzjy, xmjl, sjhm, nl, sfz, jlfj from uf_jcl_jlzjb where ocr = 1 and cqzt is null and id = ?", resumeId);
Map<String, Object> recordMap = RecruitRecordSet.getSingleRecordMap(rs);
OcrResumePo ocrResumePo = RecruitUtil.parseMap2Object(recordMap, OcrResumePo.class);
RecruitDataMap<Object> dataMap = buildApplicantMap(ocrResumePo);
// 校验简历信息并插入
Map<String, Object> map = CheckRepeatResume.getInstance().insertResumeAndReturn(dataMap);
rs.executeUpdate("update uf_jcl_jlzjb set cqzt = 1 where id = ? ", ocrResumePo.getId());
String mainId = Util.null2String(map.get("mainId"));
String sourceId = Util.null2String(map.get("sourceId"));
returnMap.put("mainId", StringUtils.isNotBlank(sourceId) ? sourceId : mainId);
returnMap.put("sourceId", sourceId);
} catch (Exception e) {
throw new RuntimeException(e);
}
return returnMap;
}
@Override
public Map<String, Object> checkRepeatResume(Map<String, Object> param) {
@ -351,6 +327,9 @@ public class ApplicantResumeServiceImpl extends Service implements ApplicantResu
}
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;
@ -475,11 +454,8 @@ public class ApplicantResumeServiceImpl extends Service implements ApplicantResu
Map<String, Object> dataMap = new RecruitDataMap<>();
String uuid = UUID.randomUUID().toString();
dataMap.put("modeuuid", uuid);
int formModeId = -1;
rs.executeQuery("select id from modeinfo where formid =( select id from workflow_bill where tablename = 'uf_jcl_rck' )");
if (rs.next()) {
formModeId = rs.getInt("id");
}
int formModeId = ApplicantCommonInfo.getModeIdByTableName("uf_jcl_rck");
dataMap.put("formmodeid", formModeId);
// 构建建模表基本数据
RecruitRecordSet.buildModeInsertFields(dataMap, user.getUID());
@ -634,55 +610,50 @@ public class ApplicantResumeServiceImpl extends Service implements ApplicantResu
for (List<Object> list : insertList) {
rs.executeUpdate("insert into uf_jcl_rck_dt4 (mainid, yylx, zwcd) values (?, ?, ?)", list);
}
// 同步设置的标签
int applicantModeId = ApplicantCommonInfo.getModeIdByTableName("uf_jcl_yppc");
rs.executeQuery("select a.tabname , a.color , a.bgcolor , a.bdcolor , a.type , a.creator , a.orderid from modeTabs_" + applicantModeId + " a left join Modetabslog_" + applicantModeId + " b on a.id = b.tabid and b.operate = 0 where b.billid = ? ", applicantId);
List<Map<String, Object>> modeTabList = RecruitRecordSet.getRecordMapList(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 ocrResumePo
* @return
*/
private RecruitDataMap<Object> buildApplicantMap(OcrResumePo ocrResumePo) {
RecruitDataMap<Object> insertMap = new RecruitDataMap<>();
// 姓名
insertMap.put("xm", ocrResumePo.getXm());
// 电子邮箱
insertMap.put("dzyx", ocrResumePo.getYx());
// 年龄
insertMap.put("nl", ocrResumePo.getNl());
// 手机号码
insertMap.put("sjhm", ocrResumePo.getSjhm());
// 自我评价
insertMap.put("zwpj", ocrResumePo.getGrys());
// 身份证号
insertMap.put("sfz", ocrResumePo.getSfz());
// 原始简历
insertMap.put("ysjl", ocrResumePo.getJlfj());
// 性别
insertMap.put("xb", ocrResumePo.getXb());
// 投递时间
insertMap.put("tdsj", DateUtil.getDateTime());
String zt = ApplicationStatusEnum.DISTRIBUTION.getValue();
// 应聘职位
//String ypzw = ocrResumePo.getYpzw();
//if (StringUtils.isNotBlank(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)) {
// insertMap.put("ypzw", ypzw);
// insertMap.put("zplc", flowId);
// insertMap.put("zpjd", zpjd);
// insertMap.put("dqypjd", dqypjd);
// zt = ApplicationStatusEnum.CANDIDATE.getValue();
// }
// }
//}
// 应聘状态
insertMap.put("zt", zt);
return insertMap;
}
}

View File

@ -4,6 +4,7 @@ import com.engine.core.impl.Service;
import com.engine.recruit.conn.ApplicantCommonInfo;
import com.engine.recruit.conn.RecruitDataMap;
import com.engine.recruit.conn.RecruitRecordSet;
import com.engine.recruit.constant.RecruitConstant;
import com.engine.recruit.entity.record.ApplicantRecordPo;
import com.engine.recruit.enums.EntryStatusEnum;
import com.engine.recruit.enums.InfoCollectEnum;
@ -28,7 +29,6 @@ import java.util.stream.Collectors;
* @version: 1.0
*/
public class InductionManageServiceImpl extends Service implements InductionManageService {
private static final String MOBILE_APPID_COLLECT = RecruitModeUtil.getRecruitPropValue("MOBILE_APPID_COLLECT");
@Override
public Map<String, Object> updateInductionManageInfo(Map<String, Object> param) {
@ -47,11 +47,11 @@ public class InductionManageServiceImpl extends Service implements InductionMana
public Map<String, Object> sendCollectInfo(Map<String, Object> param) {
String ids = Util.null2String(param.get("ids"));
String[] split = ids.split(",");
if (StringUtils.isBlank(MOBILE_APPID_COLLECT)) {
if (StringUtils.isBlank(RecruitConstant.MOBILE_APPID_COLLECT)) {
throw new CustomizeRunTimeException("未获取到对应移动建模ID请检查配置文件");
}
RecordSet rs = new RecordSet();
rs.executeQuery("select noLoginUser from mobileappbaseinfo where id = ?", MOBILE_APPID_COLLECT);
rs.executeQuery("select noLoginUser from mobileappbaseinfo where id = ?", RecruitConstant.MOBILE_APPID_COLLECT);
int creator = -1;
if (rs.next()) {
creator = rs.getInt("noLoginUser");
@ -61,7 +61,7 @@ public class InductionManageServiceImpl extends Service implements InductionMana
}
// 查询信息采集模板内容
rs.executeQuery("select yjnr,mbmc from uf_jcl_yjtzmb where mblx = 3");
rs.executeQuery("select yjnr,mbmc from uf_jcl_yjtzmb where mblx = 3 and zt = 0");
String yjnr = "";
String mbmc = "";
if (rs.next()) {
@ -92,11 +92,7 @@ public class InductionManageServiceImpl extends Service implements InductionMana
Map<String, Object> dataMap = new RecruitDataMap<>();
String uuid = UUID.randomUUID().toString();
dataMap.put("modeuuid", uuid);
int formModeId = -1;
rs.executeQuery("select id from modeinfo where formid =( select id from workflow_bill where tablename = 'uf_jcl_xxcj' )");
if (rs.next()) {
formModeId = rs.getInt("id");
}
int formModeId = ApplicantCommonInfo.getModeIdByTableName("uf_jcl_xxcj");
dataMap.put("formmodeid", formModeId);
// 构建建模表基本数据
RecruitRecordSet.buildModeInsertFields(dataMap, creator);
@ -127,7 +123,7 @@ public class InductionManageServiceImpl extends Service implements InductionMana
String mobile = Util.null2String(dataMap.get("sjh"));
String email = Util.null2String(dataMap.get("yx"));
String messageLink = RecruitModeUtil.getRecruitPropValue("COLLECT_MESSAGE_LINK");
String messageLink = RecruitConstant.COLLECT_MESSAGE_LINK;
//messageLink += "&billId=" + id;
yjnr = yjnr.replace("{链接地址}", messageLink);

View File

@ -4,17 +4,17 @@ import com.engine.core.impl.Service;
import com.engine.recruit.conn.ApplicantCommonInfo;
import com.engine.recruit.conn.RecruitDataMap;
import com.engine.recruit.conn.RecruitRecordSet;
import com.engine.recruit.constant.ModeSearchCodeConstant;
import com.engine.recruit.constant.ModeTreeCodeConstant;
import com.engine.recruit.entity.init.po.*;
import com.engine.recruit.exception.CustomizeRunTimeException;
import com.engine.recruit.service.InitRecruitDataService;
import org.apache.commons.lang3.StringUtils;
import weaver.conn.RecordSet;
import weaver.formmode.recruit.modeexpand.process.StageDataInsert;
import weaver.general.BaseBean;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -42,6 +42,11 @@ public class InitRecruitDataServiceImpl extends Service implements InitRecruitDa
rs.executeUpdate("delete from uf_jcl_zpjdsz_dt1;");
rs.executeUpdate("delete from uf_jcl_zpjdsz_dt2;");
rs.executeUpdate("delete from uf_jcl_lcczan;");
// 刷新页面菜单
rs.executeQuery("select * from hp_nonstandard_function_info where num='163' and name ='招聘管理'");
if (rs.next()) {
refreshMenuUrl();
}
// 插入操作按钮数据
int buttonModeId = ApplicantCommonInfo.getModeIdByTableName("uf_jcl_lcczan");
@ -61,6 +66,124 @@ public class InitRecruitDataServiceImpl extends Service implements InitRecruitDa
return null;
}
/**
* 更新招聘管理相关菜单地址
*/
private void refreshMenuUrl() {
List<String> menuSqlList = new ArrayList<>();
// 招聘需求
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.RECRUITMENT_DEMAND_MANAGEMENT) + "' where id = " + 100189);
// 招聘职位
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.RECRUITMENT_POSITIONS) + "' where id = " + 100190);
// 应聘者
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.APPLICANTS) + "' where id = " + 100192);
// 部门筛选
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.SCREENING_FEEDBACK) + "' where id = " + 100193);
// 笔试
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.WRITTEN_RESULTS) + "' where id = " + 100194);
// 面试
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.INTERVIEW) + "' where id = " + 100195);
// 薪酬谈判
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.SALARY_NEGOTIATION) + "' where id = " + 100196);
// 背调
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.BACK_TONE) + "' where id = " + 100197);
// offer
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.OFFER) + "' where id = " + 100198);
// 人才库
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.TALENT_POOL) + "' where id = " + 100200);
// 简历库
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.RESUME_LIBRARY) + "' where id = " + 100201);
// 工作地点
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.WORK_LOCATION) + "' where id = " + 100203);
// 字段类型名称
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.DATA_DICTIONARY_TYPE_NAME) + "' where id = " + 100205);
// 邮件通知模板
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.EMAIL_NOTIFICATION_TEMPLATE) + "' where id = " + 100206);
// 千里聆邮箱配置
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.QLL_EMAIL_CONFIG) + "' where id = " + 100207);
// 招聘需求
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.RECRUITMENT_DEMAND_MANAGEMENT) + "' where id = " + 100209);
// 我的筛选
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.SCREENING_FEEDBACK) + "' where id = " + 100210);
// 我的面试
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.PARTICIPATE_IN_INTERVIEWS) + "' where id = " + 100211);
// 招聘流程
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.RECRUITMENT_PROCESS_LIST) + "' where id = " + 100213);
// 招聘阶段
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.RECRUITMENT_STAGE_LIST) + "' where id = " + 100214);
// 操作按钮
menuSqlList.add("update LeftMenuInfo set fullrouteurl = '/spa/cube/index.html#/main/cube/search?customid=" + getCustomSearchId(ModeSearchCodeConstant.LIST_OF_OPERATION_BUTTONS) + "' where id = " + 100215);
// 入职管理
menuSqlList.add("update LeftMenuInfo set fullrouteurl= '/spa/cube/index.html#/main/cube/viewCustomPage?id=" + getCustomPageId("入职管理", ModeSearchCodeConstant.ENTRY_MANAGEMENT) + "&noTitleShow=1' where id = " + 100199);
// 数据字典
menuSqlList.add("update LeftMenuInfo set fullrouteurl= '/spa/cube/index.html#/main/cube/tree?id=" + getCustomTreeId(ModeTreeCodeConstant.DATA_DICTIONARY_TREE) + "&noTitleShow=1' where id = " + 100204);
RecordSet rs = new RecordSet();
for (String sql : menuSqlList) {
new BaseBean().writeLog("招聘目录初始化SQL==" + sql);
rs.executeUpdate(sql);
}
}
/**
* 获取建模查询列表ID
*
* @param customSearchCode
* @return
*/
private String getCustomSearchId(String customSearchCode) {
RecordSet rs = new RecordSet();
rs.executeQuery("select id from mode_customsearch where customsearchcode = ? ", customSearchCode);
if (rs.next()) {
return rs.getString("id");
}
throw new CustomizeRunTimeException("招聘管理菜单初始化失败,请检查建模引擎查询列表配置[" + customSearchCode + "]");
}
/**
* 获取建模自定义页面ID
*
* @param customPageName 自定义页面名称
* @param customSearchCode
* @return
*/
private String getCustomPageId(String customPageName, String customSearchCode) {
RecordSet rs = new RecordSet();
rs.executeQuery("select appid from mode_customsearch where customsearchcode = ? ", customSearchCode);
if (rs.next()) {
String appId = rs.getString("appid");
rs.executeQuery("select id from mode_custompage where appid = ? and customname = ?", appId, customPageName);
if (rs.next()) {
return rs.getString("id");
}
}
throw new CustomizeRunTimeException("招聘管理菜单初始化失败,请检查建模引擎自定义页面配置[" + customPageName + "," + customSearchCode + "]");
}
/**
* 获取建模树ID
*
* @param treeCode
* @return
*/
private String getCustomTreeId(String treeCode) {
RecordSet rs = new RecordSet();
rs.executeQuery("select id from mode_customtree where treecode =? ", treeCode);
if (rs.next()) {
return rs.getString("id");
}
throw new CustomizeRunTimeException("招聘管理菜单初始化失败,请检查建模引擎树配置[" + treeCode + "]");
}
/**
* 插入初始化流程数据
*
* @param baseMap
* @param modeId
*/
private void insertFlowData(Map<String, Object> baseMap, int modeId) {
OperateFlowPo flowPo = OperateFlowPo.builder()
.lcmc("默认流程")
@ -215,7 +338,7 @@ public class InitRecruitDataServiceImpl extends Service implements InitRecruitDa
stageList.add(buildStagePo(OperateStagePo.builder().jdmc("笔试").jdms("笔试").jdlx(1).hj(1).build(),
operateButtonMap,
"进入下一阶段", "安排笔试", "笔试结果登记", "转移阶段", "淘汰", "转推其他职位", "归档人才库", "添加备注", "加入黑名单"));
"进入下一阶段", "安排笔试", "转移阶段", "淘汰", "转推其他职位", "归档人才库", "添加备注", "加入黑名单"));
stageList.add(buildStagePo(OperateStagePo.builder().jdmc("面试").jdms("面试").jdlx(2).hj(1).build(),
operateButtonMap,
@ -304,7 +427,7 @@ public class InitRecruitDataServiceImpl extends Service implements InitRecruitDa
.build());
buttonList.add(OperateButtonPo.builder().buttonName("归档人才库").buttonAction("openDialog")
.linkUrl(getModeLink("/spa/cube/index.html#/main/cube/card?type=1&modeId={modeId}&formId={formId}&layoutid={layoutid}&guid=card&ids=$parentid$", "uf_jcl_yppc", "归档人才库-新建模板-新建一个投递", ""))
.linkUrl(getModeLink("/spa/cube/index.html#/main/cube/card?type=1&modeId={modeId}&formId={formId}&layoutid={layoutid}&guid=card&ids=$parentid$", "uf_jcl_yppc", "归档人才库-新建模板", ""))
.build());
buttonList.add(OperateButtonPo.builder().buttonName("加入黑名单").buttonAction("confirmAndReload")
@ -315,16 +438,16 @@ public class InitRecruitDataServiceImpl extends Service implements InitRecruitDa
.linkUrl(getModeLink("/spa/cube/index.html#/main/cube/card?modeId={modeId}&formId={formId}&type=1&layoutid={layoutid}&{ypz}=$parentid$", "uf_jcl_bs", "笔试安排-新建模板", "ypz"))
.build());
buttonList.add(OperateButtonPo.builder().buttonName("笔试结果登记").buttonAction("openDialog")
.linkUrl(getModeLink("/spa/cube/index.html#/main/cube/card?modeId={modeId}&formId={formId}&type=1&layoutid={layoutid}&{ypz}=$parentid$", "uf_jcl_bs", "笔试结果-编辑模板", "ypz"))
.build());
//buttonList.add(OperateButtonPo.builder().buttonName("笔试结果登记").buttonAction("openDialog")
// .linkUrl(getModeLink("/spa/cube/index.html#/main/cube/card?modeId={modeId}&formId={formId}&type=1&layoutid={layoutid}&{ypz}=$parentid$", "uf_jcl_bs", "笔试结果-编辑模板", "ypz"))
// .build());
buttonList.add(OperateButtonPo.builder().buttonName("安排面试").buttonAction("openDialog")
.linkUrl(getModeLink("/spa/cube/index.html#/main/cube/card?type=1&modeId={modeId}&formId={formId}&{ypz}=$parentid$", "uf_jcl_ms", "", "ypz"))
.build());
buttonList.add(OperateButtonPo.builder().buttonName("背调结果登记").buttonAction("openDialog")
.linkUrl(getModeLink("/spa/cube/index.html#/main/cube/card?type=1&modeId={modeId}&formId={formId}&{ypz}=6&recordType=addBackTone", "uf_jcl_bd", "", "ypz"))
.linkUrl(getModeLink("/spa/cube/index.html#/main/cube/card?type=1&modeId={modeId}&formId={formId}&{ypz}=$parentid$&recordType=addBackTone", "uf_jcl_bd", "", "ypz"))
.build());
buttonList.add(OperateButtonPo.builder().buttonName("谈判记录登记").buttonAction("openDialog")
@ -337,7 +460,7 @@ public class InitRecruitDataServiceImpl extends Service implements InitRecruitDa
buttonList.add(OperateButtonPo.builder().buttonName("转为待入职").buttonAction("openDialog")
.linkUrl(getModeLink("/spa/cube/index.html#/main/cube/card?type=1&modeId={modeId}&formId={formId}&pcid=$parentid$", "uf_jcl_rzgl", "", ""))
.linkUrl(getModeLink("/spa/cube/index.html#/main/cube/card?type=1&modeId={modeId}&formId={formId}&pcid=$parentid$&recordType=pendingEmployment", "uf_jcl_rzgl", "", ""))
.build());
buttonList.add(OperateButtonPo.builder().buttonName("转移阶段").buttonAction("openDialog")
@ -427,7 +550,7 @@ public class InitRecruitDataServiceImpl extends Service implements InitRecruitDa
String workflowId = "";
int formId = -1;
RecordSet rs = new RecordSet();
rs.executeQuery("select id,formid from workflow_base where workflowname = ? ", workflowName);
rs.executeQuery("select id,formid from workflow_base where workflowname like '" + workflowName + "%'");
if (rs.next()) {
workflowId = rs.getString("id");
formId = rs.getInt("formid");

View File

@ -2,13 +2,14 @@ package com.engine.recruit.service.impl;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.recruit.conn.ApplicantCommonInfo;
import com.engine.recruit.constant.RecruitConstant;
import com.engine.recruit.entity.record.ApplicantRecordPo;
import com.engine.recruit.enums.ApplicationStatusEnum;
import com.engine.recruit.enums.RecordOperateEnum;
import com.engine.recruit.service.RecruitButtonService;
import weaver.common.DateUtil;
import weaver.conn.RecordSet;
import com.engine.recruit.conn.ApplicantCommonInfo;
import weaver.formmode.recruit.modeexpand.util.RecruitModeUtil;
import weaver.general.Util;
@ -57,8 +58,8 @@ public class JoinBlacklistServiceImpl extends Service implements RecruitButtonSe
recordPo.execute();
// 消息提醒当前人员简历的跟进者应聘职位的负责人/协助人
String messageType = RecruitModeUtil.getRecruitPropValue("RECRUIT_MESSAGE_TYPE");
String messageTitle = RecruitModeUtil.getRecruitPropValue("JOIN_BLACKLIST_MESSAGE_TITLE");
String messageType = RecruitConstant.RECRUIT_MESSAGE_TYPE;
String messageTitle = RecruitConstant.JOIN_BLACKLIST_MESSAGE_TITLE;
String applicantName = ApplicantCommonInfo.getApplicantName(billId);
String operatorName = RecruitModeUtil.getResourceNames(String.valueOf(user.getUID()));
String messageContent = "应聘者:【" + applicantName + "】,已被【" + operatorName + "】加入黑名单,相关投递已自动淘汰,请知悉。";

View File

@ -1,12 +1,14 @@
package com.engine.recruit.service.impl;
import cn.hutool.core.convert.Convert;
import com.engine.core.impl.Service;
import com.engine.recruit.entity.recruitflow.po.RecruitButton;
import com.engine.recruit.entity.recruitflow.po.RecruitStepPo;
import com.engine.recruit.entity.recruitflow.po.RecruitTabPo;
import com.engine.recruit.conn.RecruitDataMap;
import com.engine.recruit.conn.RecruitRecordSet;
import com.engine.recruit.entity.recruitflow.po.*;
import com.engine.recruit.exception.CustomizeRunTimeException;
import com.engine.recruit.service.RecruitFlowService;
import com.engine.recruit.util.RecruitFlowUtil;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import weaver.conn.RecordSet;
import weaver.general.Util;
@ -15,6 +17,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author:dxfeng
@ -127,4 +130,238 @@ public class RecruitFlowServiceImpl extends Service implements RecruitFlowServic
returnMap.put("currentStageId", currentStageId);
return returnMap;
}
@Override
public Map<String, Object> syncRecruitStepInfo(Map<String, Object> param) {
String stepId = Util.null2String(param.get("stepId"));
String recruitFlowId = Util.null2String(param.get("recruitFlowId"));
String checkedValue = Util.null2String(param.get("checkedValue"));
if (StringUtils.isBlank(stepId)) {
throw new CustomizeRunTimeException("未获取到所选招聘阶段,请刷新后重试");
}
if (StringUtils.isBlank(recruitFlowId)) {
throw new CustomizeRunTimeException("同步流程为空,请选择同步流程");
}
if (StringUtils.isBlank(checkedValue)) {
throw new CustomizeRunTimeException("请选择同步选项");
}
// 判断该流程是否有该阶段没有该阶段的不做操作
String flowStepId = getFlowStepId(stepId, recruitFlowId);
if (StringUtils.isBlank(flowStepId)) {
throw new CustomizeRunTimeException("所选流程不具备当前招聘阶段,同步失败");
}
switch (checkedValue) {
case "syncAdd":
syncAdd(stepId, flowStepId);
break;
case "syncOrder":
syncOrder(stepId, flowStepId);
break;
case "syncAll":
syncAll(stepId, flowStepId);
break;
case "syncTab":
syncTab(stepId, flowStepId);
break;
default:
throw new CustomizeRunTimeException("未识别的同步方式");
}
return null;
}
/**
* 同步新增操作
* 直接将缺失的操作按钮追加在原有按钮后方
*
* @param stepId
* @param flowStepId
*/
private void syncAdd(String stepId, String flowStepId) {
List<RecruitStepDt1> stepDt1List = getStepDt1List(stepId);
List<RecruitStepDt1> flowStepDt1List = getStepDt1List(flowStepId);
// 比较差异,只保留flowStepDt1List中没有的元素
List<RecruitStepDt1> result = stepDt1List.stream()
.filter(item -> !flowStepDt1List.contains(item))
.collect(Collectors.toList());
// 元素追加
Integer order = 0;
if (CollectionUtils.isNotEmpty(flowStepDt1List)) {
String zssx = flowStepDt1List.get(flowStepDt1List.size() - 1).getZssx();
if (StringUtils.isNotBlank(zssx)) {
order = Convert.toInt(zssx);
}
}
for (RecruitStepDt1 stepDt1 : result) {
order += 10;
RecruitDataMap<Object> dataMap = new RecruitDataMap<>();
dataMap.put("mainid", flowStepId);
dataMap.put("czan", stepDt1.getCzan());
dataMap.put("zdyxsmc", stepDt1.getZdyxsmc());
dataMap.put("tzymdz", stepDt1.getTzymdz());
dataMap.put("sfqy", stepDt1.getSfqy());
dataMap.put("tzymbt", stepDt1.getTzymbt());
dataMap.put("zssx", order.toString());
RecruitRecordSet.insertData(dataMap, "uf_jcl_zpjdsz_dt1");
}
}
/**
* 同步操作顺序
* 比较差异按顺序插空进入
*
* @param stepId
* @param flowStepId
*/
private void syncOrder(String stepId, String flowStepId) {
List<RecruitStepDt1> stepDt1List = getStepDt1List(stepId);
List<RecruitStepDt1> flowStepDt1List = getStepDt1List(flowStepId);
// 只保留stepDt1List中相同的元素
flowStepDt1List.retainAll(stepDt1List);
int index = 0;
for (int i = 0; i < stepDt1List.size(); i++) {
RecruitStepDt1 character = stepDt1List.get(i);
if (flowStepDt1List.contains(character)) {
RecruitStepDt1 remove = flowStepDt1List.get(index++);
stepDt1List.set(i, remove);
}
}
// 调整展示顺序
int order = 0;
for (RecruitStepDt1 stepDt1 : stepDt1List) {
RecruitDataMap<Object> dataMap = new RecruitDataMap<>();
dataMap.put("zssx", order += 10);
dataMap.put("id", stepDt1.getId());
RecruitRecordSet.updateDataById(dataMap, "uf_jcl_zpjdsz_dt1");
}
}
/**
* 同步所有操作覆盖替换
*
* @param stepId
* @param flowStepId
*/
private void syncAll(String stepId, String flowStepId) {
List<RecruitStepDt1> stepDt1List = getStepDt1List(stepId);
// 删除原有的数据
String deleteSql = "delete from uf_jcl_zpjdsz_dt1 where mainid = " + flowStepId;
RecruitRecordSet.deleteData(deleteSql);
for (RecruitStepDt1 stepDt1 : stepDt1List) {
RecruitDataMap<Object> dataMap = new RecruitDataMap<>();
dataMap.put("mainid", flowStepId);
dataMap.put("czan", stepDt1.getCzan());
dataMap.put("zdyxsmc", stepDt1.getZdyxsmc());
dataMap.put("tzymdz", stepDt1.getTzymdz());
dataMap.put("sfqy", stepDt1.getSfqy());
dataMap.put("tzymbt", stepDt1.getTzymbt());
dataMap.put("zssx", stepDt1.getZssx());
RecruitRecordSet.insertData(dataMap, "uf_jcl_zpjdsz_dt1");
}
}
/**
* 同步卡片展示tab页面
*
* @param stepId
* @param flowStepId
*/
private void syncTab(String stepId, String flowStepId) {
List<RecruitStepDt2> stepDt2List = getStepDt2List(stepId);
// 删除原有的数据
String deleteSql = "delete from uf_jcl_zpjdsz_dt2 where mainid = " + flowStepId;
RecruitRecordSet.deleteData(deleteSql);
int order = 0;
for (RecruitStepDt2 stepDt2 : stepDt2List) {
order += 10;
RecruitDataMap<Object> dataMap = new RecruitDataMap<>();
dataMap.put("mainid", flowStepId);
dataMap.put("ymbt", stepDt2.getYmbt());
dataMap.put("ymdz", stepDt2.getYmdz());
dataMap.put("zssx", Integer.toString(order));
RecruitRecordSet.insertData(dataMap, "uf_jcl_zpjdsz_dt2");
}
}
/**
* 获取流程对应的当前阶段ID
*
* @param stepId
* @param recruitFlowId
* @return
*/
private String getFlowStepId(String stepId, String recruitFlowId) {
RecordSet rs = new RecordSet();
rs.executeQuery("select id from uf_jcl_zpjdsz where zplc = ? and zpjd = ?", recruitFlowId, stepId);
if (rs.next()) {
return rs.getString("id");
}
return "";
}
/**
* 根据阶段ID获取该阶段所有的按钮配置集合
*
* @param stepId
* @return
*/
private List<RecruitStepDt1> getStepDt1List(String stepId) {
List<RecruitStepDt1> list = new ArrayList<>();
RecordSet rs = new RecordSet();
rs.executeQuery("select * from uf_jcl_zpjdsz_dt1 where mainid = ? order by zssx", stepId);
while (rs.next()) {
RecruitStepDt1 stepDt1 = RecruitStepDt1.builder()
.id(rs.getString("id"))
.mainid(rs.getString("mainid"))
.czan(rs.getString("czan"))
.zdyxsmc(rs.getString("zdyxsmc"))
.tzymdz(rs.getString("tzymdz"))
.sfqy(rs.getString("sfqy"))
.tzymbt(rs.getString("tzymbt"))
.zssx(rs.getString("zssx"))
.build();
list.add(stepDt1);
}
return list;
}
/**
* 根据阶段ID获取该阶段所有的tab页面配置集合
*
* @param stepId
* @return
*/
private List<RecruitStepDt2> getStepDt2List(String stepId) {
List<RecruitStepDt2> list = new ArrayList<>();
RecordSet rs = new RecordSet();
rs.executeQuery("select * from uf_jcl_zpjdsz_dt2 where mainid = ? order by zssx", stepId);
while (rs.next()) {
RecruitStepDt2 stepDt1 = RecruitStepDt2.builder()
.id(rs.getString("id"))
.mainid(rs.getString("mainid"))
.ymbt(rs.getString("ymbt"))
.ymdz(rs.getString("ymdz"))
.zssx(rs.getString("zssx"))
.build();
list.add(stepDt1);
}
return list;
}
}

View File

@ -0,0 +1,89 @@
package com.engine.recruit.service.impl;
import com.engine.core.impl.Service;
import com.engine.recruit.conn.RecruitRecordSet;
import com.engine.recruit.constant.RecruitConstant;
import com.engine.recruit.service.RecruitInterviewService;
import com.weaver.formmodel.data.model.Formfield;
import org.apache.commons.lang3.StringUtils;
import weaver.conn.RecordSet;
import weaver.formmode.recruit.modeexpand.util.RecruitModeUtil;
import weaver.general.Util;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author:dxfeng
* @createTime: 2023/11/28
* @version: 1.0
*/
public class RecruitInterviewServiceImpl extends Service implements RecruitInterviewService {
@Override
public Map<String, Object> updateInterviewStatus(Map<String, Object> param) {
Map<String, Object> returnMap = new HashMap<>(3);
String status = Util.null2String(param.get("status"));
String uuid = Util.null2String(param.get("uuid"));
returnMap.put("type", "error");
returnMap.put("message", "反馈失败");
if (StringUtils.isBlank(status) || StringUtils.isBlank(uuid)) {
returnMap.put("description", "反馈失败,请直接点击邮件/短信中的链接地址访问,请勿修改链接内容。");
return returnMap;
}
RecordSet rs = new RecordSet();
rs.executeQuery("select * from uf_jcl_ms where modeuuid = ? ", uuid);
Map<String, Object> mainDataMap = RecruitRecordSet.getSingleRecordMap(rs);
String sfcj = "";
if (!mainDataMap.isEmpty()) {
sfcj = Util.null2String(mainDataMap.get("sfcj"));
} else {
returnMap.put("description", "反馈失败面试信息有误请联系相应HR确认");
return returnMap;
}
if (StringUtils.isNotBlank(sfcj)) {
returnMap.put("description", "您已成功反馈面试,请勿重复反馈。");
return returnMap;
}
List<Formfield> fieldList = RecruitModeUtil.getFieldList("uf_jcl_ms");
Map<String, Formfield> fieldMap = fieldList.stream().collect(Collectors.toMap(Formfield::getFieldname, item -> item, (k1, k2) -> k1));
// 参加
if ("0".equals(status)) {
returnMap.put("type", "success");
returnMap.put("message", "已确认参加面试");
returnMap.put("description", "您已接受面试感谢您的应聘请按期准备面试如有问题可以联系相应HR");
rs.executeUpdate("update uf_jcl_ms set sfcj = ? , zt = 0 where modeuuid = ? ", 0, uuid);
String msgContent = "应聘者:$ypz$,确认参加面试,请知悉。<br/>" +
"面试时间:$msrq$;面试官:$msg$";
msgContent = RecruitModeUtil.getMsgReplaceStr(msgContent, fieldMap, mainDataMap);
Set<String> userIdSet = new HashSet<>();
userIdSet.add(Util.null2String(mainDataMap.get("modedatacreater")));
RecruitModeUtil.messagePush(RecruitConstant.INTERVIEW_MESSAGE_TYPE, "面试反馈通知", msgContent, userIdSet, 1);
} else if ("1".equals(status)) {
returnMap.put("type", "info");
returnMap.put("message", "已取消参加面试");
returnMap.put("description", "您已取消参加面试,感谢您的应聘。希望您能够找到真正适合自己的工作。");
rs.executeUpdate("update uf_jcl_ms set sfcj = ? , qxyy = 2 , zt = 4 where modeuuid = ? ", 1, uuid);
String msgContent = "应聘者:$ypz$,反馈不参加面试,面试已取消,请知悉。<br/>" +
"面试时间:$msrq$;面试官:$msg$";
msgContent = RecruitModeUtil.getMsgReplaceStr(msgContent, fieldMap, mainDataMap);
String msg = Util.null2String(mainDataMap.get("msg"));
Set<String> userIdSet = new HashSet<>();
userIdSet.add(Util.null2String(mainDataMap.get("modedatacreater")));
userIdSet.addAll(Arrays.asList(msg.split(",")));
RecruitModeUtil.messagePush(RecruitConstant.INTERVIEW_MESSAGE_TYPE, "面试反馈通知", msgContent, userIdSet, 1);
}
return returnMap;
}
}

View File

@ -0,0 +1,501 @@
package com.engine.recruit.service.impl;
import cn.hutool.core.convert.Convert;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.engine.core.impl.Service;
import com.engine.recruit.conn.*;
import com.engine.recruit.constant.RecruitConstant;
import com.engine.recruit.enums.ApplicationStatusEnum;
import com.engine.recruit.exception.CustomizeRunTimeException;
import com.engine.recruit.service.ResumeRecognitionService;
import com.weaver.formmodel.data.model.Formfield;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import weaver.conn.RecordSet;
import weaver.file.ImageFileManager;
import weaver.formmode.recruit.modeexpand.util.RecruitModeUtil;
import weaver.general.BaseBean;
import weaver.general.Util;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author:dxfeng
* @createTime: 2023/12/12
* @version: 1.0
*/
public class ResumeRecognitionServiceImpl extends Service implements ResumeRecognitionService {
@Override
public Map<String, Object> resumeUpload(Map<String, Object> param) {
Map<String, Object> returnMap = new HashMap<>(16);
String resumeId = Util.null2String(param.get("resumeId"));
int imageField = ApplicantCommonInfo.getImageFieldByDocId(resumeId);
if (-1 == imageField) {
throw new CustomizeRunTimeException("原始简历文件获取失败,请重新上传原始简历");
}
qllResumeUpload(imageField, returnMap, true);
returnMap.put("isOcr", true);
return returnMap;
}
@Override
public Map<String, Object> importResume(Map<String, Object> param) {
Map<String, Object> returnMap = new HashMap<>();
String resumeId = Util.null2String(param.get("resumeId"));
Map<String, Object> uploadDataMap = new HashMap<>();
qllResumeUpload(Convert.toInt(resumeId), uploadDataMap, false);
Map<String, Object> resumeData = (Map<String, Object>) uploadDataMap.get("data");
// 添加原始附件字段信息
int secCategory = Convert.toInt(RecruitConstant.APPLICANTS_RESUMES_CATEGORY);
try {
int docId = RecruitModeUtil.createDocId(secCategory, Convert.toInt(resumeId), user);
resumeData.put("ysjl", docId);
} catch (Exception e) {
throw new RuntimeException(e);
}
List<RecruitDataMap<Object>> studyList = (List<RecruitDataMap<Object>>) resumeData.remove("jyjl");
List<RecruitDataMap<Object>> workList = (List<RecruitDataMap<Object>>) resumeData.remove("gzjl");
// 状态
resumeData.put("zt", ApplicationStatusEnum.DISTRIBUTION.getValue());
List<Formfield> fieldList = RecruitModeUtil.getFieldList("uf_jcl_yppc");
Set<String> keySet = fieldList.stream().map(Formfield::getFieldname).collect(Collectors.toSet());
// 移除不在 keySet 中的键值对
resumeData.entrySet().removeIf(entry -> !keySet.contains(entry.getKey()));
// 判断简历信息
CheckRepeatResume instance = CheckRepeatResume.getInstance();
Map<String, Object> map = instance.insertResumeAndReturn(resumeData);
String mainId = Util.null2String(map.get("mainId"));
String sourceId = Util.null2String(map.get("sourceId"));
returnMap.put("mainId", mainId);
returnMap.put("sourceId", sourceId);
returnMap.put("id", StringUtils.isNotBlank(sourceId) ? sourceId : mainId);
instance.insertResumeDetailTable(studyList, "uf_jcl_yppc_dt1", mainId, sourceId);
instance.insertResumeDetailTable(workList, "uf_jcl_yppc_dt2", mainId, sourceId);
return returnMap;
}
@Override
public Map<String, Object> fetchResume(Map<String, Object> param) {
String id = Util.null2String(param.get("id"));
String sql = "select * from uf_jcl_yppc where id = ? ";
RecordSet rs = new RecordSet();
rs.executeQuery(sql, id);
Map<String, Object> dataMap = RecruitRecordSet.getSingleRecordMap(rs);
List<Formfield> fieldList = RecruitModeUtil.getFieldList("uf_jcl_yppc");
Map<String, Formfield> fieldMap = fieldList.stream().collect(Collectors.toMap(Formfield::getFieldname, item -> item, (k1, k2) -> k1));
for (String key : dataMap.keySet()) {
Object value = dataMap.get(key);
if (StringUtils.isBlank(Convert.toStr(value))) {
continue;
}
// 计算新的value值
Formfield formfield = fieldMap.get(key);
value = RecruitModeUtil.getFieldShowName(formfield, Convert.toStr(value)).replaceAll("<[^>]*>", "");
// 更新value值
dataMap.put(key, value);
}
return dataMap;
}
/**
* @param resumeId 简历ID
* @param returnMap 响应集合
*/
private void qllResumeUpload(int resumeId, Map<String, Object> returnMap, boolean isCard) {
String response = doQllPost(resumeId);
if (StringUtils.isBlank(response)) {
throw new CustomizeRunTimeException("千里聆接口调用失败,响应结果为空");
}
JSONObject all = JSONObject.parseObject(response);
if (!all.getBoolean("isSuccess")) {
throw new CustomizeRunTimeException("千里聆接口调用失败,接口不通");
}
JSONObject resultall = all.getJSONObject("data");
String status = resultall.getString("state");
if ("fail".equals(status)) {
throw new CustomizeRunTimeException("调用千里聆接口失败,失败原因:" + resultall.getString("info"));
}
JSONObject result = resultall.getJSONObject("result");
Map<String, Object> dataMap = parseQllJsonToMap(result, isCard);
returnMap.put("data", dataMap);
}
/**
* 千里聆解析字段内容处理
*
* @param obj
* @return
*/
private Map<String, Object> parseQllJsonToMap(JSONObject obj, boolean isCard) {
Map<String, Object> dataMap = new HashMap<>(16);
// 姓名
String xm = parseArray(obj.getJSONArray("姓名"));
dataMap.put("xm", xm);
// 电子邮箱
String dzyx = parseArray(obj.getJSONArray("电子邮箱"));
dataMap.put("dzyx", dzyx);
// 手机号码
String sjhm = parseArray(obj.getJSONArray("手机号"));
dataMap.put("sjhm", sjhm);
// 年龄
String nl = parseArray(obj.getJSONArray("年龄"));
dataMap.put("nl", nl);
// 出生日期
String csrq = parseArray(obj.getJSONArray("出生日期"));
dataMap.put("csrq", parseDateObject(csrq));
// 民族
// 性别 默认为男
String xb = "".equals(parseArray(obj.getJSONArray("性别"))) ? "1" : "0";
dataMap.put("xb", xb);
// 体重KG
// 身高CM
// 籍贯
dataMap.put("jg", parseArray(obj.getJSONArray("籍贯")));
// 婚姻状况
// 当前所在地
dataMap.put("jzd", parseArray(obj.getJSONArray("现居住地")));
// 政治面貌
// 在职状态
// 工作经验
dataMap.put("gzjy", parseArray(obj.getJSONArray("工作经验")));
// 最高学位
List<Map<String, String>> zgxw = getBrowserArray(parseArray(obj.getJSONArray("最高学位")), this::getDegreeArray);
dataMap.put("zgxw", zgxw);
if (!isCard && CollectionUtils.isNotEmpty(zgxw)) {
dataMap.put("zgxw", zgxw.stream().map(item -> item.get("id")).collect(Collectors.joining(",")));
}
// 最高学历
List<Map<String, String>> zgxl = getBrowserArray(parseArray(obj.getJSONArray("最高学历")), this::getEducationLevelArray);
dataMap.put("zgxl", zgxl);
if (!isCard && CollectionUtils.isNotEmpty(zgxl)) {
dataMap.put("zgxl", zgxl.stream().map(item -> item.get("id")).collect(Collectors.joining(",")));
}
// 专业
String zy = parseArray(obj.getJSONArray("专业"));
dataMap.put("zy", zy);
// 毕业院校
String byyx = parseArray(obj.getJSONArray("毕业院校"));
dataMap.put("byyx", byyx);
// 期望税前月薪K
String qwxz = parseArray(obj.getJSONArray("期望薪资"));
dataMap.put("qwxz", qwxz);
// 现税前月薪K
// 自我评价
String zwpj = parseArray(obj.getJSONArray("个人评价"));
dataMap.put("zwpj", zwpj);
// 民族
dataMap.put("mz", parseArray(obj.getJSONArray("民族")));
// 明细表数据
// 教育经历
JSONArray jyjl = obj.getJSONArray("学业信息");
List<RecruitDataMap<Object>> studyList = new ArrayList<>();
if (null != jyjl && jyjl.size() > 0) {
for (int i = 0; i < jyjl.size(); i++) {
JSONObject o = (JSONObject) jyjl.get(i);
String studyDate = o.getString("就读时期");
RecruitDataMap<Object> studyMap = new RecruitDataMap<>();
studyMap.putAll(getDateRange(studyDate, true));
studyMap.put("xxmc", o.getString("院校"));
List<Map<String, String>> xl = getBrowserArray(o.getString("学历"), this::getEducationLevelArray);
studyMap.put("xl", xl);
if (!isCard && CollectionUtils.isNotEmpty(xl)) {
studyMap.put("xl", xl.stream().map(item -> item.get("id")).collect(Collectors.joining(",")));
}
studyMap.put("zy", o.getString("专业"));
studyList.add(studyMap);
}
}
dataMap.put("jyjl", studyList);
// 工作经历
JSONArray gzjl = obj.getJSONArray("工作信息");
List<RecruitDataMap<Object>> workList = new ArrayList<>();
if (null != gzjl && gzjl.size() > 0) {
for (int i = 0; i < gzjl.size(); i++) {
JSONObject o = (JSONObject) gzjl.get(i);
String workDate = o.getString("工作时间");
RecruitDataMap<Object> workMap = new RecruitDataMap<>();
workMap.putAll(getDateRange(workDate, false));
workMap.put("gsmc", o.getString("工作单位"));
workMap.put("gw", o.getString("工作岗位"));
workMap.put("gzzz", o.getString("工作内容"));
workList.add(workMap);
}
}
dataMap.put("gzjl", workList);
// 项目经验
// 语言能力
// 目前表单暂无字段
//dataMap.put("wx", parseArray(obj.getJSONArray("微信")));
//dataMap.put("qq", parseArray(obj.getJSONArray("QQ")));
//dataMap.put("ah", parseArray(obj.getJSONArray("爱好")));
//dataMap.put("bysj", parseArray(obj.getJSONArray("毕业时间")));
//
//
//dataMap.put("zyjn", parseArray(obj.getJSONArray("专业技能")));
//dataMap.put("sxjl", parseArray(obj.getJSONArray("实习经历")));
//dataMap.put("yysp", parseArray(obj.getJSONArray("英语水平")));
//dataMap.put("jnzs", parseArray(obj.getJSONArray("技能证书")));
//dataMap.put("xyjl", parseArray(obj.getJSONArray("校园经历")));
//dataMap.put("qwcsgw", parseArray(obj.getJSONArray("期望从事岗位")));
//
//dataMap.put("qwgzdd", parseArray(obj.getJSONArray("期望工作地点")));
//dataMap.put("xmjl", parseArray(obj.getJSONArray("项目经历")));
return dataMap;
}
/**
* @param resumeId
* @return
*/
private String doQllPost(int resumeId) {
String url = RecruitConstant.OCR_URL;
String appId = RecruitConstant.APP_ID;
String appSecret = RecruitConstant.APP_SECRET;
if (StringUtils.isAnyBlank(url, appId, appSecret)) {
throw new CustomizeRunTimeException("千里聆配置出错,请检查配置文件");
}
long currentTime = System.currentTimeMillis();
ImageFileManager manager = new ImageFileManager();
manager.getImageFileInfoById(resumeId);
HttpPost postRequest = new HttpPost(url);
postRequest.addHeader("sign", getSign(appId, appSecret, currentTime));
postRequest.addHeader("appId", appId);
postRequest.addHeader("timestamp", String.valueOf(currentTime));
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
String fileName = manager.getImageFileName();
builder.addTextBody("type", fileName.substring(fileName.lastIndexOf('.') + 1));
builder.addBinaryBody("resume", manager.getInputStream(), ContentType.APPLICATION_OCTET_STREAM, manager.getImageFileName());
HttpEntity entity = builder.build();
postRequest.setEntity(entity);
try {
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = httpClient.execute(postRequest);
HttpEntity responseEntity = response.getEntity();
return EntityUtils.toString(responseEntity);
} catch (Exception e) {
throw new CustomizeRunTimeException(e);
}
}
/**
* 千里聆签名
*
* @param appId 开发者AppId
* @param appSecret 开发者appSecret
* @param timestamp 当前时间戳(毫秒数)
* @return
*/
private static String getSign(String appId, String appSecret, long timestamp) {
if (appId != null && appId.length() != 0) {
if (appSecret != null && appSecret.length() != 0) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(appId.getBytes());
md5.update((timestamp + "").getBytes());
md5.update(appSecret.getBytes());
byte[] bytes = md5.digest();
return (new BigInteger(1, bytes)).toString(16);
} catch (NoSuchAlgorithmException var8) {
throw new CustomizeRunTimeException("不支持的加密算法", var8);
}
} else {
throw new CustomizeRunTimeException("appSecret不能为空");
}
} else {
throw new CustomizeRunTimeException("appId不能为空");
}
}
/**
* 文本转换
*
* @param ar
* @return
*/
private String parseArray(JSONArray ar) {
StringBuilder rs = new StringBuilder();
if (ar != null && ar.size() > 0) {
for (int i = 0; i < ar.size(); ++i) {
if (i == ar.size() - 1) {
rs.append(ar.get(i));
} else {
rs.append(ar.get(i)).append(",");
}
}
}
return StringUtils.isBlank(rs) ? null : rs.toString();
}
/**
* 转换日期对象
*
* @param value
* @return
*/
private String parseDateObject(String value) {
if (StringUtils.isBlank(value)) {
return null;
}
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.setLenient(false);
try {
sdf.parse(value);
} catch (Exception e) {
new BaseBean().writeLog("日期格式化失败", e);
value = null;
}
return value;
}
/**
* 获取开始时间和结束时间
*
* @param date
* @return
*/
private RecruitDataMap<Object> getDateRange(String date, boolean isStudy) {
RecruitDataMap<Object> dataRangeMap = new RecruitDataMap<>();
String[] split = date.split("-");
if (split.length == 2) {
String start = getFormatDate(split[0]);
String end = getFormatDate(split[1]);
if (start.length() == 4) {
if (isStudy) {
start += "-09-01";
} else {
start = "";
}
}
if (end.length() == 4) {
if (isStudy) {
end += "-07-01";
} else {
end = "";
}
}
dataRangeMap.put("kssj", start);
dataRangeMap.put("jssj", end);
}
return dataRangeMap;
}
/**
* 获取yyyy-MM-dd时间格式日期
*
* @param dateStr
* @return
*/
private String getFormatDate(String dateStr) {
dateStr = dateStr.replace(".", "-").replace("\\/", "-");
if (dateStr.length() == 7) {
return dateStr + "-01";
} else if (dateStr.length() == 10) {
return dateStr;
} else if (dateStr.length() == 4) {
return dateStr;
}
return "";
}
/**
* 构建学位字段信息
*
* @param text
* @return
*/
private Map<String, String> getDegreeArray(String text) {
Map<String, String> map = new HashMap<>(2);
if (StringUtils.isNotBlank(text)) {
String id = ModeBrowserCommonInfo.getDegreeId(text);
if (StringUtils.isNotBlank(id)) {
map.put("id", id);
map.put("name", text);
}
}
return map;
}
/**
* 构建浏览按钮字段信息格式
*
* @param text
* @param fun
* @return
*/
private List<Map<String, String>> getBrowserArray(String text, Function<String, Map<String, String>> fun) {
List<Map<String, String>> list = new ArrayList<>();
if (StringUtils.isNotBlank(text)) {
String[] split = text.split(",");
for (String s : split) {
Map<String, String> apply = fun.apply(s);
list.add(apply);
}
}
return list;
}
/**
* 构建学历字段信息
*
* @param text
* @return
*/
private Map<String, String> getEducationLevelArray(String text) {
Map<String, String> map = new HashMap<>(2);
if (StringUtils.isNotBlank(text)) {
String id = ModeBrowserCommonInfo.getEducationLevelId(text);
if (StringUtils.isNotBlank(id)) {
map.put("id", id);
map.put("name", text);
}
}
return map;
}
}

View File

@ -0,0 +1,62 @@
package com.engine.recruit.service.impl;
import com.engine.core.impl.Service;
import com.engine.integration.cmd.schedule.ImmediatelyRunCmd;
import com.engine.recruit.exception.CustomizeRunTimeException;
import com.engine.recruit.service.ResumeRemindService;
import org.apache.commons.lang3.StringUtils;
import weaver.general.Util;
import weaver.interfaces.recruit.cronjob.ResumePushJob;
import weaver.systeminfo.SystemEnv;
import java.util.HashMap;
import java.util.Map;
/**
* @author:dxfeng
* @createTime: 2024/03/13
* @version: 1.0
*/
public class ResumeRemindServiceImpl extends Service implements ResumeRemindService {
@Override
public Map<String, Object> doRemindJob(Map<String, Object> param) {
String pointId = "ResumePushJob";
HashMap<String, Boolean> locks = ImmediatelyRunCmd.locks;
boolean checkLock = true;
if (locks.containsKey(pointId)) {
checkLock = locks.get(pointId);
} else {
locks.put(pointId, checkLock);
}
String dateStr = Util.null2String(param.get("dateStr"));
if (StringUtils.isNotBlank(dateStr)) {
String[] split = dateStr.split(",");
if (split.length == 2) {
String startDate = split[0];
String endDate = split[1];
if (StringUtils.isNoneBlank(startDate, endDate)) {
if (checkLock) {
checkLock = false;
locks.put(pointId, checkLock);
try {
new ResumePushJob(startDate, endDate).execute();
} catch (Exception e) {
throw new CustomizeRunTimeException("ResumePushJob计划任务执行失败", e);
} finally {
checkLock = true;
locks.put(pointId, checkLock);
}
return null;
} else {
locks.put(pointId, false);
throw new CustomizeRunTimeException(SystemEnv.getHtmlLabelName(532655, Util.getIntValue(user.getLanguage())));
}
}
}
} else {
throw new CustomizeRunTimeException("请选择简历投递开始日期、结束日期");
}
throw new CustomizeRunTimeException("简历推送异常");
}
}

View File

@ -2,6 +2,7 @@ package com.engine.recruit.service.impl;
import com.engine.core.impl.Service;
import com.engine.recruit.conn.RecruitRecordSet;
import com.engine.recruit.exception.CustomizeRunTimeException;
import com.engine.recruit.service.RpaJclService;
import com.weaver.rpa.sdk.clients.application.resume.ERPAResumeSDKClient;
import com.weaver.rpa.sdk.clients.application.resume.entity.ResumeEmailSetting;
@ -19,38 +20,42 @@ import java.util.Map;
public class RpaJclServiceImpl extends Service implements RpaJclService {
@Override
public Map<String, Object> setEmailSetting(Map<String, Object> param) {
String billId = Util.null2String(param.get("billId"));
RecordSet rs = new RecordSet();
rs.executeQuery("select * from uf_jcl_qllyxpz where id = ? ", billId);
Map<String, Object> dataMap = RecruitRecordSet.getSingleRecordMap(rs);
try {
String billId = Util.null2String(param.get("billId"));
RecordSet rs = new RecordSet();
rs.executeQuery("select * from uf_jcl_qllyxpz where id = ? ", billId);
Map<String, Object> dataMap = RecruitRecordSet.getSingleRecordMap(rs);
ERPAResumeSDKClient resumeSDKClient = ERPASDKClients.getResumeSDKClient();
String userId = Util.null2String(dataMap.get("szr"));
String status = Util.null2String(dataMap.get("zt"));
String server = Util.null2String(dataMap.get("yjjsfwq"));
String port = Util.null2String(dataMap.get("jsdk"));
String protocol = Util.null2String(dataMap.get("csxy"));
String site = Util.null2String(dataMap.get("yxdz"));
String login = Util.null2String(dataMap.get("yxzh"));
String password = Util.null2String(dataMap.get("yxsqmmm"));
ERPAResumeSDKClient resumeSDKClient = ERPASDKClients.getResumeSDKClient();
String userId = Util.null2String(dataMap.get("szr"));
String status = Util.null2String(dataMap.get("zt"));
String server = Util.null2String(dataMap.get("yjjsfwq"));
String port = Util.null2String(dataMap.get("jsdk"));
String protocol = Util.null2String(dataMap.get("csxy"));
String site = Util.null2String(dataMap.get("yxdz"));
String login = Util.null2String(dataMap.get("yxzh"));
String password = Util.null2String(dataMap.get("yxsqmmm"));
ResumeEmailSetting emailSetting = new ResumeEmailSetting();
ResumeEmailSetting emailSetting = new ResumeEmailSetting();
// 配置启用邮箱功能
emailSetting.setSEMAILSTATUS(status);
emailSetting.setSEMAILSERVER(server);
emailSetting.setSEMAILPORT(port);
emailSetting.setSEMAILPROTOCOL(protocol);
//emailSetting.setSISSEND(isSend);
emailSetting.setSEMAILSITE(site);
emailSetting.setSEMAILLOGIN(login);
emailSetting.setSEMAILPASSWORD(password);
// 配置启用邮箱功能
emailSetting.setSEMAILSTATUS(status);
emailSetting.setSEMAILSERVER(server);
emailSetting.setSEMAILPORT(port);
emailSetting.setSEMAILPROTOCOL(protocol);
//emailSetting.setSISSEND(isSend);
emailSetting.setSEMAILSITE(site);
emailSetting.setSEMAILLOGIN(login);
emailSetting.setSEMAILPASSWORD(password);
// 禁用邮箱功能(只需要传递Status为0)
// emailSetting.setSEMAILSTATUS("0");
// 禁用邮箱功能(只需要传递Status为0)
// emailSetting.setSEMAILSTATUS("0");
// 调用方法更新简历机器人采集设置在千里聆中会更新目标用户机器人配置
resumeSDKClient.setEmailSetting(userId, emailSetting);
// 调用方法更新简历机器人采集设置在千里聆中会更新目标用户机器人配置
resumeSDKClient.setEmailSetting(userId, emailSetting);
} catch (Exception e) {
throw new CustomizeRunTimeException(e);
}
return null;
}
}

View File

@ -25,7 +25,7 @@ public class TalentPoolServiceImpl extends Service implements TalentPoolService
public Map<String, Object> removeBlacklist(Map<String, Object> param) {
String ids = Util.null2String(param.get("ids"));
if (StringUtils.isBlank(ids)) {
throw new CustomizeRunTimeException("");
throw new CustomizeRunTimeException("请至少选择一条数据");
}
RecordSet rs = new RecordSet();
rs.executeUpdate("update uf_jcl_rck set sfjrhmd = 1 where id in (" + ids + ")");
@ -56,11 +56,7 @@ public class TalentPoolServiceImpl extends Service implements TalentPoolService
String uuid = UUID.randomUUID().toString();
insertDataMap.put("modeuuid", uuid);
int formModeId = -1;
rs.executeQuery("select id from modeinfo where formid =( select id from workflow_bill where tablename = 'uf_jcl_yppc' )");
if (rs.next()) {
formModeId = rs.getInt("id");
}
int formModeId = ApplicantCommonInfo.getModeIdByTableName("uf_jcl_yppc");
insertDataMap.put("formmodeid", formModeId);
RecruitRecordSet.buildModeInsertFields(insertDataMap, user.getUID());
RecruitRecordSet.insertData(insertDataMap, "uf_jcl_yppc");

View File

@ -0,0 +1,182 @@
package com.engine.recruit.service.impl;
import cn.hutool.core.convert.Convert;
import com.engine.core.impl.Service;
import com.engine.recruit.conn.ApplicantCommonInfo;
import com.engine.recruit.entity.common.ImportLog;
import com.engine.recruit.exception.CustomizeRunTimeException;
import com.engine.recruit.service.WrittenResultsService;
import com.engine.recruit.util.ExcelUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import weaver.conn.RecordSet;
import weaver.file.ImageFileManager;
import java.io.IOException;
import java.util.*;
/**
* @author:dxfeng
* @createTime: 2024/01/24
* @version: 1.0
*/
public class WrittenResultsServiceImpl extends Service implements WrittenResultsService {
@Override
public Map<String, Object> getFormCondition() {
return null;
}
@Override
public Map<String, Object> importExcel(Map<String, Object> params) {
Integer excelId = Convert.toInt(params.get("excel"));
ImageFileManager manager = new ImageFileManager();
manager.getImageFileInfoById(excelId);
XSSFWorkbook workbook;
try {
workbook = new XSSFWorkbook(manager.getInputStream());
} catch (IOException e) {
throw new CustomizeRunTimeException(e);
}
// 当前sheet
XSSFSheet sheetAt = workbook.getSheetAt(0);
// 最后一行
int lastRowNum = sheetAt.getLastRowNum();
if (lastRowNum < 1) {
throw new CustomizeRunTimeException("导入数据为空");
}
// 最后一列
short lastCellNum = sheetAt.getRow(0).getLastCellNum();
Map<String, Integer> keyMap = new HashMap<>(16);
// 标题行
for (int cellIndex = 0; cellIndex < lastCellNum; cellIndex++) {
XSSFRow row = sheetAt.getRow(0);
if (row == null) {
throw new CustomizeRunTimeException("表单字段名称获取失败请检查Excel文件");
}
XSSFCell cell = row.getCell((short) cellIndex);
String cellValue = ExcelUtil.getCellValue(cell).trim();
keyMap.put(cellValue, cellIndex);
}
// 校验必填列
checkRequiredFields(keyMap, "ID", "笔试成绩", "笔试结果");
Integer idCellNum = keyMap.get("ID");
Integer scoreCellNum = keyMap.get("笔试成绩");
Integer resultCellNum = keyMap.get("笔试结果");
return updateWrittenResult(sheetAt, lastRowNum, idCellNum, scoreCellNum, resultCellNum);
}
/**
* 更新笔试结果
*
* @param sheetAt
* @param lastRowNum
* @param idCellNum
* @param scoreCellNum
* @param resultCellNum
* @return
*/
private Map<String, Object> updateWrittenResult(XSSFSheet sheetAt, int lastRowNum, Integer idCellNum, Integer scoreCellNum, Integer resultCellNum) {
Map<String, Object> resultMap = new HashMap<>(4);
Integer allCount = 0;
Integer successCount = 0;
Integer failCount = 0;
List<ImportLog> logList = new ArrayList<>();
RecordSet rs = new RecordSet();
for (int rowIndex = 1; rowIndex <= lastRowNum; rowIndex++) {
allCount++;
XSSFRow row = sheetAt.getRow(rowIndex);
if (null == row) {
continue;
}
List<String> descriptionList = new ArrayList<>();
boolean success = true;
XSSFCell idCell = row.getCell(idCellNum);
String ideCellValue = ExcelUtil.getCellValue(idCell).trim();
if (StringUtils.isBlank(ideCellValue)) {
descriptionList.add("[ID]为空");
success = false;
}
XSSFCell scoreCell = row.getCell(scoreCellNum);
String scoreCellValue = ExcelUtil.getCellValue(scoreCell).trim();
if (StringUtils.isBlank(scoreCellValue)) {
descriptionList.add("[笔试成绩]为空");
success = false;
}
XSSFCell resultCell = row.getCell(resultCellNum);
String resultCellValue = ExcelUtil.getCellValue(resultCell).trim();
if (StringUtils.isBlank(resultCellValue)) {
descriptionList.add("[笔试结果]为空");
success = false;
}
if (StringUtils.isNotBlank(resultCellValue)) {
resultCellValue = convertResultValue(resultCellValue);
if (StringUtils.isBlank(resultCellValue)) {
descriptionList.add("[笔试结果]转换失败");
success = false;
}
}
// 更新笔试成绩
if (success) {
rs.executeUpdate("update uf_jcl_bs set bscj = ? ,bsjg = ? where id = ? ", scoreCellValue, resultCellValue, ideCellValue);
String exceptionMsg = rs.getExceptionMsg();
if (StringUtils.isNotBlank(exceptionMsg)) {
descriptionList.add(exceptionMsg);
success = false;
}
}
if (success) {
successCount++;
} else {
failCount++;
}
ImportLog importLog = ImportLog.builder().
rowIndex(rowIndex + 1) // 对应Excel的行从1开始累加
.description(success ? "导入成功" : StringUtils.join(descriptionList, ","))
.status(String.valueOf(success))
.build();
logList.add(importLog);
}
resultMap.put("log", logList);
resultMap.put("allCount", allCount);
resultMap.put("successCount", successCount);
resultMap.put("failCount", failCount);
return resultMap;
}
/**
* 标题行校验必填列
*
* @param keyMap 字段集合
* @param requiredFields 必填字段
*/
private void checkRequiredFields(Map<String, Integer> keyMap, String... requiredFields) {
// 校验必填列
Set<String> keySet = keyMap.keySet();
for (String field : requiredFields) {
if (!keySet.contains(field)) {
throw new CustomizeRunTimeException("未获取到必填列[" + field + "]");
}
}
}
/**
* 转化笔试结果的值
*
* @param resultCellValue
* @return
*/
private String convertResultValue(String resultCellValue) {
int formId = ApplicantCommonInfo.getFormIdByTableName("uf_jcl_bs");
return ApplicantCommonInfo.getSelectValue(String.valueOf(formId), "bsjg", resultCellValue);
}
}

View File

@ -1,9 +1,12 @@
package com.engine.recruit.thread;
import cn.hutool.core.convert.Convert;
import com.alibaba.fastjson.JSON;
import com.engine.recruit.conn.ApplicantCommonInfo;
import com.engine.recruit.conn.CheckRepeatResume;
import com.engine.recruit.conn.PositionCommonInfo;
import com.engine.recruit.conn.RecruitDataMap;
import com.engine.recruit.constant.RecruitConstant;
import com.engine.recruit.enums.ApplicationStatusEnum;
import com.engine.recruit.enums.CommonBrowserTypeEnum;
import com.engine.recruit.enums.HighestDegreeEnum;
@ -16,6 +19,8 @@ import weaver.common.DateUtil;
import weaver.conn.RecordSet;
import weaver.erpa.apps.entity.application.resume.dto.*;
import weaver.formmode.recruit.modeexpand.util.RecruitModeUtil;
import weaver.general.BaseBean;
import weaver.general.Util;
import weaver.hrm.User;
import java.util.ArrayList;
@ -31,7 +36,7 @@ import java.util.Map;
public class SdkResumeSavedThread extends LocalRunnable {
private ResumeMqMessage resumeMqMessage;
private static final int SEC_CATEGORY = Convert.toInt(RecruitModeUtil.getRecruitPropValue("APPLICANTS_RESUMES_CATEGORY"));
private static final int SEC_CATEGORY = Convert.toInt(RecruitConstant.APPLICANTS_RESUMES_CATEGORY);
public SdkResumeSavedThread(ResumeMqMessage resumeMqMessage) {
this.resumeMqMessage = resumeMqMessage;
@ -49,6 +54,9 @@ public class SdkResumeSavedThread extends LocalRunnable {
* @throws Exception
*/
private void parseResume(ResumeMqMessage resumeMqMessage) throws Exception {
BaseBean baseBean = new BaseBean();
baseBean.writeLog("千里聆SDK简历开始解析------");
baseBean.writeLog("resumeMqMessage===" + JSON.toJSONString(resumeMqMessage));
String userId = resumeMqMessage.getUserId();
User user = new User();
if (StringUtils.isNotBlank(userId)) {
@ -83,60 +91,77 @@ public class SdkResumeSavedThread extends LocalRunnable {
params.put("qlljl", resumeId);
// 判断是否有发布职位信息如有发布职位信息完善招聘流程信息并指定为待分配状态
String positionId = PositionCommonInfo.getPositionIdByQll(resumeInfoDto.getJobId());
String zt = ApplicationStatusEnum.DISTRIBUTION.getValue();
// 应聘职位
if (StringUtils.isNotBlank(positionId)) {
params.put("ypzw", "positionId");
params.put("zplc", PositionCommonInfo.getRecruitFlowId(positionId));
params.put("zt", ApplicationStatusEnum.CANDIDATE.getValue());
} else {
// 状态指定待分配
params.put("zt", ApplicationStatusEnum.DISTRIBUTION.getValue());
String flowId = PositionCommonInfo.getRecruitFlowId(positionId);
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)) {
params.put("ypzw", positionId);
params.put("zplc", flowId);
params.put("zpjd", zpjd);
params.put("dqypjd", dqypjd);
zt = ApplicationStatusEnum.CANDIDATE.getValue();
}
}
}
// 应聘状态
params.put("zt", zt);
// 判断简历是否重复,插入主表
int mainId = CheckRepeatResume.getInstance().insertResumeMainTable(params);
CheckRepeatResume instance = CheckRepeatResume.getInstance();
Map<String, Object> checkMap = instance.insertResumeAndReturn(params);
String mainId = Util.null2String(checkMap.get("mainId"));
String sourceId = Util.null2String(checkMap.get("sourceId"));
Thread.sleep(1000);
if (-1 == mainId) {
if ("-1".equals(mainId)) {
return;
}
RecordSet rs = new RecordSet();
// 插入明细表数据
List<RecruitDataMap<Object>> jyjl = new ArrayList<>();
List<ResumeInfoEducationExperienceDto> educationExperience = resumeInfoDto.getEducationExperience();
String sql = "insert into uf_jcl_yppc_dt1 (mainId,xxmc,xl,zy,kssj,jssj) values (?,?,?,?,?,?) ";
for (ResumeInfoEducationExperienceDto educationExperienceDto : educationExperience) {
List<Object> data = new ArrayList<>();
data.add(mainId);
data.add(educationExperienceDto.getSchoolName());
data.add(HighestDegreeEnum.getDegreeId(educationExperienceDto.getDegree()).getId());
data.add(educationExperienceDto.getMajor());
data.add(DateUtil.getDate(educationExperienceDto.getBeginTime()));
data.add(DateUtil.getDate(educationExperienceDto.getEndTime()));
rs.executeUpdate(sql, data);
RecruitDataMap<Object> map = new RecruitDataMap<>();
map.put("xxmc", educationExperienceDto.getSchoolName());
map.put("xl", HighestDegreeEnum.getDegreeId(educationExperienceDto.getDegree()).getId());
map.put("zy", educationExperienceDto.getMajor());
map.put("kssj", DateUtil.getDate(educationExperienceDto.getBeginTime()));
map.put("jssj", DateUtil.getDate(educationExperienceDto.getEndTime()));
jyjl.add(map);
}
sql = "insert into uf_jcl_yppc_dt2 (mainId,gsmc,gw,gzzz,kssj,jssj) values (?,?,?,?,?,?) ";
instance.insertResumeDetailTable(jyjl, "uf_jcl_yppc_dt1", mainId, sourceId);
List<RecruitDataMap<Object>> gzjl = new ArrayList<>();
List<ResumeInfoWorkExperienceDto> workExperience = resumeInfoDto.getWorkExperience();
for (ResumeInfoWorkExperienceDto workExperienceDto : workExperience) {
List<Object> data = new ArrayList<>();
data.add(mainId);
data.add(workExperienceDto.getCompanyName());
data.add(workExperienceDto.getJobName());
data.add(workExperienceDto.getContent());
data.add(DateUtil.getDate(workExperienceDto.getBeginTime()));
data.add(DateUtil.getDate(workExperienceDto.getEndTime()));
rs.executeUpdate(sql, data);
RecruitDataMap<Object> map = new RecruitDataMap<>();
map.put("gsmc", workExperienceDto.getCompanyName());
map.put("gw", workExperienceDto.getJobName());
map.put("gzzz", workExperienceDto.getContent());
map.put("kssj", DateUtil.getDate(workExperienceDto.getBeginTime()));
map.put("jssj", DateUtil.getDate(workExperienceDto.getEndTime()));
gzjl.add(map);
}
sql = "insert into uf_jcl_yppc_dt3 (mainId,xmmc,xmms,kssj,jssj) values (?,?,?,?,?) ";
instance.insertResumeDetailTable(gzjl, "uf_jcl_yppc_dt2", mainId, sourceId);
List<RecruitDataMap<Object>> xmjl = new ArrayList<>();
List<ResumeInfoProjectExperienceDto> projectExperience = resumeInfoDto.getProjectExperience();
for (ResumeInfoProjectExperienceDto projectExperienceDto : projectExperience) {
List<Object> data = new ArrayList<>();
data.add(mainId);
data.add(projectExperienceDto.getProjectName());
data.add(projectExperienceDto.getContent());
data.add(DateUtil.getDate(projectExperienceDto.getBeginTime()));
data.add(DateUtil.getDate(projectExperienceDto.getEndTime()));
rs.executeUpdate(sql, data);
RecruitDataMap<Object> map = new RecruitDataMap<>();
map.put("xmmc", projectExperienceDto.getProjectName());
map.put("xmms", projectExperienceDto.getContent());
map.put("kssj", DateUtil.getDate(projectExperienceDto.getBeginTime()));
map.put("jssj", DateUtil.getDate(projectExperienceDto.getEndTime()));
xmjl.add(map);
}
instance.insertResumeDetailTable(xmjl, "uf_jcl_yppc_dt3", mainId, sourceId);
}
@ -184,14 +209,19 @@ public class SdkResumeSavedThread extends LocalRunnable {
* @return
*/
private String convertStreamToE9DocId(Long resumeFileId, User user) {
BaseBean baseBean = new BaseBean();
baseBean.writeLog("解析千里聆SDK原始简历resumeFileId===" + resumeFileId);
List<Integer> docIdList = new ArrayList<>();
ERPAResumeSDKClient client = ERPASDKClients.getResumeSDKClient();
client.start();
client.downloadResumeFile(resumeFileId, (fileName, stream) -> {
try {
baseBean.writeLog("解析千里聆SDK原始简历fileName===" + fileName);
int imageFileId = RecruitModeUtil.generateImageFileId(stream, fileName);
baseBean.writeLog("解析千里聆SDK原始简历imageFileId===" + imageFileId);
docIdList.add(RecruitModeUtil.createDocId(SEC_CATEGORY, imageFileId, user));
} catch (Exception e) {
baseBean.writeLog("解析千里聆SDK原始简历失败", e);
throw new RuntimeException(e);
}
});

View File

@ -0,0 +1,54 @@
package com.engine.recruit.util;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.xssf.usermodel.XSSFCell;
import weaver.general.Util;
import java.text.SimpleDateFormat;
/**
* @author:dxfeng
* @createTime: 2024/01/26
* @version: 1.0
*/
public class ExcelUtil {
/**
* 获取单元格内容
*
* @param cell
* @return
*/
public static String getCellValue(XSSFCell cell) {
String cellValue = "";
if (cell == null) {
return "";
}
switch (cell.getCellType()) {
case BOOLEAN:
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
// 先看是否是日期格式 读取日期格式
SimpleDateFormat sft = new SimpleDateFormat("yyyy-MM-dd");
cellValue = sft.format(cell.getDateCellValue());
} else {
// 读取数字
cellValue = String.valueOf(new Double(cell.getNumericCellValue()));
}
break;
case FORMULA:
// 读取公式
cellValue = cell.getCellFormula();
break;
case STRING:
// 读取String
cellValue = cell.getStringCellValue();
break;
default:
break;
}
cellValue = Util.toHtmlForHrm(cellValue);
return cellValue;
}
}

View File

@ -39,9 +39,11 @@ public class RecruitFlowUtil {
String[] paramPairs = urlString.split("&");
for (String paramPair : paramPairs) {
String[] keyValue = paramPair.split("=");
String key = URLDecoder.decode(keyValue[0], "UTF-8");
String value = URLDecoder.decode(keyValue[1], "UTF-8");
params.put(key, value);
if (keyValue.length == 2) {
String key = URLDecoder.decode(keyValue[0], "UTF-8");
String value = URLDecoder.decode(keyValue[1], "UTF-8");
params.put(key, value);
}
}
}
} catch (Exception e) {

View File

@ -0,0 +1,357 @@
package com.engine.recruit.util;
import com.api.browser.bean.BrowserBean;
import com.api.browser.bean.SearchConditionItem;
import com.api.browser.bean.SearchConditionOption;
import com.api.browser.util.ConditionFactory;
import com.api.browser.util.ConditionType;
import weaver.hrm.User;
import weaver.integration.util.ConstantsUtil;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author dxfeng
* @description:
* @Date 2024/1/24
* @Version V1.0
**/
@Deprecated
public class RecruitFormItemUtil {
/**
* 下拉框
*
* @param user
* @param selectOptions
* @param colSpan
* @param fieldcol
* @param labelcol
* @param isQuickSearch
* @param label
* @return
*/
public static SearchConditionItem selectItem(User user, List<SearchConditionOption> selectOptions, int colSpan, int fieldcol,
int labelcol, boolean isQuickSearch, String label, String name) {
ConditionFactory conditionFactory = new ConditionFactory(user);
SearchConditionItem select = conditionFactory.createCondition(ConditionType.SELECT, 502327, name);
select.setOptions(selectOptions);
select.setColSpan(colSpan);
select.setFieldcol(fieldcol);
select.setLabelcol(labelcol);
select.setIsQuickSearch(isQuickSearch);
select.setLabel(label);
return select;
}
/**
* checkbox
*
* @param user
* @param colSpan
* @param fieldcol
* @param viewAttr
* @param isQuickSearch
* @param label
* @param name
* @return
*/
public static SearchConditionItem checkboxItem(User user, int colSpan, int fieldcol,
int viewAttr, boolean isQuickSearch, String label, String name) {
ConditionFactory conditionFactory = new ConditionFactory(user);
SearchConditionItem checkbox = conditionFactory.createCondition(ConditionType.CHECKBOX, 502327, name);
checkbox.setColSpan(colSpan);
checkbox.setFieldcol(fieldcol);
checkbox.setViewAttr(viewAttr);
checkbox.setIsQuickSearch(isQuickSearch);
checkbox.setLabel(label);
return checkbox;
}
/**
* 输入框数字
*
* @param user
* @param colSpan
* @param fieldcol
* @param viewAttr
* @param label
* @return
*/
public static SearchConditionItem inputNumberItem(User user, int colSpan, int fieldcol,
int viewAttr, String label, String name) {
ConditionFactory conditionFactory = new ConditionFactory(user);
SearchConditionItem inputnumber = conditionFactory.createCondition(ConditionType.INPUTNUMBER, 502327, name);
inputnumber.setColSpan(colSpan);
inputnumber.setFieldcol(fieldcol);
inputnumber.setViewAttr(viewAttr);
inputnumber.setLabel(label);
return inputnumber;
}
/**
* 输入框文本
*
* @param user
* @param colSpan
* @param fieldcol
* @param viewAttr
* @param length
* @param label
* @return
*/
public static SearchConditionItem inputItem(User user, int colSpan, int fieldcol,
int viewAttr, int length, String label, String name) {
ConditionFactory conditionFactory = new ConditionFactory(user);
SearchConditionItem input = conditionFactory.createCondition(ConditionType.INPUT, 25034, name);
input.setColSpan(colSpan);
input.setFieldcol(fieldcol);
input.setViewAttr(viewAttr);
input.setLength(length);
input.setLabel(label);
return input;
}
public static SearchConditionItem uploadItem(User user, int colSpan, int fieldcol,
int viewAttr, int length, String label, String name,int maxUploadSize,int maxFilesNumber,String limitType) {
ConditionFactory conditionFactory = new ConditionFactory(user);
SearchConditionItem upload = conditionFactory.createCondition(ConditionType.UPLOAD, 25034, name);
upload.setColSpan(colSpan);
upload.setFieldcol(fieldcol);
upload.setViewAttr(viewAttr);
upload.setLength(length);
upload.setLabel(label);
upload.setUploadUrl(ConstantsUtil.INTEGRATION_DATASOURCE_UPLOADFILE);
upload.setCategory("string");
upload.setMultiSelection(false);
Map<String, Object> otherParams = new HashMap<>();
otherParams.put("maxUploadSize", maxUploadSize);
otherParams.put("autoUpload", true);
otherParams.put("limitType", limitType);
upload.setOtherParams(otherParams);
upload.setMaxFilesNumber(maxFilesNumber);
upload.setViewAttr(viewAttr);
if (viewAttr == 3) {
upload.setRules("required");
}
return upload;
}
/**
* 浏览按钮
*
* @param user
* @param colSpan
* @param fieldcol
* @param viewAttr
* @param isQuickSearch
* @param label
* @param type
* @param name
* @param fieldDbType 数据展现集成标识
* @return
*/
public static SearchConditionItem browserItem(User user, int colSpan, int fieldcol,
int viewAttr, boolean isQuickSearch, String label, String type, String name, String fieldDbType) {
ConditionFactory conditionFactory = new ConditionFactory(user);
SearchConditionItem browser = conditionFactory.createCondition(ConditionType.BROWSER, 502327, name, type);
browser.setColSpan(colSpan);
browser.setFieldcol(fieldcol);
browser.setViewAttr(viewAttr);
browser.setIsQuickSearch(isQuickSearch);
browser.setLabel(label);
if ("161".equals(type) || "162".equals(type)) {
fieldDbType = "browser." + fieldDbType;
BrowserBean browserBean = new BrowserBean();
// completeParams
Map<String, Object> completeMap = new HashMap<>();
completeMap.put("f_weaver_belongto_usertype", 0);
completeMap.put("type", type);
completeMap.put("fielddbtype", fieldDbType);
browserBean.setCompleteParams(completeMap);
// conditionDataParams
Map<java.lang.String, Object> conditionDataMap = new HashMap<>();
conditionDataMap.put("f_weaver_belongto_usertype", 0);
conditionDataMap.put("type", fieldDbType);
conditionDataMap.put("fielddbtype", fieldDbType);
browserBean.setConditionDataParams(conditionDataMap);
// dataParams
Map<java.lang.String, Object> dataMap = new HashMap<>();
dataMap.put("f_weaver_belongto_usertype", 0);
dataMap.put("type", fieldDbType);
browserBean.setDataParams(dataMap);
// destDataParams
Map<java.lang.String, Object> destDataMap = new HashMap<>();
destDataMap.put("f_weaver_belongto_usertype", 0);
destDataMap.put("type", fieldDbType);
browserBean.setDestDataParams(destDataMap);
browserBean.setLinkUrl("");
browserBean.setMobileLinkUrl("");
browserBean.setPageSize(10);
browserBean.setScrollx(true);
browserBean.setTitle(label);
browserBean.setType(type);
browser.setBrowserConditionParam(browserBean);
if ("162".equals(type)) {
HashMap<String, Object> otherMap = new HashMap<>();
otherMap.put("isMultCheckbox", "true");
otherMap.put("icon", "icon-coms-integration");
browser.setOtherParams(otherMap);
}
}
return browser;
}
/**
* 日期区间
*
* @param user
* @param colSpan
* @param fieldcol
* @param viewAttr
* @param label
* @return
*/
public static SearchConditionItem rangeDateItem(User user, int colSpan, int fieldcol, int viewAttr
, String label, String name1, String name2) {
ConditionFactory conditionFactory = new ConditionFactory(user);
SearchConditionItem rangeDate = conditionFactory.createCondition(ConditionType.TIMEPICKER, 502327, new String[]{name1, name2});
rangeDate.setColSpan(colSpan);
rangeDate.setFieldcol(fieldcol);
rangeDate.setViewAttr(viewAttr);
rangeDate.setLabel(label);
return rangeDate;
}
/**
* 多行文本框
*
* @param user
* @param colSpan
* @param fieldcol
* @param isQuickSearch
* @param viewAttr
* @param length
* @param label
* @param name
* @return
*/
public static SearchConditionItem textareaItem(User user, int colSpan, int fieldcol, boolean isQuickSearch,
int viewAttr, int length, String label, String name) {
ConditionFactory conditionFactory = new ConditionFactory(user);
SearchConditionItem textarea = conditionFactory.createCondition(ConditionType.TEXTAREA, 502227, name);
textarea.setColSpan(colSpan);
textarea.setFieldcol(fieldcol);
textarea.setIsQuickSearch(isQuickSearch);
textarea.setViewAttr(viewAttr);
textarea.setLength(length);
textarea.setLabel(label);
return textarea;
}
/**
* 日期组合
*
* @param user
* @param colSpan
* @param fieldcol
* @param isQuickSearch
* @param viewAttr
* @param label
* @param name
* @return
*/
public static SearchConditionItem dateItem(User user, int colSpan, int fieldcol, boolean isQuickSearch,
int viewAttr, String label, String name) {
ConditionFactory conditionFactory = new ConditionFactory(user);
SearchConditionItem date = conditionFactory.createCondition(ConditionType.DATE, 502227, name);
date.setColSpan(colSpan);
date.setFieldcol(fieldcol);
date.setIsQuickSearch(isQuickSearch);
date.setViewAttr(viewAttr);
date.setLabel(label);
return date;
}
/**
* @param user
* @param colSpan
* @param fieldcol
* @param isQuickSearch
* @param viewAttr
* @param label
* @param name
* @return
*/
public static SearchConditionItem datePickerItem(User user, int colSpan, int fieldcol, boolean isQuickSearch,
int viewAttr, String label, String name) {
ConditionFactory conditionFactory = new ConditionFactory(user);
SearchConditionItem datePicker = conditionFactory.createCondition(ConditionType.DATEPICKER, 502227, name);
datePicker.setColSpan(colSpan);
datePicker.setFieldcol(fieldcol);
datePicker.setIsQuickSearch(isQuickSearch);
datePicker.setViewAttr(viewAttr);
datePicker.setLabel(label);
return datePicker;
}
public static SearchConditionItem dateGroupItem(User user, int colSpan, int fieldcol, boolean isQuickSearch,
int viewAttr, String label, String name) {
ConditionFactory conditionFactory = new ConditionFactory(user);
SearchConditionItem dateGroup = conditionFactory.createCondition(ConditionType.DATEGROUP, 502227, name);
dateGroup.setColSpan(colSpan);
dateGroup.setFieldcol(fieldcol);
dateGroup.setIsQuickSearch(isQuickSearch);
dateGroup.setViewAttr(viewAttr);
dateGroup.setLabel(label);
List<Object> datas = new ArrayList<>();
datas.add(new DateGroupData("全部", "0"));
datas.add(new DateGroupData("今天", "1"));
datas.add(new DateGroupData("本周", "2"));
datas.add(new DateGroupData("本月", "3"));
datas.add(new DateGroupData("本季", "4"));
datas.add(new DateGroupData("本年", "5"));
datas.add(new DateGroupData("上个月", "7"));
datas.add(new DateGroupData("上一年", "8"));
datas.add(new DateGroupData("指定日期范围", "6"));
dateGroup.setDatas(datas);
dateGroup.setValue(new ArrayList<>());
dateGroup.setDateGroup(true);
return dateGroup;
}
static class DateGroupData {
private String name;
private String value;
public DateGroupData(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public String getValue() {
return value;
}
}
}

View File

@ -43,6 +43,8 @@ public class RecruitMessageUtils {
}
public static boolean sendSMS(String receiver, String content) {
// 去除短信内容中的html样式
content = content.replaceAll("<[^>]*>|&nbsp;", "").replaceAll("\\n+", "\n");
return MessageUtil.sendSMS(receiver, content);
}

View File

@ -38,9 +38,6 @@ public class ApplicantResumeWrapper extends Service {
return getApplicantResumeService(user).updateApplicantsInfo(params);
}
public Map<String, Object> fullOriginalResumeId(Map<String, Object> params) {
return getApplicantResumeService(user).fullOriginalResumeId(params);
}
public Map<String, Object> checkRepeatResume(Map<String, Object> params) {
return getApplicantResumeService(user).checkRepeatResume(params);

View File

@ -25,4 +25,8 @@ public class RecruitFlowWrapper extends Service {
public Map<String, Object> getRecruitStepList(Map<String, Object> param) {
return getRecruitFlowService(user).getRecruitStepList(param);
}
public Map<String, Object> syncRecruitStepInfo(Map<String, Object> param) {
return getRecruitFlowService(user).syncRecruitStepInfo(param);
}
}

View File

@ -0,0 +1,24 @@
package com.engine.recruit.wrapper;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.recruit.service.RecruitInterviewService;
import com.engine.recruit.service.impl.RecruitInterviewServiceImpl;
import weaver.hrm.User;
import java.util.Map;
/**
* @author:dxfeng
* @createTime: 2023/11/28
* @version: 1.0
*/
public class RecruitInterviewWrapper extends Service {
private RecruitInterviewService getRecruitInterviewService(User user) {
return ServiceUtil.getService(RecruitInterviewServiceImpl.class, user);
}
public Map<String, Object> updateInterviewStatus(Map<String, Object> param) {
return getRecruitInterviewService(user).updateInterviewStatus(param);
}
}

View File

@ -0,0 +1,44 @@
package com.engine.recruit.wrapper;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.recruit.constant.RecruitConstant;
import com.engine.recruit.factory.ResumeRecognitionFactory;
import com.engine.recruit.service.ResumeRecognitionService;
import org.apache.commons.lang3.StringUtils;
import weaver.hrm.User;
import java.util.Map;
/**
* @author:dxfeng
* @createTime: 2023/12/12
* @version: 1.0
*/
public class ResumeRecognitionWrapper extends Service {
private ResumeRecognitionService getResumeRecognitionService(User user) {
return ServiceUtil.getService(ResumeRecognitionFactory.getClass(RecruitConstant.OCR_TYPE), user);
}
public Map<String, Object> resumeUpload(Map<String, Object> param) {
if (StringUtils.isBlank(RecruitConstant.OCR_TYPE)) {
return null;
}
return getResumeRecognitionService(user).resumeUpload(param);
}
public Map<String, Object> importResume(Map<String, Object> param) {
if (StringUtils.isBlank(RecruitConstant.OCR_TYPE)) {
return null;
}
return getResumeRecognitionService(user).importResume(param);
}
public Map<String, Object> fetchResume(Map<String, Object> param) {
if (StringUtils.isBlank(RecruitConstant.OCR_TYPE)) {
return null;
}
return getResumeRecognitionService(user).fetchResume(param);
}
}

View File

@ -0,0 +1,24 @@
package com.engine.recruit.wrapper;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.recruit.service.ResumeRemindService;
import com.engine.recruit.service.impl.ResumeRemindServiceImpl;
import weaver.hrm.User;
import java.util.Map;
/**
* @author:dxfeng
* @createTime: 2024/03/13
* @version: 1.0
*/
public class ResumeRemindWrapper extends Service {
private ResumeRemindService getResumeRemindService(User user) {
return ServiceUtil.getService(ResumeRemindServiceImpl.class, user);
}
public Map<String, Object> doRemindJob(Map<String, Object> param) {
return getResumeRemindService(user).doRemindJob(param);
}
}

View File

@ -0,0 +1,28 @@
package com.engine.recruit.wrapper;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.recruit.service.WrittenResultsService;
import com.engine.recruit.service.impl.WrittenResultsServiceImpl;
import weaver.hrm.User;
import java.util.Map;
/**
* @author:dxfeng
* @createTime: 2024/01/24
* @version: 1.0
*/
public class WrittenResultsWrapper extends Service {
private WrittenResultsService getWrittenResultsService(User user) {
return ServiceUtil.getService(WrittenResultsServiceImpl.class, user);
}
public Map<String, Object> getFormCondition(Map<String, Object> params) {
return getWrittenResultsService(user).getFormCondition();
}
public Map<String, Object> importExcel(Map<String, Object> params) {
return getWrittenResultsService(user).importExcel(params);
}
}

View File

@ -0,0 +1,29 @@
package weaver.formmode.recruit.customsearch;
import org.apache.commons.lang3.StringUtils;
import weaver.formmode.customjavacode.AbstractCustomSqlConditionJavaCode;
import weaver.general.Util;
import weaver.hrm.User;
import java.util.Map;
/**
* 简历订阅推送记录列表查询条件
*
* @author:dxfeng
* @createTime: 2024/03/11
* @version: 1.0
*/
public class RemindSearchTemplate extends AbstractCustomSqlConditionJavaCode {
@Override
public String generateSqlCondition(Map<String, Object> param) {
String whereSql = "";
User user = (User) param.get("user");
whereSql += " t1.jsr = '" + user.getUID() + "'";
String uuid = Util.null2String(param.get("uuid"));
if (StringUtils.isNotBlank(uuid)) {
whereSql += " and t1.uuid = '" + uuid + "'";
}
return whereSql;
}
}

View File

@ -57,11 +57,7 @@ public class CreatRckApplicantExpand extends AbstractModeExpandJavaCodeNew {
String uuid = UUID.randomUUID().toString();
insertDataMap.put("modeuuid", uuid);
int formModeId = -1;
rs.executeQuery("select id from modeinfo where formid =( select id from workflow_bill where tablename = 'uf_jcl_yppc' )");
if (rs.next()) {
formModeId = rs.getInt("id");
}
int formModeId = ApplicantCommonInfo.getModeIdByTableName("uf_jcl_yppc");
insertDataMap.put("formmodeid", formModeId);
insertDataMap.put("id", billId);
RecruitRecordSet.updateDataById(insertDataMap, "uf_jcl_yppc");

View File

@ -1,6 +1,7 @@
package weaver.formmode.recruit.modeexpand.departmentscreening;
import com.engine.recruit.conn.ApplicantCommonInfo;
import com.engine.recruit.constant.RecruitConstant;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import weaver.common.DateUtil;
@ -35,12 +36,8 @@ public class BatchAddDeptScreeningModeExpand extends AbstractModeExpandJavaCodeN
try {
RequestInfo requestInfo = (RequestInfo) param.get("RequestInfo");
if (requestInfo != null) {
int formModeId = -1;
RecordSet rs = new RecordSet();
rs.executeQuery("select id from modeinfo where formid =( select id from workflow_bill where tablename = ? )", MODE_TABLE_NAME);
if (rs.next()) {
formModeId = rs.getInt("id");
}
int formModeId = ApplicantCommonInfo.getModeIdByTableName(MODE_TABLE_NAME);
MainTableInfo mainTableInfo = requestInfo.getMainTableInfo();
Property[] properties = mainTableInfo.getProperty();
Map<String, Object> mainDataMap = new HashMap<>();
@ -97,9 +94,9 @@ public class BatchAddDeptScreeningModeExpand extends AbstractModeExpandJavaCodeN
}
// 发送待办消息
String messageType = RecruitModeUtil.getRecruitPropValue("SCREENING_MESSAGE_TYPE");
String messageTitle = RecruitModeUtil.getRecruitPropValue("SCREENING_MESSAGE_TITLE");
String linkUrl = RecruitModeUtil.getRecruitPropValue("SCREENING_MESSAGE_URL");
String messageType = RecruitConstant.SCREENING_MESSAGE_TYPE;
String messageTitle = RecruitConstant.SCREENING_MESSAGE_TITLE;
String linkUrl = RecruitConstant.SCREENING_MESSAGE_URL;
String fkr = Util.null2String(mainDataMap.get("fkr"));
Set<String> userIdSet = new HashSet<>(Arrays.asList(fkr.split(",")));
RecruitModeUtil.messagePush(messageType, messageTitle, msgBuilder.toString(), userIdSet, user.getUID(), linkUrl, "");

View File

@ -1,11 +1,12 @@
package weaver.formmode.recruit.modeexpand.departmentscreening;
import com.engine.recruit.conn.ApplicantCommonInfo;
import com.engine.recruit.constant.RecruitConstant;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import weaver.common.DateUtil;
import weaver.conn.RecordSet;
import weaver.formmode.customjavacode.AbstractModeExpandJavaCodeNew;
import com.engine.recruit.conn.ApplicantCommonInfo;
import weaver.formmode.recruit.modeexpand.util.RecruitModeUtil;
import weaver.formmode.setup.ModeRightInfo;
import weaver.general.BaseBean;
@ -44,12 +45,8 @@ public class SingleAddDeptScreeningModeExpand extends AbstractModeExpandJavaCode
dataMap.put(property.getName(), property.getValue());
}
int formModeId = -1;
RecordSet rs = new RecordSet();
rs.executeQuery("select id from modeinfo where formid =( select id from workflow_bill where tablename = ? )", MODE_TABLE_NAME);
if (rs.next()) {
formModeId = rs.getInt("id");
}
int formModeId = ApplicantCommonInfo.getModeIdByTableName(MODE_TABLE_NAME);
User user = (User) param.get("user");
// 部门筛选ID
@ -79,9 +76,9 @@ public class SingleAddDeptScreeningModeExpand extends AbstractModeExpandJavaCode
}
}
// 发送待办消息
String messageType = RecruitModeUtil.getRecruitPropValue("SCREENING_MESSAGE_TYPE");
String messageTitle = RecruitModeUtil.getRecruitPropValue("SCREENING_MESSAGE_TITLE");
String linkUrl = RecruitModeUtil.getRecruitPropValue("SCREENING_MESSAGE_URL");
String messageType = RecruitConstant.SCREENING_MESSAGE_TYPE;
String messageTitle = RecruitConstant.SCREENING_MESSAGE_TITLE;
String linkUrl = RecruitConstant.SCREENING_MESSAGE_URL;
String fkr = Util.null2String(dataMap.get("fkr"));
String applicantName = ApplicantCommonInfo.getApplicantName(Util.null2String(dataMap.get("ypz")));
String applicantPosition = ApplicantCommonInfo.getApplicantPosition(Util.null2String(dataMap.get("ypzw")));

View File

@ -1,6 +1,7 @@
package weaver.formmode.recruit.modeexpand.entrymanager;
import com.engine.common.util.ServiceUtil;
import com.engine.recruit.enums.ApplicationStatusEnum;
import com.engine.recruit.service.impl.ApplicantResumeServiceImpl;
import org.apache.commons.lang3.StringUtils;
import weaver.conn.RecordSet;
@ -20,7 +21,7 @@ import java.util.Map;
public class AddEntryModeExpand extends AbstractModeExpandJavaCodeNew {
@Override
public Map<String, String> doModeExpand(Map<String, Object> param) {
Map<String, String> result = new HashMap<>();
Map<String, String> result = new HashMap<>(2);
try {
int billId;
int modeId;
@ -30,15 +31,17 @@ public class AddEntryModeExpand extends AbstractModeExpandJavaCodeNew {
billId = Util.getIntValue(requestInfo.getRequestid());
modeId = Util.getIntValue(requestInfo.getWorkflowid());
if (billId > 0 && modeId > 0) {
RecordSet rs = new RecordSet();
String pcId = Util.null2String(param.get("pcid"));
String offerId = Util.null2String(param.get("offerid"));
if (StringUtils.isNotBlank(pcId)) {
// 归档人才库归档原因待入职
ServiceUtil.getService(ApplicantResumeServiceImpl.class, user).archiveTalentPool(pcId, false, "13");
// 更新应聘批次为已归档
rs.executeUpdate("update uf_jcl_yppc set zt = ? where id = ? ", ApplicationStatusEnum.ARCHIVED.getValue(), pcId);
}
if (StringUtils.isNotBlank(offerId)) {
// 是否待入职字段为是
RecordSet rs = new RecordSet();
rs.executeUpdate("update uf_jcl_offer set sfzdrz = 1 where id = ? ", offerId);
}
}

View File

@ -1,5 +1,7 @@
package weaver.formmode.recruit.modeexpand.interview;
import com.engine.recruit.constant.RecruitConstant;
import com.engine.recruit.conn.ApplicantCommonInfo;
import com.engine.recruit.util.RecruitMessageUtils;
import com.weaver.formmodel.data.model.Formfield;
import org.apache.commons.collections.CollectionUtils;
@ -28,21 +30,6 @@ import java.util.stream.Collectors;
public class BatchAddInterviewResultModeExpand extends AbstractModeExpandJavaCodeNew {
private static final String MODE_TABLE_NAME = "uf_jcl_ms";
/**
* 消息来源ID
*/
private final String messageType;
/**
* 消息提醒标题
*/
private final String title;
public BatchAddInterviewResultModeExpand() {
super();
messageType = RecruitModeUtil.getRecruitPropValue("INTERVIEW_MESSAGE_TYPE");
title = RecruitModeUtil.getRecruitPropValue("INTERVIEW_ADD_MESSAGE_TITLE");
}
@Override
public Map<String, String> doModeExpand(Map<String, Object> param) {
@ -50,23 +37,18 @@ public class BatchAddInterviewResultModeExpand extends AbstractModeExpandJavaCod
try {
RequestInfo requestInfo = (RequestInfo) param.get("RequestInfo");
if (requestInfo != null) {
int formModeId = -1;
int formId = -1;
RecordSet rs = new RecordSet();
rs.executeQuery("select id from workflow_bill where tablename = ?", MODE_TABLE_NAME);
if (rs.next()) {
formId = rs.getInt("id");
}
rs.executeQuery("select id from modeinfo where formid =?", formId);
if (rs.next()) {
formModeId = rs.getInt("id");
}
int formModeId = ApplicantCommonInfo.getModeIdByTableName(MODE_TABLE_NAME);
MainTableInfo mainTableInfo = requestInfo.getMainTableInfo();
Property[] properties = mainTableInfo.getProperty();
Map<String, Object> mainDataMap = new HashMap<>();
for (Property property : properties) {
mainDataMap.put(property.getName(), RecruitModeUtil.parseBlankToNull(property.getValue()));
}
// 需要应聘者反馈
boolean needFeedback = "1".equals(Util.null2String(mainDataMap.get("sfxyfk")));
User user = (User) param.get("user");
// 填充建模数据基本信息
mainDataMap.put("formmodeid", formModeId);
@ -127,7 +109,15 @@ public class BatchAddInterviewResultModeExpand extends AbstractModeExpandJavaCod
String yx = Util.null2String(detailDataMap.get("dzyx"));
String sjh = Util.null2String(detailDataMap.get("sjhm"));
if (sendEmail) {
RecruitMessageUtils.sendEmail(yx, emailTitle, msgContent);
if (needFeedback) {
String confirmUrl = RecruitConstant.INTERVIEW_FEEDBACK_URL + "?uuid=" + uuid;
String emailContent = "<div style=\"border:3px solid silver;width:635px;height:55px;line-height:55px;font-family:'microsoft Yahei';font-size:18px;font-weight:bold;color:#333;padding-left:10px\">请您答复是否参加此次邀请? <a href=\"" + confirmUrl + "&status=0\" style=\"text-decoration:underline;color:#0000cc;margin-right:10px\">参加</a> <a href=\"" + confirmUrl + "&status=1\" style=\"text-decoration:underline;color:#0000cc;\">不参加</a></div>";
// 邮件内容拼接确认信息
emailContent = msgContent + emailContent;
RecruitMessageUtils.sendEmail(yx, emailTitle, emailContent);
} else {
RecruitMessageUtils.sendEmail(yx, emailTitle, msgContent);
}
}
if (sendSms) {
@ -150,7 +140,7 @@ public class BatchAddInterviewResultModeExpand extends AbstractModeExpandJavaCod
Set<String> userIdSet = new HashSet<>();
userIdSet.addAll(Arrays.asList(msg.split(",")));
userIdSet.addAll(Arrays.asList(ptmsg.split(",")));
RecruitModeUtil.messagePush(messageType, title, msgBuilder.toString(), userIdSet, user.getUID());
RecruitModeUtil.messagePush(RecruitConstant.INTERVIEW_MESSAGE_TYPE, RecruitConstant.INTERVIEW_ADD_MESSAGE_TITLE, msgBuilder.toString(), userIdSet, user.getUID());
}
}
} catch (Exception e) {

View File

@ -1,19 +1,18 @@
package weaver.formmode.recruit.modeexpand.interview;
import com.engine.recruit.enums.InterviewOperateTypeEnum;
import com.engine.recruit.util.RecruitMessageUtils;
import com.weaver.formmodel.data.model.Formfield;
import org.apache.commons.lang3.StringUtils;
import weaver.conn.RecordSet;
import weaver.formmode.customjavacode.AbstractModeExpandJavaCodeNew;
import com.engine.recruit.conn.ApplicantCommonInfo;
import com.engine.recruit.constant.RecruitConstant;
import com.engine.recruit.enums.InterviewOperateTypeEnum;
import org.apache.commons.lang3.StringUtils;
import weaver.formmode.customjavacode.AbstractModeExpandJavaCodeNew;
import weaver.formmode.recruit.modeexpand.util.RecruitModeUtil;
import weaver.general.Util;
import weaver.hrm.User;
import weaver.soa.workflow.request.*;
import weaver.soa.workflow.request.MainTableInfo;
import weaver.soa.workflow.request.Property;
import weaver.soa.workflow.request.RequestInfo;
import java.util.*;
import java.util.stream.Collectors;
/**
* <p>聚才林招聘</p>
@ -35,8 +34,6 @@ public class CreateInterviewModeExpand extends AbstractModeExpandJavaCodeNew {
*/
private String title;
private final RecordSet recordSet = new RecordSet();
@Override
public Map<String, String> doModeExpand(Map<String, Object> params) {
Map<String, String> result = new HashMap<>();
@ -58,36 +55,21 @@ public class CreateInterviewModeExpand extends AbstractModeExpandJavaCodeNew {
mainDataMap.put(property.getName(), property.getValue());
}
String operateType = Util.null2String(params.get("operateType"));
if (StringUtils.isBlank(operateType)) {
operateType = InterviewOperateTypeEnum.ARRANGE.getOperateType();
}
InterviewOperateTypeEnum operateTypeEnum = InterviewOperateTypeEnum.getOperateType(operateType);
if (operateTypeEnum == InterviewOperateTypeEnum.ARRANGE) {
messageType = RecruitModeUtil.getRecruitPropValue("INTERVIEW_MESSAGE_TYPE");
title = RecruitModeUtil.getRecruitPropValue("INTERVIEW_ADD_MESSAGE_TITLE");
messageType = RecruitConstant.INTERVIEW_MESSAGE_TYPE;
title = RecruitConstant.INTERVIEW_ADD_MESSAGE_TITLE;
// 消息提醒
arrangeInterview(user, mainDataMap);
String tzypz = Util.null2String(mainDataMap.get("tzypz"));
String yjnr = Util.null2String(mainDataMap.get("yjnr"));
String yjtzmb = Util.null2String(mainDataMap.get("yjtzmb"));
List<String> sendTypeList = Arrays.asList(tzypz.split(","));
boolean sendEmail = sendTypeList.contains("0");
boolean sendSms = sendTypeList.contains("1");
String emailTitle = RecruitModeUtil.getEmailTitle(yjtzmb);
List<Formfield> fieldList = RecruitModeUtil.getFieldList("uf_jcl_ms");
Map<String, List<Formfield>> fieldMapList = fieldList.stream().collect(Collectors.groupingBy(Formfield::getLabelName));
// 发送邮件
String msgContent = RecruitModeUtil.getReplaceContent(yjnr, fieldMapList, mainDataMap);
String yx = Util.null2String(mainDataMap.get("dzyx"));
String sjh = Util.null2String(mainDataMap.get("sjhm"));
if (sendEmail) {
RecruitMessageUtils.sendEmail(yx, emailTitle, msgContent);
}
if (sendSms) {
RecruitMessageUtils.sendSMS(sjh, msgContent);
}
// 需要应聘者反馈
boolean needFeedback = "1".equals(Util.null2String(mainDataMap.get("sfxyfk")));
// 发送邮件短信
InterviewMsgUtil.sendEmailAndMsg(mainDataMap, billId, needFeedback);
}
}

View File

@ -0,0 +1,71 @@
package weaver.formmode.recruit.modeexpand.interview;
import com.engine.recruit.constant.RecruitConstant;
import com.engine.recruit.util.RecruitMessageUtils;
import com.weaver.formmodel.data.model.Formfield;
import weaver.conn.RecordSet;
import weaver.formmode.recruit.modeexpand.util.RecruitModeUtil;
import weaver.general.Util;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author:dxfeng
* @createTime: 2024/03/04
* @version: 1.0
*/
public class InterviewMsgUtil {
/**
* 面试相关发送邮件短信
*
* @param mainDataMap
* @param billId
* @param needFeedback
*/
public static void sendEmailAndMsg(Map<String, Object> mainDataMap, int billId, boolean needFeedback) {
String tzypz = Util.null2String(mainDataMap.get("tzypz"));
String yjnr = Util.null2String(mainDataMap.get("yjnr"));
String yjtzmb = Util.null2String(mainDataMap.get("yjtzmb"));
List<String> sendTypeList = Arrays.asList(tzypz.split(","));
boolean sendEmail = sendTypeList.contains("0");
boolean sendSms = sendTypeList.contains("1");
String emailTitle = RecruitModeUtil.getEmailTitle(yjtzmb);
List<Formfield> fieldList = RecruitModeUtil.getFieldList("uf_jcl_ms");
Map<String, List<Formfield>> fieldMapList = fieldList.stream().collect(Collectors.groupingBy(Formfield::getLabelName));
// 发送邮件
String msgContent = RecruitModeUtil.getReplaceContent(yjnr, fieldMapList, mainDataMap);
String yx = Util.null2String(mainDataMap.get("dzyx"));
String sjh = Util.null2String(mainDataMap.get("sjhm"));
RecordSet rs = new RecordSet();
rs.executeQuery("select modeuuid from uf_jcl_ms where id = ? ", billId);
String uuid = "";
if (rs.next()) {
uuid = rs.getString("modeuuid");
}
String confirmUrl = RecruitConstant.INTERVIEW_FEEDBACK_URL + "?uuid=" + uuid;
if (sendEmail) {
if (needFeedback) {
String emailContent = "<div style=\"border:3px solid silver;width:635px;height:55px;line-height:55px;font-family:'microsoft Yahei';font-size:18px;font-weight:bold;color:#333;padding-left:10px\">请您答复是否参加此次邀请? <a href=\"" + confirmUrl + "&status=0\" style=\"text-decoration:underline;color:#0000cc;margin-right:10px\">参加</a> <a href=\"" + confirmUrl + "&status=1\" style=\"text-decoration:underline;color:#0000cc;\">不参加</a></div>";
// 邮件内容拼接确认信息
emailContent = msgContent + emailContent;
RecruitMessageUtils.sendEmail(yx, emailTitle, emailContent);
} else {
RecruitMessageUtils.sendEmail(yx, emailTitle, msgContent);
}
}
if (sendSms) {
if (needFeedback) {
String messageContent = "请您答复是否参加此次邀请?" + confirmUrl;
messageContent = msgContent + messageContent;
RecruitMessageUtils.sendSMS(sjh, messageContent);
} else {
RecruitMessageUtils.sendSMS(sjh, msgContent);
}
}
}
}

View File

@ -1,10 +1,12 @@
package weaver.formmode.recruit.modeexpand.interview;
import com.engine.recruit.conn.ApplicantCommonInfo;
import com.engine.recruit.constant.RecruitConstant;
import com.engine.recruit.enums.InterviewOperateTypeEnum;
import com.weaver.formmodel.data.model.Formfield;
import org.apache.commons.lang3.StringUtils;
import weaver.conn.RecordSet;
import weaver.formmode.customjavacode.AbstractModeExpandJavaCodeNew;
import com.engine.recruit.conn.ApplicantCommonInfo;
import weaver.formmode.recruit.modeexpand.util.RecruitModeUtil;
import weaver.general.Util;
import weaver.hrm.User;
@ -13,6 +15,7 @@ import weaver.soa.workflow.request.Property;
import weaver.soa.workflow.request.RequestInfo;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author:dxfeng
@ -63,15 +66,27 @@ public class UpdateInterviewModeExpand extends AbstractModeExpandJavaCodeNew {
switch (operateTypeEnum) {
case EVALUATE:
// 面试评价
messageType = RecruitModeUtil.getRecruitPropValue("INTERVIEW_MESSAGE_TYPE");
title = RecruitModeUtil.getRecruitPropValue("INTERVIEW_EVALUATE_MESSAGE_TITLE");
messageType = RecruitConstant.INTERVIEW_MESSAGE_TYPE;
title = RecruitConstant.INTERVIEW_EVALUATE_MESSAGE_TITLE;
evaluateInterview(params, requestInfo.getCreatorid(), mainDataMap);
break;
case CANCEL:
// 面试取消
messageType = RecruitModeUtil.getRecruitPropValue("INTERVIEW_MESSAGE_TYPE");
title = RecruitModeUtil.getRecruitPropValue("INTERVIEW_CANCEL_MESSAGE_TITLE");
messageType = RecruitConstant.INTERVIEW_MESSAGE_TYPE;
title = RecruitConstant.INTERVIEW_CANCEL_MESSAGE_TITLE;
cancelInterView(params, requestInfo, billId, mainDataMap);
// 发送邮件
InterviewMsgUtil.sendEmailAndMsg(mainDataMap, billId, false);
break;
case ADJUSTMENT:
messageType = RecruitConstant.INTERVIEW_MESSAGE_TYPE;
title = RecruitConstant.INTERVIEW_ADJUSTMENT_MESSAGE_TITLE;
// 发送消息提醒
adjustmentInterView(requestInfo.getCreatorid(), mainDataMap);
boolean needFeedback = "1".equals(Util.null2String(mainDataMap.get("sfxyfk")));
// 发送邮件同安排面试
InterviewMsgUtil.sendEmailAndMsg(mainDataMap, billId, needFeedback);
// 更新反馈状态为未反馈
break;
default:
break;
@ -160,5 +175,31 @@ public class UpdateInterviewModeExpand extends AbstractModeExpandJavaCodeNew {
}
/**
* 调整面试拓展动作
*
* @param creator creator
* @param mainDataMap mainDataMap
*/
private void adjustmentInterView(String creator, Map<String, Object> mainDataMap) {
// 发送消息
String msg = Util.null2String(mainDataMap.get("msg"));
String ptmsg = Util.null2String(mainDataMap.get("ptmsg"));
String msgContent = "您有一条面试已调整,调整后的面试信息如下:<br/>" +
"应聘者:$ypz$;应聘职位:$ypzw$<br/>" +
"面试官:$msg$;陪同面试官:$ptmsg$<br/>" +
"面试时间:$msrq$;面试方式:$msfs$<br/>" +
"面试地址:$msdd$";
// 消息发送
Set<String> userIdSet = new HashSet<>();
userIdSet.addAll(Arrays.asList(msg.split(",")));
userIdSet.addAll(Arrays.asList(ptmsg.split(",")));
List<Formfield> fieldList = RecruitModeUtil.getFieldList(MODE_TABLE_NAME);
Map<String, Formfield> fieldMap = fieldList.stream().collect(Collectors.toMap(Formfield::getFieldname, item -> item, (k1, k2) -> k1));
String msgStr = RecruitModeUtil.getMsgReplaceStr(msgContent, fieldMap, mainDataMap);
RecruitModeUtil.messagePush(messageType, title, msgStr, userIdSet, Integer.parseInt(creator));
}
}

View File

@ -1,5 +1,6 @@
package weaver.formmode.recruit.modeexpand.offer;
import com.engine.recruit.constant.RecruitConstant;
import com.engine.recruit.enums.RecordOperateEnum;
import com.engine.recruit.util.RecruitMessageUtils;
import com.weaver.formmodel.data.model.Formfield;
@ -59,8 +60,7 @@ public class CreateOfferModeExpand extends AbstractModeExpandJavaCodeNew {
List<Formfield> fieldList = RecruitModeUtil.getFieldList("uf_jcl_offer");
Map<String, List<Formfield>> fieldMapList = fieldList.stream().collect(Collectors.groupingBy(Formfield::getLabelName));
// 发送邮件
String offerMobileUrl = RecruitModeUtil.getRecruitPropValue("OFFER_MOBILE_URL");
offerMobileUrl += "&billid=" + billId + "&dzyx=" + yx;
String offerMobileUrl = RecruitConstant.OFFER_MOBILE_URL + "&billid=" + billId + "&dzyx=" + yx;
String mobileLink = "<span color='red'><a href='" + offerMobileUrl + "' target='_blank'>录用通知函</a></span>";
tznr = tznr.replace("{录用通知函}", mobileLink);
String msgContent = RecruitModeUtil.getReplaceContent(tznr, fieldMapList, mainDataMap);

View File

@ -1,9 +1,15 @@
package weaver.formmode.recruit.modeexpand.position;
import com.alibaba.fastjson.JSON;
import com.engine.recruit.thread.SdkResumeSavedThread;
import com.weaver.rpa.sdk.clients.application.resume.ERPAResumeSDKClient;
import com.weaver.rpa.sdk.clients.core.ERPASDKClients;
import com.weaver.rpa.sdk.clients.core.entity.SDKCore;
import com.weaver.rpa.sdk.clients.core.utils.ERPASDKInitUtils;
import org.apache.commons.lang3.StringUtils;
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.customjavacode.AbstractModeExpandJavaCodeNew;
import weaver.general.BaseBean;
import weaver.general.Util;
@ -23,8 +29,9 @@ public class ClosePositionModeExpand extends AbstractModeExpandJavaCodeNew {
@Override
public Map<String, String> doModeExpand(Map<String, Object> param) {
String tableName = "uf_jcl_zp_zpzw";
BaseBean baseBean = new BaseBean();
Map<String, String> result = new HashMap<>(16);
Map<String, String> resultMap = new HashMap<>(16);
try {
User user = (User) param.get("user");
int billId;
@ -35,30 +42,85 @@ public class ClosePositionModeExpand extends AbstractModeExpandJavaCodeNew {
modeId = Util.getIntValue(requestInfo.getWorkflowid());
if (billId > 0 && modeId > 0) {
RecordSet rs = new RecordSet();
rs.executeQuery("select qllgwid from " + tableName + " where id = ?", billId);
if (rs.next()) {
String qllgwid = rs.getString("qllgwid");
if (StringUtils.isBlank(qllgwid)) {
new BaseBean().writeLog("billId=" + billId + ",当前职位暂未发布,无需进行下架操作");
result.put("errmsg", "当前职位暂未发布,无需进行下架操作");
result.put("flag", "false");
return result;
// 判断是否配置千里聆若未配置千里聆信息则不执行下架职位操作只更新状态
if (checkUseQll()) {
rs.executeQuery("select qllgwid from " + tableName + " where id = ?", billId);
if (rs.next()) {
String qllgwid = rs.getString("qllgwid");
if (StringUtils.isBlank(qllgwid)) {
baseBean.writeLog("billId=" + billId + ",当前职位暂未发布,无需进行下架操作");
resultMap.put("errmsg", "当前职位暂未发布,无需进行下架操作");
resultMap.put("flag", "false");
return resultMap;
}
long jobId = Long.parseLong(qllgwid);
ERPAResumeSDKClient client = ERPASDKClients.getResumeSDKClient();
// 在启动监听前需要配置好简历接收回调
client.addResumeSavedListener(resumeMqMessage -> {
// 处理获取到的简历信息
baseBean.writeLog("【简历接收回调】:" + JSON.toJSONString(resumeMqMessage));
Thread thread = new Thread(new SdkResumeSavedThread(resumeMqMessage));
thread.start();
});
client.start();
String userId = String.valueOf(user.getUID());
ResumeTaskResult result = client.closeResumeJob(userId, jobId);
String errorMsg = "";
TaskResult current = result.getResult();
baseBean.writeLog(current);
// 使用回调函数获取成功或者失败时的消息
result.onResult(() -> {
baseBean.writeLog("执行成功回调");
}, (reason) -> {
baseBean.writeLog("执行失败回调,原因:" + reason);
});
// 等待直到状态不再是PENDING
TaskResult taskResult = result.waitResult();
baseBean.writeLog(taskResult);
if (taskResult == TaskResult.SUCCEED) {
baseBean.writeLog("执行成功");
} else {
errorMsg = "执行失败,原因:" + result.getFailReason();
baseBean.writeLog("执行失败,原因:" + result.getFailReason());
}
if (StringUtils.isBlank(errorMsg)) {
rs.executeUpdate("update " + tableName + " set qdfbzt = ? where id = ?", 5, billId);
} else {
resultMap.put("errmsg", errorMsg);
resultMap.put("flag", "false");
return resultMap;
}
}
long jobId = Long.parseLong(qllgwid);
ERPAResumeSDKClient client = ERPASDKClients.getResumeSDKClient();
client.start();
String userId = String.valueOf(user.getUID());
client.closeResumeJob(userId, jobId);
rs.executeUpdate("update " + tableName + " set qdfbzt = ? where id = ?", 5, billId);
}
// 更新招聘状态为招聘结束
rs.executeUpdate("update " + tableName + " set zpzt = ? where id = ?", 1, billId);
}
}
} catch (Exception e) {
new BaseBean().writeLog(e);
result.put("errmsg", e.getMessage());
result.put("flag", "false");
baseBean.writeLog(e);
resultMap.put("errmsg", e.getMessage());
resultMap.put("flag", "false");
}
return result;
return resultMap;
}
/**
* 校验是否配置千里聆
*
* @return
*/
private boolean checkUseQll() {
boolean used;
try {
SDKCore sdkCore = ERPASDKInitUtils.genSDKCore();
used = sdkCore != null;
} catch (Exception e) {
used = false;
}
return used;
}
}

View File

@ -0,0 +1,47 @@
package weaver.formmode.recruit.modeexpand.position;
import weaver.conn.RecordSet;
import weaver.formmode.customjavacode.AbstractModeExpandJavaCodeNew;
import weaver.general.BaseBean;
import weaver.general.Util;
import weaver.soa.workflow.request.RequestInfo;
import java.util.HashMap;
import java.util.Map;
/**
* @author:dxfeng
* @createTime: 2024/03/14
* @version: 1.0
*/
public class OpenPositionModeExpand extends AbstractModeExpandJavaCodeNew {
@Override
public Map<String, String> doModeExpand(Map<String, Object> param) {
String tableName = "uf_jcl_zp_zpzw";
BaseBean baseBean = new BaseBean();
Map<String, String> resultMap = new HashMap<>(16);
try {
int billId;
int modeId;
RequestInfo requestInfo = (RequestInfo) param.get("RequestInfo");
if (requestInfo != null) {
billId = Util.getIntValue(requestInfo.getRequestid());
modeId = Util.getIntValue(requestInfo.getWorkflowid());
if (billId > 0 && modeId > 0) {
RecordSet rs = new RecordSet();
// 更新招聘状态为招聘中
rs.executeUpdate("update " + tableName + " set zpzt = ? where id = ?", 0, billId);
}
}
} catch (Exception e) {
baseBean.writeLog(e);
resultMap.put("errmsg", e.getMessage());
resultMap.put("flag", "false");
}
return resultMap;
}
}

View File

@ -3,9 +3,10 @@ package weaver.formmode.recruit.modeexpand.position;
import com.alibaba.fastjson.JSON;
import com.engine.recruit.thread.SdkResumeSavedThread;
import com.weaver.rpa.sdk.clients.application.resume.ERPAResumeSDKClient;
import com.weaver.rpa.sdk.clients.application.resume.entity.ResumeJobDto;
import com.weaver.rpa.sdk.clients.application.resume.entity.ResumeJobV2Dto;
import com.weaver.rpa.sdk.clients.core.ERPASDKClients;
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;
@ -34,6 +35,7 @@ public class ReleasePositionModeExpand extends AbstractModeExpandJavaCodeNew {
String tableName = "uf_jcl_zp_zpzw";
Map<String, String> resultMap = new HashMap<>(16);
BaseBean baseBean = new BaseBean();
try {
User user = (User) param.get("user");
int billId;
@ -59,10 +61,10 @@ public class ReleasePositionModeExpand extends AbstractModeExpandJavaCodeNew {
for (Property property : properties) {
map.put(property.getName(), property.getValue());
}
ResumeJobDto resumeJobDto = RecruitPositionUtil.convertMap2ResumeJobDto(map);
ResumeJobV2Dto resumeJobDto = RecruitPositionUtil.convertMap2ResumeJobV2Dto(map);
// 发布千里聆职位
if (!RecruitPositionUtil.checkAvailable(client)) {
new BaseBean().writeLog("千里聆未开通简历应用。");
baseBean.writeLog("千里聆未开通简历应用。");
resultMap.put("errmsg", "千里聆未开通简历应用。");
resultMap.put("flag", "false");
return resultMap;
@ -70,16 +72,25 @@ public class ReleasePositionModeExpand extends AbstractModeExpandJavaCodeNew {
String userId = String.valueOf(user.getUID());
// 未创建职位则先创建职位
if (jobId == -1) {
baseBean.writeLog("【创建职位】,[id=" + billId + "],resumeJobDto=" + JSON.toJSONString(resumeJobDto));
// 创建千里聆职位
jobId = client.addResumeJob(userId, resumeJobDto);
jobId = client.addResumeJobV2(userId, resumeJobDto);
// 更新千里聆ID到建模表单
rs.executeUpdate("update " + tableName + " set qllgwid = ? where id = ?", jobId, billId);
} else {
baseBean.writeLog("【更新职位】,[id=" + billId + "],[qllgwid=" + jobId + "],resumeJobDto=" + JSON.toJSONString(resumeJobDto));
// 已发布的职位更新职位信息
client.editResumeJobV2(userId, jobId, jobDto -> {
new BaseBean().writeLog("职位更新前:" + JSON.toJSONString(jobDto));
BeanUtils.copyProperties(resumeJobDto,jobDto);
new BaseBean().writeLog("职位更新后:" + JSON.toJSONString(jobDto));
});
}
// 在启动监听前需要配置好简历接收回调
client.addResumeSavedListener(resumeMqMessage -> {
// 处理获取到的简历信息
new BaseBean().writeLog("【简历接收回调】:" + JSON.toJSONString(resumeMqMessage));
baseBean.writeLog("【简历接收回调】:" + JSON.toJSONString(resumeMqMessage));
Thread thread = new Thread(new SdkResumeSavedThread(resumeMqMessage));
thread.start();
});
@ -87,28 +98,28 @@ public class ReleasePositionModeExpand extends AbstractModeExpandJavaCodeNew {
client.start();
List<Integer> platformIds;
platformIds = resumeJobDto.getPlatformIds();
platformIds = resumeJobDto.getPlatformList();
String errorMsg = "";
for (Integer platformId : platformIds) {
ResumeTaskResult result = client.releaseResumeJob(userId, jobId, platformId);
// 直接查看结果正在执行中会返回PENGING成功后会返回SUCCEED失败后会返回FAILED
TaskResult current = result.getResult();
new BaseBean().writeLog(current);
baseBean.writeLog(current);
// 使用回调函数获取成功或者失败时的消息
result.onResult(() -> {
new BaseBean().writeLog("执行成功回调");
baseBean.writeLog("执行成功回调");
}, (reason) -> {
new BaseBean().writeLog("执行失败回调,原因:" + reason);
baseBean.writeLog("执行失败回调,原因:" + reason);
});
// 等待直到状态不再是PENDING
TaskResult taskResult = result.waitResult();
new BaseBean().writeLog(taskResult);
baseBean.writeLog(taskResult);
if (taskResult == TaskResult.SUCCEED) {
new BaseBean().writeLog("执行成功");
baseBean.writeLog("执行成功");
} else {
errorMsg = "执行失败,原因:" + result.getFailReason();
new BaseBean().writeLog(errorMsg);
baseBean.writeLog(errorMsg);
break;
}
}
@ -127,7 +138,7 @@ public class ReleasePositionModeExpand extends AbstractModeExpandJavaCodeNew {
}
}
} catch (Exception e) {
new BaseBean().writeLog(e);
baseBean.writeLog(e);
resultMap.put("errmsg", e.getMessage());
resultMap.put("flag", "false");
}

View File

@ -37,14 +37,14 @@ public class StageDataInsert {
// modedatacreatetime
paramsList.add(dateSplit[1]);
// modedatamodifier
paramsList.add(null);
//paramsList.add(null);
// modedatamodifydatetime
paramsList.add(null);
//paramsList.add(null);
// modedatacreatertype
paramsList.add("0");
String processIdsStr = StringUtils.join(Arrays.asList(processIds), ",");
String insertSql = "insert into uf_jcl_zpjdsz (modeuuid, modedatacreater, modedatacreatedate, modedatacreatetime, modedatamodifier, modedatamodifydatetime, modedatacreatertype, formmodeid, jdmc, jdms, jdlx, hj, sfqy, zssx, zpjd, " + relateField + ") values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
String insertSql = "insert into uf_jcl_zpjdsz (modeuuid, modedatacreater, modedatacreatedate, modedatacreatetime, modedatacreatertype, formmodeid, jdmc, jdms, jdlx, hj, sfqy, zssx, zpjd, " + relateField + ") values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
if (StringUtils.isNotBlank(processIdsStr)) {
insertMainTableData(creator, billId, processIdsStr, insertSql, paramsList);
}

View File

@ -24,11 +24,9 @@ import weaver.hrm.resource.ResourceComInfo;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
* @author:dxfeng
@ -36,7 +34,15 @@ import java.util.stream.Collectors;
* @version: 1.0
*/
public class RecruitModeUtil {
private static final Pattern MSG_PATTERN = Pattern.compile(Pattern.quote("{") + "(.*?)" + Pattern.quote("}"));
/**
* 邮件短信发送替换内容正则表达式
*/
private static final Pattern EMAIL_PATTERN = Pattern.compile(Pattern.quote("{") + "(.*?)" + Pattern.quote("}"));
/**
* 消息中心替换内容正则表达式
*/
private static final Pattern MSG_PATTERN = Pattern.compile(Pattern.quote("$") + "(.*?)" + Pattern.quote("$"));
/**
* 消息推送
@ -87,17 +93,6 @@ public class RecruitModeUtil {
}
}
/**
* 获取聚才林招聘相关配置文件
*
* @param key key
* @return value
*/
public static String getRecruitPropValue(String key) {
String value = new BaseBean().getPropValue("jclRecruit", key);
value = new String(value.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
return value;
}
/**
* 转换空字符串为null
@ -146,13 +141,13 @@ public class RecruitModeUtil {
return FormInfoManager.getInstance().getAllField(formId);
}
public static String getFieldShowName(Formfield formfield, String fieldName) {
public static String getFieldShowName(Formfield formfield, String fieldValue) {
User user = new User(1);
return FieldHandler.getFieldValue(fieldName, formfield, true, user);
return FieldHandler.getFieldValue(fieldValue, formfield, true, user);
}
public static String getReplaceContent(String content, Map<String, List<Formfield>> fieldMapList, Map<String, Object> paramsData) {
Matcher matcher = MSG_PATTERN.matcher(content);
Matcher matcher = EMAIL_PATTERN.matcher(content);
// 指定要匹配的字符串
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
@ -172,6 +167,30 @@ public class RecruitModeUtil {
return sb.toString();
}
/**
* 消息中心替换消息内容
*
* @param content
* @param fieldMap
* @param paramsData
* @return
*/
public static String getMsgReplaceStr(String content, Map<String, Formfield> fieldMap, Map<String, Object> paramsData) {
Matcher matcher = MSG_PATTERN.matcher(content);
// 指定要匹配的字符串
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
String replace = matcher.group(1);
Formfield formfield = fieldMap.get(replace);
String replaceValue = Util.null2String(paramsData.get(formfield.getFieldname().toLowerCase()));
String fieldShowName = RecruitModeUtil.getFieldShowName(formfield, replaceValue).replaceAll("<[^>]*>", "");
matcher.appendReplacement(sb, Util.null2String(fieldShowName));
}
matcher.appendTail(sb);
return sb.toString();
}
/**
* 附件imageFieldId生成docId
*
@ -266,51 +285,6 @@ public class RecruitModeUtil {
return StringUtils.join(imageFileIds, ",");
}
/**
* @Author ml
* @Date 2023/10/23 18:21
* @Description 根据建模表名称获取列名称
* @Param [tableName]
* @Return Map<Object, List < Map < String, Object>>>
*/
public static Map<String, Object> getModeColumns(String tableName) {
RecordSet rs = new RecordSet();
List<Map<String, String>> mapList = new ArrayList<>();
Map<String, String> tmpMap = new HashMap<>(16);
rs.executeQuery("select b.FIELDNAME,b.VIEWTYPE from workflow_bill a left join workflow_billfield b on a.id = b.BILLID where a.TABLENAME = ?", tableName);
while (rs.next()) {
tmpMap.put("fieldname", rs.getString("FIELDNAME"));
tmpMap.put("viewtype", rs.getString("VIEWTYPE"));
mapList.add(tmpMap);
}
Map<String, List<Map<String, String>>> dataMap = mapList.stream().collect(Collectors.groupingBy(item -> item.get("viewtype")));
Map<String, Object> resMap = new HashMap<>();
for (String key : dataMap.keySet()) {
resMap.put(key, dataMap.get(key).stream().map(Map -> Map.get("fieldname")).collect(Collectors.toList()));
}
return resMap;
}
public static String getQuerySql(String tableName) {
Map<String, Object> params = getModeColumns(tableName);
String fieldSql = "";
StringBuilder whereSql = new StringBuilder();
whereSql.append(tableName).append(" t0");
for (String key : params.keySet()) {
List<String> oldlist = (List<String>) params.get(key);
List<String> list = new ArrayList<>();
oldlist.forEach(field -> list.add("t" + key + "." + field));
fieldSql = StringUtils.join(list, ",");
if ("0".equals(key)) {
continue;
}
whereSql.append(" left join ").append(tableName).append("_dt").append(key).append(" ").append("t").append(key).append(" on t0.id=").append("t").append(key).append(".mainid");
}
return "select " + fieldSql + " from " + whereSql + " where t0.id=?";
}
/**
* 获取邮件模板主题
*

View File

@ -7,10 +7,13 @@ import com.engine.recruit.enums.PositionThirdChannelEnum;
import com.engine.recruit.exception.CustomizeRunTimeException;
import com.weaver.rpa.sdk.clients.application.resume.ERPAResumeSDKClient;
import com.weaver.rpa.sdk.clients.application.resume.common.ResumePlatform;
import com.weaver.rpa.sdk.clients.application.resume.entity.ResumeJobDto;
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.utils.HttpClientUtils;
import org.apache.commons.lang3.StringUtils;
import weaver.conn.RecordSet;
import weaver.general.BaseBean;
import weaver.general.Util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
@ -26,26 +29,43 @@ import java.util.*;
public class RecruitPositionUtil {
/**
* 将Map转换成ResumeJobDto对象
* 将Map转换成ResumeJobV2Dto对象
*
* @param map 数据集合
* @return ResumeJobDto对象
* @return ResumeJobV2Dto
*/
public static ResumeJobDto convertMap2ResumeJobDto(Map<String, Object> map) {
String positionName = Convert.toStr(map.get("zpzwmc"));//职位名称
String positionDuty = Convert.toStr(map.get("gwzz"));//职位职责
String finishTime = Convert.toStr(map.get("zpjzrq"));//完成时间
String education = ApplicantCommonInfo.getRecruitCommonBrowserValue(Convert.toStr(map.get("zdxlyq")));//学历要求
String workYears = ApplicantCommonInfo.getRecruitCommonBrowserValue(Convert.toStr(map.get("gznx")));//工作年限
String positionNature = ApplicantCommonInfo.getRecruitCommonBrowserValue(Convert.toStr(map.get("zwxz")));//职位性质
Integer salaryMin = Convert.toInt(map.get("zdxzk"), 0);//最低薪酬
Integer salaryMax = Convert.toInt(map.get("zgxzk"), 0);// 最高薪酬
Integer xcyfs = Convert.toInt(map.get("xzyfs"), 12);// 薪酬月份数
Integer workingDays = Convert.toInt(map.get("sxmzdgts"), 1);// 实习每周到岗天数
Integer internshipDuration = Convert.toInt(map.get("sxscy"), 1);// 实习时长
String jobCategory = "不限";//职位类别
public static ResumeJobV2Dto convertMap2ResumeJobV2Dto(Map<String, Object> map) {
// 职位名称
String positionName = Convert.toStr(map.get("zpzwmc"));
// 职位职责
String positionDuty = Convert.toStr(map.get("gwzz"));
// 任职要求
String jobRequirements = Convert.toStr(map.get("rzyq"));
// 完成时间
String finishTime = Convert.toStr(map.get("zpjzrq"));
// 学历要求
String education = ApplicantCommonInfo.getRecruitCommonBrowserValue(Convert.toStr(map.get("zdxlyq")));
// 工作年限
String workYears = ApplicantCommonInfo.getRecruitCommonBrowserValue(Convert.toStr(map.get("gznx")));
// 职位性质
String positionNature = ApplicantCommonInfo.getRecruitCommonBrowserValue(Convert.toStr(map.get("zwxz")));
// 最低薪酬
Integer salaryMin = Convert.toInt(map.get("zdxzk"), 0);
// 最高薪酬
Integer salaryMax = Convert.toInt(map.get("zgxzk"), 0);
// 薪酬月份数
Integer xcyfs = Convert.toInt(map.get("xzyfs"), 12);
// 实习每周到岗天数
Integer workingDays = Convert.toInt(map.get("sxmzdgts"), 1);
// 实习时长
Integer internshipDuration = Convert.toInt(map.get("sxscy"), 1);
// 招聘人数
Integer zprs = Convert.toInt(map.get("zprs"), 1);
// 职位类别
String jobCategory = "不限";
int experienceValue = -1;//不限
//不限
int experienceValue = -1;
if ("应届毕业生".equals(workYears)) {
experienceValue = 1;
} else if ("一年以内".equals(workYears)) {
@ -61,7 +81,8 @@ public class RecruitPositionUtil {
}
int educationValue = -1; //不限
//不限
int educationValue = -1;
if ("博士".equals(education)) {
educationValue = 8;
} else if ("MBA/EMBA".equals(education)) {
@ -80,7 +101,8 @@ public class RecruitPositionUtil {
educationValue = 1;
}
int resumeType = 1;// 兼职全职
// 社招全职兼职其他
int resumeType = 1;
if ("实习".equals(positionNature)) {
resumeType = 3;
} else if ("校招".equals(positionNature)) {
@ -89,44 +111,151 @@ public class RecruitPositionUtil {
// 招聘职位类型与特殊设置字段
ResumeJobDto resumeJobDto = new ResumeJobDto();
resumeJobDto.setResumeType(resumeType); // (必填,默认社招)招聘类型 1:社招 2:校招 3:实习
ResumeJobV2Dto resumeJobV2Dto = new ResumeJobV2Dto();
// (必填,默认社招)招聘类型 1:社招 2:校招 3:实习
resumeJobV2Dto.setResumeType(resumeType);
if (2 == resumeType && StringUtils.isBlank(finishTime)) {
throw new CustomizeRunTimeException("校招招聘截止时间必填");
}
resumeJobDto.setStopReumeTimeLong(stringTurnLong(finishTime));// (校招必填)仅校招: 招聘截止时间(时间戳)
resumeJobDto.setRequirementsTime(internshipDuration); // (实习必填,默认1个月)仅实习: 实习时长 1~12 单位:()
resumeJobDto.setWorkDate(workingDays); // (实习必填,默认1天)仅实习: 每周到岗天数 1~7 单位:()
// (校招必填)仅校招: 招聘截止时间(时间戳)
resumeJobV2Dto.setStopReumeTimeLong(stringTurnLong(finishTime));
// (实习必填,默认1个月)仅实习: 实习时长 1~12 单位:()
resumeJobV2Dto.setRequirementsTime(internshipDuration);
// (实习必填,默认1天)仅实习: 每周到岗天数 1~7 单位:()
resumeJobV2Dto.setWorkDate(workingDays);
// 招聘职位基本描述
resumeJobDto.setJobname(positionName); // 配置职位名称
resumeJobDto.setJobdesc(positionDuty); // 配置职位描述
resumeJobDto.setJobType(jobCategory); // 配置职位类别
// 配置职位名称
resumeJobV2Dto.setJobname(positionName);
String jobDescription = "";
if (StringUtils.isNotBlank(positionDuty)) {
jobDescription += "职位职责:\n" + positionDuty + "\n\n";
}
if (StringUtils.isNotBlank(jobRequirements)) {
jobDescription += "任职要求:\n" + jobRequirements;
}
// 配置职位描述
resumeJobV2Dto.setJobdesc(jobDescription);
// 配置职位类别
List<ResumeJobDynamicField.Item> items = new ArrayList<>();
ResumeJobDynamicField.Item item = new ResumeJobDynamicField.Item();
item.setLabel("0");
item.setValue(jobCategory);
resumeJobV2Dto.setJobType(items);
// 招聘职位条件
//resumeJobDto.setKeywordStr(Lists.newArrayList("java")); // 职位关键词
resumeJobDto.setExperience(experienceValue); // (必填,默认不限)经验要求(实习无此字段) -1:不限 1:一年以下 2:1~3年 3:3~5年 5:5~10年 6:10年以上
resumeJobDto.setEducation(educationValue); // (必填,默认不限)学历要求 -1:不限 1:初中及以下 2:高中 3:中专/中技 4:大专 5:本科 6:硕士 7:MBA/EMBA 8:博士
// (必填,默认不限)经验要求(实习无此字段) -1:不限 1:一年以下 2:1~3年 3:3~5年 5:5~10年 6:10年以上
resumeJobV2Dto.setExperience(experienceValue);
// (必填,默认不限)学历要求 -1:不限 1:初中及以下 2:高中 3:中专/中技 4:大专 5:本科 6:硕士 7:MBA/EMBA 8:博士
resumeJobV2Dto.setEducation(educationValue);
//薪资福利
resumeJobDto.setExpectSalaryStart(salaryMin); // (必填)薪资范围开始 单位:(社招/校招: 千元/ 实习:/)
resumeJobDto.setExpectSalaryStop(salaryMax); // (必填)薪资范围截止 单位:(社招/校招: 千元/ 实习:/)
resumeJobDto.setExpectSalaryMonth(xcyfs); // (必填,默认12个月)薪资月份数(实习无此字段) 1224
// (必填)薪资范围开始 单位:(社招/校招: 千元/ 实习:/)
resumeJobV2Dto.setExpectSalaryStart(salaryMin);
// (必填)薪资范围截止 单位:(社招/校招: 千元/ 实习:/)
resumeJobV2Dto.setExpectSalaryStop(salaryMax);
// (必填,默认12个月)薪资月份数(实习无此字段) 1224
resumeJobV2Dto.setExpectSalaryMonth(xcyfs);
// (必填)要发布的渠道平台Id
List<Integer> platformIds = matchPlatform(Convert.toStr(map.get("dsfqd")));
resumeJobDto.setPlatformIds(platformIds);
resumeJobV2Dto.setPlatformList(platformIds);
// 简历匹配度设置
resumeJobDto.setMappingageStart(-1); // (必填,默认不限)匹配年龄age开始 -1:不限
resumeJobDto.setMappingageStop(-1);// (必填,默认不限)匹配年龄age开始 -1:不限
resumeJobDto.setMappingSex(-1);// (必填,默认不限)匹配性别 -1:不限 0: 1:
resumeJobDto.setMappingeducationStr(Collections.singletonList(-1));// (必填,默认不限)匹配学历 -1:不限 1:初中及以下 2:高中 3:中专/中技 4:大专 5:本科 6:硕士 7:MBA/EMBA 8:博士
resumeJobDto.setMappingexperienceStr(Collections.singletonList(-1));// (必填,默认不限)匹配经验 -1:不限 1:1年内 2:1~3年 3:3~5年 4:5~10年 5:10年以上
// resumeJobDto.setMappingKeywordStr(Lists.newArrayList()); // 匹配关键词内容
resumeJobDto.setMappingStatus(1); // (必填,默认任一命中)匹配模式 1:任一命中 2:全部命中
// (必填,默认不限)匹配年龄age开始 -1:不限
resumeJobV2Dto.setMappingageStart(-1);
// (必填,默认不限)匹配年龄age开始 -1:不限
resumeJobV2Dto.setMappingageStop(-1);
// (必填,默认不限)匹配性别 -1:不限 0: 1:
resumeJobV2Dto.setMappingSex(-1);
// (必填,默认不限)匹配学历 -1:不限 1:初中及以下 2:高中 3:中专/中技 4:大专 5:本科 6:硕士 7:MBA/EMBA 8:博士
resumeJobV2Dto.setMappingeducationStr(Collections.singletonList(-1));
// (必填,默认不限)匹配经验 -1:不限 1:1年内 2:1~3年 3:3~5年 4:5~10年 5:10年以上
resumeJobV2Dto.setMappingexperienceStr(Collections.singletonList(-1));
return resumeJobDto;
String zwgjc = Util.null2String(map.get("zwgjc"));
List<String> zwgjcList = new ArrayList<>();
if (StringUtils.isNotBlank(zwgjc)) {
zwgjcList.addAll(Arrays.asList(zwgjc.split("")));
}
// 匹配关键词内容
resumeJobV2Dto.setMappingKeywordStr(zwgjcList);
// 职位关键词
resumeJobV2Dto.setKeywordStr(zwgjcList);
// (必填,默认任一命中)匹配模式 1:任一命中 2:全部命中
resumeJobV2Dto.setMappingStatus(1);
resumeJobV2Dto.setBizVersion(1);
// 海外经历 ["海外工作经历", "海外教育背景"]
List<String> hwjlList = new ArrayList<>();
String hwjl = Util.null2String(map.get("hwjl"));
if (StringUtils.isNotBlank(hwjl)) {
String[] split = hwjl.split(",");
List<String> strings = Arrays.asList(split);
if (strings.contains("0")) {
hwjlList.add("海外工作经历");
}
if (strings.contains("1")) {
hwjlList.add("海外教育背景");
}
}
resumeJobV2Dto.setHwjl(hwjlList);
/*
*BOSS直聘必填字段
*/
// 毕业时间-开始 boss校招必填
String bysjks = Util.null2String(map.get("bysjks"));
resumeJobV2Dto.setBysjStart(bysjks);
// 毕业时间-结束 boss校招必填
String bysjjs = Util.null2String(map.get("bysjjs"));
resumeJobV2Dto.setBysjEnd(bysjjs);
/*
* 前程无忧必填
*/
// 发布城市
List<String> cityList = new ArrayList<>();
String fbcs = Util.null2String(map.get("fbcs"));
RecordSet rs = new RecordSet();
rs.executeQuery("select cityname from hrmcity where id = ?", fbcs);
if (rs.next()) {
String cityName = rs.getString("cityname");
cityList.add(cityName);
}
resumeJobV2Dto.setFbcs(cityList);
// 所属行业
String sshy = Util.null2String(map.get("szhy"));
List<String> sshyList = new ArrayList<>();
if (StringUtils.isNotBlank(sshy)) {
sshyList.addAll(Arrays.asList(sshy.split("")));
}
resumeJobV2Dto.setSshy(Collections.singletonList(sshyList));
/*
* 猎聘必填 智联必填
*/
// 招聘人数
resumeJobV2Dto.setZprs(zprs);
/*
* 拉勾必填
*/
// 职位亮点
resumeJobV2Dto.setZwld(Util.null2String(map.get("zwld")));
// 行业领域
String hyly = Util.null2String(map.get("hyly"));
List<String> hylyList = new ArrayList<>();
if (StringUtils.isNotBlank(hyly)) {
hylyList.addAll(Arrays.asList(hyly.split("")));
}
resumeJobV2Dto.setHyly(hylyList);
return resumeJobV2Dto;
}
/**

View File

@ -1,5 +1,6 @@
package weaver.formmode.recruit.modeexpand.written;
import com.engine.recruit.conn.ApplicantCommonInfo;
import com.engine.recruit.conn.RecruitRecordSet;
import com.engine.recruit.util.RecruitMessageUtils;
import com.weaver.formmodel.data.model.Formfield;
@ -33,12 +34,8 @@ public class BatchAddWrittenResultModeExpand extends AbstractModeExpandJavaCodeN
try {
RequestInfo requestInfo = (RequestInfo) param.get("RequestInfo");
if (requestInfo != null) {
int formModeId = -1;
RecordSet rs = new RecordSet();
rs.executeQuery("select id from modeinfo where formid =( select id from workflow_bill where tablename = ? )", MODE_TABLE_NAME);
if (rs.next()) {
formModeId = rs.getInt("id");
}
int formModeId = ApplicantCommonInfo.getModeIdByTableName(MODE_TABLE_NAME);
MainTableInfo mainTableInfo = requestInfo.getMainTableInfo();
Property[] properties = mainTableInfo.getProperty();
Map<String, Object> mainDataMap = new HashMap<>();

View File

@ -3,10 +3,10 @@ package weaver.interfaces.recruit.action;
import com.cloudstore.dev.api.bean.MessageBean;
import com.cloudstore.dev.api.bean.MessageType;
import com.cloudstore.dev.api.util.Util_Message;
import com.engine.recruit.conn.ApplicantCommonInfo;
import com.engine.recruit.conn.RecruitRecordSet;
import org.apache.commons.collections.CollectionUtils;
import weaver.common.DateUtil;
import weaver.conn.RecordSet;
import weaver.conn.RecordSetTrans;
import weaver.formmode.recruit.modeexpand.util.RecruitModeUtil;
import weaver.formmode.setup.ModeRightInfo;
@ -54,12 +54,7 @@ public class RecruitFlowToModeAction implements Action {
Map<String, Object> mainMap = new HashMap<>(16);
// 需求审批流程ID
mainMap.put("xqsplc", requestInfo.getRequestid());
int formModeId = -1;
RecordSet rs = new RecordSet();
rs.executeQuery("select id from modeinfo where formid =( select id from workflow_bill where tablename = ? )", MODE_TABLE_NAME);
if (rs.next()) {
formModeId = rs.getInt("id");
}
int formModeId = ApplicantCommonInfo.getModeIdByTableName(MODE_TABLE_NAME);
Property[] propertyArray = mainTableInfo.getProperty();
for (Property property : propertyArray) {
@ -131,7 +126,7 @@ public class RecruitFlowToModeAction implements Action {
rst.commit();
} catch (Exception e) {
rst.rollback();
new BaseBean().writeLog(e.getMessage());
new BaseBean().writeLog(e);
requestInfo.getRequestManager().setMessagecontent("接口动作【RecruitFlowToModeAction】执行异常");
return FAILURE_AND_CONTINUE;
}

View File

@ -0,0 +1,501 @@
package weaver.interfaces.recruit.cronjob;
import cn.hutool.core.convert.Convert;
import com.api.cube.util.CubeCipherUitl;
import com.engine.recruit.conn.ApplicantCommonInfo;
import com.engine.recruit.conn.RecruitDataMap;
import com.engine.recruit.conn.RecruitRecordSet;
import com.engine.recruit.constant.ModeSearchCodeConstant;
import com.engine.recruit.constant.RecruitConstant;
import com.engine.recruit.exception.CustomizeRunTimeException;
import org.apache.commons.lang3.StringUtils;
import weaver.common.DateUtil;
import weaver.conn.RecordSet;
import weaver.formmode.recruit.modeexpand.util.RecruitModeUtil;
import weaver.formmode.service.RemindJobService;
import weaver.formmode.task.TaskService;
import weaver.formmode.virtualform.VirtualFormHandler;
import weaver.general.BaseBean;
import weaver.general.Util;
import weaver.hrm.resource.ResourceComInfo;
import weaver.interfaces.schedule.BaseCronJob;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author:dxfeng
* @createTime: 2024/03/07
* @version: 1.0
*/
public class ResumePushJob extends BaseCronJob {
private final RemindJobService remindJobService = new RemindJobService();
private final String remindHistoryTable = "uf_jcl_jldy";
private String currentDate;
private String uuid;
private Map<Integer, Set<String>> checkRepeatMap;
private int remindHistoryModeId;
private String startDate;
private String endDate;
public ResumePushJob() {
}
public ResumePushJob(String startDate, String endDate) {
this.startDate = startDate;
this.endDate = endDate;
}
@Override
public void execute() {
BaseBean baseBean = new BaseBean();
baseBean.writeLog("简历订阅推送任务开始...");
currentDate = DateUtil.getFullDate();
uuid = UUID.randomUUID().toString();
checkRepeatMap = new HashMap<>();
String sql = "";
if (StringUtils.isNoneBlank(startDate, endDate)) {
sql = "select t1.* from uf_jcl_yppc t1 where t1.tdsj >= '" + startDate + "' and t1.tdsj <='" + endDate + "'";
} else {
Calendar calendar = Calendar.getInstance(Locale.CHINA);
Calendar limitDate = DateUtil.addMonth(calendar, -1);
Date time = limitDate.getTime();
String date = DateUtil.getDate(time);
// 推送规则针对一条简历订阅首次设置订阅规则且启用的筛选投递时间为一个月内的简历简历表后续为增量推送
sql = "select t1.* from uf_jcl_yppc t1 where t1.tdsj >= '" + date + "' ";
}
RecordSet rs = new RecordSet();
remindHistoryModeId = ApplicantCommonInfo.getModeIdByTableName(remindHistoryTable);
// 建模ID
int modeId = ApplicantCommonInfo.getModeIdByTableName("uf_jcl_yppc");
// 简历订阅规则设置,页面拓展ID
String pageExpand = "";
rs.executeQuery("select id from mode_pageexpand where modeid = ? and expendname = ?", modeId, "简历订阅规则设置");
if (rs.next()) {
pageExpand = rs.getString("id");
}
if (StringUtils.isBlank(pageExpand)) {
throw new CustomizeRunTimeException("未获取到对应的页面拓展配置信息");
}
// 查询所有的消息提醒类型的页面拓展
String taskSql = "select id from mode_timedtask_detail where isenable='1' and id in (select taskdetailid from mode_pageexpanddetail where interfacetype='5' and mainid=?)";
rs.executeQuery(taskSql, pageExpand);
List<Map<String, Object>> taskDetailList = RecruitRecordSet.getRecordMapList(rs);
Map<Integer, Integer> remindCountJob = new ConcurrentHashMap<>();
baseBean.writeLog("简历订阅推送任务生成列表数据...");
for (Map<String, Object> map : taskDetailList) {
String taskDetailId = Util.null2String(map.get("id"));
Map<String, Object> taskDetailMap = remindJobService.getTaskDetailById(Convert.toInt(taskDetailId));
String conditionsType = Util.null2String(taskDetailMap.get("conditionstype"));
String whereSql = "";
if ("1".equals(conditionsType)) {
whereSql = Util.null2String(taskDetailMap.get("conditionsfield"));
} else if ("2".equals(conditionsType)) {
whereSql = Util.null2String(taskDetailMap.get("conditionssql"));
}
rs.executeQuery(sql + (StringUtils.isNotBlank(whereSql) ? " and (" + whereSql + ")" : ""));
List<Map<String, Object>> recordMapList = RecruitRecordSet.getRecordMapList(rs);
for (Map<String, Object> recordMap : recordMapList) {
String billId = Util.null2String(recordMap.get("id"));
// 判断当前规则有无推送过这条数据同一规则不重复推送数据
boolean push = isPush(billId, taskDetailId);
if (!push) {
continue;
}
// 该规则推送的人员ID集合
Set<Integer> remindUserList = getRemindUserSet(taskDetailMap, billId);
// 统计每个人推送多少条数据
for (Integer remindUserId : remindUserList) {
// 插入订阅历史表数据
insertPushHistory(recordMap, remindUserId, remindCountJob);
}
}
}
// 简历订阅列表URL
String remindSearchLink = ApplicantCommonInfo.getCustomSearchLink(ModeSearchCodeConstant.RESUME_SUBSCRIPTION, RecruitConstant.REMIND_SEARCH_LINK);
if (StringUtils.isNotBlank(remindSearchLink)) {
remindSearchLink += "&uuid=" + uuid;
}
baseBean.writeLog("简历订阅推送任务发送消息提醒...");
// 给每个人推送当前规则的代办
for (Map.Entry<Integer, Integer> entry : remindCountJob.entrySet()) {
Integer key = entry.getKey();
Integer value = entry.getValue();
// 发送代办
Set<String> userIds = new HashSet<>(1);
userIds.add(Integer.toString(key));
RecruitModeUtil.messagePush(RecruitConstant.RECRUIT_MESSAGE_TYPE, "简历订阅推送提醒", "有{" + value.toString() + "}条简历推送给您,请查阅。", userIds, 1, remindSearchLink, "");
}
baseBean.writeLog("简历订阅推送任务结束...");
}
/**
* 插入订阅历史表数据
*
* @param recordMap
* @param remindUserId
* @param remindCountJob
*/
private void insertPushHistory(Map<String, Object> recordMap, Integer remindUserId, Map<Integer, Integer> remindCountJob) {
if (recordMap == null || recordMap.isEmpty()) {
return;
}
String billId = Util.null2String(recordMap.get("id"));
Set<String> hashSet = new HashSet<>();
if (checkRepeatMap.containsKey(remindUserId)) {
Set<String> containsSet = checkRepeatMap.get(remindUserId);
if (containsSet.contains(billId)) {
return;
}
hashSet.addAll(containsSet);
}
hashSet.add(billId);
checkRepeatMap.put(remindUserId, hashSet);
RecruitDataMap<Object> insertDataMap = new RecruitDataMap<>();
String modeUuid = UUID.randomUUID().toString();
insertDataMap.put("modeuuid", modeUuid);
insertDataMap.put("formmodeid", remindHistoryModeId);
RecruitRecordSet.buildModeInsertFields(insertDataMap, 1);
// 姓名
insertDataMap.put("xm", billId);
// 最近投递职位
insertDataMap.put("zjtdzw", recordMap.get("ypzw"));
// 性别
insertDataMap.put("xb", recordMap.get("xb"));
// 最高学历
insertDataMap.put("zgxl", recordMap.get("zgxl"));
// 工作经验
insertDataMap.put("gzjy", recordMap.get("gzjy"));
// 简历来源
insertDataMap.put("jlly", recordMap.get("jlly"));
// 推送时间
insertDataMap.put("tssj", currentDate);
// 接收人
insertDataMap.put("jsr", remindUserId);
// UUID
insertDataMap.put("uuid", uuid);
// 插入推送历史表
RecruitRecordSet.insertData(insertDataMap, remindHistoryTable);
// 权限重构
int id = RecruitRecordSet.refreshRight(modeUuid, remindHistoryTable, remindHistoryModeId, 1);
// 统计每个人推送多少条数据
if (id != -1) {
remindCountJob.merge(remindUserId, 1, Integer::sum);
}
}
/**
* 获取当前数据配置的提醒对象的ID集合
*
* @param remindJob
* @param billid
* @return
*/
private Set<Integer> getRemindUserSet(Map<String, Object> remindJob, String billid) {
String formtype = Util.null2String(remindJob.get("formtype"));
//字段id
String id = Util.null2String(remindJob.get("id"));
String modeid = Util.null2String(remindJob.get("modeid"));
//表单id
String formid = Util.null2String(remindJob.get("formid"));
TaskService taskService = new TaskService();
RecordSet rs = new RecordSet();
RecordSet rs2 = new RecordSet();
RecordSet rs3 = new RecordSet();
RecordSet rs4 = new RecordSet();
String tablename = "";
String sqlStr = "select b.tablename from modeinfo a,workflow_bill b where a.id=" + modeid + " and a.formid=b.id";
rs.executeQuery(sqlStr);
if (rs.next()) {
tablename = rs.getString("tablename");
}
// 判断是否为 虚拟表单;
boolean isvirtualform = VirtualFormHandler.isVirtualForm(formid);
String vdatasource = "";
String vprimarykey = "";
if (isvirtualform) {
Map<String, Object> vFormInfo = VirtualFormHandler.getVFormInfo(formid);
vdatasource = Util.null2String(vFormInfo.get("vdatasource"));
vprimarykey = Util.null2String(vFormInfo.get("vprimarykey"));
tablename = VirtualFormHandler.getRealFromName(tablename);
String vformtype = Util.null2String(vFormInfo.get("vformtype"));
String vsql = Util.null2String(vFormInfo.get("vsql"));
if ("2".equals(vformtype)) {
tablename = "(" + vsql + ")";
}
}
String sql;
if (!"0".equals(formtype) && !"".equals(formtype)) {
sql = "select t1.*,d1.id as subbillid from " + tablename + " t1 left join " + tablename + "_dt" + formtype + " d1 on t1.id = d1.mainid where t1.id=" + billid;
} else {
sql = " select * from " + tablename + " t1 where t1.id=" + billid;
if (isvirtualform) {
sql = " select * from " + tablename + " t1 where t1." + vprimarykey + "='" + billid + "'";
}
}
//检验条件
String sqlwhere = "";
String conditionstype = Util.null2String(remindJob.get("conditionstype"));
if ("1".equals(conditionstype)) {
//字段
String conditionsfield = Util.null2String(remindJob.get("conditionsfield"));
if (!"".equals(conditionsfield)) {
sqlwhere = " and (" + conditionsfield + ") ";
}
} else if ("2".equals(conditionstype)) {
//sql
String conditionssql = Util.null2String(remindJob.get("conditionssql"));
if (!"".equals(conditionssql)) {
sqlwhere = " and (" + conditionssql + ") ";
}
}
if (!"".equals(sqlwhere)) {
sql = sql + sqlwhere;
}
rs.isReturnDecryptData(true);
if (isvirtualform) {
rs.executeQuery(sql, vdatasource);
} else {
rs.executeQuery(sql);
}
Set<Integer> userSet = new HashSet<>();
String remind_rule_sql = "select * from remind_multi_ruleinfo where taskdetailid='" + id + "' order by receivertype,id ";
while (rs.next()) {
String subbillid = rs.getString("subbillid");
List<Integer> userList = new ArrayList<>();
rs3.execute(remind_rule_sql);
while (rs3.next()) {
String receivertype = rs3.getString("receivertype");
String receiverdetail = rs3.getString("receiverdetail");
String receiverlevel = rs3.getString("showlevel");
String receiverlevel2 = rs3.getString("showlevel2");
String receiverfieldtype = rs3.getString("receiverfieldtype");
// 上级关系 1 当前人员 2 直接上级 3 所有上级 4 本部门 5 本分部 6 本岗位
int remindhigherlevel = Util.getIntValue(rs3.getString("higherlevel"), 1);
//1 :所有上级 2所有下级
int orgrelation = Util.getIntValue(rs3.getString("orgrelation"), 1);
//----------------处理提醒人员-------------------
if ("1".equals(receivertype)) {
//人力资源
userList = taskService.getRemind_ruleUserList(userList, Util.getIntValue(receivertype), receiverdetail, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
} else if ("2".equals(receivertype)) {
//分部
userList = taskService.getRemind_ruleUserList(userList, Util.getIntValue(receivertype), receiverdetail, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
} else if ("3".equals(receivertype)) {
//部门
userList = taskService.getRemind_ruleUserList(userList, Util.getIntValue(receivertype), receiverdetail, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
} else if ("4".equals(receivertype)) {
//角色
userList = taskService.getRemind_ruleUserList(userList, Util.getIntValue(receivertype), receiverdetail, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
} else if ("5".equals(receivertype)) {
//所有人
userList = taskService.getRemind_ruleUserList(userList, Util.getIntValue(receivertype), receiverdetail, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
} else if ("6".equals(receivertype)) {
//模块创建人
int modedatacreater = rs.getInt("modedatacreater");
//考虑上级关系 1 当前人员 2 直接上级 3 所有上级 4 本部门 5 本分部 6 本岗位 remindhigherlevel
if (remindhigherlevel == 1) {
// 1 当前人员
userList.add(modedatacreater);
} else if (remindhigherlevel == 2) {
// 2 直接上级
try {
ResourceComInfo rc = new ResourceComInfo();
int manager = Util.getIntValue(rc.getManagerID("" + modedatacreater), 0);
userList.add(manager);
} catch (Exception e) {
e.printStackTrace();
}
} else if (remindhigherlevel == 3) {
// 3 所有上级
try {
ResourceComInfo rc = new ResourceComInfo();
String managers = rc.getAllManagerByUserId("" + modedatacreater);
String[] ms = managers.split(",");
for (String m : ms) {
userList.add(Integer.parseInt(m));
}
} catch (Exception e) {
e.printStackTrace();
}
} else if (remindhigherlevel == 4) {
// 4 本部门
// 考虑安全级别
try {
ResourceComInfo rc = new ResourceComInfo();
String departmentID = rc.getDepartmentID("" + modedatacreater);
userList = taskService.getRemind_ruleUserList(userList, 3, departmentID, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
} catch (Exception e) {
e.printStackTrace();
}
} else if (remindhigherlevel == 5) {
// 5 本分部
// 考虑安全级别
try {
ResourceComInfo rc = new ResourceComInfo();
String subCompanyID = rc.getSubCompanyID("" + modedatacreater);
userList = taskService.getRemind_ruleUserList(userList, 2, subCompanyID, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
} catch (Exception e) {
e.printStackTrace();
}
} else if (remindhigherlevel == 6) {
// 6 本岗位
try {
ResourceComInfo rc = new ResourceComInfo();
String jobTitle = rc.getJobTitle("" + modedatacreater);
userList = taskService.getRemind_ruleUserList(userList, 6, jobTitle, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
} catch (Exception e) {
e.printStackTrace();
}
}
} else if ("1000".equals(receivertype)) {
//字段
String objids = "";
String sqlstr1 = "select id,fieldname,detailtable,viewtype from workflow_billfield where id in (" + receiverdetail + ")";
rs4.executeQuery(sqlstr1);
String tempFieldName;
String viewtype;
while (rs4.next()) {
tempFieldName = rs4.getString("fieldname").toLowerCase();
viewtype = Util.null2String(rs4.getString("viewtype"));
if ("0".equals(viewtype)) {
String val = CubeCipherUitl.decrypt(rs.getString(tempFieldName));
if (StringUtils.isNotBlank(val)) {
if ("".equals(objids)) {
objids = val;
} else {
objids = objids + "," + val;
}
}
} else if ("1".equals(viewtype)) {
if (subbillid != null && !"".equals(subbillid)) {
String psql = "select * from " + tablename + "_dt" + formtype + " where id=" + subbillid;
rs2.executeQuery(psql);
if (rs2.next()) {
String val1 = CubeCipherUitl.decrypt(rs2.getString(tempFieldName));
if (!"".equals(val1)) {
if ("".equals(objids)) {
objids = val1;
} else {
objids = objids + "," + val1;
}
}
}
}
}
}
if ("1".equals(receiverfieldtype)) {
//人力资源字段
if (remindhigherlevel == 1) {
//当前人员
userList = taskService.getRemind_ruleUserList(userList, 1, objids, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
} else if (remindhigherlevel == 2) {
// 2 直接上级
userList = taskService.getRemind_ruleUserList(userList, 7, objids, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
} else if (remindhigherlevel == 3) {
// 3 所有上级
userList = taskService.getRemind_ruleUserList(userList, 8, objids, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
} else if (remindhigherlevel == 4) {
// 4 本部门
// 考虑安全级别
// 获取 当前字段的部门id
objids = taskService.getDeptOrCompany(objids, "1");
userList = taskService.getRemind_ruleUserList(userList, 3, objids, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
} else if (remindhigherlevel == 5) {
// 5 本分部
// 考虑安全级别
// 获取 当前字段的分部id
objids = taskService.getDeptOrCompany(objids, "2");
userList = taskService.getRemind_ruleUserList(userList, 2, objids, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
} else if (remindhigherlevel == 6) {
// 6 本岗位
// 获取 当前字段的岗位id
objids = taskService.getDeptOrCompany(objids, "3");
userList = taskService.getRemind_ruleUserList(userList, 6, objids, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
}
} else if ("2".equals(receiverfieldtype)) {
//部门
if (orgrelation == 0) {
userList = taskService.getRemind_ruleUserList(userList, 3, objids, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
} else if (orgrelation == 1) {
//所有上级
userList = taskService.getRemind_ruleUserList(userList, 9, objids, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
} else if (orgrelation == 2) {
//所有下级
userList = taskService.getRemind_ruleUserList(userList, 10, objids, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
}
} else if ("3".equals(receiverfieldtype)) {
//分部
if (orgrelation == 0) {
userList = taskService.getRemind_ruleUserList(userList, 2, objids, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
} else if (orgrelation == 1) {
//所有上级
userList = taskService.getRemind_ruleUserList(userList, 11, objids, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
} else if (orgrelation == 2) {
//所有下级
userList = taskService.getRemind_ruleUserList(userList, 12, objids, Util.getIntValue(receiverlevel), Util.getIntValue(receiverlevel2, -1));
}
}
}
}
userSet.addAll(userList);
}
return userSet;
}
private boolean isPush(String billId, String taskDetailId) {
RecordSet recordSet = new RecordSet();
recordSet.executeQuery("select dygz from uf_jcl_jltsjl where ypz = ? ", billId);
if (recordSet.next()) {
String dygz = recordSet.getString("dygz");
String[] split = dygz.split(",");
List<String> taskIdList = Arrays.asList(split);
if (taskIdList.contains(taskDetailId)) {
return false;
} else {
// 更新简历推送记录表
Set<String> list = new HashSet<>(taskIdList);
list.add(taskDetailId);
String taskIds = StringUtils.join(list, ",");
recordSet.executeUpdate("update uf_jcl_jltsjl set dygz = ? where ypz = ? ", taskIds, billId);
}
} else {
// 插入简历推送记录表
recordSet.executeUpdate("insert into uf_jcl_jltsjl (ypz,dygz) values (?,?)", billId, taskDetailId);
}
return true;
}
}

View File

@ -1,5 +1,7 @@
package weaver.interfaces.recruit.thread;
import cn.hutool.core.convert.Convert;
import com.alibaba.fastjson.JSON;
import com.engine.recruit.conn.*;
import com.engine.recruit.entity.resume.QllResumePo;
import com.engine.recruit.enums.ApplicationStatusEnum;
@ -8,6 +10,8 @@ import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import weaver.common.DateUtil;
import weaver.conn.RecordSet;
import weaver.general.BaseBean;
import weaver.general.Util;
import java.util.List;
import java.util.Map;
@ -18,6 +22,8 @@ import java.util.Map;
* @version: 1.0
*/
public class ExtractQllResumeThread extends Thread {
BaseBean baseBean = new BaseBean();
@Override
public void run() {
RecordSet rs = new RecordSet();
@ -28,10 +34,29 @@ public class ExtractQllResumeThread extends Thread {
}
for (Map<String, Object> map : mapList) {
QllResumePo qllResumePo = RecruitUtil.parseMap2Object(map, QllResumePo.class);
RecruitDataMap<Object> dataMap = buildApplicantMap(qllResumePo);
// 校验简历信息并插入
CheckRepeatResume.getInstance().insertResumeMainTable(dataMap);
rs.executeUpdate("update uf_jcl_jlzjb set cqzt = 1 where id = ? ", qllResumePo.getId());
try {
baseBean.writeLog("千里聆简历解析开始中间表ID=【" + qllResumePo.getId() + "");
RecruitDataMap<Object> dataMap = buildApplicantMap(qllResumePo);
baseBean.writeLog("千里聆简历主表数据解析完成==" + JSON.toJSONString(dataMap));
// 校验简历信息并插入
CheckRepeatResume instance = CheckRepeatResume.getInstance();
Map<String, Object> checkMap = instance.insertResumeAndReturn(dataMap);
String mainId = Util.null2String(checkMap.get("mainId"));
String sourceId = Util.null2String(checkMap.get("sourceId"));
baseBean.writeLog("千里聆简历主表数据插入完成mainId==【" + mainId + "sourceId==【" + sourceId + "");
// 数据写入完成后更新抽取状态为新插入的数据ID
rs.executeUpdate("update uf_jcl_jlzjb set cqzt = 1 ,mainid = ? ,sourceid = ? where id = ? ", Convert.toInt(mainId), Convert.toInt(sourceId), qllResumePo.getId());
// 插入明细表数据
instance.insertResumeDetailTable(qllResumePo.getJyjl(), "uf_jcl_yppc_dt1", mainId, sourceId);
instance.insertResumeDetailTable(qllResumePo.getGzjl(), "uf_jcl_yppc_dt2", mainId, sourceId);
instance.insertResumeDetailTable(qllResumePo.getXmjl(), "uf_jcl_yppc_dt3", mainId, sourceId);
baseBean.writeLog("千里聆简历解析完成mainId==【" + mainId + "sourceId==【" + sourceId + "");
} catch (Exception e) {
baseBean.writeLog("简历解析失败" + JSON.toJSONString(qllResumePo), e);
}
}
}
@ -45,35 +70,39 @@ public class ExtractQllResumeThread extends Thread {
RecruitDataMap<Object> insertMap = new RecruitDataMap<>();
// 姓名
insertMap.put("xm", qllResumePo.getXm());
// 简历来源
insertMap.put("jlly", qllResumePo.getLyqd());
// 电子邮箱
insertMap.put("dzyx", qllResumePo.getYx());
// 手机号码
insertMap.put("sjhm", qllResumePo.getSjhm());
// 年龄
insertMap.put("nl", qllResumePo.getNl());
// 性别
insertMap.put("xb", qllResumePo.getXb());
// 年龄
insertMap.put("nl", qllResumePo.getNl());
// 工作经验
insertMap.put("gzjy", qllResumePo.getGzjy());
// 最高学历
insertMap.put("zgxl", qllResumePo.getZgxl());
// 投递时间
insertMap.put("tdsj", DateUtil.getDateTime());
// 手机号码
insertMap.put("sjhm", qllResumePo.getSjhm());
// 电子邮箱
insertMap.put("dzyx", qllResumePo.getYx());
// 自我评价
insertMap.put("zwpj", qllResumePo.getGrys());
// 最高学历
insertMap.put("zgxl", qllResumePo.getZgxl());
// 简历来源
insertMap.put("jlly", qllResumePo.getLyqd());
// 投递时间
insertMap.put("tdsj", DateUtil.getDateTime());
// 原始简历
insertMap.put("ysjl", qllResumePo.getJlfj());
// 投递职位第三方
insertMap.put("tdzwdsf", qllResumePo.getYpzw());
String zt = ApplicationStatusEnum.DISTRIBUTION.getValue();
// 应聘职位
String ypzw = qllResumePo.getYpzw();
String ypzw = PositionCommonInfo.getPositionIdByName(qllResumePo.getYpzw(), qllResumePo.getGjrsjh());
baseBean.writeLog("投递职位==【" + qllResumePo.getYpzw() + "】,投递职位ID==【" + ypzw + "");
if (StringUtils.isNotBlank(ypzw)) {
String flowId = PositionCommonInfo.getRecruitFlowId(ypzw);
Map<String, String> initialStage = ApplicantCommonInfo.getInitialStage(flowId);
if (null != initialStage) {
baseBean.writeLog("initialStage===" + JSON.toJSONString(initialStage));
String zpjd = initialStage.get("zpjd");
String dqypjd = initialStage.get("jdlx");
if (StringUtils.isNotBlank(zpjd) && StringUtils.isNotBlank(dqypjd)) {

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,47 @@
#############################消息提醒相关配置##############################
#聚才林默认招聘消息提醒,消息来源(消息来源ID获取方式==》应用中心-消息中心-消息类型设置>>>>消息来源-列中字段中的绑定标识)
RECRUIT_MESSAGE_TYPE=2022061063
#面试反馈消息提醒,消息来源
INTERVIEW_MESSAGE_TYPE=2022061063
#添加面试消息提醒标题
INTERVIEW_ADD_MESSAGE_TITLE=面试安排提醒
#取消面试消息提醒标题
INTERVIEW_CANCEL_MESSAGE_TITLE=取消面试提醒
#面试评价消息提醒标题
INTERVIEW_EVALUATE_MESSAGE_TITLE=面试评价提醒
#人才黑名单通知
JOIN_BLACKLIST_MESSAGE_TITLE=人才黑名单通知
#筛选反馈
#筛选反馈消息提醒,消息来源
SCREENING_MESSAGE_TYPE=2022061063
#筛选反馈,消息提醒标题
SCREENING_MESSAGE_TITLE=简历筛选
#筛选反馈,消息提醒链接地址(需替换下面链接地址的IDID获取方式==》建模引擎-应用建模-查询>>>>聚才林招聘管理-应聘者简历-筛选反馈)
SCREENING_MESSAGE_URL=/wui/index.html#/main/cube/search?customid=64
#############################移动建模相关配置##############################
#配置获取路径:移动引擎-应用建模-应用
#APPID获取方式选择对应的应用页面即展示对应ID
#移动建模地址获取方式:选择对应的应用,鼠标右键>>免登陆访问设置,即可复制应用访问地址
#信息采集移动建模APPID
MOBILE_APPID_COLLECT=3
#信息采集移动建模地址
COLLECT_MESSAGE_LINK=http://ip:port/mobilemode/mobile/view.html?appid=3&mTokenFrom=anonymous&mToken=6B56BDC3C4233A984BA4BCE626FD44CF
#offer移动建模APPID
MOBILE_APPID_OFFER=2
#offer反馈移动建模地址
OFFER_MOBILE_URL=http://ip:port/mobilemode/mobile/view.html?appid=2&mTokenFrom=anonymous&mToken=C13059E5D6B68D0F23BC30B80E440C42
#############################文档目录相关配置##############################
#原始简历附件目录ID后端引擎-内容引擎-目录设置-文档目录>>>>招聘-原始简历附件)
APPLICANTS_RESUMES_CATEGORY=110

View File

@ -0,0 +1,69 @@
#简历智能抽取服务-千里聆地址
qianlilingurl=https://open.easst.cn/openapi/rest/resume
#appid
appId=66666666
#appSecret
appSecret=66666666666666666666666666666666
#模块-简历库id
model.id=71
#是否使用自建0不使用1使用
sfsymr=1
#自建表-表名
jlk.tablename=uf_jcl_jlzjb
#字段映射
#姓名
rmxm=xm
#性别
xb=xb
#出生日期
csrq=csrq
#籍贯
jg=jg
#电子邮箱
email=yx
#微信
wx=wx
#QQ
qq=qq
#现居住地
jzd=xjzd
#爱好
ah=ah
#个人评价
grpj=grys
#学业信息
xyxg=jyjl
#毕业时间
bysj=bysj
#最高学历
zgxl=zgxl
#专业技能
zyjn=zyjn
#实习经历
sxjl=gzjl
#英语水平
yysp=yysp
#技能证书
jnzs=zs
#校园经历
#xyjl=xyjl
#工作信息
gzxg=gzjl
#期望从事岗位
qwcsgw=ypzw
#工作经验
gzjy1=gzjy
#期望薪资
#qwxz=qwsqyxk
#期望工作地点
#qwgzdd=qwgzdd
#项目经历
xmjl=xmjl
#手机号码
sjhm=sjhm
#年龄
nl=nl
#身份证
sfz=sfz

View File

@ -0,0 +1,69 @@
host=http://youyun.market.alicloudapi.com
path=/
method=POST
#appcode
appcode=66666666666666666666666666666666
#是否使用自建0不使用1使用
sfsymr=1
#模块-简历库id
formmodeid=71
#自建表-表名
tablename=uf_jcl_jlzjb
#姓名
rmxm=xm
#性别
xb=xb
#出生日期
csrq=csrq
#籍贯
jg=jg
#电子邮箱
email=yx
#微信
wx=wx
#QQ
qq=qq
#现居住地
jzd=xjzd
#爱好
ah=ah
#个人评价
grpj=grys
#学业信息
xyxg=jyjl
#毕业时间
bysj=bysj
#最高学历
zgxl=zgxl
#专业技能
zyjn=zyjn
#实习经历
sxjl=sxjl
#英语水平
yysp=yysp
#技能证书
jnzs=zs
#校园经历
#xyjl=xyjl
#工作信息
gzxg=gzjl
#期望从事岗位
qwcsgw=ypzw
#工作经验
gzjy1=gzjy
#期望薪资
#qwxz=qwsqyxk
#期望工作地点
#qwgzdd=qwgzdd
#项目经历
xmjl=xmjl
#手机号码
sjhm=sjhm
#年龄
nl=nl
#身份证
sfz=sfz

Some files were not shown because too many files have changed in this diff Show More