Sfoglia il codice sorgente

短信功能添加模板

DESKTOP-3Q5PM1M\896986 1 giorno fa
parent
commit
7f2fb7513f

+ 3 - 1
complaint-admin/src/main/resources/application-prod.yml

@@ -124,10 +124,12 @@ ums:
         namespace: http://sms.webservice.com             # 短信服务命名空间
         secret-key-raw: a4tfSrXgg6uTyi66S/OmWFOcU5o=  # 【涉密】短信密钥
         interface-method: sms
-        operator-unit-id: 4d99b438044d4238bc240b3a15a66bf
+        operator-unit-id: 4d99b438044d4238bc240b3a15a66bfb
         operator-unit-name: ''
         send-sys-name: 投诉平台系统
         send-priority: 2                    # 东软放开业务通知后改为3
+        admin-template-code: SMS_512120647
+        citizen-template-code: SMS_512265662
     wechat:
         enabled: true
         wsdl: https://www.whjyyun.cn/tp_mp/service/WechatOAService

+ 3 - 1
complaint-admin/src/main/resources/application.yml

@@ -179,6 +179,8 @@ ums:
     operator-unit-name: ''
     send-sys-name: 投诉平台系统
     send-priority: 2                                        # 测试期 2=验证码;东软放开后改 3=立即发送
+    admin-template-code: SMS_512120647                     # 学校管理员短信模板ID(新工单/复核/超时提醒)
+    citizen-template-code: SMS_512265662                   # 投诉人短信模板ID(办结/驳回/复核结果)
   wechat:
     enabled: true
     wsdl: https://www.whjyyun.cn/tp_mp/service/WechatOAService   # 正式环境服务地址(不带?wsdl)
@@ -223,7 +225,7 @@ complaint:
   phone-mask: true
   h5-base-url: ''                                          # 群众端入口域名(生成二维码用),测试/正式切换
   demo-data:
-    enabled: true                                          # 预置演示数据开关:true=预制数据;验证通过或真实数据到位后置 false
+    enabled: false                                         # 预置演示数据开关:正式环境已关闭,初始化类已删除
   msg-template:
     sms-new-workorder: '【校长信箱】{name}您好,{school}有一条新的投诉工单({no}),处置链接:{link}'
     sms-citizen-closed: '【校长信箱】您投诉的{school}工单{no}已办结,结论:{conclusion}'

+ 26 - 0
complaint-workorder/src/main/java/com/complaint/workorder/config/UmsProperties.java

@@ -90,6 +90,12 @@ public class UmsProperties
         /** 发送优先级:2=验证码(测试期),3=立即发送(东软放开后) */
         private String sendPriority = "2";
 
+        /** 学校管理员短信模板ID(新工单/复核/超时提醒) */
+        private String adminTemplateCode = "SMS_512120647";
+
+        /** 投诉人短信模板ID(办结/驳回/复核结果) */
+        private String citizenTemplateCode = "SMS_512265662";
+
         public boolean isEnabled()
         {
             return enabled;
@@ -209,6 +215,26 @@ public class UmsProperties
         {
             this.sendPriority = sendPriority;
         }
+
+        public String getAdminTemplateCode()
+        {
+            return adminTemplateCode;
+        }
+
+        public void setAdminTemplateCode(String adminTemplateCode)
+        {
+            this.adminTemplateCode = adminTemplateCode;
+        }
+
+        public String getCitizenTemplateCode()
+        {
+            return citizenTemplateCode;
+        }
+
+        public void setCitizenTemplateCode(String citizenTemplateCode)
+        {
+            this.citizenTemplateCode = citizenTemplateCode;
+        }
     }
 
     /**

+ 3 - 1
complaint-workorder/src/main/java/com/complaint/workorder/constant/ComplaintConstants.java

@@ -32,7 +32,9 @@ public class ComplaintConstants
     public static final String ACTION_CLOSE = "办结";
     /** 驳回 */
     public static final String ACTION_REJECT = "驳回";
