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()) {