|
|
@@ -1,5 +1,7 @@
|
|
|
package com.complaint.workorder.service.impl;
|
|
|
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import com.complaint.workorder.config.ComplaintProperties;
|
|
|
@@ -86,7 +88,7 @@ public class PushServiceImpl implements IPushService
|
|
|
}
|
|
|
|
|
|
String smsTemplate = complaintProperties.getMsgTemplate().getOrDefault("sms-new-workorder",
|
|
|
- "【乌教解忧】{name}您好,{school}有一条新的投诉工单({no}),处置链接:{link}");
|
|
|
+ "【校长信箱】{name}您好,{school}有一条新的投诉工单({no}),处置链接:{link}");
|
|
|
|
|
|
// 合并多个管理员的信息为一条消息(姓名 | 学工号|部门ID|部门名称 | 电话 ^@^ 分隔)
|
|
|
StringBuilder personInfos = new StringBuilder();
|
|
|
@@ -98,23 +100,21 @@ public class PushServiceImpl implements IPushService
|
|
|
personInfos.append(buildPersonInfo(admin));
|
|
|
}
|
|
|
|
|
|
- // 发送一条合并的短信(包含所有管理员)
|
|
|
+ // 发送一条合并的短信(包含所有管理员)- 使用新模板格式
|
|
|
String firstAdminName = admins.get(0).getNickName();
|
|
|
- String smsContent = smsTemplate.replace("{name}", StringUtils.defaultString(firstAdminName))
|
|
|
- .replace("{school}", StringUtils.defaultString(workorder.getSchoolName()))
|
|
|
- .replace("{no}", workorder.getComplaintNo())
|
|
|
- .replace("{link}", StringUtils.defaultString(adminLink));
|
|
|
- sendSmsWithLog(workorder.getComplaintNo(), null, smsContent, personInfos.toString());
|
|
|
+ sendSmsWithLogByTemplate(workorder.getComplaintNo(), personInfos.toString(),
|
|
|
+ firstAdminName, workorder.getSchoolName(), workorder.getComplaintNo(),
|
|
|
+ workorder.getCategory(), "SMS_512120647");
|
|
|
|
|
|
// 公众号:为每个管理员单独发送一条消息(平台限制)
|
|
|
+ String wechatInfo = buildNewWorkorderWechatInfo();
|
|
|
for (SysUser admin : admins) {
|
|
|
// 公众号按学工号匹配,无学工号时跳过
|
|
|
if (StringUtils.isNotBlank(admin.getStaffNo()))
|
|
|
{
|
|
|
String receiveInfo = buildReceiveInfo(admin);
|
|
|
sendWechatWithLog(workorder.getComplaintNo(), admin.getNickName(), admin.getStaffNo(),
|
|
|
- receiveInfo, "新投诉工单提醒",
|
|
|
- buildWechatInfo(workorder.getComplaintNo(), workorder.getSchoolName(), "新工单待受理,请及时处置"));
|
|
|
+ receiveInfo, "新投诉工单提醒", wechatInfo);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -122,13 +122,8 @@ public class PushServiceImpl implements IPushService
|
|
|
@Override
|
|
|
public void pushClosedToCitizen(ComplaintWorkorder workorder)
|
|
|
{
|
|
|
- // 短信通知群众(主通道,确保触达)
|
|
|
- String template = complaintProperties.getMsgTemplate().getOrDefault("sms-citizen-closed",
|
|
|
- "【乌教解忧】您投诉的{school}工单{no}已办结,结论:{conclusion}");
|
|
|
- String content = template.replace("{school}", StringUtils.defaultString(workorder.getSchoolName()))
|
|
|
- .replace("{no}", StringUtils.defaultString(workorder.getComplaintNo()))
|
|
|
- .replace("{conclusion}", StringUtils.abbreviate(StringUtils.defaultString(workorder.getConclusion()), 50));
|
|
|
- sendSmsToCitizen(workorder, content);
|
|
|
+ // 短信通知群众(新模板格式)
|
|
|
+ sendSmsToCitizen(workorder, "办结");
|
|
|
// 公众号(待平台支持 openid 直发,记录日志占位)
|
|
|
String info = buildWechatInfo(workorder.getComplaintNo(), workorder.getSchoolName(),
|
|
|
"已办结:" + StringUtils.abbreviate(StringUtils.defaultString(workorder.getConclusion()), 100));
|
|
|
@@ -138,13 +133,8 @@ public class PushServiceImpl implements IPushService
|
|
|
@Override
|
|
|
public void pushRejectedToCitizen(ComplaintWorkorder workorder)
|
|
|
{
|
|
|
- // 短信通知群众(主通道)
|
|
|
- String template = complaintProperties.getMsgTemplate().getOrDefault("sms-citizen-rejected",
|
|
|
- "【乌教解忧】您投诉的{school}工单{no}已驳回,理由:{reason}");
|
|
|
- String content = template.replace("{school}", StringUtils.defaultString(workorder.getSchoolName()))
|
|
|
- .replace("{no}", StringUtils.defaultString(workorder.getComplaintNo()))
|
|
|
- .replace("{reason}", StringUtils.abbreviate(StringUtils.defaultString(workorder.getRejectReason()), 50));
|
|
|
- sendSmsToCitizen(workorder, content);
|
|
|
+ // 短信通知群众(新模板格式)
|
|
|
+ sendSmsToCitizen(workorder, "驳回");
|
|
|
// 公众号(待平台支持,记录日志占位)
|
|
|
String info = buildWechatInfo(workorder.getComplaintNo(), workorder.getSchoolName(),
|
|
|
"已驳回:" + StringUtils.abbreviate(StringUtils.defaultString(workorder.getRejectReason()), 100));
|
|
|
@@ -183,7 +173,7 @@ public class PushServiceImpl implements IPushService
|
|
|
personInfos.append(buildPersonInfo(admin));
|
|
|
}
|
|
|
|
|
|
- String smsContent = "【乌教解忧】工单 " + workorder.getComplaintNo() + " 收到群众异议复核申请,请及时处理";
|
|
|
+ String smsContent = "【校长信箱】工单 " + workorder.getComplaintNo() + " 收到群众异议复核申请,请及时处理";
|
|
|
sendSmsWithLog(workorder.getComplaintNo(), null, smsContent, personInfos.toString());
|
|
|
|
|
|
// 公众号:逐人推送复核提醒(按学工号匹配)
|
|
|
@@ -204,12 +194,8 @@ public class PushServiceImpl implements IPushService
|
|
|
{
|
|
|
String resultText = review.getStatus() != null && review.getStatus() == ComplaintConstants.REVIEW_PASS
|
|
|
? "复核通过,工单将重新处置" : "复核维持原判";
|
|
|
- // 短信通知群众(主通道)
|
|
|
- String template = complaintProperties.getMsgTemplate().getOrDefault("sms-citizen-review-result",
|
|
|
- "【乌教解忧】您的工单{no}复核结果:{result}");
|
|
|
- String content = template.replace("{no}", StringUtils.defaultString(workorder.getComplaintNo()))
|
|
|
- .replace("{result}", StringUtils.abbreviate(resultText, 30));
|
|
|
- sendSmsToCitizen(workorder, content);
|
|
|
+ // 短信通知群众(新模板格式)
|
|
|
+ sendSmsToCitizen(workorder, resultText);
|
|
|
// 公众号(待平台支持,记录日志占位)
|
|
|
String info = buildWechatInfo(workorder.getComplaintNo(), workorder.getSchoolName(), resultText);
|
|
|
sendWechatToCitizen(workorder, "异议复核处理结果", info);
|
|
|
@@ -224,6 +210,17 @@ public class PushServiceImpl implements IPushService
|
|
|
+ "|||" + StringUtils.defaultString(result);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 新工单提醒公众号内容:固定文案 + 当前时间
|
|
|
+ * 格式:您有一条新的投诉工单待处理|||yyyy-MM-dd HH:mm
|
|
|
+ */
|
|
|
+ private String buildNewWorkorderWechatInfo()
|
|
|
+ {
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
|
|
|
+ String currentTime = sdf.format(new Date());
|
|
|
+ return "您有一条新的投诉工单待处理|||" + currentTime;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 发短信并写日志(带重试)
|
|
|
* @param receiverInfo 接收人信息(可以是合并的多个人,用^@^分隔)
|
|
|
@@ -257,6 +254,56 @@ public class PushServiceImpl implements IPushService
|
|
|
messageLogMapper.insertComplaintMessageLog(messageLog);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 发模板短信并写日志(带重试)- 新格式
|
|
|
+ * sms_info为JSON字符串,包含teacher_name/school/complaint_number/complaint/template_code
|
|
|
+ *
|
|
|
+ * @param receiverInfo 接收人信息(可以是合并的多个人,用^@^分隔)
|
|
|
+ * @param teacherName 短信接收人姓名
|
|
|
+ * @param school 学校名称
|
|
|
+ * @param complaintNumber 投诉工单号
|
|
|
+ * @param complaint 投诉分类
|
|
|
+ * @param templateCode 短信模板id
|
|
|
+ */
|
|
|
+ private void sendSmsWithLogByTemplate(String complaintNo, String receiverInfo,
|
|
|
+ String teacherName, String school, String complaintNumber,
|
|
|
+ String complaint, String templateCode)
|
|
|
+ {
|
|
|
+ if (!umsProperties.getSms().isEnabled())
|
|
|
+ {
|
|
|
+ log.info("短信通道未启用,跳过短信推送 complaintNo={}", complaintNo);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 构造sms_info的JSON字符串(用于日志记录)
|
|
|
+ String smsInfoJson = "{\"teacher_name\":\"" + StringUtils.defaultString(teacherName)
|
|
|
+ + "\",\"school\":\"" + StringUtils.defaultString(school)
|
|
|
+ + "\",\"complaint_number\":\"" + StringUtils.defaultString(complaintNumber)
|
|
|
+ + "\",\"complaint\":\"" + StringUtils.defaultString(complaint)
|
|
|
+ + "\",\"template_code\":\"" + StringUtils.defaultString(templateCode) + "\"}";
|
|
|
+
|
|
|
+ ComplaintMessageLog messageLog = new ComplaintMessageLog();
|
|
|
+ messageLog.setComplaintNo(complaintNo);
|
|
|
+ messageLog.setMsgType(ComplaintConstants.MSG_TYPE_SMS);
|
|
|
+ messageLog.setReceiver(receiverInfo);
|
|
|
+ messageLog.setTempletId(templateCode);
|
|
|
+ messageLog.setContent(smsInfoJson);
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Map<String, Object> resp = retry(() -> smsClient.sendSmsByTemplate(
|
|
|
+ receiverInfo, teacherName, school, complaintNumber,
|
|
|
+ complaint, templateCode, null, null));
|
|
|
+ messageLog.setResult(1);
|
|
|
+ messageLog.setMsgId(resp == null ? "" : String.valueOf(resp.getOrDefault("msg_id", "")));
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ log.error("模板短信推送失败 complaintNo={}", complaintNo, e);
|
|
|
+ messageLog.setResult(0);
|
|
|
+ messageLog.setErrorMsg(StringUtils.abbreviate(e.getMessage(), 450));
|
|
|
+ }
|
|
|
+ messageLogMapper.insertComplaintMessageLog(messageLog);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 发公众号消息并写日志(带重试)
|
|
|
*/
|
|
|
@@ -291,18 +338,60 @@ public class PushServiceImpl implements IPushService
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 短信通知群众(按手机号发送,无需学工号)
|
|
|
- * person_info 格式:姓名|学工号|部门ID|部门名称|电话号码(群众无学工号/部门,中间字段传空)
|
|
|
+ * 短信通知群众(新模板格式)
|
|
|
+ * sms_info为JSON字符串,包含school/complaint_type/complaint_result/template_code
|
|
|
+ *
|
|
|
+ * @param workorder 工单对象
|
|
|
+ * @param complaintResult 投诉处理结果(办结/驳回/复核结果等)
|
|
|
*/
|
|
|
- private void sendSmsToCitizen(ComplaintWorkorder workorder, String content)
|
|
|
+ private void sendSmsToCitizen(ComplaintWorkorder workorder, String complaintResult)
|
|
|
{
|
|
|
if (StringUtils.isBlank(workorder.getPhone()))
|
|
|
{
|
|
|
log.warn("工单 {} 群众未留手机号,跳过短信推送", workorder.getComplaintNo());
|
|
|
return;
|
|
|
}
|
|
|
+ if (!umsProperties.getSms().isEnabled())
|
|
|
+ {
|
|
|
+ log.info("短信通道未启用,跳过群众短信推送 complaintNo={}", workorder.getComplaintNo());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
String receiverInfo = "||||" + workorder.getPhone();
|
|
|
- sendSmsWithLog(workorder.getComplaintNo(), null, content, receiverInfo);
|
|
|
+ String templateCode = "SMS_512265662";
|
|
|
+
|
|
|
+ // 构造sms_info的JSON字符串(用于日志记录)
|
|
|
+ String smsInfoJson = "{\"school\":\"" + StringUtils.defaultString(workorder.getSchoolName())
|
|
|
+ + "\",\"complaint_type\":\"" + StringUtils.defaultString(workorder.getCategory())
|
|
|
+ + "\",\"complaint_result\":\"" + StringUtils.defaultString(complaintResult)
|
|
|
+ + "\",\"template_code\":\"" + templateCode + "\"}";
|
|
|
+
|
|
|
+ ComplaintMessageLog messageLog = new ComplaintMessageLog();
|
|
|
+ messageLog.setComplaintNo(workorder.getComplaintNo());
|
|
|
+ messageLog.setMsgType(ComplaintConstants.MSG_TYPE_SMS);
|
|
|
+ messageLog.setReceiver(receiverInfo);
|
|
|
+ messageLog.setTempletId(templateCode);
|
|
|
+ messageLog.setContent(smsInfoJson);
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Map<String, Object> resp = retry(() -> smsClient.sendSmsToCitizen(
|
|
|
+ receiverInfo,
|
|
|
+ workorder.getSchoolName(),
|
|
|
+ workorder.getCategory(),
|
|
|
+ complaintResult,
|
|
|
+ templateCode,
|
|
|
+ null,
|
|
|
+ null));
|
|
|
+ messageLog.setResult(1);
|
|
|
+ messageLog.setMsgId(resp == null ? "" : String.valueOf(resp.getOrDefault("msg_id", "")));
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ log.error("群众短信推送失败 complaintNo={}", workorder.getComplaintNo(), e);
|
|
|
+ messageLog.setResult(0);
|
|
|
+ messageLog.setErrorMsg(StringUtils.abbreviate(e.getMessage(), 450));
|
|
|
+ }
|
|
|
+ messageLogMapper.insertComplaintMessageLog(messageLog);
|
|
|
}
|
|
|
|
|
|
/**
|