-    /** 复核 */
+    /** 复核申请(群众提交) */
+    public static final String ACTION_REVIEW_SUBMIT = "复核申请";
+    /** 复核结论(管理员处理) */
     public static final String ACTION_REVIEW = "复核";
 
     /* ===== 消息类型(complaint_message_log.msg_type) ===== */

+ 14 - 1
complaint-workorder/src/main/java/com/complaint/workorder/domain/ComplaintProcessLog.java

@@ -34,9 +34,12 @@ public class ComplaintProcessLog extends BaseEntity
     /** 操作管理员ID */
     private Long operatorId;
 
-    /** 操作人姓名 */
+    /** 操作人姓名(用户名) */
     private String operatorName;
 
+    /** 操作人昵称(联查sys_user,非数据库字段,用于显示) */
+    private String nickName;
+
     /** 操作时间 */
     private Date createTime;
 
@@ -130,6 +133,16 @@ public class ComplaintProcessLog extends BaseEntity
         this.operatorName = operatorName;
     }
 
+    public String getNickName()
+    {
+        return nickName;
+    }
+
+    public void setNickName(String nickName)
+    {
+        this.nickName = nickName;
+    }
+
     @Override
     public Date getCreateTime()
     {

+ 36 - 29
complaint-workorder/src/main/java/com/complaint/workorder/push/UmsSmsClient.java

@@ -66,7 +66,7 @@ public class UmsSmsClient
         params.put("user_browser", "");
         String jsonParams = JSON.toJSONString(params);
         log.info("========== 短信发送参数 ==========");
-        log.info("【旧版sendSms方法 - 直接传sms_info字符串】");
+        log.info("【底层sendSms方法 - 通用发送】");
         log.info("接口地址(wsdl): {}", cfg.getWsdl());
         log.info("命名空间(namespace): {}", cfg.getNamespace());
         log.info("方法名: saveSmsInfo");
@@ -94,91 +94,98 @@ public class UmsSmsClient
     }
 
     /**
-     * 发送给学校管理员短信(新格式)
+     * 给学校管理员发送提醒短信
      * <p>
+     * 适用场景:新工单提醒、复核申请提醒、工单超时提醒等
+     * 模板ID:SMS_512120647(配置项 ums.sms.admin-template-code)
      * sms_info 字段为JSON字符串,包含以下字段:
-     * - teacher_name: 短信接收人姓名
-     * - school: 投诉工单中的学校
+     * - teacher_name: 管理员姓名
+     * - school: 学校名称
      * - complaint_number: 投诉工单号
      * - complaint: 投诉分类
-     * - template_code: 短信模板id(固定为 SMS_512120647)
+     * - template_code: 短信模板ID
      *
      * @param personInfo       接收人,格式:姓名|学工号|部门ID|部门名称|电话号码,多人用 ^@^ 分隔
-     * @param teacherName      短信接收人姓名
-     * @param school           投诉工单中的学校
+     * @param teacherName      管理员姓名
+     * @param school           学校名称
      * @param complaintNumber  投诉工单号
      * @param complaint        投诉分类
-     * @param templateCode     短信模板id(固定为 SMS_512120647)
      * @param operatorId       发送人学工号(可空)
      * @param operatorName     发送人姓名(可空)
      * @return 平台返回 {result, msg, msg_id}
      */
