站控版本 相关业务上线

This commit is contained in:
andy 2025-10-29 10:55:51 +08:00
parent c4271768e1
commit 90d74beb03
40 changed files with 681 additions and 59 deletions

View File

@ -6,9 +6,6 @@
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="common-mongodb" />
<module name="cloud-manage-server" />
<module name="common-redis" />
<module name="common-mybatis" />
<module name="authorization-server" />
<module name="resource-server" />
@ -16,7 +13,10 @@
<module name="gateway-server" />
<module name="admin-server" />
<module name="common-web" />
<module name="common-mongodb" />
<module name="wechat-server" />
<module name="cloud-manage-server" />
<module name="common-redis" />
<module name="common-core" />
</profile>
</annotationProcessing>

View File

@ -314,4 +314,8 @@ public interface HDConstant {
* 预约单失效前缀
*/
String preOrder="pre_order:";
/***
* 站控推送策略
*/
String STRATEGY_NAME = "站控推送";
}

View File

@ -0,0 +1,12 @@
package com.evotech.hd.common.core.dao.cloud;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.evotech.hd.common.core.entity.common.AlarmTemplate;
/**
* @author zrb
* @since 2025-02-10
*/
public interface AlarmTemplateDao extends BaseMapper<AlarmTemplate> {
}

View File

@ -16,4 +16,6 @@ import java.util.List;
public interface BatteryStationCdStrategyDao extends BaseMapper<BatteryStationCdStrategy> {
List<BatteryStationCdStrategy> listCdStrategy(@Param("stationCode") String stationCode, @Param("status") Integer status);
BatteryStationCdStrategy getBatteryStationCdStrategyByName(@Param("stationCode") String stationCode, @Param("name") String name);
}

View File

@ -37,4 +37,10 @@ public class BaseEntity extends IdEntity {
@TableField(fill = FieldFill.UPDATE)
private Date uptime;
public BaseEntity() {
}
public BaseEntity(Integer pkId) {
super(pkId);
}
}

View File

@ -36,4 +36,11 @@ public class IdEntity implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@TableField(fill = FieldFill.INSERT)
private Date ctime;
public IdEntity() {
}
public IdEntity(Integer pkId) {
this.pkId = pkId;
}
}

View File

@ -1,22 +1,16 @@
package com.evotech.hd.common.core.entity.cloud;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.evotech.hd.common.core.entity.BaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serializable;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
/**
* @author zrb
* @since 2025-02-10
@ -50,4 +44,18 @@ public class BatteryStationCdStrategyDetail extends BaseEntity implements Serial
@Schema(description = "充电功率")
private Double chargingPower;
/***
* 数据状态, 1正常, 2修改, 3删除
*/
@TableField(exist = false)
private Integer dataType = 1;
public BatteryStationCdStrategyDetail() {
}
public BatteryStationCdStrategyDetail(Integer pkId, Integer dataType) {
super(pkId);
this.dataType = dataType;
}
}

View File

@ -0,0 +1,40 @@
package com.evotech.hd.common.core.entity.common;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.evotech.hd.common.core.entity.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* AlarmTemplate
*
* @author andy.shi
* @ClassName:AlarmTemplate
* @date: 2025年10月28日 15:01
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName(value = "sys_alarm_template", schema = "hd_cloud_manage")
@Schema(name = "AlarmTemplate", description = "异常通知")
public class AlarmTemplate extends BaseEntity implements Serializable {
@Schema(description = "路径", requiredMode = Schema.RequiredMode.REQUIRED)
String path;
@Schema(description = "通知人员", requiredMode = Schema.RequiredMode.REQUIRED)
String recipientIds;
//通知人员姓名
@TableField(exist = false)
String recipientNames;
@TableField(exist = false)
String area;
@TableField(exist = false)
String message;
}

View File

