From 90d74beb039a99986ec918ac6c23c3864cc9be6a Mon Sep 17 00:00:00 2001 From: andy <1042025947@qq.com> Date: Wed, 29 Oct 2025 10:55:51 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AB=99=E6=8E=A7=E7=89=88=E6=9C=AC=20?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E4=B8=9A=E5=8A=A1=E4=B8=8A=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/compiler.xml | 6 +- .../hd/common/core/constant/HDConstant.java | 4 + .../core/dao/cloud/AlarmTemplateDao.java | 12 +++ .../cloud/BatteryStationCdStrategyDao.java | 2 + .../hd/common/core/entity/BaseEntity.java | 6 ++ .../hd/common/core/entity/IdEntity.java | 7 ++ .../cloud/BatteryStationCdStrategyDetail.java | 26 +++--- .../core/entity/common/AlarmTemplate.java | 40 ++++++++++ .../common/core/enums/OrderStatusEnums.java | 2 + .../InsertAndUpdateMybatisHandler.java | 6 +- .../controller/alarm/AlarmController.java | 80 +++++++++++++++++++ .../customer/WechatUserController.java | 2 +- .../request/PageListAlarmTemplateRequest.java | 17 ++++ .../mqtt/enums/StateFunctionTypesEnum.java | 1 + .../message/handle/EventMessageService.java | 6 +- .../message/handle/MessageUtilService.java | 22 ++++- ...irmSwapCompleteExchangeProcessorImpl.java} | 4 +- .../MqttStrategyConfirmExchangeProcessor.java | 30 +++++++ .../impl/event/BaseProcessorImpl.java | 29 +++++++ .../MqttStrategyEventExchangeProcessor.java | 13 ++- .../cloud/open/processor/StrategyFactory.java | 7 +- .../impl/BatteryStrategyProcessor.java | 33 ++++++++ .../processor/impl/KeepaliveProcessor.java | 27 +++++++ .../processor/impl/OrderSwapProcessor.java | 4 +- .../cloud/service/AlarmTemplateService.java | 20 +++++ ...BatteryStationCdStrategyDetailService.java | 21 +++++ .../hd/cloud/service/WechatUserService.java | 8 +- .../impl/AlarmTemplateServiceImpl.java | 59 ++++++++++++++ ...eryStationCdStrategyDetailServiceImpl.java | 58 ++++++++++++++ .../BatteryStationCdStrategyServiceImpl.java | 40 +++++++++- .../cloud/service/impl/OrderServiceImpl.java | 1 + .../service/impl/WechatUserServiceImpl.java | 8 +- .../hd/cloud/service/rpc/WechatService.java | 8 ++ .../mapper/BatteryStationCdStrategyMapper.xml | 20 ++++- .../com/evotech/hd/cloud/AesDecryTest.java | 41 ++++++---- .../hd/wechat/config/GZHProperties.java | 7 +- .../wechat/controller/SendGzhController.java | 8 ++ .../templatemessage/AlarmTemplateData.java | 22 +++++ .../gzh/GZHMessageTemplateService.java | 31 ++++++- .../src/main/resources/application.yml | 2 + 40 files changed, 681 insertions(+), 59 deletions(-) create mode 100644 base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/AlarmTemplateDao.java create mode 100644 base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/common/AlarmTemplate.java create mode 100644 cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/alarm/AlarmController.java create mode 100644 cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/request/PageListAlarmTemplateRequest.java rename cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/{event/MqttEventSwapCompleteExchangeProcessorImpl.java => confirm/MqttConfirmSwapCompleteExchangeProcessorImpl.java} (98%) create mode 100644 cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/confirm/MqttStrategyConfirmExchangeProcessor.java create mode 100644 cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/event/BaseProcessorImpl.java create mode 100644 cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/impl/BatteryStrategyProcessor.java create mode 100644 cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/impl/KeepaliveProcessor.java create mode 100644 cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/AlarmTemplateService.java create mode 100644 cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/BatteryStationCdStrategyDetailService.java create mode 100644 cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/AlarmTemplateServiceImpl.java create mode 100644 cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationCdStrategyDetailServiceImpl.java create mode 100644 wechat-server/src/main/java/com/evotech/hd/wechat/entity/gzh/templatemessage/AlarmTemplateData.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml index b0702df..cd8b700 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -6,9 +6,6 @@ - - - @@ -16,7 +13,10 @@ + + + diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/constant/HDConstant.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/constant/HDConstant.java index d4143cb..f0a453e 100644 --- a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/constant/HDConstant.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/constant/HDConstant.java @@ -314,4 +314,8 @@ public interface HDConstant { * 预约单失效前缀 */ String preOrder="pre_order:"; + /*** + * 站控推送策略 + */ + String STRATEGY_NAME = "站控推送"; } diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/AlarmTemplateDao.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/AlarmTemplateDao.java new file mode 100644 index 0000000..5badb9e --- /dev/null +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/AlarmTemplateDao.java @@ -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 { + +} diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/BatteryStationCdStrategyDao.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/BatteryStationCdStrategyDao.java index 85769b7..b995d66 100644 --- a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/BatteryStationCdStrategyDao.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/dao/cloud/BatteryStationCdStrategyDao.java @@ -16,4 +16,6 @@ import java.util.List; public interface BatteryStationCdStrategyDao extends BaseMapper { List listCdStrategy(@Param("stationCode") String stationCode, @Param("status") Integer status); + + BatteryStationCdStrategy getBatteryStationCdStrategyByName(@Param("stationCode") String stationCode, @Param("name") String name); } diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/BaseEntity.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/BaseEntity.java index e6e90e9..b5f38d0 100644 --- a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/BaseEntity.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/BaseEntity.java @@ -37,4 +37,10 @@ public class BaseEntity extends IdEntity { @TableField(fill = FieldFill.UPDATE) private Date uptime; + public BaseEntity() { + } + + public BaseEntity(Integer pkId) { + super(pkId); + } } diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/IdEntity.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/IdEntity.java index 0706709..ad797cb 100644 --- a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/IdEntity.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/IdEntity.java @@ -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; + } } diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/BatteryStationCdStrategyDetail.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/BatteryStationCdStrategyDetail.java index 80ce45f..63650d9 100644 --- a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/BatteryStationCdStrategyDetail.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/BatteryStationCdStrategyDetail.java @@ -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; + } } diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/common/AlarmTemplate.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/common/AlarmTemplate.java new file mode 100644 index 0000000..368cbc7 --- /dev/null +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/common/AlarmTemplate.java @@ -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; + +} diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/enums/OrderStatusEnums.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/enums/OrderStatusEnums.java index 5d65657..19b6646 100644 --- a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/enums/OrderStatusEnums.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/enums/OrderStatusEnums.java @@ -31,6 +31,8 @@ public enum OrderStatusEnums implements BaseEnum { Integer code; String name; + + public Integer getCode() { return code; diff --git a/base-commons/common-permission/src/main/java/com/evotech/hd/common/permission/handler/InsertAndUpdateMybatisHandler.java b/base-commons/common-permission/src/main/java/com/evotech/hd/common/permission/handler/InsertAndUpdateMybatisHandler.java index f417b87..71d9544 100644 --- a/base-commons/common-permission/src/main/java/com/evotech/hd/common/permission/handler/InsertAndUpdateMybatisHandler.java +++ b/base-commons/common-permission/src/main/java/com/evotech/hd/common/permission/handler/InsertAndUpdateMybatisHandler.java @@ -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); } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/alarm/AlarmController.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/alarm/AlarmController.java new file mode 100644 index 0000000..51b8eed --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/alarm/AlarmController.java @@ -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 add(@Valid @ParameterObject AlarmTemplate params) { + return Result.getInstance().build(Boolean.class).success(alarmTemplateService.save(params)); + } + + @Operation(summary = "删除") + @PostMapping("/del") + @ApiOperationSupport(order = 2) + public Result delete(Integer id) { + return Result.getInstance().build(Boolean.class).success(alarmTemplateService.removeById(id)); + } + + @Operation(summary = "修改") + @PostMapping({"/update"}) + @ApiOperationSupport(order = 3) + public Result update(@ParameterObject AlarmTemplate params) { + return Result.getInstance().build(Boolean.class).success(alarmTemplateService.updateById(params)); + } + + @Operation(summary = "查询") + @GetMapping("/list") + @ApiOperationSupport(order = 4) + public Result> list(@ParameterObject PageListAlarmTemplateRequest params) { + return alarmTemplateService.pageList(params); + } + + @Operation(summary = "推送通知") + @PostMapping("/send/{path}") + + public Result deleteDetail(@RequestBody AlarmTemplate param,@PathVariable("path")String path) { + AlarmTemplate alarmTemplate = alarmTemplateService.getOne(new LambdaQueryWrapper().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); + } +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/customer/WechatUserController.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/customer/WechatUserController.java index c070862..24b4476 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/customer/WechatUserController.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/customer/WechatUserController.java @@ -28,7 +28,7 @@ public class WechatUserController { @Operation(summary = "查询") @GetMapping("/list") public Result> list(@ParameterObject PageListWechatUserRequest plwur) { - return wechatUserService.list(plwur); + return wechatUserService.pageList(plwur); } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/request/PageListAlarmTemplateRequest.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/request/PageListAlarmTemplateRequest.java new file mode 100644 index 0000000..25f2a47 --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/entity/request/PageListAlarmTemplateRequest.java @@ -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; + +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/enums/StateFunctionTypesEnum.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/enums/StateFunctionTypesEnum.java index d18aaf1..b5d3f73 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/enums/StateFunctionTypesEnum.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/enums/StateFunctionTypesEnum.java @@ -15,6 +15,7 @@ public enum StateFunctionTypesEnum { FUN_CHARGING_DATA("chargingData", "", "充电过程实时信息"), FUN_BAT_DATA("batData", "", "电池实时信息"), FUN_STATION_STATE("stationState", "", "站级状态信息"), + FUN_CHARGING_STRATEGY("chargingStrategy", "", "充电策略信息"), ; diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/EventMessageService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/EventMessageService.java index 137ab59..6517611 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/EventMessageService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/EventMessageService.java @@ -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 mqttEventExchangeProcessorMap = applicationContext.getBeansOfType(MqttStrategyEventExchangeProcessor.class); + Map 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); } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/MessageUtilService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/MessageUtilService.java index 2557a9d..641a4ac 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/MessageUtilService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/MessageUtilService.java @@ -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消息 diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/event/MqttEventSwapCompleteExchangeProcessorImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/confirm/MqttConfirmSwapCompleteExchangeProcessorImpl.java similarity index 98% rename from cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/event/MqttEventSwapCompleteExchangeProcessorImpl.java rename to cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/confirm/MqttConfirmSwapCompleteExchangeProcessorImpl.java index 901edda..664bdc5 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/event/MqttEventSwapCompleteExchangeProcessorImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/confirm/MqttConfirmSwapCompleteExchangeProcessorImpl.java @@ -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; diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/confirm/MqttStrategyConfirmExchangeProcessor.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/confirm/MqttStrategyConfirmExchangeProcessor.java new file mode 100644 index 0000000..8471dfb --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/confirm/MqttStrategyConfirmExchangeProcessor.java @@ -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); + } +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/event/BaseProcessorImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/event/BaseProcessorImpl.java new file mode 100644 index 0000000..2f504c3 --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/event/BaseProcessorImpl.java @@ -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) { + + } +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/event/MqttStrategyEventExchangeProcessor.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/event/MqttStrategyEventExchangeProcessor.java index b775ca7..72ca9f4 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/event/MqttStrategyEventExchangeProcessor.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/event/MqttStrategyEventExchangeProcessor.java @@ -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); diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/StrategyFactory.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/StrategyFactory.java index 1c9d327..4d4fd60 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/StrategyFactory.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/StrategyFactory.java @@ -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()); } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/impl/BatteryStrategyProcessor.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/impl/BatteryStrategyProcessor.java new file mode 100644 index 0000000..9ab4f52 --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/impl/BatteryStrategyProcessor.java @@ -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); + } + +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/impl/KeepaliveProcessor.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/impl/KeepaliveProcessor.java new file mode 100644 index 0000000..d818df3 --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/impl/KeepaliveProcessor.java @@ -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); + } + +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/impl/OrderSwapProcessor.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/impl/OrderSwapProcessor.java index 2bf28e2..8b99869 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/impl/OrderSwapProcessor.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/open/processor/impl/OrderSwapProcessor.java @@ -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 diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/AlarmTemplateService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/AlarmTemplateService.java new file mode 100644 index 0000000..cf87d7a --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/AlarmTemplateService.java @@ -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 { + + public Result> pageList(PageListAlarmTemplateRequest params); +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/BatteryStationCdStrategyDetailService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/BatteryStationCdStrategyDetailService.java new file mode 100644 index 0000000..57a6107 --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/BatteryStationCdStrategyDetailService.java @@ -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 { + + + public Result addBatteryStationCdStrategyDetailByCloud (JSONObject jsonObject); + +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/WechatUserService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/WechatUserService.java index 661d753..905e3f9 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/WechatUserService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/WechatUserService.java @@ -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> list(PageListWechatUserRequest plwur); - + public Result> pageList(PageListWechatUserRequest plwur); + + public Result> list(List wuIds); + public Result alterPhone(String wuid, String phone, String name); public Result companyRelation(String wuid, String pcode, String pname); diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/AlarmTemplateServiceImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/AlarmTemplateServiceImpl.java new file mode 100644 index 0000000..eb54694 --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/AlarmTemplateServiceImpl.java @@ -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 implements AlarmTemplateService { + + @Resource + WechatService wechatService; + @Resource + WechatUserService wechatUserService; + + @Override + public Result> pageList(PageListAlarmTemplateRequest params) { + Page page = new Page(params.getPageNo(), params.getPageSize()); + page = getBaseMapper().selectPage(page, new LambdaQueryWrapper() + .eq(StringUtils.hasText(params.getPath()), AlarmTemplate::getPath, params.getPath())); + if (page.getRecords().isEmpty()) { + return new Result>().error(CodeMsg.DATABASE_RESULT_NULL); + } + page.getRecords().forEach(data->{ + Result> listResult = wechatUserService.list(Collections.asList(data.getRecipientIds().split(","))); + if(ResultUtil.verifyCode(listResult)){ + data.setRecipientNames(DataUtils.findDefaultValue(ResultUtil.getValue(listResult), new ArrayList()).stream().map(d-> d.getName()+"-"+d.getPhoneNumber()).collect(Collectors.joining(","))); + } + }); + return new Result>().success(page); + } +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationCdStrategyDetailServiceImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationCdStrategyDetailServiceImpl.java new file mode 100644 index 0000000..e946418 --- /dev/null +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationCdStrategyDetailServiceImpl.java @@ -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 implements BatteryStationCdStrategyDetailService { + + @Resource + BatteryStationCdStrategyDao batteryStationCdStrategyDao; + @Override + public Result 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)); + } +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationCdStrategyServiceImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationCdStrategyServiceImpl.java index d39e6c1..fc672f2 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationCdStrategyServiceImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationCdStrategyServiceImpl.java @@ -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 delete(Integer id) { int n = strategyDao.deleteById(id); if (n == 1) { - strategyDetailDao.delete(new QueryWrapper().eq("strategy_id", id)); + List list = strategyDetailDao.selectList(new QueryWrapper().eq("strategy_id", id)); + if(Collections.isNotEmpty(list)){ + List delIds = Collections.emptyList(); + list.stream().forEach(data->{ + delIds.add(data.getPkId()); + data.setDataType(3); + pushStation(data); + }); + strategyDetailDao.deleteByIds(delIds); + } +// strategyDetailDao.delete(new QueryWrapper().eq("strategy_id", id)); return new Result().success(n); } return new Result().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().success(n); } return new Result().error("添加充电策略详情出错!"); @@ -82,6 +102,7 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra public Result deleteDetail(Integer id) { int n = strategyDetailDao.deleteById(id); if (n == 1) { + pushStation(new BatteryStationCdStrategyDetail(id, 3)); return new Result().success(n); } return new Result().error("删除充电策略详情出错!"); @@ -91,6 +112,8 @@ public class BatteryStationCdStrategyServiceImpl implements BatteryStationCdStra public Result updateDetail(BatteryStationCdStrategyDetail bscsd) { int n = strategyDetailDao.updateById(bscsd); if (n == 1) { + bscsd.setDataType(2); + pushStation(bscsd); return new Result().success(n); } return new Result().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().success(strategyDetail)); + } catch (Exception e) { + e.printStackTrace(); + log.error("云端修正充电策略推送站端失败, 原因是:{}, 推送数据是: {}" , e.getMessage(), JSONObject.toJSONString(strategyDetail)); + } + }); + + + } + } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderServiceImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderServiceImpl.java index 50e6add..e525d9e 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderServiceImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderServiceImpl.java @@ -548,6 +548,7 @@ public class OrderServiceImpl extends ServiceImpl implements Or OrderDetailVo orderDetailVo = new OrderDetailVo(); Order order = getOne(new LambdaQueryWrapper().eq(Order::getOrderNo, orderNo)); BeanUtils.copyProperties(order, orderDetailVo); + orderDetailVo.setPerName(order.getOrderPreUname()); orderDetailVo.setAmount(order.getOrderAmount()); OrderDetail orderDetail = orderDetailDao.selectOne(new LambdaQueryWrapper().eq(OrderDetail::getOrderId, order.getPkId())); if(ObjectUtils.isNotEmpty(orderDetail)){ diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/WechatUserServiceImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/WechatUserServiceImpl.java index 3575705..f1f17c5 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/WechatUserServiceImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/WechatUserServiceImpl.java @@ -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> list(PageListWechatUserRequest plwur) { + public Result> pageList(PageListWechatUserRequest plwur) { Page page = new Page(plwur.getPageNo(), plwur.getPageSize()); page = wechatUserDao.selectPage(page, new QueryWrapper() @@ -49,6 +50,11 @@ public class WechatUserServiceImpl implements WechatUserService { return new Result>().success(page); } + @Override + public Result> list(List wuIds) { + return Result.getInstance().buildList(WechatUser.class).success(wechatUserDao.selectList(new LambdaQueryWrapper().in(WechatUser::getWuid, wuIds))); + } + @Override public Result alterPhone(String wuid, String phone, String name) { if (!(StringUtils.hasText(phone) || StringUtils.hasText(name))) { diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/rpc/WechatService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/rpc/WechatService.java index d3ad3ac..ae72e1f 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/rpc/WechatService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/rpc/WechatService.java @@ -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 sendGzhToBeSettledAlarmMessage(@RequestBody AlarmTemplate alarmTemplate); + } diff --git a/cloud-manage-server/src/main/resources/mapper/BatteryStationCdStrategyMapper.xml b/cloud-manage-server/src/main/resources/mapper/BatteryStationCdStrategyMapper.xml index 3c545f3..fd9ec14 100644 --- a/cloud-manage-server/src/main/resources/mapper/BatteryStationCdStrategyMapper.xml +++ b/cloud-manage-server/src/main/resources/mapper/BatteryStationCdStrategyMapper.xml @@ -21,7 +21,7 @@ - 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 + + + + diff --git a/cloud-manage-server/src/test/java/com/evotech/hd/cloud/AesDecryTest.java b/cloud-manage-server/src/test/java/com/evotech/hd/cloud/AesDecryTest.java index df2f44d..075b59f 100644 --- a/cloud-manage-server/src/test/java/com/evotech/hd/cloud/AesDecryTest.java +++ b/cloud-manage-server/src/test/java/com/evotech/hd/cloud/AesDecryTest.java @@ -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())); +// +// } + } diff --git a/wechat-server/src/main/java/com/evotech/hd/wechat/config/GZHProperties.java b/wechat-server/src/main/java/com/evotech/hd/wechat/config/GZHProperties.java index 7198377..20b20ac 100644 --- a/wechat-server/src/main/java/com/evotech/hd/wechat/config/GZHProperties.java +++ b/wechat-server/src/main/java/com/evotech/hd/wechat/config/GZHProperties.java @@ -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; } diff --git a/wechat-server/src/main/java/com/evotech/hd/wechat/controller/SendGzhController.java b/wechat-server/src/main/java/com/evotech/hd/wechat/controller/SendGzhController.java index 8e8fbea..a6ba6c2 100644 --- a/wechat-server/src/main/java/com/evotech/hd/wechat/controller/SendGzhController.java +++ b/wechat-server/src/main/java/com/evotech/hd/wechat/controller/SendGzhController.java @@ -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 sendOrderToBeSettled(@RequestBody Order order) { return gzhMessageTemplateService.sendOrderToBeSettled(order); } + + @Operation(summary = "推送公众号待结算订单消息") + @PostMapping("/alarm/message") + @ApiOperationSupport(order = 2) + public Result sendAlarmToMessage(@RequestBody AlarmTemplate alarmTemplate) { + return gzhMessageTemplateService.sendAlarmToMessage(alarmTemplate); + } } diff --git a/wechat-server/src/main/java/com/evotech/hd/wechat/entity/gzh/templatemessage/AlarmTemplateData.java b/wechat-server/src/main/java/com/evotech/hd/wechat/entity/gzh/templatemessage/AlarmTemplateData.java new file mode 100644 index 0000000..ffa7d09 --- /dev/null +++ b/wechat-server/src/main/java/com/evotech/hd/wechat/entity/gzh/templatemessage/AlarmTemplateData.java @@ -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; + +} diff --git a/wechat-server/src/main/java/com/evotech/hd/wechat/service/gzh/GZHMessageTemplateService.java b/wechat-server/src/main/java/com/evotech/hd/wechat/service/gzh/GZHMessageTemplateService.java index 5a4f767..cacbe0b 100644 --- a/wechat-server/src/main/java/com/evotech/hd/wechat/service/gzh/GZHMessageTemplateService.java +++ b/wechat-server/src/main/java/com/evotech/hd/wechat/service/gzh/GZHMessageTemplateService.java @@ -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 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 result = Collections.emptyMap(); + if(org.apache.commons.lang3.StringUtils.isNotEmpty(alarmTemplate.getRecipientIds())){ + List wechatUsers = wechatUserDao.selectList(new QueryWrapper().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)); + } + + + + diff --git a/wechat-server/src/main/resources/application.yml b/wechat-server/src/main/resources/application.yml index 42d8f3a..4a2dbd0 100644 --- a/wechat-server/src/main/resources/application.yml +++ b/wechat-server/src/main/resources/application.yml @@ -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