-    public Map<String, Object> sendSmsByTemplate(String personInfo, String teacherName,
+    public Map<String, Object> sendSmsToAdmin(String personInfo, String teacherName,
             String school, String complaintNumber, String complaint,
-            String templateCode, String operatorId, String operatorName)
+            String operatorId, String operatorName)
     {
+        UmsProperties.Sms cfg = properties.getSms();
+        String templateCode = cfg.getAdminTemplateCode();
+
         // 构造sms_info的JSON字符串
         Map<String, String> smsInfoMap = new HashMap<>();
         smsInfoMap.put("teacher_name", teacherName == null ? "" : teacherName);
         smsInfoMap.put("school", school == null ? "" : school);
         smsInfoMap.put("complaint_number", complaintNumber == null ? "" : complaintNumber);
         smsInfoMap.put("complaint", complaint == null ? "" : complaint);
-        smsInfoMap.put("template_code", templateCode == null ? "SMS_512120647" : templateCode);
+        smsInfoMap.put("template_code", templateCode);
         String smsInfoJson = JSON.toJSONString(smsInfoMap);
 
-        log.info("========== 模板短信发送参数 ==========");
-        log.info("【新版sendSmsByTemplate方法 - sms_info为JSON字符串】");
+        log.info("========== 学校管理员短信发送参数 ==========");
+        log.info("【sendSmsToAdmin - 模板ID: {}】", templateCode);
         log.info("teacher_name: {}", teacherName);
         log.info("school: {}", school);
         log.info("complaint_number: {}", complaintNumber);
         log.info("complaint: {}", complaint);
-        log.info("template_code: {}", templateCode);
         log.info("sms_info(JSON): {}", smsInfoJson);
-        log.info("======================================");
+        log.info("==========================================");
 
-        // 调用原有的sendSms方法,传入构造好的sms_info JSON字符串
+        // 调用底层sendSms方法,传入构造好的sms_info JSON字符串
         return sendSms(personInfo, smsInfoJson, operatorId, operatorName);
     }
 
     /**
-     * 发送群众短信(办结/驳回/复核结果等场景)
+     * 给投诉人(群众)发送通知短信
      * <p>
+     * 适用场景:办结通知、驳回通知、复核结果通知等
+     * 模板ID:SMS_512265662(配置项 ums.sms.citizen-template-code)
      * sms_info 字段为JSON字符串,包含以下字段:
-     * - school: 投诉的学校名称
+     * - school: 学校名称
      * - complaint_type: 投诉分类
-     * - complaint_result: 投诉处理结果(办结/驳回/复核结果等)
-     * - template_code: 短信模板id(固定为 SMS_512265662)
+     * - complaint_result: 处理结果(办结/驳回/复核结果等)
+     * - template_code: 短信模板ID
      *
      * @param personInfo       接收人,格式:姓名|学工号|部门ID|部门名称|电话号码
-     * @param school           投诉的学校名称
+     * @param school           学校名称
      * @param complaintType    投诉分类
-     * @param complaintResult  投诉处理结果
-     * @param templateCode     短信模板id(固定为 SMS_512265662)
+     * @param complaintResult  处理结果
      * @param operatorId       发送人学工号(可空)
      * @param operatorName     发送人姓名(可空)
      * @return 平台返回 {result, msg, msg_id}
      */
     public Map<String, Object> sendSmsToCitizen(String personInfo, String school,
             String complaintType, String complaintResult,
-            String templateCode, String operatorId, String operatorName)
+            String operatorId, String operatorName)
     {
+        UmsProperties.Sms cfg = properties.getSms();
+        String templateCode = cfg.getCitizenTemplateCode();
+
         // 构造sms_info的JSON字符串
         Map<String, String> smsInfoMap = new HashMap<>();
         smsInfoMap.put("school", school == null ? "" : school);
         smsInfoMap.put("complaint_type", complaintType == null ? "" : complaintType);
         smsInfoMap.put("complaint_result", complaintResult == null ? "" : complaintResult);
-        smsInfoMap.put("template_code", templateCode == null ? "SMS_512265662" : templateCode);
+        smsInfoMap.put("template_code", templateCode);
         String smsInfoJson = JSON.toJSONString(smsInfoMap);
 
-        log.info("========== 群众短信发送参数 ==========");
+        log.info("========== 投诉人短信发送参数 ==========");
+        log.info("【sendSmsToCitizen - 模板ID: {}】", templateCode);
         log.info("school: {}", school);
         log.info("complaint_type: {}", complaintType);
         log.info("complaint_result: {}", complaintResult);
-        log.info("template_code: {}", templateCode);
         log.info("sms_info(JSON): {}", smsInfoJson);
-        log.info("======================================");
+        log.info("==========================================");
 
-        // 调用原有的sendSms方法,传入构造好的sms_info JSON字符串
+        // 调用底层sendSms方法,传入构造好的sms_info JSON字符串
         return sendSms(personInfo, smsInfoJson, operatorId, operatorName);
     }
 }

