站控版本 相关业务上线
This commit is contained in:
parent
c4271768e1
commit
90d74beb03
@ -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>
|
||||
|
||||
@ -314,4 +314,8 @@ public interface HDConstant {
|
||||
* 预约单失效前缀
|
||||
*/
|
||||
String preOrder="pre_order:";
|
||||
/***
|
||||
* 站控推送策略
|
||||
*/
|
||||
String STRATEGY_NAME = "站控推送";
|
||||
}
|
||||
|
||||
@ -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> {
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -37,4 +37,10 @@ public class BaseEntity extends IdEntity {
|
||||
@TableField(fill = FieldFill.UPDATE)
|
||||
private Date uptime;
|
||||
|
||||
public BaseEntity() {
|
||||
}
|
||||
|
||||
public BaseEntity(Integer pkId) {
|
||||
super(pkId);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -31,6 +31,8 @@ public enum OrderStatusEnums implements BaseEnum<Integer, String> {
|
||||
Integer code;
|
||||
|
||||
String name;
|
||||
|
||||
|
||||
|
||||
public Integer getCode() {
|
||||
return code;
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -15,6 +15,7 @@ public enum StateFunctionTypesEnum {
|
||||
FUN_CHARGING_DATA("chargingData", "", "充电过程实时信息"),
|
||||
FUN_BAT_DATA("batData", "", "电池实时信息"),
|
||||
FUN_STATION_STATE("stationState", "", "站级状态信息"),
|
||||
FUN_CHARGING_STRATEGY("chargingStrategy", "", "充电策略信息"),
|
||||
;
|
||||
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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消息
|
||||
|
||||
@ -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;
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
|
||||
@ -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());
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
}
|
||||
@ -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);
|
||||
|
||||
}
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
@ -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));
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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)){
|
||||
|
||||
@ -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))) {
|
||||
|
||||
@ -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);
|
||||
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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()));
|
||||
//
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user