apzl_leasing/src_tenwa/com/tenwa/message/QuartzJobMsg.java

334 lines
20 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.tenwa.message;
import com.amarsoft.are.ARE;
import com.amarsoft.are.jbo.*;
import com.amarsoft.awe.util.ASResultSet;
import com.amarsoft.awe.util.SqlObject;
import com.amarsoft.awe.util.Transaction;
import com.tenwa.app.manage.util.KHSQContractSignActionTwoUtil;
import com.tenwa.quartz.DateUtil;
import com.tenwa.reckon.util.UUIDUtil;
import jbo.app.tenwa.calc.LC_RENT_INCOME;
import jbo.app.tenwa.calc.LC_RENT_PLAN;
import jbo.com.tenwa.lease.comm.LB_CONTRACT_INFO;
import jbo.com.tenwa.lease.comm.LB_SMS_NOTICE_TASKS;
import jbo.sys.MSG_CONFIG;
import org.apache.commons.lang3.StringUtils;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Calendar;
public class QuartzJobMsg implements Job {
private static final Logger logger = LoggerFactory.getLogger(QuartzJobMsg.class);
public static final String MSG_GROUP_NAME = "MSG_DEFAULT_GROUP";
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JBOTransaction tx = null;
JBOTransaction inner_tx = null;
try {
tx = JBOFactory.createJBOTransaction();
Transaction tran = Transaction.createTransaction(tx);
Trigger trigger = context.getTrigger();
JobDataMap data = context.getJobDetail().getJobDataMap();
//获取主键
String id = data.getString("id");
//获取sql语句
String msgsql = data.getString("msgSql");
logger.info("QuartzJobMsgexecute20210513 msgsql=" + msgsql);
//获取关键字
String msgsqlparam = data.getString("msgsqlparam");
//获取短信内容
String msgcontent = data.getString("msgcontent");
//获取触发方式
String triggermode = data.getString("triggermode");
//获取短信发送时间类型、短信延迟发送天数、短信发送时间点
String msgsendtype = data.getString("msgsendtype");//短信发送类型
String msgsendtime = "";//短信发送时间点
Date timeSet = null;
boolean checkTime = false;
Date timeNow = new Date();
if (data.getString("msgsendtime") != null) {
msgsendtime = data.getString("msgsendtime");
timeSet = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(new SimpleDateFormat("yyyy-MM-dd").format(timeNow) + " " + msgsendtime);
}
String delayday = "";//延迟发送天数
if (data.getString("delayday") != null) {
delayday = data.getString("delayday");
}
//获得过期是否执行
String isoverdateexecute = data.getString("isoverdateexecute");
//获取短信类型
String msgtype = data.getString("msgType");
if ("Tl_Business".equals(msgtype) || "Tl_ChangeBusiness".equals(msgtype) || "Tl_MakeContract".equals(msgtype) || "Tl_ChangeContract".equals(msgtype) || "Tl_AfterRenting".equals(msgtype)) {
msgcontent = msgcontent.replace("@", "=");
}
//获取是否按日期去重
String isrepatebydate = data.getString("isrepeatbydate");
//获取短信替换参数
int oldlength = msgcontent.length();
int newlength = msgcontent.replace("}", "").length();
String[] params = new String[oldlength - newlength];
if (params.length > 0) {
int index = 0;
for (int i = 0; i < params.length; i++) {
int start = msgcontent.indexOf("{", index);
int end = msgcontent.indexOf("}", index);
params[i] = msgcontent.substring(start + 1, end);
index = end + 1;
}
}
JBOFactory.getBizObjectManager(MSG_CONFIG.CLASS_NAME, tx).createQuery("update O set previous_fire_time=:previousFireTime , next_fire_time=:nextFireTime where id='" + id + "'")
.setParameter("previousFireTime", trigger.getPreviousFireTime().getTime())
.setParameter("nextFireTime", trigger.getNextFireTime() == null ? "" : String.valueOf(trigger.getNextFireTime().getTime())).executeUpdate();
ASResultSet rs = tran.getASResultSet(new SqlObject(msgsql));
Scheduler scheduler = getScheduler();
Transaction inner_tran = null;
while (rs.next()) {
boolean flag = false;
for (int p = 0; p < params.length; p++) {
if (rs.getString(params[p]) == null) {
flag = true;
}
}
if (flag) {
continue;
}
String rsMsgContent = msgcontent;
Object phonenumber = rs.getString("phonenumber");
if (phonenumber == null || phonenumber.toString().length() != 11) {
continue;
}
logger.info("QuartzJobMsgexecute20210513 如果当前是否为【back_day = 还款失败提醒】。msgtype=" + msgtype);
if("back_day".equals(msgtype)){
logger.info("QuartzJobMsgexecute20210513 还款失败提醒 【back_day】。");
//20210429 如果当前合同是卡尔代偿,或者中之保订单,则不发送短信。
logger.info("QuartzJobMsgexecute20210429 如果当前合同是卡尔代偿或者中之保订单则不发送短信。CONTRACT_ID=" + rs.getString("CONTRACT_ID"));
if(null != rs.getString("CONTRACT_ID") && StringUtils.isNotEmpty(rs.getString("CONTRACT_ID"))
&& null != rs.getString("RENT_PLAN_ID") && StringUtils.isNotEmpty(rs.getString("RENT_PLAN_ID"))
&& checkMsg(rs.getString("CONTRACT_ID"), rs.getString("RENT_PLAN_ID"))){
logger.info("QuartzJobMsgexecute20210429 触发条件本条不执行。RENT_PLAN_ID=" + rs.getString("RENT_PLAN_ID"));
logger.info("QuartzJobMsgexecute20210429 触发条件本条不执行。CONTRACT_ID=" + rs.getString("CONTRACT_ID"));
continue;
}
logger.info("QuartzJobMsgexecute20210429 未触发条件继续执行。CONTRACT_ID=" + rs.getString("CONTRACT_ID"));
}
//新起数据库连接
inner_tx = JBOFactory.createJBOTransaction();
inner_tran = Transaction.createTransaction(inner_tx);
//查询关联记录
String sql = "select * from msg_send_relative where 1=1 ";
String[] sqlparams = msgsqlparam.split("&");
if (sqlparams.length > 0) {
for (int i = 0; i < sqlparams.length; i++) {
sql += "and " + sqlparams[i] + "='" + rs.getString(sqlparams[i]).toString() + "' ";
}
}
if (isrepatebydate.equals("yes")) {//根据日期去重
sql += "and inputtime='" + rs.getString("checkdate") + "'";
}
if (msgtype.startsWith("holiday") || msgtype.startsWith("birthday")) {//如果是生日祝福和节假日祝福必须添加短信类型和日期条件筛选
sql += "and msg_type='" + msgtype + "' and inputtime='" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + "'";
} else {
sql += "and msg_type='" + msgtype + "'";
}
sql = sql.replaceAll(":", "");
SqlObject so = new SqlObject(sql);
so.setRunSql(so.getRunSql().replaceAll("", ":"));
ASResultSet msgSend = inner_tran.getASResultSet(so);
//关联记录不存在,新建短信任务,发送短信通知
if (!msgSend.next()) {
for (int i = 0; i < params.length; i++) {
rsMsgContent = rsMsgContent.replace(params[i], rs.getString(params[i]));
}
rsMsgContent = rsMsgContent.replace("{", "");
rsMsgContent = rsMsgContent.replace("}", "");
//创建短信发送记录
BizObjectManager bomLSNT = JBOFactory.getBizObjectManager(LB_SMS_NOTICE_TASKS.CLASS_NAME, inner_tx);
BizObject sn = bomLSNT.newObject();
sn.setAttributeValue("inputuserid", rs.getString("proj_manage") != null ? rs.getString("proj_manage") : data.getString("userID"));
sn.setAttributeValue("customer_id", rs.getString("customer_id"));
sn.setAttributeValue("phone_number", phonenumber.toString());
sn.setAttributeValue("send_flag", 0);
sn.setAttributeValue("sms_content", rsMsgContent);
sn.setAttributeValue("sms_type", "DELAYED");
sn.setAttributeValue("inputtime", DateUtil.getDateTime(new Date()));
bomLSNT.saveObject(sn);
if ("trigger_mode02".equals(triggermode)) {//手动触发,不需要定时代理
continue;
}
//关联表生成记录
String insertSql = "insert into msg_send_relative (id,sms_id,msg_type,column) values('" + UUIDUtil.getUUID() + "','" + sn.getAttribute("ID").getString() + "','" + msgtype + "',data)";
String column = "";
String value = "";
for (int m = 0; m < sqlparams.length; m++) {
column += "," + sqlparams[m];
value += ",'" + rs.getString(sqlparams[m]).toString() + "'";
}
column = column.substring(1, column.length());
value = value.substring(1, value.length());
if (msgtype.startsWith("holiday") || msgtype.startsWith("birthday")) {
column += ",inputtime";
value += ",'" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + "'";
}
if (isrepatebydate.equals("yes")) {//根据日期去重
column += ",inputtime";
value += ",'" + rs.getString("checkdate") + "'";
}
String jobName = UUIDUtil.getUUID();
String triggerName = UUIDUtil.getUUID();
//记录短信发送定时代理
column += ",msg_send_jobname,msg_send_triggername";
value += ",'" + jobName + "','" + triggerName + "'";
insertSql = insertSql.replace("column", column);
insertSql = insertSql.replace("data", value);
insertSql = insertSql.replaceAll(":", "");
SqlObject soInsert = new SqlObject(insertSql);
soInsert.setRunSql(soInsert.getRunSql().replaceAll("", ":"));
inner_tran.executeSQL(new SqlObject(insertSql));
Date startTime = DateUtil.getTimeByFormat(DateUtil.getDateTime(new Date()), "yyyy-MM-dd HH:mm:ss");
//动态创建时间表达式
String cron = "";
Calendar ca = Calendar.getInstance();
ca.setTime(new Date());
if (timeSet != null) {
if (timeSet.compareTo(timeNow) <= 0) {
checkTime = true;
}
cron += msgsendtime.split(":")[2] + " ";
cron += msgsendtime.split(":")[1] + " ";
cron += msgsendtime.split(":")[0] + " ";
if (checkTime) {
cron = "";
String tNow = new SimpleDateFormat("HH:mm:ss").format(new Date(new Date().getTime() + 2000));
cron += tNow.split(":")[2] + " ";
cron += tNow.split(":")[1] + " ";
cron += tNow.split(":")[0] + " ";
}
}
//定时任务处理
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("smsnoticeid", sn.getAttribute("ID").getString());
JobDetail jobDetail = JobBuilder.newJob(JobSendMessage.class).withIdentity(jobName, MSG_GROUP_NAME)
.usingJobData(new JobDataMap(dataMap)).requestRecovery("1".equals(isoverdateexecute) ? true : false).storeDurably(false).build();
CronExpression ce = null;
switch (msgsendtype) {
case "msg_time_type01"://当天立即
cron = "";
String tNow = new SimpleDateFormat("HH:mm:ss").format(new Date(new Date().getTime() + 2000));
cron += tNow.split(":")[2] + " ";
cron += tNow.split(":")[1] + " ";
cron += tNow.split(":")[0] + " ";
cron += ca.get(Calendar.DAY_OF_MONTH) + " ";
cron += (ca.get(Calendar.MONTH) + 1) + " ? *";
ce = new CronExpression(cron);
trigger = TriggerBuilder.newTrigger().forJob(jobName, MSG_GROUP_NAME).withIdentity(triggerName, MSG_GROUP_NAME).startAt(startTime).endAt(new Date(new Date().getTime() + (24 * 60 * 60 * 1000)))
.withSchedule(CronScheduleBuilder.cronSchedule(ce).withMisfireHandlingInstructionDoNothing())
.build();
sn.setAttributeValue("sms_type", "IMMEDIATELY");
ARE.getLog().warn(triggerName + " cron : " + cron);
break;
case "msg_time_type02"://当天指定时间
cron += ca.get(Calendar.DAY_OF_MONTH) + " ";
cron += (ca.get(Calendar.MONTH) + 1) + " ? *";
ce = new CronExpression(cron);
trigger = TriggerBuilder.newTrigger().forJob(jobName, MSG_GROUP_NAME).withIdentity(triggerName, MSG_GROUP_NAME).startAt(startTime).endAt(new Date(new Date().getTime() + (24 * 60 * 60 * 1000)))
.withSchedule(CronScheduleBuilder.cronSchedule(ce).withMisfireHandlingInstructionDoNothing())
.build();
break;
case "msg_time_type03"://本周最后一天
cron += ca.getActualMaximum(Calendar.DAY_OF_WEEK_IN_MONTH) + " ";
cron += (ca.get(Calendar.MONTH) + 1) + " ? *";
ce = new CronExpression(cron);
trigger = TriggerBuilder.newTrigger().forJob(jobName, MSG_GROUP_NAME).withIdentity(triggerName, MSG_GROUP_NAME).startAt(startTime).endAt(new Date(new Date().getTime() + (8 * 24 * 60 * 60 * 1000)))
.withSchedule(CronScheduleBuilder.cronSchedule(ce).withMisfireHandlingInstructionDoNothing())
.build();
break;
case "msg_time_type04"://本月最后一天
cron += ca.getActualMaximum(Calendar.DAY_OF_MONTH) + " ";
cron += (ca.get(Calendar.MONTH) + 1) + " ? *";
ce = new CronExpression(cron);
trigger = TriggerBuilder.newTrigger().forJob(jobName, MSG_GROUP_NAME).withIdentity(triggerName, MSG_GROUP_NAME).startAt(startTime).endAt(new Date(new Date().getTime() + (31 * 24 * 60 * 60 * 1000)))
.withSchedule(CronScheduleBuilder.cronSchedule(ce).withMisfireHandlingInstructionDoNothing())
.build();
break;
case "msg_time_type05"://延迟天
cron += (ca.get(Calendar.DAY_OF_MONTH) + Integer.parseInt(delayday)) + " ";
cron += (ca.get(Calendar.MONTH) + 1) + " ? *";
ce = new CronExpression(cron);
trigger = TriggerBuilder.newTrigger().forJob(jobName, MSG_GROUP_NAME).withIdentity(triggerName, MSG_GROUP_NAME).startAt(startTime).endAt(new Date(new Date().getTime() + (Integer.parseInt(delayday) * 24 * 60 * 60 * 1000)))
.withSchedule(CronScheduleBuilder.cronSchedule(ce).withMisfireHandlingInstructionDoNothing())
.build();
break;
}
sn.setAttributeValue("notice_time", DateUtil.getDateTime(ce.getNextValidTimeAfter(startTime)));
bomLSNT.saveObject(sn);
scheduler.scheduleJob(jobDetail, trigger);
}
inner_tran.commit();
}
tran.commit();
} catch (Exception e) {
e.printStackTrace();
try {
if (tx != null) tx.rollback();
if (inner_tx != null) inner_tx.rollback();
} catch (JBOException e1) {
e1.printStackTrace();
}
}
}
public Scheduler getScheduler() throws Exception {
return StdSchedulerFactory.getDefaultScheduler();
}
private boolean checkMsg(String contractId, String rentId) {
try {
logger.info("QuartzJobMsgexecute20210429 验证当前订单。CONTRACT_ID=" + contractId);
logger.info("QuartzJobMsgexecute20210429 验证当前订单。rentId=" + rentId);
BizObject lbContractInfo = JBOFactory.createBizObjectQuery(LB_CONTRACT_INFO.CLASS_NAME,"ID=:ID")
.setParameter("ID", contractId).getSingleResult(false);
if(null != lbContractInfo && null != lbContractInfo.getAttribute("distributor_id")
&& StringUtils.isNotEmpty(lbContractInfo.getAttribute("distributor_id").getString())){
logger.info("QuartzJobMsgexecute20210429 渠道id不为空时。DSTB20200430004679[中之保] DSTB20190510003636[卡尔、辉煌国际] distributor_id="
+ lbContractInfo.getAttribute("distributor_id").getString());
if("DSTB20200430004679".equals(lbContractInfo.getAttribute("distributor_id").getString())){
//如果渠道是中之保不发送短信。20210429
logger.info("QuartzJobMsgexecute20210429 渠道是中之保不发送短信。contractId=" + contractId);
return true;
}else if ("DSTB20190510003636".equals(lbContractInfo.getAttribute("distributor_id").getString())) {
//如果渠道是卡尔并且是代偿的话不发送短信。20210429
logger.info("QuartzJobMsgexecute20210429 渠道是卡尔,如果是代偿的话,不发送短信。");
@SuppressWarnings("unchecked")
BizObject rentplan = JBOFactory.createBizObjectQuery(LC_RENT_PLAN.CLASS_NAME, "ID=:ID").setParameter("ID", rentId).getSingleResult(false);
if(null != rentplan && null != rentplan.getAttribute("COLLECT_STATUS")
&& StringUtils.isNotEmpty(rentplan.getAttribute("COLLECT_STATUS").toString())
&& "代偿".equals(rentplan.getAttribute("COLLECT_STATUS").toString())){
logger.info("QuartzJobMsgexecute20210429 当前渠道是卡尔,并且是代偿,不发送短信。");
return true;
}
}
}
} catch (JBOException e) {
e.printStackTrace();
logger.error("QuartzJobMsgexecute20210429 errorMsg=" + e.getMessage());
}
return false;
}
}