+ 1 - 1
complaint-workorder/src/main/java/com/complaint/workorder/service/impl/ComplaintWorkorderServiceImpl.java

@@ -284,7 +284,7 @@ public class ComplaintWorkorderServiceImpl implements IComplaintWorkorderService
         {
             throw new ServiceException("工单状态已变更,请刷新后重试");
         }
-        addProcessLog(complaintNo, ComplaintConstants.ACTION_REVIEW, null, null, null, null, openid);
+        addProcessLog(complaintNo, ComplaintConstants.ACTION_REVIEW_SUBMIT, null, null, null, null, openid);
         try
         {
             pushService.pushReviewNotify(exist);

+ 74 - 68
complaint-workorder/src/main/java/com/complaint/workorder/service/impl/PushServiceImpl.java

@@ -100,11 +100,11 @@ public class PushServiceImpl implements IPushService
             personInfos.append(buildPersonInfo(admin));
         }
 
-        // 发送一条合并的短信(包含所有管理员)- 使用新模板格式
+        // 发送一条合并的短信给学校管理员
         String firstAdminName = admins.get(0).getNickName();
-        sendSmsWithLogByTemplate(workorder.getComplaintNo(), personInfos.toString(),
+        sendSmsToAdminWithLog(workorder.getComplaintNo(), personInfos.toString(),
                 firstAdminName, workorder.getSchoolName(), workorder.getComplaintNo(),
-                workorder.getCategory(), "SMS_512120647");
+                workorder.getCategory(), admins.get(0).getStaffNo());
 
         // 公众号:为每个管理员单独发送一条消息(平台限制)
         String wechatInfo = buildNewWorkorderWechatInfo();
