longz
2026-07-11 04e4346f9e05f8df3a40a96a8187c93f9d3d524c
微信短信消息推送
5个文件已修改
112 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/SendMessageDTO.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/MsgConstants.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/MsgUtil.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/SendMessageDTO.java
@@ -13,6 +13,8 @@
    private String code;
    private String site;
    private String chargeGun;
    private Integer type;// 1 codeMsg  2 applyCodeMsg 3 faultMsg
    private String chargingCapacity;
    private String chargingFee;
    private Integer type;// 1 codeMsg  2 applyCodeMsg 3 faultMsg 4 vipChargeFinishMsg
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/MsgConstants.java
@@ -20,6 +20,9 @@
    /** 充电结束 TEMPLATE_ID */
    public static final String CHARGE_TEMPLATE_ID = "47b2eb376cfa436faae041a6f2f22688";
    /** VIP充电完成 TEMPLATE_ID */
    public static final String VIP_CHARGE_FINISH_TEMPLATE_ID = "bcfd70421a2b4010a1d4dbae2d17950f";
    /** 桩故障(自动/手动) TEMPLATE_ID */
    public static final String FAULT_TEMPLATE_ID = "37956469a14a47e484a747a1e7e462de";
    /** 更换手机号短信验证码 AP_ID */
@@ -33,6 +36,9 @@
    /** 充电结束 AP_ID */
    public static final String CHARGE_AP_ID = "CD123";
    /** VIP充电完成 AP_ID */
    public static final String VIP_CHARGE_FINISH_AP_ID = "CD123";
    /** 桩故障(自动/手动) AP_ID */
    public static final String FAULT_AP_ID = "GZ123";
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 手机号
@@ -197,4 +227,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);
    }
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -1550,6 +1550,11 @@
                String reqStr2 = MsgUtil.applyCodeMsg(sendMessageDTO.getPhone(), sendMessageDTO.getCode());
                String result2 = HttpUtils.post(MsgConstants.SEND_URL, reqStr2);
                return R.ok(result2);
            case 4:
                String reqStr4 = MsgUtil.vipChargeFinishMsg(sendMessageDTO.getPhone(), sendMessageDTO.getSite(),
                        sendMessageDTO.getChargingCapacity(), sendMessageDTO.getChargingFee());
                String result4 = HttpUtils.post(MsgConstants.SEND_URL, reqStr4);
                return R.ok(result4);
            default:
                String reqStr3 = MsgUtil.faultMsg(sendMessageDTO.getPhone(), sendMessageDTO.getSite(), sendMessageDTO.getChargeGun());
                String result3 = HttpUtils.post(MsgConstants.SEND_URL, reqStr3);
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -7,6 +7,7 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.api.dto.SendMessageDTO;
import com.ruoyi.account.api.feignClient.*;
import com.ruoyi.account.api.model.*;
import com.ruoyi.account.api.vo.AppUserWhitelistMatchVO;
@@ -447,6 +448,42 @@
     */
    private BigDecimal money(BigDecimal amount) {
        return amount == null ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : amount.setScale(2, RoundingMode.HALF_UP);
    }
    private void sendVipChargeFinishMessage(TAppUser appUser, TChargingOrder chargingOrder, Site site) {
        try {
            if (appUser == null || chargingOrder == null || appUser.getVipId() == null || !StringUtils.hasLength(appUser.getPhone())) {
                return;
            }
            GetAppUserVipDetail query = new GetAppUserVipDetail();
            query.setAppUserId(appUser.getId());
            query.setVipId(appUser.getVipId());
            TAppUserVipDetail vipDetail = appUserVipDetailClient.getAppUserVipDetail(query).getData();
            if (vipDetail == null) {
                return;
            }
            SendMessageDTO dto = new SendMessageDTO();
            dto.setType(4);
            dto.setPhone(appUser.getPhone());
            dto.setSite(site == null ? "充电站" : site.getName());
            dto.setChargingCapacity(formatSmsNumber(chargingOrder.getChargingCapacity()));
            BigDecimal fee = chargingOrder.getPaymentAmount() == null ? chargingOrder.getOrderAmount() : chargingOrder.getPaymentAmount();
            dto.setChargingFee(formatSmsNumber(fee));
            R<String> result = appUserClient.sendMessage(dto);
            if (result == null || result.getCode() != 200) {
                log.warn("VIP充电完成短信发送失败,orderCode={}, appUserId={}, result={}", chargingOrder.getCode(), appUser.getId(), result);
            }
        } catch (Exception e) {
            log.warn("VIP充电完成短信发送异常,orderCode={}, appUserId={}", chargingOrder == null ? null : chargingOrder.getCode(), appUser == null ? null : appUser.getId(), e);
        }
    }
    private String formatSmsNumber(BigDecimal value) {
        if (value == null) {
            return "0";
        }
        String text = value.setScale(0, RoundingMode.HALF_UP).toPlainString();
        return text.length() <= 5 ? text : text.substring(0, 5);
    }
    /**
@@ -3488,9 +3525,10 @@
                //添加积分
                if (1 == chargingOrder.getOrderSource()) {
                    TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
                    sendVipChargeFinishMessage(appUser, chargingOrder, site);
                    TIntegralRule integralRule = integralRuleClient.getSet().getData();
                    if (null != integralRule) {
                        TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
                        Integer num1 = JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1");
                        Integer integral = chargingOrder.getServiceCharge().intValue() * num1;
                        if (null != appUser.getVipId()) {