调整面试、取消面试邮件、短信通知

This commit is contained in:
dxfeng 2024-03-05 16:21:47 +08:00
parent 28ddcf41fa
commit 36c1cf41c4
6 changed files with 145 additions and 187 deletions

View File

@ -25,6 +25,7 @@ public class RecruitConstant {
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;
@ -50,6 +51,7 @@ public class RecruitConstant {
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");

View File

@ -3,10 +3,7 @@ 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.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 weaver.formmode.recruit.modeexpand.util.RecruitModeUtil;
import weaver.general.Util;
@ -16,7 +13,6 @@ import weaver.soa.workflow.request.Property;
import weaver.soa.workflow.request.RequestInfo;
import java.util.*;
import java.util.stream.Collectors;
/**
* <p>聚才林招聘</p>
@ -59,8 +55,6 @@ public class CreateInterviewModeExpand extends AbstractModeExpandJavaCodeNew {
mainDataMap.put(property.getName(), property.getValue());
}
// 需要应聘者反馈
boolean needFeedback = "1".equals(Util.null2String(mainDataMap.get("sfxyfk")));
String operateType = Util.null2String(params.get("operateType"));
if (StringUtils.isBlank(operateType)) {
@ -72,41 +66,10 @@ public class CreateInterviewModeExpand extends AbstractModeExpandJavaCodeNew {
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) {
if (needFeedback) {
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;
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) {
RecruitMessageUtils.sendSMS(sjh, msgContent);
}
// 需要应聘者反馈
boolean needFeedback = "1".equals(Util.null2String(mainDataMap.get("sfxyfk")));
// 发送邮件短信
InterviewMsgUtil.sendEmailAndMsg(mainDataMap, billId, needFeedback);
}
}

View File

@ -0,0 +1,66 @@
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"));
if (sendEmail) {
if (needFeedback) {
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;
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) {
// TODO 参加反馈
RecruitMessageUtils.sendSMS(sjh, msgContent);
}
}
}

View File

@ -3,6 +3,7 @@ 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;
@ -14,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
@ -73,6 +75,18 @@ public class UpdateInterviewModeExpand extends AbstractModeExpandJavaCodeNew {
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;
@ -161,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

@ -34,7 +34,14 @@ import java.util.regex.Pattern;
* @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("$"));
/**
@ -140,7 +147,7 @@ public class RecruitModeUtil {
}
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()) {
@ -160,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
*

View File

@ -1,144 +0,0 @@
package weaver.interfaces.gsjrkg.action;
import com.alibaba.fastjson.JSON;
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 weaver.interfaces.workflow.action.Action;
import weaver.soa.workflow.request.MainTableInfo;
import weaver.soa.workflow.request.Property;
import weaver.soa.workflow.request.RequestInfo;
import java.util.*;
/**
* @Description: 同步证书到人员卡片个人信息
* @author:dxfeng
* @createTime: 2023/02/20
* @version: 1.0
*/
public class SyncCertificateAction implements Action {
/**
* 建模表表名
*/
private String modeTableName;
/**
* 参数名称建模表字段名人员表字段名
*/
private String params;
private String resourceFieldGroup;
@Override
public String execute(RequestInfo requestInfo) {
BaseBean baseBean = new BaseBean();
if (StringUtils.isBlank(params)) {
requestInfo.getRequestManager().setMessagecontent("自定义接口参数值配置错误");
return Action.FAILURE_AND_CONTINUE;
}
if (StringUtils.isBlank(resourceFieldGroup)) {
// -1:基本信息,1:个人信息,3:工作信息
resourceFieldGroup = "1";
}
Map<String, String> fieldMap = new HashMap<>();
String[] fieldsArray = params.split(";");
for (String fields : fieldsArray) {
String[] field = fields.split(":");
if (field.length == 2) {
fieldMap.put(field[0], field[1]);
}
}
if (fieldMap.size() != fieldsArray.length) {
requestInfo.getRequestManager().setMessagecontent("自定义接口参数值格式错误,请检查");
return Action.FAILURE_AND_CONTINUE;
}
baseBean.writeLog("fieldMap==" + JSON.toJSONString(fieldMap));
Set<String> modeFields = fieldMap.keySet();
Map<String, Set<String>> modeMap = new HashMap<>();
RecordSet rs = new RecordSet();
String resourceId = "";
MainTableInfo mainTableInfo = requestInfo.getMainTableInfo();
Property[] property = mainTableInfo.getProperty();
for (Property item : property) {
String name = item.getName();
String value = Util.null2String(item.getValue());
if (StringUtils.isNotBlank(name) && StringUtils.isNotBlank(value)) {
if ("xm".equals(name)) {
resourceId = value;
}
}
}
// 查询当前人员的所有数据
StringBuilder sqlBuilder = new StringBuilder("select ").append(StringUtils.join(modeFields, ",")).append(" from ").append(modeTableName).append(" where xm = ").append(resourceId).append(" order by id");
baseBean.writeLog("selectSql===" + sqlBuilder);
rs.executeQuery(sqlBuilder.toString());
while (rs.next()) {
appendIds(modeFields, rs, modeMap);
}
baseBean.writeLog("modeMap===" + JSON.toJSONString(modeMap));
// 判断有无数据没有的话插入数据
sqlBuilder = new StringBuilder("SELECT id FROM CUS_FIELDDATA where scope ='HrmCustomFieldByInfoType' and scopeid = '").append(resourceFieldGroup).append("' and id =? ");
rs.executeQuery(sqlBuilder.toString(), resourceId);
if (!rs.next()) {
// 插入人员信息数据
rs.executeUpdate("insert into cus_fielddata (scope,scopeid,id) values ('HrmCustomFieldByInfoType','" + resourceFieldGroup + "',?)", resourceId);
}
// 组装更新SQL语句
sqlBuilder = new StringBuilder("update cus_fielddata set ");
for (Map.Entry<String, String> entry : fieldMap.entrySet()) {
Set<String> valueSet = modeMap.get(entry.getKey());
String values = CollectionUtils.isEmpty(valueSet) ? "" : StringUtils.join(valueSet, ",");
sqlBuilder.append(" ").append(entry.getValue()).append(" = '").append(values).append("',");
}
sqlBuilder.deleteCharAt(sqlBuilder.length() - 1);
sqlBuilder.append(" where scope ='HrmCustomFieldByInfoType' and scopeid = ").append(resourceFieldGroup).append(" and id = ").append(resourceId);
baseBean.writeLog("updateSql===" + sqlBuilder);
rs.executeUpdate(sqlBuilder.toString());
return Action.SUCCESS;
}
private void appendIds(Set<String> modeFields, RecordSet rs, Map<String, Set<String>> modeMap) {
BaseBean baseBean = new BaseBean();
for (String modeField : modeFields) {
String ids = rs.getString(modeField);
baseBean.writeLog("modeField==【" + modeField + "】,getString==【" + ids + "");
if (StringUtils.isBlank(ids)) {
continue;
}
if (CollectionUtils.isEmpty(modeMap.get(modeField))) {
modeMap.put(modeField, new HashSet<>());
}
modeMap.get(modeField).addAll(Arrays.asList(ids.split(",")));
}
}
public String getParams() {
return params;
}
public void setParams(String params) {
this.params = params;
}
public String getModeTableName() {
return modeTableName;
}
public void setModeTableName(String modeTableName) {
this.modeTableName = modeTableName;
}
public String getResourceFieldGroup() {
return resourceFieldGroup;
}
public void setResourceFieldGroup(String resourceFieldGroup) {
this.resourceFieldGroup = resourceFieldGroup;
}
}