@ -31,6 +31,8 @@ public enum OrderStatusEnums implements BaseEnum<Integer, String> {
Integer code;
String name;
public Integer getCode() {
return code;

View File

@ -26,7 +26,7 @@ public class InsertAndUpdateMybatisHandler implements MetaObjectHandler {
public void insertFill(MetaObject metaObject) {
try {
AuthUser user = RedisPermissionUtils.getUser();
if(BeanUtil.isNotEmpty(metaObject)){
if(BeanUtil.isNotEmpty(metaObject) && BeanUtil.isNotEmpty(user)){
mySetFieldValByName("creater",(BeanUtil.isEmpty(user) ? "system" : user.getUid()),metaObject);
mySetFieldValByName("ctime",new Date(),metaObject);
}
@ -47,8 +47,8 @@ public class InsertAndUpdateMybatisHandler implements MetaObjectHandler {
@Override
public void updateFill(MetaObject metaObject) {
try {
AuthUser user = RedisPermissionUtils.getUser();
if(BeanUtil.isNotEmpty(metaObject)){
AuthUser user = RedisPermissionUtils.getUser();
if(BeanUtil.isNotEmpty(metaObject) && BeanUtil.isNotEmpty(user)){
mySetFieldValByName("updater",(BeanUtil.isEmpty(user) ? "system" : user.getUid()),metaObject);
mySetFieldValByName("uptime",new Date(),metaObject);
}

View File

@ -0,0 +1,80 @@
package com.evotech.hd.cloud.controller.alarm;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.evotech.hd.cloud.entity.request.PageListAlarmTemplateRequest;
import com.evotech.hd.cloud.service.AlarmTemplateService;
import com.evotech.hd.cloud.service.rpc.WechatService;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.entity.common.AlarmTemplate;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.apache.commons.lang3.ObjectUtils;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* AlarmController
*
* @author andy.shi
* @ClassName:AlarmController
* @date: 2025年10月28日 15:13
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Tag(name = "异常通知")
@ApiSupport(order = 48)
@RestController
@RequestMapping("/alarm")
public class AlarmController {
@Autowired
AlarmTemplateService alarmTemplateService;
@Autowired
WechatService wechatService;
@Operation(summary = "增加")
@PostMapping("/add")
@ApiOperationSupport(order = 1)
public Result<Boolean> add(@Valid @ParameterObject AlarmTemplate params) {
return Result.getInstance().build(Boolean.class).success(alarmTemplateService.save(params));
}
@Operation(summary = "删除")
@PostMapping("/del")
@ApiOperationSupport(order = 2)
public Result<Boolean> delete(Integer id) {
return Result.getInstance().build(Boolean.class).success(alarmTemplateService.removeById(id));
}
@Operation(summary = "修改")
@PostMapping({"/update"})
@ApiOperationSupport(order = 3)
public Result<Boolean> update(@ParameterObject AlarmTemplate params) {
return Result.getInstance().build(Boolean.class).success(alarmTemplateService.updateById(params));
}
@Operation(summary = "查询")
@GetMapping("/list")
@ApiOperationSupport(order = 4)
public Result<Page<AlarmTemplate>> list(@ParameterObject PageListAlarmTemplateRequest params) {
return alarmTemplateService.pageList(params);
}
@Operation(summary = "推送通知")
@PostMapping("/send/{path}")
public Result<String> deleteDetail(@RequestBody AlarmTemplate param,@PathVariable("path")String path) {
AlarmTemplate alarmTemplate = alarmTemplateService.getOne(new LambdaQueryWrapper<AlarmTemplate>().eq(AlarmTemplate::getPath, path), false);
if(ObjectUtils.isEmpty(alarmTemplate)){
return Result.getInstance().build(String.class).error("当前路径不存在");
}
alarmTemplate.setArea(param.getArea());
alarmTemplate.setMessage(param.getMessage());
return wechatService.sendGzhToBeSettledAlarmMessage(alarmTemplate);
}
}

View File

@ -28,7 +28,7 @@ public class WechatUserController {
@Operation(summary = "查询")
@GetMapping("/list")
public Result<Page<WechatUser>> list(@ParameterObject PageListWechatUserRequest plwur) {
return wechatUserService.list(plwur);
return wechatUserService.pageList(plwur);
}

View File

@ -0,0 +1,17 @@
package com.evotech.hd.cloud.entity.request;
import com.evotech.hd.common.core.entity.BasePageRequest;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@Schema(name = "查询异常请求参数", hidden = true)
@EqualsAndHashCode(callSuper=false)
public class PageListAlarmTemplateRequest extends BasePageRequest {
@Schema(description = "路径")
private String path;
}

View File

@ -15,6 +15,7 @@ public enum StateFunctionTypesEnum {
FUN_CHARGING_DATA("chargingData", "", "充电过程实时信息"),
FUN_BAT_DATA("batData", "", "电池实时信息"),
FUN_STATION_STATE("stationState", "", "站级状态信息"),
FUN_CHARGING_STRATEGY("chargingStrategy", "", "充电策略信息"),
;

View File

@ -4,7 +4,7 @@ import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
import com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.event.MqttStrategyEventExchangeProcessor;
import com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.confirm.MqttStrategyConfirmExchangeProcessor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
@ -25,11 +25,11 @@ public class EventMessageService {
* event消息 处理
*/
public void event(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
Map<String, MqttStrategyEventExchangeProcessor> mqttEventExchangeProcessorMap = applicationContext.getBeansOfType(MqttStrategyEventExchangeProcessor.class);
Map<String, MqttStrategyConfirmExchangeProcessor> mqttEventExchangeProcessorMap = applicationContext.getBeansOfType(MqttStrategyConfirmExchangeProcessor.class);
if(CollectionUtils.isEmpty(mqttEventExchangeProcessorMap)){
log.error("mqttEventExchangeProcessorMap is empty, 没有找到当前的请求信息, 请求接口{}, 请求参数{}", JSONUtil.toJsonStr(header), JSONUtil.toJsonStr(dataBody));
}
for (MqttStrategyEventExchangeProcessor processor : mqttEventExchangeProcessorMap.values()) {
for (MqttStrategyConfirmExchangeProcessor processor : mqttEventExchangeProcessorMap.values()) {
if(processor.accept(header.getFunction())){
processor.exchange(topic, header, dataBody);
}

View File

@ -1,5 +1,7 @@
package com.evotech.hd.cloud.mqtt.message.handle;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.KeyUtil;
@ -11,6 +13,7 @@ import cn.hutool.crypto.asymmetric.RSA;
import cn.hutool.crypto.symmetric.AES;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@ -18,9 +21,11 @@ import com.evotech.hd.cloud.dao.BatteryStationSecretKeyDao;
import com.evotech.hd.cloud.entity.BatteryStationSecretKey;
import com.evotech.hd.cloud.entity.MessageMqtt;
import com.evotech.hd.cloud.mqtt.config.MqttPublishMessage;
import com.evotech.hd.cloud.mqtt.enums.MqttMessageTypeEnum;
import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
import com.evotech.hd.cloud.mqtt.message.MyMqttMessage;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse;
import com.evotech.hd.cloud.service.MessageMqttService;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.redis.utils.RedisUtil;
@ -45,8 +50,23 @@ public class MessageUtilService {
private BatteryStationSecretKeyDao batteryStationSecretKeyDao;
@Resource
private MqttPublishMessage publishMessage;
public void publishStateMessage(String stationCode, String function, MqttResponse response) {
publishMessage(function, MqttMessageTypeEnum.STATE.getType(),response, stationCode);
}
private void publishMessage(String function, String messageType, MqttResponse response, String stationCode) {
MessageTopic topic = new MessageTopic();
topic.setMessageType(messageType);
topic.setStationCode(stationCode);
topic.setDataDirection("M2S");
MqttMessageHeader header = new MqttMessageHeader();
header.setTimeStamp(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_FORMATTER));
header.setFunction(function);
publishAESMessage(topic, header, JSONUtil.parseObj(response, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN)));
}
/**
* 记录MQTT消息

View File

@ -1,4 +1,4 @@
package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.event;
package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.confirm;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
@ -25,7 +25,7 @@ import org.springframework.stereotype.Service;
*/
@Service
@Slf4j
public class MqttEventSwapCompleteExchangeProcessorImpl implements MqttStrategyEventExchangeProcessor {
public class MqttConfirmSwapCompleteExchangeProcessorImpl implements MqttStrategyConfirmExchangeProcessor {
@Resource
OrderService orderService;

View File

@ -0,0 +1,30 @@
package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.confirm;
import cn.hutool.core.date.DatePattern;
import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONUtil;
import com.evotech.hd.cloud.mqtt.enums.EventFunctionTypesEnum;
import com.evotech.hd.cloud.mqtt.enums.MqttMessageTypeEnum;
import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse;
import com.evotech.hd.cloud.mqtt.message.processor.strategy.MqttStrategyExchangeProcessor;
/**
* 接口
*
* @ClassName:MqttStrategyequestExchangeProcessor
* @date: 2025年06月19日 16:29
* @author: andy.shi
* @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface MqttStrategyConfirmExchangeProcessor extends MqttStrategyExchangeProcessor {
default void sendAESMessage(MessageTopic topic, MqttMessageHeader header, EventFunctionTypesEnum typesEnum, MqttResponse response){
topic.setMessageType(MqttMessageTypeEnum.CONFIRM.getType());
header.setFunction(typesEnum.getReFunction());
logger.info("\r\n=====>>>回复站端的EVENT消息--MQTT发送到消息主题{},头部信息:{},message:{}", topic,header, JSONUtil.parseObj(response, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN)));
sendAESMessage(topic, header, response);
}
}

View File

@ -0,0 +1,29 @@
package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.event;
import cn.hutool.json.JSONObject;
import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* BaseProcessorImpl
*
* @author andy.shi
* @ClassName:BaseProcessorImpl
* @date: 2025年10月29日 10:46
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
@Slf4j
public class BaseProcessorImpl implements MqttStrategyEventExchangeProcessor {
@Override
public boolean accept(String functionName) {
return false;
}
@Override
public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
}
}

View File

@ -11,19 +11,18 @@ import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse;
import com.evotech.hd.cloud.mqtt.message.processor.strategy.MqttStrategyExchangeProcessor;
/**
* 接口
* MqttStrategyEventExchangeProcessor
*
* @ClassName:MqttStrategyequestExchangeProcessor
* @date: 2025年06月19日 16:29
* @author: andy.shi
* @contact: 17330188597
* @author andy.shi
* @ClassName:MqttStrategyEventExchangeProcessor
* @date: 2025年10月29日 10:41
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface MqttStrategyEventExchangeProcessor extends MqttStrategyExchangeProcessor {
default void sendAESMessage(MessageTopic topic, MqttMessageHeader header, EventFunctionTypesEnum typesEnum, MqttResponse response){
topic.setMessageType(MqttMessageTypeEnum.CONFIRM.getType());
topic.setMessageType(MqttMessageTypeEnum.EVENT.getType());
header.setFunction(typesEnum.getReFunction());
logger.info("\r\n=====>>>回复站端的EVENT消息--MQTT发送到消息主题{},头部信息:{},message:{}", topic,header, JSONUtil.parseObj(response, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN)));
sendAESMessage(topic, header, response);

View File

@ -55,8 +55,11 @@ public class StrategyFactory implements InitializingBean, ApplicationContextAwar
}
return Result.getInstance().error("当前method不存在");
} catch (Exception e) {
Throwable realException = e.getCause(); // 获取实际的异常
realException.printStackTrace();
Throwable realException = e.getCause();
if(realException != null){
realException.printStackTrace();
}// 获取实际的异常
e.printStackTrace();
return Result.getInstance().error(e.getMessage());
}

View File

@ -0,0 +1,33 @@
package com.evotech.hd.cloud.open.processor.impl;
import com.alibaba.fastjson.JSONObject;
import com.evotech.hd.cloud.open.processor.StationMessageStrategyExchangeProcessor;
import com.evotech.hd.cloud.service.BatteryStationCdStrategyDetailService;
import com.evotech.hd.common.core.Dto.Result;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
/**
* BatteryStrategyProcessor
*
* @author andy.shi
* @ClassName:BatteryStrategyProcessor
* @date: 2025年09月28日 9:18
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
public class BatteryStrategyProcessor implements StationMessageStrategyExchangeProcessor {
@Resource
BatteryStationCdStrategyDetailService batteryStationCdStrategyDetailService;
/***
* 推送策略
* @param json
* @return
*/
public Result receiveStationStrategy(JSONObject json){
return batteryStationCdStrategyDetailService.addBatteryStationCdStrategyDetailByCloud(json);
}
}

View File

@ -0,0 +1,27 @@
package com.evotech.hd.cloud.open.processor.impl;
import com.alibaba.fastjson.JSONObject;
import com.evotech.hd.cloud.open.processor.StationMessageStrategyExchangeProcessor;
import com.evotech.hd.common.core.Dto.Result;
import org.springframework.stereotype.Service;
/**
* BatteryStrategyProcessor
*
* @author andy.shi
* @ClassName:BatteryStrategyProcessor
* @date: 2025年09月28日 9:18
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
public class KeepaliveProcessor implements StationMessageStrategyExchangeProcessor {
/***
* 心跳检查
* @return
*/
public Result keepalive(JSONObject json){
return Result.getInstance().build(Boolean.class).success(true);
}
}

View File

@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.dto.newer.event.SwapComplete;
import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData;
import com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.event.MqttEventSwapCompleteExchangeProcessorImpl;
import com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.confirm.MqttConfirmSwapCompleteExchangeProcessorImpl;
import com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.state.MqttStateSwapStepDataExchangeProcessor;
import com.evotech.hd.cloud.open.processor.StationMessageStrategyExchangeProcessor;
import com.evotech.hd.cloud.service.OrderService;
@ -45,7 +45,7 @@ public class OrderSwapProcessor implements StationMessageStrategyExchangeProcess
@Resource
private MqttStateSwapStepDataExchangeProcessor mqttStateSwapStepDataExchangeProcessor;
@Resource
private MqttEventSwapCompleteExchangeProcessorImpl mqttEventSwapCompleteExchangeProcessorImpl;
private MqttConfirmSwapCompleteExchangeProcessorImpl mqttEventSwapCompleteExchangeProcessorImpl;
/***
* 新增换电单 禁止删除, 反射调用
* @param json

View File

@ -0,0 +1,20 @@
package com.evotech.hd.cloud.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.evotech.hd.cloud.entity.request.PageListAlarmTemplateRequest;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.entity.common.AlarmTemplate;
/**
* AlarmTemplateService
*
* @author andy.shi
* @ClassName:AlarmTemplateService
* @date: 2025年10月28日 15:14
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface AlarmTemplateService extends IService<AlarmTemplate> {
public Result<Page<AlarmTemplate>> pageList(PageListAlarmTemplateRequest params);
}

View File

@ -0,0 +1,21 @@
package com.evotech.hd.cloud.service;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.entity.cloud.BatteryStationCdStrategyDetail;
/**
* BatteryStationCdStrategyDetailService
*
* @author andy.shi
* @ClassName:BatteryStationCdStrategyDetailService
* @date: 2025年09月28日 9:22
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
public interface BatteryStationCdStrategyDetailService extends IService<BatteryStationCdStrategyDetail> {
public Result<JSONObject> addBatteryStationCdStrategyDetailByCloud (JSONObject jsonObject);
}

View File

@ -5,10 +5,14 @@ import com.evotech.hd.cloud.entity.request.PageListWechatUserRequest;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.entity.wechat.WechatUser;
import java.util.List;
public interface WechatUserService {
public Result<Page<WechatUser>> list(PageListWechatUserRequest plwur);
public Result<Page<WechatUser>> pageList(PageListWechatUserRequest plwur);
public Result<List<WechatUser>> list(List<String> wuIds);
public Result<Integer> alterPhone(String wuid, String phone, String name);
public Result<Integer> companyRelation(String wuid, String pcode, String pname);

View File

@ -0,0 +1,59 @@
package com.evotech.hd.cloud.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.evotech.hd.cloud.entity.request.PageListAlarmTemplateRequest;
import com.evotech.hd.cloud.service.AlarmTemplateService;
import com.evotech.hd.cloud.service.WechatUserService;
import com.evotech.hd.cloud.service.rpc.WechatService;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.Dto.ResultUtil;
import com.evotech.hd.common.core.dao.cloud.AlarmTemplateDao;
import com.evotech.hd.common.core.entity.common.AlarmTemplate;
import com.evotech.hd.common.core.entity.wechat.WechatUser;
import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.common.core.utils.Collections;
import com.evotech.hd.common.core.utils.DataUtils;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* BatteryStationCdStrategyDetailServiceImpl
*
* @author andy.shi
* @ClassName:BatteryStationCdStrategyDetailServiceImpl
* @date: 2025年09月28日 9:25
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
public class AlarmTemplateServiceImpl extends ServiceImpl<AlarmTemplateDao, AlarmTemplate> implements AlarmTemplateService {
@Resource
WechatService wechatService;
@Resource
WechatUserService wechatUserService;
@Override
public Result<Page<AlarmTemplate>> pageList(PageListAlarmTemplateRequest params) {
Page<AlarmTemplate> page = new Page<AlarmTemplate>(params.getPageNo(), params.getPageSize());
page = getBaseMapper().selectPage(page, new LambdaQueryWrapper<AlarmTemplate>()
.eq(StringUtils.hasText(params.getPath()), AlarmTemplate::getPath, params.getPath()));
if (page.getRecords().isEmpty()) {
return new Result<Page<AlarmTemplate>>().error(CodeMsg.DATABASE_RESULT_NULL);
}
page.getRecords().forEach(data->{
Result<List<WechatUser>> listResult = wechatUserService.list(Collections.asList(data.getRecipientIds().split(",")));
if(ResultUtil.verifyCode(listResult)){
data.setRecipientNames(DataUtils.findDefaultValue(ResultUtil.getValue(listResult), new ArrayList<WechatUser>()).stream().map(d-> d.getName()+"-"+d.getPhoneNumber()).collect(Collectors.joining(",")));
}
});
return new Result<Page<AlarmTemplate>>().success(page);
}
}

View File

@ -0,0 +1,58 @@
package com.evotech.hd.cloud.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.evotech.hd.cloud.service.BatteryStationCdStrategyDetailService;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.dao.cloud.BatteryStationCdStrategyDao;
import com.evotech.hd.common.core.dao.cloud.BatteryStationCdStrategyDetailDao;
import com.evotech.hd.common.core.entity.cloud.BatteryStationCdStrategy;
import com.evotech.hd.common.core.entity.cloud.BatteryStationCdStrategyDetail;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
/**
* BatteryStationCdStrategyDetailServiceImpl
*
* @author andy.shi
* @ClassName:BatteryStationCdStrategyDetailServiceImpl
* @date: 2025年09月28日 9:25
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/
@Service
public class BatteryStationCdStrategyDetailServiceImpl extends ServiceImpl<BatteryStationCdStrategyDetailDao, BatteryStationCdStrategyDetail> implements BatteryStationCdStrategyDetailService {
@Resource
BatteryStationCdStrategyDao batteryStationCdStrategyDao;
@Override
public Result<JSONObject> addBatteryStationCdStrategyDetailByCloud(JSONObject jsonObject) {
//云端数据id
Integer cloudId = jsonObject.getInteger("cloudId");
BatteryStationCdStrategyDetail detail = null;
if(cloudId != null){
detail = getById(cloudId);
}else{
detail = new BatteryStationCdStrategyDetail();
BatteryStationCdStrategy batteryStationCdStrategy = batteryStationCdStrategyDao.getBatteryStationCdStrategyByName(jsonObject.getString("stationCode"), HDConstant.STRATEGY_NAME);
if(batteryStationCdStrategy == null){
batteryStationCdStrategy = new BatteryStationCdStrategy();
batteryStationCdStrategy.setStationCode(jsonObject.getString("stationCode"));
batteryStationCdStrategy.setStationName(jsonObject.getString("stationName"));
batteryStationCdStrategy.setStatus(1);
batteryStationCdStrategy.setName(HDConstant.STRATEGY_NAME);
batteryStationCdStrategy.setMiniLimit(5);
batteryStationCdStrategyDao.insert(batteryStationCdStrategy);
}
detail.setStrategyId(batteryStationCdStrategy.getPkId());
detail.setStationCode(batteryStationCdStrategy.getStationCode());
detail.setStationName(batteryStationCdStrategy.getStationName());
detail.setBeginTime(jsonObject.getString("beginTime"));
detail.setEndTime(jsonObject.getString("endTime"));
detail.setChargingPower(jsonObject.getDouble("chargingPower"));
saveOrUpdate(detail);
}
return Result.getInstance().build(JSONObject.class).success((JSONObject)JSONObject.toJSON(detail));
}
}

View File

@ -1,7 +1,11 @@
package com.evotech.hd.cloud.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse;
import com.evotech.hd.cloud.mqtt.message.handle.MessageUtilService;
import com.evotech.hd.cloud.service.BatteryStationCdStrategyService;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.dao.cloud.BatteryStationCdStrategyDao;
@ -9,23 +13,28 @@ import com.evotech.hd.common.core.dao.cloud.BatteryStationCdStrategyDetailDao;
import com.evotech.hd.common.core.entity.cloud.BatteryStationCdStrategy;
import com.evotech.hd.common.core.entity.cloud.BatteryStationCdStrategyDetail;
import com.evotech.hd.common.core.enums.CodeMsg;
import com.evotech.hd.common.core.utils.Collections;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.CompletableFuture;
@Service
@Slf4j
public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStrategyService {
@Resource
private BatteryStationCdStrategyDao strategyDao;
@Resource
private BatteryStationCdStrategyDetailDao strategyDetailDao;
@Resource
private MessageUtilService messageUtilService;
@ -44,7 +53,17 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
public Result<Integer> delete(Integer id) {
int n = strategyDao.deleteById(id);
if (n == 1) {
strategyDetailDao.delete(new QueryWrapper<BatteryStationCdStrategyDetail>().eq("strategy_id", id));
List<BatteryStationCdStrategyDetail> list = strategyDetailDao.selectList(new QueryWrapper<BatteryStationCdStrategyDetail>().eq("strategy_id", id));
if(Collections.isNotEmpty(list)){
List<Integer> delIds = Collections.emptyList();
list.stream().forEach(data->{
delIds.add(data.getPkId());
data.setDataType(3);
pushStation(data);
});
strategyDetailDao.deleteByIds(delIds);
}
// strategyDetailDao.delete(new QueryWrapper<BatteryStationCdStrategyDetail>().eq("strategy_id", id));
return new Result<Integer>().success(n);
}
return new Result<Integer>().error("删除充电策略出错!");
@ -73,6 +92,7 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
bscsd.setCtime(new Date());
int n = strategyDetailDao.insert(bscsd);
if (n == 1) {
pushStation(bscsd);
return new Result<Integer>().success(n);
}
return new Result<Integer>().error("添加充电策略详情出错!");
@ -82,6 +102,7 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
public Result<Integer> deleteDetail(Integer id) {
int n = strategyDetailDao.deleteById(id);
if (n == 1) {
pushStation(new BatteryStationCdStrategyDetail(id, 3));
return new Result<Integer>().success(n);
}
return new Result<Integer>().error("删除充电策略详情出错!");
@ -91,6 +112,8 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
public Result<Integer> updateDetail(BatteryStationCdStrategyDetail bscsd) {
int n = strategyDetailDao.updateById(bscsd);
if (n == 1) {
bscsd.setDataType(2);
pushStation(bscsd);
return new Result<Integer>().success(n);
}
return new Result<Integer>().error("更新充电策略详情失败!");
@ -119,4 +142,17 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
return list;
}
public void pushStation(BatteryStationCdStrategyDetail strategyDetail){
CompletableFuture.runAsync(() -> {
try {
messageUtilService.publishStateMessage(strategyDetail.getStationCode(), StateFunctionTypesEnum.FUN_CHARGING_STRATEGY.getFunction(), new MqttResponse<BatteryStationCdStrategyDetail>().success(strategyDetail));
} catch (Exception e) {
e.printStackTrace();
log.error("云端修正充电策略推送站端失败, 原因是:{}, 推送数据是: {}" , e.getMessage(), JSONObject.toJSONString(strategyDetail));
}
});
}
}

View File

@ -548,6 +548,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
OrderDetailVo orderDetailVo = new OrderDetailVo();
Order order = getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, orderNo));
BeanUtils.copyProperties(order, orderDetailVo);
orderDetailVo.setPerName(order.getOrderPreUname());
orderDetailVo.setAmount(order.getOrderAmount());
OrderDetail orderDetail = orderDetailDao.selectOne(new LambdaQueryWrapper<OrderDetail>().eq(OrderDetail::getOrderId, order.getPkId()));
if(ObjectUtils.isNotEmpty(orderDetail)){

View File

@ -1,5 +1,6 @@
package com.evotech.hd.cloud.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -27,7 +28,7 @@ public class WechatUserServiceImpl implements WechatUserService {
private WechatUserDao wechatUserDao;
@Override
public Result<Page<WechatUser>> list(PageListWechatUserRequest plwur) {
public Result<Page<WechatUser>> pageList(PageListWechatUserRequest plwur) {
Page<WechatUser> page = new Page<WechatUser>(plwur.getPageNo(), plwur.getPageSize());
page = wechatUserDao.selectPage(page, new QueryWrapper<WechatUser>()
@ -49,6 +50,11 @@ public class WechatUserServiceImpl implements WechatUserService {
return new Result<Page<WechatUser>>().success(page);
}
@Override
public Result<List<WechatUser>> list(List<String> wuIds) {
return Result.getInstance().buildList(WechatUser.class).success(wechatUserDao.selectList(new LambdaQueryWrapper<WechatUser>().in(WechatUser::getWuid, wuIds)));
}
@Override
public Result<Integer> alterPhone(String wuid, String phone, String name) {
if (!(StringUtils.hasText(phone) || StringUtils.hasText(name))) {

View File

@ -6,6 +6,7 @@ import com.evotech.hd.common.core.Dto.request.template.AlarmTemplateDto;
import com.evotech.hd.common.core.Dto.request.template.StopServerTemplateDto;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre;
import com.evotech.hd.common.core.entity.cloud.TradeDetail;
import com.evotech.hd.common.core.entity.common.AlarmTemplate;
import com.evotech.hd.common.core.entity.order.Order;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.cloud.openfeign.FeignClient;
@ -90,4 +91,11 @@ public interface WechatService {
@Async("taskExecutor")
public void sendGzhToBeSettledOrderMessage(@RequestBody Order order);
/***
* 发送报警到公众号
* @return
*/
@PostMapping(value = "/send/gzh/alarm/message", consumes = {MediaType.APPLICATION_JSON_VALUE})
public com.evotech.hd.common.core.Dto.Result<String> sendGzhToBeSettledAlarmMessage(@RequestBody AlarmTemplate alarmTemplate);
}

View File

@ -21,7 +21,7 @@
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
pk_id, station_code, station_name, mini_limit, status, ctime, creater, uptime, updater
pk_id, `name`, station_code, station_name, mini_limit, status, ctime, creater, uptime, updater
</sql>
<select id="listCdStrategy" resultMap="BaseResultMap">
@ -38,6 +38,22 @@
and a.status = #{status}
</if>
order by a.pk_id desc
</select>
</select>
<select id="getBatteryStationCdStrategyByName" resultType="com.evotech.hd.common.core.entity.cloud.BatteryStationCdStrategy">
select
<include refid="Base_Column_List"/>
from yt_t_battery_station_cd_strategy
where
1 = 1
<if test="stationCode != null and stationCode != '' ">
and station_code = #{stationCode}
</if>
<if test="name != null and name != '' ">
and name = #{name}
</if>
</select>
</mapper>

View File

@ -1,24 +1,35 @@
package com.evotech.hd.cloud;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
public class AesDecryTest {
public static void main(String[] args) {
System.out.println(new BCryptPasswordEncoder().encode("123456"));
// String key = "94kl35k25d3t2rk2";
// String iv = "k394kf44lf1pyq8k";
// SymmetricCrypto aes = new AES(Mode.CBC, Padding.PKCS5Padding, key.getBytes(), iv.getBytes());
// // 需要加密的数据
// String data = "2yKExCzIRWg6bLwf2zsTn83XhzTAvuQtW5svhO111zihn3oX/Jrf4UFrKCA5UbZy4SWRF5vtcyYXLr8oFof2xRDBXsvFRDFHYKmmkpN6Udk7ChB0sCNTzisaM/iqAtbybD8uC9HpHYCQsSVipUc//aUhgSNvhK7CewK1UjGKnyBvOvCUJiPGVtuKzX5Pf5KIrR1ozJ+moDq01+td8Du5lA3lXaHdLZ8WbmoqYd2T6r3PDVsh/yxC327mNsQrivK0yL3QUt4ZCuLV6G/nQTsxvNgAYprSNVejGCywDD2cWuA4f90bsxJEKFLJ+XUd9/IAJR50QGhwm0qzxWwZzszWU9+EJoDyp+gUUn9bY4u9V/I=";
//
// byte[] decrypt = aes.decrypt(Base64.getDecoder().decode(data));
// System.out.println(new String(decrypt));
//
// SecretKey key1 = KeyUtil.generateKey(SymmetricAlgorithm.AES.getValue());
// System.out.println(Base64.getEncoder().encodeToString(key1.getEncoded()));
public static void main(String[] args) {
PasswordEncoder encoder = new BCryptPasswordEncoder();
String rawSecret = "123456"; // 原始明文密钥
String encodedSecret = encoder.encode(rawSecret);
System.out.println("加密后的 client_secret: " + encodedSecret);
System.out.println(encoder.matches("YTHD123","$2a$10$yQ9xx3SSuObt5.nOYlOtZe78qQo74gZ8tY9FvF97T0OvfIm.89K6O"));
// 输出示例$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW
}
// public static void main(String[] args) {
// System.out.println(new BCryptPasswordEncoder().encode("YTHD123"));
//
// System.out.println(new BCryptPasswordEncoder().encode("123456"));
//// String key = "94kl35k25d3t2rk2";
//// String iv = "k394kf44lf1pyq8k";
//// SymmetricCrypto aes = new AES(Mode.CBC, Padding.PKCS5Padding, key.getBytes(), iv.getBytes());
//// // 需要加密的数据
//// String data = "2yKExCzIRWg6bLwf2zsTn83XhzTAvuQtW5svhO111zihn3oX/Jrf4UFrKCA5UbZy4SWRF5vtcyYXLr8oFof2xRDBXsvFRDFHYKmmkpN6Udk7ChB0sCNTzisaM/iqAtbybD8uC9HpHYCQsSVipUc//aUhgSNvhK7CewK1UjGKnyBvOvCUJiPGVtuKzX5Pf5KIrR1ozJ+moDq01+td8Du5lA3lXaHdLZ8WbmoqYd2T6r3PDVsh/yxC327mNsQrivK0yL3QUt4ZCuLV6G/nQTsxvNgAYprSNVejGCywDD2cWuA4f90bsxJEKFLJ+XUd9/IAJR50QGhwm0qzxWwZzszWU9+EJoDyp+gUUn9bY4u9V/I=";
////
//// byte[] decrypt = aes.decrypt(Base64.getDecoder().decode(data));
//// System.out.println(new String(decrypt));
////
//// SecretKey key1 = KeyUtil.generateKey(SymmetricAlgorithm.AES.getValue());
//// System.out.println(Base64.getEncoder().encodeToString(key1.getEncoded()));
//
// }
}

View File

@ -1,10 +1,9 @@
package com.evotech.hd.wechat.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "hbyt.gzh", ignoreUnknownFields = true)
@ -41,4 +40,6 @@ public class GZHProperties {
private String stopServerTemplateId;
//充电结算订单
private String chargingIsCompletedTemplateId;
//设备异常通知
private String deviceAlarmTemplateId;
}

View File

@ -1,6 +1,7 @@
package com.evotech.hd.wechat.controller;
import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.entity.common.AlarmTemplate;
import com.evotech.hd.common.core.entity.order.Order;
import com.evotech.hd.wechat.service.gzh.GZHMessageTemplateService;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@ -41,4 +42,11 @@ public class SendGzhController {
public Result<String> sendOrderToBeSettled(@RequestBody Order order) {
return gzhMessageTemplateService.sendOrderToBeSettled(order);
}
@Operation(summary = "推送公众号待结算订单消息")
@PostMapping("/alarm/message")
@ApiOperationSupport(order = 2)
public Result<String> sendAlarmToMessage(@RequestBody AlarmTemplate alarmTemplate) {
return gzhMessageTemplateService.sendAlarmToMessage(alarmTemplate);
}
}

View File

@ -0,0 +1,22 @@
package com.evotech.hd.wechat.entity.gzh.templatemessage;
import cn.hutool.json.JSONObject;
import lombok.Data;
import lombok.Getter;
/**
* 充电完成SOC 模板消息 关键词
*/
@Getter
@Data
public class AlarmTemplateData {
/*
所属区域
*/
private JSONObject thing1;
/*
报警原因
*/
private JSONObject thing5;
}

View File

@ -15,6 +15,7 @@ import com.evotech.hd.common.core.dao.cloud.OrderDetailDao;
import com.evotech.hd.common.core.dao.wechat.WechatUserDao;
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre;
import com.evotech.hd.common.core.entity.cloud.TradeDetail;
import com.evotech.hd.common.core.entity.common.AlarmTemplate;
import com.evotech.hd.common.core.entity.order.Order;
import com.evotech.hd.common.core.entity.order.OrderDetail;
import com.evotech.hd.common.core.entity.wechat.WechatUser;
@ -116,10 +117,38 @@ public class GZHMessageTemplateService {
chargeData.setAmount37(JSONUtil.parseObj(Collections.asMap("value", (orderDetail.getServiceFee() != null ? new BigDecimal(orderDetail.getServiceFee()).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_DOWN).setScale(2, RoundingMode.HALF_EVEN).toString() : ""))));
chargeData.setAmount5(JSONUtil.parseObj(Collections.asMap("value", (order.getOrderAmount() != null ? new BigDecimal(order.getOrderAmount()).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_DOWN).setScale(2, RoundingMode.HALF_EVEN).toString(): ""))));
return sendTemplateMessage(wechatUser.getGzhOpenid(), gzhProperties.getChargingIsCompletedTemplateId(),JSONUtil.parseObj(chargeData), true);
}
/***
* 待结算订单推送
* @param order
* @return
*/
public com.evotech.hd.common.core.Dto.Result<String> sendAlarmToMessage(AlarmTemplate alarmTemplate){
if(alarmTemplate.getMessage().length() > 20){
alarmTemplate.setMessage(alarmTemplate.getMessage().substring(0,19));
}
//查询详情
AlarmTemplateData alarmData = new AlarmTemplateData();
alarmData.setThing1(JSONUtil.parseObj(Collections.asMap("value", alarmTemplate.getArea())));
alarmData.setThing5(JSONUtil.parseObj(Collections.asMap("value", alarmTemplate.getMessage())));
Map<String, String> result = Collections.emptyMap();
if(org.apache.commons.lang3.StringUtils.isNotEmpty(alarmTemplate.getRecipientIds())){
List<WechatUser> wechatUsers = wechatUserDao.selectList(new QueryWrapper<WechatUser>().in("wuid", Collections.asList(alarmTemplate.getRecipientIds().split(",")))).stream().filter(d -> org.apache.commons.lang3.StringUtils.isNotEmpty(d.getGzhOpenid())).collect(Collectors.toList());
if(Collections.isEmpty(wechatUsers)){
return Result.getInstance().build(String.class).error("当前错误接口没有绑定微信通知人");
}
for (WechatUser wechatUser : wechatUsers){
result.put(wechatUser.getName(), sendTemplateMessage(wechatUser.getGzhOpenid(), gzhProperties.getDeviceAlarmTemplateId(),JSONUtil.parseObj(alarmData), false).getData());
}
}
return Result.getInstance().build(String.class).success(com.alibaba.fastjson.JSONObject.toJSONString(result));
}

View File

@ -143,3 +143,5 @@ hbyt:
stop_server_template_id: RVrVqa9Y8-AjOCHxp9LWAnYejjphZhLoHJr0pU2nReo
#充电结束待结算
charging_is_completed_template_id: K6cdaBOkxGJpah0vsz5rqxP8JQq-QyWCCTQkadL5G7g
#设备报警通知
device_alarm_template_id: tf6UdLT86ntVQaMLeJ8hLy_B7CUpWsCS-sq6ohLjdN8