站控版本 相关业务上线
This commit is contained in:
parent
c4271768e1
commit
90d74beb03
@ -6,9 +6,6 @@
|
|||||||
<sourceOutputDir name="target/generated-sources/annotations" />
|
<sourceOutputDir name="target/generated-sources/annotations" />
|
||||||
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
|
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
|
||||||
<outputRelativeToContentRoot value="true" />
|
<outputRelativeToContentRoot value="true" />
|
||||||
<module name="common-mongodb" />
|
|
||||||
<module name="cloud-manage-server" />
|
|
||||||
<module name="common-redis" />
|
|
||||||
<module name="common-mybatis" />
|
<module name="common-mybatis" />
|
||||||
<module name="authorization-server" />
|
<module name="authorization-server" />
|
||||||
<module name="resource-server" />
|
<module name="resource-server" />
|
||||||
@ -16,7 +13,10 @@
|
|||||||
<module name="gateway-server" />
|
<module name="gateway-server" />
|
||||||
<module name="admin-server" />
|
<module name="admin-server" />
|
||||||
<module name="common-web" />
|
<module name="common-web" />
|
||||||
|
<module name="common-mongodb" />
|
||||||
<module name="wechat-server" />
|
<module name="wechat-server" />
|
||||||
|
<module name="cloud-manage-server" />
|
||||||
|
<module name="common-redis" />
|
||||||
<module name="common-core" />
|
<module name="common-core" />
|
||||||
</profile>
|
</profile>
|
||||||
</annotationProcessing>
|
</annotationProcessing>
|
||||||
|
|||||||
@ -314,4 +314,8 @@ public interface HDConstant {
|
|||||||
* 预约单失效前缀
|
* 预约单失效前缀
|
||||||
*/
|
*/
|
||||||
String preOrder="pre_order:";
|
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> {
|
public interface BatteryStationCdStrategyDao extends BaseMapper<BatteryStationCdStrategy> {
|
||||||
|
|
||||||
List<BatteryStationCdStrategy> listCdStrategy(@Param("stationCode") String stationCode, @Param("status") Integer status);
|
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)
|
@TableField(fill = FieldFill.UPDATE)
|
||||||
private Date uptime;
|
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")
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||||
@TableField(fill = FieldFill.INSERT)
|
@TableField(fill = FieldFill.INSERT)
|
||||||
private Date ctime;
|
private Date ctime;
|
||||||
|
|
||||||
|
public IdEntity() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public IdEntity(Integer pkId) {
|
||||||
|
this.pkId = pkId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,22 +1,16 @@
|
|||||||
package com.evotech.hd.common.core.entity.cloud;
|
package com.evotech.hd.common.core.entity.cloud;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.IdType;
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.evotech.hd.common.core.entity.BaseEntity;
|
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;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
|
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
|
||||||
import jakarta.validation.constraints.NotBlank;
|
import jakarta.validation.constraints.NotBlank;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author zrb
|
* @author zrb
|
||||||
* @since 2025-02-10
|
* @since 2025-02-10
|
||||||
@ -50,4 +44,18 @@ public class BatteryStationCdStrategyDetail extends BaseEntity implements Serial
|
|||||||
|
|
||||||
@Schema(description = "充电功率")
|
@Schema(description = "充电功率")
|
||||||
private Double chargingPower;
|
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;
|
Integer code;
|
||||||
|
|
||||||
String name;
|
String name;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public Integer getCode() {
|
public Integer getCode() {
|
||||||
return code;
|
return code;
|
||||||
|
|||||||
@ -26,7 +26,7 @@ public class InsertAndUpdateMybatisHandler implements MetaObjectHandler {
|
|||||||
public void insertFill(MetaObject metaObject) {
|
public void insertFill(MetaObject metaObject) {
|
||||||
try {
|
try {
|
||||||
AuthUser user = RedisPermissionUtils.getUser();
|
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("creater",(BeanUtil.isEmpty(user) ? "system" : user.getUid()),metaObject);
|
||||||
mySetFieldValByName("ctime",new Date(),metaObject);
|
mySetFieldValByName("ctime",new Date(),metaObject);
|
||||||
}
|
}
|
||||||
@ -47,8 +47,8 @@ public class InsertAndUpdateMybatisHandler implements MetaObjectHandler {
|
|||||||
@Override
|
@Override
|
||||||
public void updateFill(MetaObject metaObject) {
|
public void updateFill(MetaObject metaObject) {
|
||||||
try {
|
try {
|
||||||
AuthUser user = RedisPermissionUtils.getUser();
|
AuthUser user = RedisPermissionUtils.getUser();
|
||||||
if(BeanUtil.isNotEmpty(metaObject)){
|
if(BeanUtil.isNotEmpty(metaObject) && BeanUtil.isNotEmpty(user)){
|
||||||
mySetFieldValByName("updater",(BeanUtil.isEmpty(user) ? "system" : user.getUid()),metaObject);
|
mySetFieldValByName("updater",(BeanUtil.isEmpty(user) ? "system" : user.getUid()),metaObject);
|
||||||
mySetFieldValByName("uptime",new Date(),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 = "查询")
|
@Operation(summary = "查询")
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
public Result<Page<WechatUser>> list(@ParameterObject PageListWechatUserRequest plwur) {
|
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_CHARGING_DATA("chargingData", "", "充电过程实时信息"),
|
||||||
FUN_BAT_DATA("batData", "", "电池实时信息"),
|
FUN_BAT_DATA("batData", "", "电池实时信息"),
|
||||||
FUN_STATION_STATE("stationState", "", "站级状态信息"),
|
FUN_STATION_STATE("stationState", "", "站级状态信息"),
|
||||||
|
FUN_CHARGING_STRATEGY("chargingStrategy", "", "充电策略信息"),
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import cn.hutool.json.JSONObject;
|
|||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import com.evotech.hd.cloud.mqtt.message.MessageTopic;
|
import com.evotech.hd.cloud.mqtt.message.MessageTopic;
|
||||||
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
|
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 lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.context.ApplicationContext;
|
import org.springframework.context.ApplicationContext;
|
||||||
@ -25,11 +25,11 @@ public class EventMessageService {
|
|||||||
* event消息 处理
|
* event消息 处理
|
||||||
*/
|
*/
|
||||||
public void event(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
|
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)){
|
if(CollectionUtils.isEmpty(mqttEventExchangeProcessorMap)){
|
||||||
log.error("mqttEventExchangeProcessorMap is empty, 没有找到当前的请求信息, 请求接口{}, 请求参数{}", JSONUtil.toJsonStr(header), JSONUtil.toJsonStr(dataBody));
|
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())){
|
if(processor.accept(header.getFunction())){
|
||||||
processor.exchange(topic, header, dataBody);
|
processor.exchange(topic, header, dataBody);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,7 @@
|
|||||||
package com.evotech.hd.cloud.mqtt.message.handle;
|
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.ObjectUtil;
|
||||||
import cn.hutool.core.util.RandomUtil;
|
import cn.hutool.core.util.RandomUtil;
|
||||||
import cn.hutool.crypto.KeyUtil;
|
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.AES;
|
||||||
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
|
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
|
||||||
import cn.hutool.crypto.symmetric.SymmetricCrypto;
|
import cn.hutool.crypto.symmetric.SymmetricCrypto;
|
||||||
|
import cn.hutool.json.JSONConfig;
|
||||||
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONObject;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
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.BatteryStationSecretKey;
|
||||||
import com.evotech.hd.cloud.entity.MessageMqtt;
|
import com.evotech.hd.cloud.entity.MessageMqtt;
|
||||||
import com.evotech.hd.cloud.mqtt.config.MqttPublishMessage;
|
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.MessageTopic;
|
||||||
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
|
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
|
||||||
import com.evotech.hd.cloud.mqtt.message.MyMqttMessage;
|
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.cloud.service.MessageMqttService;
|
||||||
import com.evotech.hd.common.core.constant.HDConstant;
|
import com.evotech.hd.common.core.constant.HDConstant;
|
||||||
import com.evotech.hd.common.redis.utils.RedisUtil;
|
import com.evotech.hd.common.redis.utils.RedisUtil;
|
||||||
@ -45,8 +50,23 @@ public class MessageUtilService {
|
|||||||
private BatteryStationSecretKeyDao batteryStationSecretKeyDao;
|
private BatteryStationSecretKeyDao batteryStationSecretKeyDao;
|
||||||
@Resource
|
@Resource
|
||||||
private MqttPublishMessage publishMessage;
|
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消息
|
* 记录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.JSONObject;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
@ -25,7 +25,7 @@ import org.springframework.stereotype.Service;
|
|||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class MqttEventSwapCompleteExchangeProcessorImpl implements MqttStrategyEventExchangeProcessor {
|
public class MqttConfirmSwapCompleteExchangeProcessorImpl implements MqttStrategyConfirmExchangeProcessor {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
OrderService orderService;
|
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;
|
import com.evotech.hd.cloud.mqtt.message.processor.strategy.MqttStrategyExchangeProcessor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 接口
|
* MqttStrategyEventExchangeProcessor
|
||||||
*
|
*
|
||||||
* @ClassName:MqttStrategyequestExchangeProcessor
|
* @author andy.shi
|
||||||
* @date: 2025年06月19日 16:29
|
* @ClassName:MqttStrategyEventExchangeProcessor
|
||||||
* @author: andy.shi
|
* @date: 2025年10月29日 10:41
|
||||||
* @contact: 17330188597
|
|
||||||
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
|
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public interface MqttStrategyEventExchangeProcessor extends MqttStrategyExchangeProcessor {
|
public interface MqttStrategyEventExchangeProcessor extends MqttStrategyExchangeProcessor {
|
||||||
|
|
||||||
|
|
||||||
default void sendAESMessage(MessageTopic topic, MqttMessageHeader header, EventFunctionTypesEnum typesEnum, MqttResponse response){
|
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());
|
header.setFunction(typesEnum.getReFunction());
|
||||||
logger.info("\r\n=====>>>回复站端的EVENT消息--MQTT发送到消息主题:{},头部信息:{},message:{}", topic,header, JSONUtil.parseObj(response, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN)));
|
logger.info("\r\n=====>>>回复站端的EVENT消息--MQTT发送到消息主题:{},头部信息:{},message:{}", topic,header, JSONUtil.parseObj(response, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN)));
|
||||||
sendAESMessage(topic, header, response);
|
sendAESMessage(topic, header, response);
|
||||||
|
|||||||
@ -55,8 +55,11 @@ public class StrategyFactory implements InitializingBean, ApplicationContextAwar
|
|||||||
}
|
}
|
||||||
return Result.getInstance().error("当前method不存在");
|
return Result.getInstance().error("当前method不存在");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Throwable realException = e.getCause(); // 获取实际的异常
|
Throwable realException = e.getCause();
|
||||||
realException.printStackTrace();
|
if(realException != null){
|
||||||
|
realException.printStackTrace();
|
||||||
|
}// 获取实际的异常
|
||||||
|
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return Result.getInstance().error(e.getMessage());
|
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.MessageTopic;
|
||||||
import com.evotech.hd.cloud.mqtt.message.dto.newer.event.SwapComplete;
|
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.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.mqtt.message.processor.strategy.impl.state.MqttStateSwapStepDataExchangeProcessor;
|
||||||
import com.evotech.hd.cloud.open.processor.StationMessageStrategyExchangeProcessor;
|
import com.evotech.hd.cloud.open.processor.StationMessageStrategyExchangeProcessor;
|
||||||
import com.evotech.hd.cloud.service.OrderService;
|
import com.evotech.hd.cloud.service.OrderService;
|
||||||
@ -45,7 +45,7 @@ public class OrderSwapProcessor implements StationMessageStrategyExchangeProcess
|
|||||||
@Resource
|
@Resource
|
||||||
private MqttStateSwapStepDataExchangeProcessor mqttStateSwapStepDataExchangeProcessor;
|
private MqttStateSwapStepDataExchangeProcessor mqttStateSwapStepDataExchangeProcessor;
|
||||||
@Resource
|
@Resource
|
||||||
private MqttEventSwapCompleteExchangeProcessorImpl mqttEventSwapCompleteExchangeProcessorImpl;
|
private MqttConfirmSwapCompleteExchangeProcessorImpl mqttEventSwapCompleteExchangeProcessorImpl;
|
||||||
/***
|
/***
|
||||||
* 新增换电单 禁止删除, 反射调用
|
* 新增换电单 禁止删除, 反射调用
|
||||||
* @param json
|
* @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.Dto.Result;
|
||||||
import com.evotech.hd.common.core.entity.wechat.WechatUser;
|
import com.evotech.hd.common.core.entity.wechat.WechatUser;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public interface WechatUserService {
|
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> alterPhone(String wuid, String phone, String name);
|
||||||
|
|
||||||
public Result<Integer> companyRelation(String wuid, String pcode, String pname);
|
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;
|
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.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
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.cloud.service.BatteryStationCdStrategyService;
|
||||||
import com.evotech.hd.common.core.Dto.Result;
|
import com.evotech.hd.common.core.Dto.Result;
|
||||||
import com.evotech.hd.common.core.dao.cloud.BatteryStationCdStrategyDao;
|
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.BatteryStationCdStrategy;
|
||||||
import com.evotech.hd.common.core.entity.cloud.BatteryStationCdStrategyDetail;
|
import com.evotech.hd.common.core.entity.cloud.BatteryStationCdStrategyDetail;
|
||||||
import com.evotech.hd.common.core.enums.CodeMsg;
|
import com.evotech.hd.common.core.enums.CodeMsg;
|
||||||
|
import com.evotech.hd.common.core.utils.Collections;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
|
@Slf4j
|
||||||
public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStrategyService {
|
public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStrategyService {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private BatteryStationCdStrategyDao strategyDao;
|
private BatteryStationCdStrategyDao strategyDao;
|
||||||
@Resource
|
@Resource
|
||||||
private BatteryStationCdStrategyDetailDao strategyDetailDao;
|
private BatteryStationCdStrategyDetailDao strategyDetailDao;
|
||||||
|
@Resource
|
||||||
|
private MessageUtilService messageUtilService;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -44,7 +53,17 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
|
|||||||
public Result<Integer> delete(Integer id) {
|
public Result<Integer> delete(Integer id) {
|
||||||
int n = strategyDao.deleteById(id);
|
int n = strategyDao.deleteById(id);
|
||||||
if (n == 1) {
|
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>().success(n);
|
||||||
}
|
}
|
||||||
return new Result<Integer>().error("删除充电策略出错!");
|
return new Result<Integer>().error("删除充电策略出错!");
|
||||||
@ -73,6 +92,7 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
|
|||||||
bscsd.setCtime(new Date());
|
bscsd.setCtime(new Date());
|
||||||
int n = strategyDetailDao.insert(bscsd);
|
int n = strategyDetailDao.insert(bscsd);
|
||||||
if (n == 1) {
|
if (n == 1) {
|
||||||
|
pushStation(bscsd);
|
||||||
return new Result<Integer>().success(n);
|
return new Result<Integer>().success(n);
|
||||||
}
|
}
|
||||||
return new Result<Integer>().error("添加充电策略详情出错!");
|
return new Result<Integer>().error("添加充电策略详情出错!");
|
||||||
@ -82,6 +102,7 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
|
|||||||
public Result<Integer> deleteDetail(Integer id) {
|
public Result<Integer> deleteDetail(Integer id) {
|
||||||
int n = strategyDetailDao.deleteById(id);
|
int n = strategyDetailDao.deleteById(id);
|
||||||
if (n == 1) {
|
if (n == 1) {
|
||||||
|
pushStation(new BatteryStationCdStrategyDetail(id, 3));
|
||||||
return new Result<Integer>().success(n);
|
return new Result<Integer>().success(n);
|
||||||
}
|
}
|
||||||
return new Result<Integer>().error("删除充电策略详情出错!");
|
return new Result<Integer>().error("删除充电策略详情出错!");
|
||||||
@ -91,6 +112,8 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
|
|||||||
public Result<Integer> updateDetail(BatteryStationCdStrategyDetail bscsd) {
|
public Result<Integer> updateDetail(BatteryStationCdStrategyDetail bscsd) {
|
||||||
int n = strategyDetailDao.updateById(bscsd);
|
int n = strategyDetailDao.updateById(bscsd);
|
||||||
if (n == 1) {
|
if (n == 1) {
|
||||||
|
bscsd.setDataType(2);
|
||||||
|
pushStation(bscsd);
|
||||||
return new Result<Integer>().success(n);
|
return new Result<Integer>().success(n);
|
||||||
}
|
}
|
||||||
return new Result<Integer>().error("更新充电策略详情失败!");
|
return new Result<Integer>().error("更新充电策略详情失败!");
|
||||||
@ -119,4 +142,17 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra
|
|||||||
return list;
|
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();
|
OrderDetailVo orderDetailVo = new OrderDetailVo();
|
||||||
Order order = getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, orderNo));
|
Order order = getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, orderNo));
|
||||||
BeanUtils.copyProperties(order, orderDetailVo);
|
BeanUtils.copyProperties(order, orderDetailVo);
|
||||||
|
orderDetailVo.setPerName(order.getOrderPreUname());
|
||||||
orderDetailVo.setAmount(order.getOrderAmount());
|
orderDetailVo.setAmount(order.getOrderAmount());
|
||||||
OrderDetail orderDetail = orderDetailDao.selectOne(new LambdaQueryWrapper<OrderDetail>().eq(OrderDetail::getOrderId, order.getPkId()));
|
OrderDetail orderDetail = orderDetailDao.selectOne(new LambdaQueryWrapper<OrderDetail>().eq(OrderDetail::getOrderId, order.getPkId()));
|
||||||
if(ObjectUtils.isNotEmpty(orderDetail)){
|
if(ObjectUtils.isNotEmpty(orderDetail)){
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package com.evotech.hd.cloud.service.impl;
|
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.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
@ -27,7 +28,7 @@ public class WechatUserServiceImpl implements WechatUserService {
|
|||||||
private WechatUserDao wechatUserDao;
|
private WechatUserDao wechatUserDao;
|
||||||
|
|
||||||
@Override
|
@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<WechatUser> page = new Page<WechatUser>(plwur.getPageNo(), plwur.getPageSize());
|
||||||
|
|
||||||
page = wechatUserDao.selectPage(page, new QueryWrapper<WechatUser>()
|
page = wechatUserDao.selectPage(page, new QueryWrapper<WechatUser>()
|
||||||
@ -49,6 +50,11 @@ public class WechatUserServiceImpl implements WechatUserService {
|
|||||||
return new Result<Page<WechatUser>>().success(page);
|
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
|
@Override
|
||||||
public Result<Integer> alterPhone(String wuid, String phone, String name) {
|
public Result<Integer> alterPhone(String wuid, String phone, String name) {
|
||||||
if (!(StringUtils.hasText(phone) || StringUtils.hasText(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.Dto.request.template.StopServerTemplateDto;
|
||||||
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre;
|
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.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.Order;
|
||||||
import org.springdoc.core.annotations.ParameterObject;
|
import org.springdoc.core.annotations.ParameterObject;
|
||||||
import org.springframework.cloud.openfeign.FeignClient;
|
import org.springframework.cloud.openfeign.FeignClient;
|
||||||
@ -90,4 +91,11 @@ public interface WechatService {
|
|||||||
@Async("taskExecutor")
|
@Async("taskExecutor")
|
||||||
public void sendGzhToBeSettledOrderMessage(@RequestBody Order order);
|
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">
|
<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>
|
</sql>
|
||||||
|
|
||||||
<select id="listCdStrategy" resultMap="BaseResultMap">
|
<select id="listCdStrategy" resultMap="BaseResultMap">
|
||||||
@ -38,6 +38,22 @@
|
|||||||
and a.status = #{status}
|
and a.status = #{status}
|
||||||
</if>
|
</if>
|
||||||
order by a.pk_id desc
|
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>
|
</mapper>
|
||||||
|
|||||||
@ -1,24 +1,35 @@
|
|||||||
package com.evotech.hd.cloud;
|
package com.evotech.hd.cloud;
|
||||||
|
|
||||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||||
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
|
|
||||||
public class AesDecryTest {
|
public class AesDecryTest {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
|
|
||||||
System.out.println(new BCryptPasswordEncoder().encode("123456"));
|
public static void main(String[] args) {
|
||||||
// String key = "94kl35k25d3t2rk2";
|
PasswordEncoder encoder = new BCryptPasswordEncoder();
|
||||||
// String iv = "k394kf44lf1pyq8k";
|
String rawSecret = "123456"; // 原始明文密钥
|
||||||
// SymmetricCrypto aes = new AES(Mode.CBC, Padding.PKCS5Padding, key.getBytes(), iv.getBytes());
|
String encodedSecret = encoder.encode(rawSecret);
|
||||||
// // 需要加密的数据
|
System.out.println("加密后的 client_secret: " + encodedSecret);
|
||||||
// String data = "2yKExCzIRWg6bLwf2zsTn83XhzTAvuQtW5svhO111zihn3oX/Jrf4UFrKCA5UbZy4SWRF5vtcyYXLr8oFof2xRDBXsvFRDFHYKmmkpN6Udk7ChB0sCNTzisaM/iqAtbybD8uC9HpHYCQsSVipUc//aUhgSNvhK7CewK1UjGKnyBvOvCUJiPGVtuKzX5Pf5KIrR1ozJ+moDq01+td8Du5lA3lXaHdLZ8WbmoqYd2T6r3PDVsh/yxC327mNsQrivK0yL3QUt4ZCuLV6G/nQTsxvNgAYprSNVejGCywDD2cWuA4f90bsxJEKFLJ+XUd9/IAJR50QGhwm0qzxWwZzszWU9+EJoDyp+gUUn9bY4u9V/I=";
|
System.out.println(encoder.matches("YTHD123","$2a$10$yQ9xx3SSuObt5.nOYlOtZe78qQo74gZ8tY9FvF97T0OvfIm.89K6O"));
|
||||||
//
|
// 输出示例:$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW
|
||||||
// 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) {
|
||||||
|
// 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;
|
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 io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@ConfigurationProperties(prefix = "hbyt.gzh", ignoreUnknownFields = true)
|
@ConfigurationProperties(prefix = "hbyt.gzh", ignoreUnknownFields = true)
|
||||||
@ -41,4 +40,6 @@ public class GZHProperties {
|
|||||||
private String stopServerTemplateId;
|
private String stopServerTemplateId;
|
||||||
//充电结算订单
|
//充电结算订单
|
||||||
private String chargingIsCompletedTemplateId;
|
private String chargingIsCompletedTemplateId;
|
||||||
|
//设备异常通知
|
||||||
|
private String deviceAlarmTemplateId;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package com.evotech.hd.wechat.controller;
|
package com.evotech.hd.wechat.controller;
|
||||||
|
|
||||||
import com.evotech.hd.common.core.Dto.Result;
|
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.common.core.entity.order.Order;
|
||||||
import com.evotech.hd.wechat.service.gzh.GZHMessageTemplateService;
|
import com.evotech.hd.wechat.service.gzh.GZHMessageTemplateService;
|
||||||
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
|
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
|
||||||
@ -41,4 +42,11 @@ public class SendGzhController {
|
|||||||
public Result<String> sendOrderToBeSettled(@RequestBody Order order) {
|
public Result<String> sendOrderToBeSettled(@RequestBody Order order) {
|
||||||
return gzhMessageTemplateService.sendOrderToBeSettled(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.dao.wechat.WechatUserDao;
|
||||||
import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre;
|
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.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.Order;
|
||||||
import com.evotech.hd.common.core.entity.order.OrderDetail;
|
import com.evotech.hd.common.core.entity.order.OrderDetail;
|
||||||
import com.evotech.hd.common.core.entity.wechat.WechatUser;
|
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.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(): ""))));
|
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);
|
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
|
stop_server_template_id: RVrVqa9Y8-AjOCHxp9LWAnYejjphZhLoHJr0pU2nReo
|
||||||
#充电结束待结算
|
#充电结束待结算
|
||||||
charging_is_completed_template_id: K6cdaBOkxGJpah0vsz5rqxP8JQq-QyWCCTQkadL5G7g
|
charging_is_completed_template_id: K6cdaBOkxGJpah0vsz5rqxP8JQq-QyWCCTQkadL5G7g
|
||||||
|
#设备报警通知
|
||||||
|
device_alarm_template_id: tf6UdLT86ntVQaMLeJ8hLy_B7CUpWsCS-sq6ohLjdN8
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user