@@ -122,8 +122,8 @@ public class PushServiceImpl implements IPushService
     @Override
     public void pushClosedToCitizen(ComplaintWorkorder workorder)
     {
-        // 短信通知群众(新模板格式
-        sendSmsToCitizen(workorder, "办结");
+        // 短信通知投诉人(办结
+        sendSmsToCitizenWithLog(workorder, "办结");
         // 公众号(待平台支持 openid 直发,记录日志占位)
         String info = buildWechatInfo(workorder.getComplaintNo(), workorder.getSchoolName(),
                 "已办结:" + StringUtils.abbreviate(StringUtils.defaultString(workorder.getConclusion()), 100));
@@ -133,8 +133,8 @@ public class PushServiceImpl implements IPushService
     @Override
     public void pushRejectedToCitizen(ComplaintWorkorder workorder)
     {
-        // 短信通知群众(新模板格式
-        sendSmsToCitizen(workorder, "驳回");
+        // 短信通知投诉人(驳回
+        sendSmsToCitizenWithLog(workorder, "驳回");
         // 公众号(待平台支持,记录日志占位)
         String info = buildWechatInfo(workorder.getComplaintNo(), workorder.getSchoolName(),
                 "已驳回:" + StringUtils.abbreviate(StringUtils.defaultString(workorder.getRejectReason()), 100));
@@ -173,8 +173,11 @@ public class PushServiceImpl implements IPushService
             personInfos.append(buildPersonInfo(admin));
         }
 
-        String smsContent = "【校长信箱】工单 " + workorder.getComplaintNo() + " 收到群众异议复核申请,请及时处理";
-        sendSmsWithLog(workorder.getComplaintNo(), null, smsContent, personInfos.toString());
+        // 发送复核申请提醒短信给学校管理员
+        String firstAdminName = admins.get(0).getNickName();
+        sendSmsToAdminWithLog(workorder.getComplaintNo(), personInfos.toString(),
+                firstAdminName, workorder.getSchoolName(), workorder.getComplaintNo(),
+                "异议复核申请", admins.get(0).getStaffNo());
 
         // 公众号:逐人推送复核提醒(按学工号匹配)
         for (SysUser admin : admins)
@@ -194,8 +197,8 @@ public class PushServiceImpl implements IPushService
     {
         String resultText = review.getStatus() != null && review.getStatus() == ComplaintConstants.REVIEW_PASS
                 ? "复核通过,工单将重新处置" : "复核维持原判";
-        // 短信通知群众(新模板格式
-        sendSmsToCitizen(workorder, resultText);
+        // 短信通知投诉人(复核结果
+        sendSmsToCitizenWithLog(workorder, resultText);
         // 公众号(待平台支持,记录日志占位)
         String info = buildWechatInfo(workorder.getComplaintNo(), workorder.getSchoolName(), resultText);
         sendWechatToCitizen(workorder, "异议复核处理结果", info);
@@ -222,64 +225,35 @@ public class PushServiceImpl implements IPushService
     }
 
     /**
-     * 发短信并写日志(带重试)
-     * @param receiverInfo 接收人信息(可以是合并的多个人,用^@^分隔)
-     */
-    private void sendSmsWithLog(String complaintNo, ComplaintAdmin admin, String content, String receiverInfo)
-    {
-        if (!umsProperties.getSms().isEnabled())
-        {
-            log.info("短信通道未启用,跳过短信推送 complaintNo={}", complaintNo);
-            return;
-        }
-        ComplaintMessageLog messageLog = new ComplaintMessageLog();
-        messageLog.setComplaintNo(complaintNo);
-        messageLog.setMsgType(ComplaintConstants.MSG_TYPE_SMS);
-        messageLog.setReceiver(receiverInfo); // 记录所有接收人(批量)
-        messageLog.setTempletId("0");
-        messageLog.setContent(content);
-        try
-        {
-            Map<String, Object> resp = retry(() -> smsClient.sendSms(
-                    receiverInfo, content, 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);
-    }
-
-    /**
-     * 发模板短信并写日志(带重试)- 新格式
-     * sms_info为JSON字符串,包含teacher_name/school/complaint_number/complaint/template_code
+     * 给学校管理员发送短信并写日志(带重试)
+     * <p>
+     * 适用场景:新工单提醒、复核申请提醒、工单超时提醒等
+     * 模板ID从配置 ums.sms.admin-template-code 读取
      *
-     * @param receiverInfo 接收人信息(可以是合并的多个人,用^@^分隔)
-     * @param teacherName  短信接收人姓名
-     * @param school       学校名称
+     * @param receiverInfo    接收人信息(可以是合并的多个人,用^@^分隔)
+     * @param teacherName     管理员姓名
+     * @param school          学校名称
      * @param complaintNumber 投诉工单号
-     * @param complaint    投诉分类
-     * @param templateCode 短信模板id
+     * @param complaint       投诉分类
+     * @param operatorStaffNo 发送人学工号(operator_id,不能为空,否则平台只受理不投递)
      */
-    private void sendSmsWithLogByTemplate(String complaintNo, String receiverInfo,
+    private void sendSmsToAdminWithLog(String complaintNo, String receiverInfo,
             String teacherName, String school, String complaintNumber,
-            String complaint, String templateCode)
+            String complaint, String operatorStaffNo)
     {
         if (!umsProperties.getSms().isEnabled())
         {
-            log.info("短信通道未启用,跳过短信推送 complaintNo={}", complaintNo);
+            log.info("短信通道未启用,跳过学校管理员短信推送 complaintNo={}", complaintNo);
             return;
         }
+        String templateCode = umsProperties.getSms().getAdminTemplateCode();
+
         // 构造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) + "\"}";
+                + "\",\"template_code\":\"" + templateCode + "\"}";
 
         ComplaintMessageLog messageLog = new ComplaintMessageLog();
         messageLog.setComplaintNo(complaintNo);
@@ -289,15 +263,15 @@ public class PushServiceImpl implements IPushService
         messageLog.setContent(smsInfoJson);
         try
         {
-            Map<String, Object> resp = retry(() -> smsClient.sendSmsByTemplate(
+            Map<String, Object> resp = retry(() -> smsClient.sendSmsToAdmin(
                     receiverInfo, teacherName, school, complaintNumber,
-                    complaint, templateCode, null, null));
+                    complaint, operatorStaffNo, teacherName));
             messageLog.setResult(1);
             messageLog.setMsgId(resp == null ? "" : String.valueOf(resp.getOrDefault("msg_id", "")));
         }
         catch (Exception e)
         {
-            log.error("模板短信推送失败 complaintNo={}", complaintNo, e);
+            log.error("学校管理员短信推送失败 complaintNo={}", complaintNo, e);
             messageLog.setResult(0);
             messageLog.setErrorMsg(StringUtils.abbreviate(e.getMessage(), 450));
         }
@@ -338,27 +312,31 @@ public class PushServiceImpl implements IPushService
     }
 
     /**
-     * 短信通知群众(新模板格式)
-     * sms_info为JSON字符串,包含school/complaint_type/complaint_result/template_code
+     * 给投诉人(群众)发送短信并写日志(带重试)
+     * <p>
+     * 适用场景:办结通知、驳回通知、复核结果通知等
+     * 模板ID从配置 ums.sms.citizen-template-code 读取
      *
      * @param workorder       工单对象
-     * @param complaintResult 投诉处理结果(办结/驳回/复核结果等)
+     * @param complaintResult 处理结果(办结/驳回/复核结果等)
      */
-    private void sendSmsToCitizen(ComplaintWorkorder workorder, String complaintResult)
+    private void sendSmsToCitizenWithLog(ComplaintWorkorder workorder, String complaintResult)
     {
         if (StringUtils.isBlank(workorder.getPhone()))
         {
-            log.warn("工单 {} 群众未留手机号,跳过短信推送", workorder.getComplaintNo());
+            log.warn("工单 {} 投诉人未留手机号,跳过短信推送", workorder.getComplaintNo());
             return;
         }
         if (!umsProperties.getSms().isEnabled())
         {
-            log.info("短信通道未启用,跳过群众短信推送 complaintNo={}", workorder.getComplaintNo());
+            log.info("短信通道未启用,跳过投诉人短信推送 complaintNo={}", workorder.getComplaintNo());
             return;
         }
 
         String receiverInfo = "||||" + workorder.getPhone();
-        String templateCode = "SMS_512265662";
+        String templateCode = umsProperties.getSms().getCitizenTemplateCode();
+        // 发送人学工号:东软平台要求 operator_id 非空,否则消息只受理不实际投递
+        String operatorStaffNo = resolveCitizenSmsOperator(workorder);
 
         // 构造sms_info的JSON字符串(用于日志记录)
         String smsInfoJson = "{\"school\":\"" + StringUtils.defaultString(workorder.getSchoolName())
@@ -379,15 +357,14 @@ public class PushServiceImpl implements IPushService
                     workorder.getSchoolName(),
                     workorder.getCategory(),
                     complaintResult,
-                    templateCode,
-                    null,
+                    operatorStaffNo,
                     null));
             messageLog.setResult(1);
             messageLog.setMsgId(resp == null ? "" : String.valueOf(resp.getOrDefault("msg_id", "")));
         }
         catch (Exception e)
         {
-            log.error("群众短信推送失败 complaintNo={}", workorder.getComplaintNo(), e);
+            log.error("投诉人短信推送失败 complaintNo={}", workorder.getComplaintNo(), e);
             messageLog.setResult(0);
             messageLog.setErrorMsg(StringUtils.abbreviate(e.getMessage(), 450));
         }
@@ -415,6 +392,35 @@ public class PushServiceImpl implements IPushService
         messageLogMapper.insertComplaintMessageLog(messageLog);
     }
 
