generated from dxfeng/secondev-chapanda-feishu
调整面试、取消面试邮件、短信通知
This commit is contained in:
parent
28ddcf41fa
commit
36c1cf41c4
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue