yanderong
4 天以前 7617d46abee2950b7336e3379f8c7a564939cb54
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/MsgUtil.java
@@ -5,6 +5,8 @@
import com.ruoyi.common.core.utils.req.SubmitTempletReq;
import org.apache.commons.codec.binary.Base64;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.concurrent.ThreadLocalRandom;
public class MsgUtil {
@@ -146,6 +148,34 @@
        return encode;
    }
    /**
     * VIP充电完成:VIP 用户您好!您在{电站名称}的充电已完成,本次电量{充电度数}度,费用共计{充电费用}元。
     */
    public static String vipChargeFinishMsg(String phone, String site, String chargingCapacity, String chargingFee){
        SubmitTempletReq submitReq = new SubmitTempletReq();
        String[] paramss = {limitSiteName(site), limitNumber(chargingCapacity), limitNumber(chargingFee)};
        submitReq.setParams(JSON.toJSONString(paramss));
        submitReq.setTemplateId(MsgConstants.VIP_CHARGE_FINISH_TEMPLATE_ID);
        submitReq.setApId(MsgConstants.VIP_CHARGE_FINISH_AP_ID);
        submitReq.setEcName(ecName);
        submitReq.setSecretKey(secretKey);
        submitReq.setMobiles(phone);
        submitReq.setAddSerial("");
        submitReq.setSign(sign);
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(submitReq.getEcName());
        stringBuffer.append(submitReq.getApId());
        stringBuffer.append(submitReq.getSecretKey());
        stringBuffer.append(submitReq.getTemplateId());
        stringBuffer.append(submitReq.getMobiles());
        stringBuffer.append(submitReq.getParams());
        stringBuffer.append(submitReq.getSign());
        stringBuffer.append(submitReq.getAddSerial());
        submitReq.setMac(MD5Util.getMD5(stringBuffer.toString()));
        String reqText = JSON.toJSONString(submitReq);
        return Base64.encodeBase64String(reqText.getBytes());
    }
    /**  phone  单词可拼接5000个号码
     * 桩故障(自动/手动):检测到【电站1】【编号】号桩设备离线,请及时查看处理!
     * @param phone 手机号
@@ -187,9 +217,95 @@
        String reqText = JSON.toJSONString(submitReq);
        //加密
        String encode = Base64.encodeBase64String(reqText.getBytes());
        System.err.println(encode);
        return encode;
    }
    /**
     * 公司总账户余额不足提醒:尊敬的客户您好!您公司{[公司名称]}总账户余额不足,当前余额{[当前余额]}元,已低于预警线{[预警线]}元。为避免影响车辆正常充电,请及时充值。感谢配合!
     * @param phone 手机号
     * @param companyName 公司名称(纯中文,总长度10)
     * @param balance 当前余额(纯数字,总长度10)
     * @param warnAmount 预警线(纯数字,总长度10)
     * @return
     */
    public static String companyBalanceWarnMsg(String phone, String companyName, String balance, String warnAmount){
        return buildBalanceWarnMsg(phone, MsgConstants.COMPANY_BALANCE_WARN_TEMPLATE_ID,
                new String[]{limitChinese(companyName), limitDecimal(balance), limitDecimal(warnAmount)});
    }
    /**
     * 公司子账号余额不足提醒:尊敬的客户您好!您公司{[公司名称]}用户{[用户信息]}子账户余额不足,当前子账户余额{[当前余额]}元,已低于预警线{[预警线]}元。为避免影响车辆正常充电,请及时分配额度。感谢配合!
     * @param phone 手机号
     * @param companyName 公司名称(纯中文,总长度10)
     * @param userInfo 用户信息(中文+字母+数字,总长度10)
     * @param balance 当前余额(纯数字,总长度10)
     * @param warnAmount 预警线(纯数字,总长度10)
     * @return
     */
    public static String subBalanceWarnMsg(String phone, String companyName, String userInfo, String balance, String warnAmount){
        return buildBalanceWarnMsg(phone, MsgConstants.SUB_BALANCE_WARN_TEMPLATE_ID,
                new String[]{limitChinese(companyName), limitUserInfo(userInfo), limitDecimal(balance), limitDecimal(warnAmount)});
    }
    /**
     * 余额预警模板短信组包(公共逻辑)
     */
    private static String buildBalanceWarnMsg(String phone, String templateId, String[] params){
        SubmitTempletReq submitReq = new SubmitTempletReq();
        submitReq.setApId(MsgConstants.BALANCE_WARN_AP_ID);
        submitReq.setEcName(ecName);
        submitReq.setSecretKey(secretKey);
        submitReq.setParams(JSON.toJSONString(params));
        submitReq.setMobiles(phone);
        submitReq.setAddSerial("");
        submitReq.setSign(sign);
        submitReq.setTemplateId(templateId);
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(submitReq.getEcName());
        stringBuffer.append(submitReq.getApId());
        stringBuffer.append(submitReq.getSecretKey());
        stringBuffer.append(submitReq.getTemplateId());
        stringBuffer.append(submitReq.getMobiles());
        stringBuffer.append(submitReq.getParams());
        stringBuffer.append(submitReq.getSign());
        stringBuffer.append(submitReq.getAddSerial());
        submitReq.setMac(MD5Util.getMD5(stringBuffer.toString()));
        String reqText = JSON.toJSONString(submitReq);
        return Base64.encodeBase64String(reqText.getBytes());
    }
    /**
     * 公司名称参数约束:纯中文,总长度10;剔除非法字符,空值兜底
     */
    private static String limitChinese(String value) {
        String v = value == null ? "" : value.replaceAll("[^\\u4e00-\\u9fa5]", "");
        if (v.length() == 0) {
            v = "公司";
        }
        return v.length() <= 10 ? v : v.substring(0, 10);
    }
    /**
     * 用户信息参数约束:中文+字母+数字,总长度10;剔除非法字符,空值兜底
     */
    private static String limitUserInfo(String value) {
        String v = value == null ? "" : value.replaceAll("[^\\u4e00-\\u9fa5A-Za-z0-9]", "");
        if (v.length() == 0) {
            v = "用户";
        }
        return v.length() <= 10 ? v : v.substring(0, 10);
    }
    /**
     * 金额参数约束:纯数字(允许小数点),总长度10;剔除非法字符,空值兜底
     */
    private static String limitDecimal(String value) {
        String v = value == null ? "" : value.replaceAll("[^\\d.]", "");
        if (v.length() == 0) {
            v = "0";
        }
        return v.length() <= 10 ? v : v.substring(0, 10);
    }
    /**
     * 生成验证码
     * @return
@@ -198,4 +314,31 @@
        return String.valueOf(ThreadLocalRandom.current().nextInt(100000, 999999));
    }
    private static String limitSiteName(String site) {
        String value = site == null ? "充电站" : site.replaceAll("[^\\u4e00-\\u9fa5\\d,。!?、:;()《》【】]", "");
        if (value.length() == 0) {
            value = "充电站";
        }
        return value.length() <= 10 ? value : value.substring(0, 10);
    }
    private static String limitNumber(String value) {
        if (value == null) {
            return "0";
        }
        String number = value.replaceAll("[^\\d.]", "");
        if (number.length() == 0) {
            return "0";
        }
        try {
            number = new BigDecimal(number).setScale(0, RoundingMode.HALF_UP).toPlainString();
        } catch (NumberFormatException e) {
            number = number.replaceAll("\\D", "");
        }
        if (number.length() == 0) {
            return "0";
        }
        return number.length() <= 5 ? number : number.substring(0, 5);
    }
}