|
@@ -27,7 +27,7 @@ import org.springframework.stereotype.Component;
|
|
|
public class WorkorderOverdueCheckTask
|
|
public class WorkorderOverdueCheckTask
|
|
|
{
|
|
{
|
|
|
private static final Logger log = LoggerFactory.getLogger(WorkorderOverdueCheckTask.class);
|
|
private static final Logger log = LoggerFactory.getLogger(WorkorderOverdueCheckTask.class);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
/** 默认超时天数(工作日) */
|
|
/** 默认超时天数(工作日) */
|
|
|
private static final int OVERDUE_DAYS = 5;
|
|
private static final int OVERDUE_DAYS = 5;
|
|
|
|
|
|
|
@@ -53,7 +53,7 @@ public class WorkorderOverdueCheckTask
|
|
|
/**
|
|
/**
|
|
|
* 每日 09:00 检查超期工单
|
|
* 每日 09:00 检查超期工单
|
|
|
*/
|
|
*/
|
|
|
- @Scheduled(cron = "0 0 9 * * ?")
|
|
|
|
|
|
|
+ // @Scheduled(cron = "0 0 9 * * ?") // 【已停用】生产环境暂时关闭自动任务
|
|
|
public void checkOverdueWorkorders()
|
|
public void checkOverdueWorkorders()
|
|
|
{
|
|
{
|
|
|
log.info("开始检查超期工单...");
|
|
log.info("开始检查超期工单...");
|
|
@@ -62,14 +62,14 @@ public class WorkorderOverdueCheckTask
|
|
|
ComplaintWorkorder query = new ComplaintWorkorder();
|
|
ComplaintWorkorder query = new ComplaintWorkorder();
|
|
|
query.setStatus(1); // 处理中
|
|
query.setStatus(1); // 处理中
|
|
|
List<ComplaintWorkorder> processingOrders = workorderMapper.selectWorkorderList(query);
|
|
List<ComplaintWorkorder> processingOrders = workorderMapper.selectWorkorderList(query);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
int overdueCount = 0;
|
|
int overdueCount = 0;
|
|
|
for (ComplaintWorkorder order : processingOrders) {
|
|
for (ComplaintWorkorder order : processingOrders) {
|
|
|
Date acceptTime = order.getAcceptTime();
|
|
Date acceptTime = order.getAcceptTime();
|
|
|
if (acceptTime == null) {
|
|
if (acceptTime == null) {
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 计算已受理天数
|
|
// 计算已受理天数
|
|
|
long daysBetween = calculateBusinessDays(acceptTime, new Date());
|
|
long daysBetween = calculateBusinessDays(acceptTime, new Date());
|
|
|
if (daysBetween >= OVERDUE_DAYS) {
|
|
if (daysBetween >= OVERDUE_DAYS) {
|
|
@@ -78,13 +78,13 @@ public class WorkorderOverdueCheckTask
|
|
|
sendOverdueReminder(order, daysBetween);
|
|
sendOverdueReminder(order, daysBetween);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
log.info("超期工单检查完成,共发现{}条超期工单", overdueCount);
|
|
log.info("超期工单检查完成,共发现{}条超期工单", overdueCount);
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
log.error("超期工单检查任务异常", e);
|
|
log.error("超期工单检查任务异常", e);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 发送超期提醒(短信 + 公众号)
|
|
* 发送超期提醒(短信 + 公众号)
|
|
|
*/
|
|
*/
|
|
@@ -92,16 +92,16 @@ public class WorkorderOverdueCheckTask
|
|
|
{
|
|
{
|
|
|
String schoolName = StringUtils.defaultString(order.getSchoolName());
|
|
String schoolName = StringUtils.defaultString(order.getSchoolName());
|
|
|
String complaintNo = order.getComplaintNo();
|
|
String complaintNo = order.getComplaintNo();
|
|
|
- String content = String.format("【校长信箱】学校[%s]有一起投诉工单(编号:%s)已受理%d 天仍未办结,请及时处理",
|
|
|
|
|
|
|
+ String content = String.format("【校长信箱】学校[%s]有一起投诉工单(编号:%s)已受理%d 天仍未办结,请及时处理",
|
|
|
schoolName, complaintNo, overdueDays);
|
|
schoolName, complaintNo, overdueDays);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 获取该学校的所有启用管理员
|
|
// 获取该学校的所有启用管理员
|
|
|
List<ComplaintAdmin> admins = adminMapper.selectAdminListByUnit(order.getUnitUid());
|
|
List<ComplaintAdmin> admins = adminMapper.selectAdminListByUnit(order.getUnitUid());
|
|
|
if (admins == null || admins.isEmpty()) {
|
|
if (admins == null || admins.isEmpty()) {
|
|
|
log.warn("学校{}未配置管理员,跳过超期提醒发送", schoolName);
|
|
log.warn("学校{}未配置管理员,跳过超期提醒发送", schoolName);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
for (ComplaintAdmin admin : admins) {
|
|
for (ComplaintAdmin admin : admins) {
|
|
|
// 构建接收人信息(姓名 | 学工号|部门 ID| 部门名称 | 电话号码)
|
|
// 构建接收人信息(姓名 | 学工号|部门 ID| 部门名称 | 电话号码)
|
|
|
String personInfo = buildPersonInfo(admin);
|
|
String personInfo = buildPersonInfo(admin);
|
|
@@ -130,7 +130,7 @@ public class WorkorderOverdueCheckTask
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
log.error("超期提醒短信发送失败 complaintNo={} admin={}", complaintNo, admin.getAdminName(), e);
|
|
log.error("超期提醒短信发送失败 complaintNo={} admin={}", complaintNo, admin.getAdminName(), e);
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 如果有学工号,同时发送公众号消息
|
|
// 如果有学工号,同时发送公众号消息
|
|
|
if (StringUtils.isNotBlank(admin.getStaffNo())) {
|
|
if (StringUtils.isNotBlank(admin.getStaffNo())) {
|
|
|
try {
|
|
try {
|
|
@@ -140,7 +140,7 @@ public class WorkorderOverdueCheckTask
|
|
|
String wechatInfo = complaintNo + "|||" + StringUtils.defaultString(schoolName)
|
|
String wechatInfo = complaintNo + "|||" + StringUtils.defaultString(schoolName)
|
|
|
+ "|||" + "工单已超期,请尽快处置";
|
|
+ "|||" + "工单已超期,请尽快处置";
|
|
|
wechatClient.sendWechat(receiveInfo, title, wechatInfo);
|
|
wechatClient.sendWechat(receiveInfo, title, wechatInfo);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 记录公众号推送日志
|
|
// 记录公众号推送日志
|
|
|
ComplaintMessageLog msgLog = new ComplaintMessageLog();
|
|
ComplaintMessageLog msgLog = new ComplaintMessageLog();
|
|
|
msgLog.setComplaintNo(complaintNo);
|
|
msgLog.setComplaintNo(complaintNo);
|
|
@@ -149,35 +149,35 @@ public class WorkorderOverdueCheckTask
|
|
|
msgLog.setContent(wechatInfo);
|
|
msgLog.setContent(wechatInfo);
|
|
|
msgLog.setResult(1);
|
|
msgLog.setResult(1);
|
|
|
messageLogMapper.insertComplaintMessageLog(msgLog);
|
|
messageLogMapper.insertComplaintMessageLog(msgLog);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
log.error("超期提醒公众号发送失败 complaintNo={} admin={}", complaintNo, admin.getAdminName(), e);
|
|
log.error("超期提醒公众号发送失败 complaintNo={} admin={}", complaintNo, admin.getAdminName(), e);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 构建短信接收人信息:姓名 | 学工号|部门 ID| 部门名称 | 电话号码
|
|
* 构建短信接收人信息:姓名 | 学工号|部门 ID| 部门名称 | 电话号码
|
|
|
*/
|
|
*/
|
|
|
private String buildPersonInfo(ComplaintAdmin admin)
|
|
private String buildPersonInfo(ComplaintAdmin admin)
|
|
|
{
|
|
{
|
|
|
- return StringUtils.defaultString(admin.getAdminName()) + "|"
|
|
|
|
|
- + StringUtils.defaultString(admin.getStaffNo()) + "||"
|
|
|
|
|
- + StringUtils.defaultString(admin.getUnitUid()) + "|"
|
|
|
|
|
|
|
+ return StringUtils.defaultString(admin.getAdminName()) + "|"
|
|
|
|
|
+ + StringUtils.defaultString(admin.getStaffNo()) + "||"
|
|
|
|
|
+ + StringUtils.defaultString(admin.getUnitUid()) + "|"
|
|
|
+ StringUtils.defaultString(admin.getPhone());
|
|
+ StringUtils.defaultString(admin.getPhone());
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 构建公众号接收人信息:姓名 | 学工号|部门 ID| 部门名称
|
|
* 构建公众号接收人信息:姓名 | 学工号|部门 ID| 部门名称
|
|
|
*/
|
|
*/
|
|
|
private String buildReceiveInfo(ComplaintAdmin admin)
|
|
private String buildReceiveInfo(ComplaintAdmin admin)
|
|
|
{
|
|
{
|
|
|
- return StringUtils.defaultString(admin.getAdminName()) + "|"
|
|
|
|
|
- + StringUtils.defaultString(admin.getStaffNo()) + "||"
|
|
|
|
|
|
|
+ return StringUtils.defaultString(admin.getAdminName()) + "|"
|
|
|
|
|
+ + StringUtils.defaultString(admin.getStaffNo()) + "||"
|
|
|
+ StringUtils.defaultString(admin.getUnitUid());
|
|
+ StringUtils.defaultString(admin.getUnitUid());
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 计算两个日期之间的工作日数量(简单算法,不考虑法定节假日)
|
|
* 计算两个日期之间的工作日数量(简单算法,不考虑法定节假日)
|
|
|
* @return 工作日数
|
|
* @return 工作日数
|
|
@@ -186,21 +186,21 @@ public class WorkorderOverdueCheckTask
|
|
|
if (startDate == null || endDate == null) {
|
|
if (startDate == null || endDate == null) {
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
Calendar calStart = Calendar.getInstance();
|
|
Calendar calStart = Calendar.getInstance();
|
|
|
calStart.setTime(startDate);
|
|
calStart.setTime(startDate);
|
|
|
calStart.set(Calendar.HOUR_OF_DAY, 0);
|
|
calStart.set(Calendar.HOUR_OF_DAY, 0);
|
|
|
calStart.set(Calendar.MINUTE, 0);
|
|
calStart.set(Calendar.MINUTE, 0);
|
|
|
calStart.set(Calendar.SECOND, 0);
|
|
calStart.set(Calendar.SECOND, 0);
|
|
|
calStart.set(Calendar.MILLISECOND, 0);
|
|
calStart.set(Calendar.MILLISECOND, 0);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
Calendar calEnd = Calendar.getInstance();
|
|
Calendar calEnd = Calendar.getInstance();
|
|
|
calEnd.setTime(endDate);
|
|
calEnd.setTime(endDate);
|
|
|
calEnd.set(Calendar.HOUR_OF_DAY, 0);
|
|
calEnd.set(Calendar.HOUR_OF_DAY, 0);
|
|
|
calEnd.set(Calendar.MINUTE, 0);
|
|
calEnd.set(Calendar.MINUTE, 0);
|
|
|
calEnd.set(Calendar.SECOND, 0);
|
|
calEnd.set(Calendar.SECOND, 0);
|
|
|
calEnd.set(Calendar.MILLISECOND, 0);
|
|
calEnd.set(Calendar.MILLISECOND, 0);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
long businessDays = 0;
|
|
long businessDays = 0;
|
|
|
Calendar current = calStart;
|
|
Calendar current = calStart;
|
|
|
while (!current.after(calEnd)) {
|
|
while (!current.after(calEnd)) {
|
|
@@ -211,7 +211,7 @@ public class WorkorderOverdueCheckTask
|
|
|
}
|
|
}
|
|
|
current.add(Calendar.DAY_OF_MONTH, 1);
|
|
current.add(Calendar.DAY_OF_MONTH, 1);
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
return businessDays;
|
|
return businessDays;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|