From 6629aff939376bbbd7241adaca0d5fc0e1ad4c12 Mon Sep 17 00:00:00 2001 From: wangsq Date: Tue, 30 Jun 2026 09:05:18 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9F=AD=E4=BF=A1=E6=8E=A5=E5=8F=A3=E6=96=B0?= =?UTF-8?q?=E5=A2=9EHIS=E5=8F=AF=E8=B0=83=E7=94=A8=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=BD=BF=E7=94=A8MD5=E5=8A=A0=E5=AF=86=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E6=AF=94=E5=AF=B9=EF=BC=8C=E5=A4=A9=E5=8A=A9=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E5=92=8C=E9=98=BF=E9=87=8C=E4=BA=91=E7=9F=AD=E4=BF=A1=E9=83=BD?= =?UTF-8?q?=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ynxbd/common/action/SmsAction.java | 53 +++++++++++- .../ynxbd/common/helper/common/SmsHelper.java | 82 +++++++++++++++++-- 2 files changed, 129 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/ynxbd/common/action/SmsAction.java b/src/main/java/com/ynxbd/common/action/SmsAction.java index 5fb86c8..6a72231 100644 --- a/src/main/java/com/ynxbd/common/action/SmsAction.java +++ b/src/main/java/com/ynxbd/common/action/SmsAction.java @@ -2,6 +2,7 @@ package com.ynxbd.common.action; import com.alibaba.fastjson.JSONObject; import com.ynxbd.common.action.base.BaseAction; +import com.ynxbd.common.bean.enums.HospEnum; import com.ynxbd.common.bean.sms.SmsTempEnum; import com.ynxbd.common.bean.sms.SmsTemplate; import com.ynxbd.common.bean.wxMessage.WaitReg; @@ -10,13 +11,16 @@ import com.ynxbd.common.helper.common.CodeHelper; import com.ynxbd.common.helper.common.SmsHelper; import com.ynxbd.common.result.Result; import com.ynxbd.common.result.ResultEnum; +import com.ynxbd.wx.config.WeChatConfig; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * @Author wsq @@ -255,7 +259,7 @@ public class SmsAction extends BaseAction { } /** - * 天助平台短信推送(红河州第一人民医院(影像报告使用)) + * 天助平台短信推送(红河州第一人民医院(影像报告使用) * 备注:2025-05-07 只有放射科会发短信 * * @param tel 电话号码 @@ -270,4 +274,51 @@ public class SmsAction extends BaseAction { } return Result.success(SmsHelper.sendDanMi("1000000002608", tel, content)); } + + + /** + * [HIS发送短信] + * + * @param callNo 调用码 + * @param tel 电话 + * @param temParamsJson 内容json + * @param sign 验证签名 + */ + @Action("smsHis") + public Result smsHis(String callNo, String tel, String temParamsJson, String sign) { + log.info("[天助平台-旦米短信]callNo={}, tel={}, temParamsJson={}, sign={}", callNo, tel, temParamsJson, sign); + if (callNo == null || tel == null || temParamsJson == null || sign == null) { + return Result.error(ResultEnum.PARAM_IS_INVALID); + } + String key = "xbd_sms"; + String md5 = DigestUtils.md5Hex(callNo + tel + key).toUpperCase(); + if (!md5.equals(sign)) { + return Result.error(ResultEnum.SIGN_ERROR); + } + + JSONObject smsJson = SmsHelper.parseJson(temParamsJson); + if (smsJson == null) { + return Result.error(ResultEnum.PARAM_IS_INVALID); + } + + switch (callNo) { + case "dept_kq": // 口腔科复诊通知 {p1:姓名,p2:日期,p3:时间,p4:科室} + if (WeChatConfig.APP_ID.equals(HospEnum.红河州人民医院.APP_ID)) { + String template = "尊敬的${p1},温馨提醒:您上次${p2}就诊时预约了${p3}到${p4}复诊,无法就诊请提前改期。"; + return Result.isOK(SmsHelper.sendTemplateDanMi(tel, template, smsJson)); + } + return Result.isOK(SmsHelper.send("SMS_508510318", tel, smsJson)); + + case "pacs": // pacs + if (WeChatConfig.APP_ID.equals(HospEnum.红河州人民医院.APP_ID)) { + String template = "${p1}"; + return Result.isOK(SmsHelper.sendTemplateDanMi(tel, template, smsJson)); + } + return Result.error("[阿里云短信模板未配置]"); + + default: + return Result.error(ResultEnum.PARAM_CALL_NO_NOT_FOUND); + } + } + } diff --git a/src/main/java/com/ynxbd/common/helper/common/SmsHelper.java b/src/main/java/com/ynxbd/common/helper/common/SmsHelper.java index 7d9e20d..fa3e559 100644 --- a/src/main/java/com/ynxbd/common/helper/common/SmsHelper.java +++ b/src/main/java/com/ynxbd/common/helper/common/SmsHelper.java @@ -9,6 +9,8 @@ import com.ynxbd.common.bean.sms.SmsTemplate; import com.ynxbd.common.config.EhCacheConfig; import com.ynxbd.common.helper.ProperHelper; import com.ynxbd.common.helper.http.OkHttpHelper; +import com.ynxbd.common.result.Result; +import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.service.UsageCountService; import lombok.extern.slf4j.Slf4j; import okhttp3.FormBody; @@ -19,6 +21,9 @@ import org.apache.commons.lang3.StringUtils; import org.ehcache.Cache; import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; @Slf4j public class SmsHelper { @@ -214,14 +219,28 @@ public class SmsHelper { /** - * 天助平台(短信平台) + * [天助平台-旦米短信] + * + */ + public static boolean sendTemplateDanMi(String tel, String template, JSONObject smsJson) { + Map map = SmsHelper.jsonObjToMap(smsJson); + if (map == null) { + return false; + } + String content = SmsHelper.replaceTemplate(template, map); + return sendDanMi("1000000002608", tel, content); + } + + + /** + * [天助平台-旦米短信] * * @param templateId 模板id * @param tel 电话号码 * @param content 发送内容 * @return string */ - public static String sendDanMi(String templateId, String tel, String content) { + public static boolean sendDanMi(String templateId, String tel, String content) { String accountSid = "301d69a6ea6ed34b0827a4dec3ca1ff8"; String authToken = "94f37caeddeb36a8400ad0ecc9b04ece"; String timestamp = String.valueOf(new Date().getTime()); @@ -233,14 +252,57 @@ public class SmsHelper { .add("param", content) .add("sig", DigestUtils.md5Hex(accountSid + authToken + timestamp)) .build(); - String result = OkHttpHelper.post("https://openapi.danmi.com/textSMS/sendSMS/V1", requestBody, headers -> { + String respJsonStr = OkHttpHelper.post("https://openapi.danmi.com/textSMS/sendSMS/V1", requestBody, headers -> { headers.add("content-type", "application/x-www-form-urlencoded"); }); new UsageCountService().updateUsageCount(UsageCountEnum.TZ_SMS, null, true); // 人数统计 - log.info("[天助平台] 短信发送 result-{},tel-{},templateId-{},content-{}", result, tel, templateId, content); + log.info("[天助平台-旦米短信]发送 resp-{}, tel-{}, templateId-{}, content-{}", respJsonStr, tel, templateId, content); + if (ObjectUtils.isEmpty(respJsonStr)) { + return false; + } + JSONObject respJson = JsonHelper.parseObject(respJsonStr); + Boolean success = respJson.getBoolean("success"); + return success != null && success; + } + + /** + * 通用模板替换工具 + * + * @param template 带[p1][p2]模板字符串 + * @param map key:p1/p2/p3/p4 value:替换内容 + * @return 替换完成文本 + */ + public static String replaceTemplate(String template, Map map) { + if (template == null) { + return ""; + } + if (map == null || map.isEmpty()) { + return template; + } + + // 转换key为 ${xxx} 格式,过滤value为null的键值对 + Map replaceMap = map.entrySet().stream() + .filter(entry -> entry.getValue() != null) // 剔除value为null,避免替换时报错 + .collect(Collectors.toMap(entry -> "${" + entry.getKey() + "}", Map.Entry::getValue)); + + String result = template; + for (Map.Entry entry : replaceMap.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + result = result.replace(key, value); // 空字符串仍执行替换,把占位符清空;不需要替换可加判断跳过 + } return result; } +// public static void main(String[] args) { +// String template = "尊敬的${p1},温馨提醒:您上次${p2}就诊时预约了${p3}到${p4}复诊,无法就诊请提前改期。"; +// Map param = new HashMap<>(); +// param.put("p1", "李四"); +// param.put("p3", "2026-08-01"); +// param.put("p4", "2026-08-05"); +// String result = replaceTemplate(template, param); +// System.out.println(result); +// } /** * 是否重复发送 @@ -327,6 +389,17 @@ public class SmsHelper { } } + public static Map jsonObjToMap(JSONObject jsonObj) { + if (jsonObj == null) { + return null; + } + Map map = new HashMap<>(); + for (String key : jsonObj.keySet()) { + map.put(key, jsonObj.getString(key)); + } + return map; + } + public static String encodeRSA(String data) { return RSAHelper.encrypt(data, PUBLIC_KEY); } @@ -336,7 +409,6 @@ public class SmsHelper { } - // private void isCache() { // if (CACHE == null) { // 判断是否重复发送验证码 // // 建立一个缓存实例