+    /**
+     * 群众短信的发送人学工号:取工单所属学校的管理员学工号(系统代发)
+     * <p>
+     * 东软平台要求 operator_id 非空,否则消息仅"发布成功"但不会实际投递;
+     * 取不到时返回空串(UmsSmsClient 会打告警日志)。
+     */
+    private String resolveCitizenSmsOperator(ComplaintWorkorder workorder)
+    {
+        try
+        {
+            List<SysUser> admins = sysUserMapper.selectUsersByUnitUid(workorder.getUnitUid());
+            if (admins != null)
+            {
+                for (SysUser admin : admins)
+                {
+                    if (StringUtils.isNotBlank(admin.getStaffNo()))
+                    {
+                        return admin.getStaffNo();
+                    }
+                }
+            }
+        }
+        catch (Exception e)
+        {
+            log.warn("查询群众短信发送人学工号失败 complaintNo={}", workorder.getComplaintNo(), e);
+        }
+        return "";
+    }
+
     /**
      * 短信接收人信息:姓名|学工号|部门ID|部门名称|电话号码
      * 学校管理员从 sys_user 读取:nickName(姓名)、staffNo(学工号)、unitUid(学校)、phonenumber(电话)

+ 18 - 7
complaint-workorder/src/main/java/com/complaint/workorder/task/WorkorderOverdueCheckTask.java

@@ -9,6 +9,7 @@ import com.complaint.workorder.domain.ComplaintWorkorder;
 import com.complaint.workorder.mapper.ComplaintAdminMapper;
 import com.complaint.workorder.mapper.ComplaintMessageLogMapper;
 import com.complaint.workorder.mapper.ComplaintWorkorderMapper;
+import com.complaint.workorder.config.UmsProperties;
 import com.complaint.workorder.push.UmsSmsClient;
 import com.complaint.workorder.push.UmsWechatClient;
 import com.ruoyi.common.utils.StringUtils;
@@ -35,16 +36,18 @@ public class WorkorderOverdueCheckTask
     private final ComplaintMessageLogMapper messageLogMapper;
     private final UmsSmsClient smsClient;
     private final UmsWechatClient wechatClient;
+    private final UmsProperties umsProperties;
 
     public WorkorderOverdueCheckTask(ComplaintWorkorderMapper workorderMapper,
             ComplaintAdminMapper adminMapper, ComplaintMessageLogMapper messageLogMapper,
-            UmsSmsClient smsClient, UmsWechatClient wechatClient)
+            UmsSmsClient smsClient, UmsWechatClient wechatClient, UmsProperties umsProperties)
     {
         this.workorderMapper = workorderMapper;
         this.adminMapper = adminMapper;
         this.messageLogMapper = messageLogMapper;
         this.smsClient = smsClient;
         this.wechatClient = wechatClient;
+        this.umsProperties = umsProperties;
     }
 
     /**
@@ -102,20 +105,28 @@ public class WorkorderOverdueCheckTask
         for (ComplaintAdmin admin : admins) {
             // 构建接收人信息(姓名 | 学工号|部门 ID| 部门名称 | 电话号码)
             String personInfo = buildPersonInfo(admin);
-            
+
             try {
-                // 短信推送
-                smsClient.sendSms(personInfo, content, admin.getStaffNo(), admin.getAdminName());
-                
+                // 短信推送(使用学校管理员模板)
+                smsClient.sendSmsToAdmin(personInfo, admin.getAdminName(),
+                        schoolName, complaintNo, "工单超期提醒",
+                        admin.getStaffNo(), admin.getAdminName());
+
                 // 记录推送日志
+                String smsInfoJson = "{\"teacher_name\":\"" + StringUtils.defaultString(admin.getAdminName())
+                        + "\",\"school\":\"" + schoolName
+                        + "\",\"complaint_number\":\"" + complaintNo
+                        + "\",\"complaint\":\"工单超期提醒\""
+                        + "\",\"template_code\":\"" + umsProperties.getSms().getAdminTemplateCode() + "\"}";
                 ComplaintMessageLog msgLog = new ComplaintMessageLog();
                 msgLog.setComplaintNo(complaintNo);
                 msgLog.setMsgType("sms");
                 msgLog.setReceiver(personInfo);
-                msgLog.setContent(content);
+                msgLog.setTempletId(umsProperties.getSms().getAdminTemplateCode());
+                msgLog.setContent(smsInfoJson);
                 msgLog.setResult(1);
                 messageLogMapper.insertComplaintMessageLog(msgLog);
-                
+
             } catch (Exception e) {
                 log.error("超期提醒短信发送失败 complaintNo={} admin={}", complaintNo, admin.getAdminName(), e);
             }

+ 11 - 5
complaint-workorder/src/main/resources/mapper/workorder/ComplaintProcessLogMapper.xml

@@ -42,11 +42,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	</insert>
 
 	<select id="selectProcessLogByNo" parameterType="String" resultMap="ComplaintProcessLogResult">
-		select id, complaint_no, "action", investigation, conclusion, process_images, reject_reason,
-		       operator_id, operator_name, create_time
-		from complaint_process_log
-		where complaint_no = #{complaintNo}
-		order by create_time desc
+		select l.id, l.complaint_no, l."action", l.investigation, l.conclusion, l.process_images, l.reject_reason,
+		       l.operator_id, l.operator_name, l.create_time,
+		       case
+		           when l."action" = '复核申请' then w.name
+		           else u.nick_name
+		       end as nickName
+		from complaint_process_log l
+		left join sys_user u on l.operator_name = u.user_name
+		left join complaint_workorder w on l.operator_name = w.openid and l.complaint_no = w.complaint_no
+		where l.complaint_no = #{complaintNo}
+		order by l.create_time desc
 	</select>
 
 </mapper>

+ 1 - 1
h5-app/index.html

@@ -3,7 +3,7 @@
 <head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-  <title>乌教解忧 - 教育投诉平台</title>
+  <title>校长信箱 - 教育投诉平台</title>
 </head>
 <body>
   <div id="app"></div>

+ 1 - 1
h5-app/src/pages/admin/Workorder.vue

@@ -79,7 +79,7 @@
       <div class="log-item" v-for="log in processLogs" :key="log.id">
         <div class="log-head">
           <van-tag plain type="primary" size="medium">{{ log.action }}</van-tag>
-          <span class="log-meta">{{ log.operatorName }} · {{ formatTime(log.createTime) }}</span>
+          <span class="log-meta">{{ log.nickName || log.operatorName }} · {{ formatTime(log.createTime) }}</span>
         </div>
         <div class="log-content" v-if="log.rejectReason">驳回理由:{{ log.rejectReason }}</div>
         <div class="log-content" v-else-if="log.investigation || log.conclusion">

+ 3 - 3
ruoyi-ui/src/layout/components/Navbar.vue

@@ -10,7 +10,7 @@
 
     <div class="right-menu">
       <template v-if="appStore.device !== 'mobile'">
-        <header-search id="header-search" class="right-menu-item" />
+        <!-- <header-search id="header-search" class="right-menu-item" /> -->
 
         <!-- <screenfull id="screenfull" class="right-menu-item hover-effect" />
 
@@ -25,9 +25,9 @@
           <size-select id="size-select" class="right-menu-item hover-effect" />
         </el-tooltip> -->
 
-        <el-tooltip content="消息通知" effect="dark" placement="bottom">
+        <!-- <el-tooltip content="消息通知" effect="dark" placement="bottom">
           <header-notice id="header-notice" class="right-menu-item hover-effect" />
-        </el-tooltip>
+        </el-tooltip> -->
       </template>
 
       <el-dropdown @command="handleCommand" class="avatar-container right-menu-item hover-effect" trigger="hover">

+ 1 - 1
ruoyi-ui/src/views/complaint/workorder/index.vue

@@ -143,7 +143,7 @@
             <el-timeline-item v-for="log in processLogs" :key="log.id" :timestamp="parseTime(log.createTime)" placement="top">
               <div>
                 <el-tag size="small" style="margin-right: 8px">{{ log.action }}</el-tag>
-                <span style="color: #909399">{{ log.operatorName }}</span>
+                <span style="color: #909399">{{ log.nickName || log.operatorName }}</span>
               </div>
               <div v-if="log.investigation" style="margin-top: 4px">调查经过:{{ log.investigation }}</div>
               <div v-if="log.conclusion" style="margin-top: 4px">处置结论:{{ log.conclusion }}</div>