From 3a040fe510113624c020ec1b792f93c808e1177b Mon Sep 17 00:00:00 2001 From: andy <1042025947@qq.com> Date: Fri, 25 Jul 2025 15:35:42 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=BE=AE=E4=BF=A1websocket?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE=E6=8E=A8=E9=80=81=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=B0=83=E6=95=B4=20=E5=8F=96=E6=B6=88=E6=B2=A1=E7=94=A8?= =?UTF-8?q?=E7=9A=84mqtt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- base-commons/common-core/pom.xml | 6 + .../entity/cloud/OrderSwapBatteryStep.java | 13 +- .../InsertAndUpdateMybatisHandler.java | 12 +- ...ventSwapCompleteExchangeProcessorImpl.java | 2 +- ...questBatteryInfoExchangeProcessorImpl.java | 138 ++++++++--------- ...questBatterySwapExchangeProcessorImpl.java | 2 +- ...questCancelOrderExchangeProcessorImpl.java | 2 +- ...ttRequestCarInfoExchangeProcessorImpl.java | 146 +++++++++--------- ...tRequestPreOrderExchangeProcessorImpl.java | 17 +- ...questPushCarInfoExchangeProcessorImpl.java | 2 +- ...equestQueryOrderExchangeProcessorImpl.java | 5 +- ...tRequestStrategyExchangeProcessorImpl.java | 2 +- ...StateOrderStatusDataExchangeProcessor.java | 84 +++++----- ...qttStateSwapStepDataExchangeProcessor.java | 7 +- .../cloud/service/impl/OrderServiceImpl.java | 3 +- .../hd/wechat/Dao/LogWebSocketDao.java | 16 ++ .../hd/wechat/Dao/OnlineWebSocketUserDao.java | 16 ++ .../controller/WebSocketService.java | 19 +++ .../websocket/controller/WebSocketUtils.java | 9 ++ .../wechat/websocket/entity/LogWebSocket.java | 33 ++++ .../websocket/entity/OnlineWebSocketUser.java | 33 ++++ 21 files changed, 343 insertions(+), 224 deletions(-) create mode 100644 wechat-server/src/main/java/com/evotech/hd/wechat/Dao/LogWebSocketDao.java create mode 100644 wechat-server/src/main/java/com/evotech/hd/wechat/Dao/OnlineWebSocketUserDao.java create mode 100644 wechat-server/src/main/java/com/evotech/hd/wechat/websocket/entity/LogWebSocket.java create mode 100644 wechat-server/src/main/java/com/evotech/hd/wechat/websocket/entity/OnlineWebSocketUser.java diff --git a/base-commons/common-core/pom.xml b/base-commons/common-core/pom.xml index afb78a4..e62e974 100644 --- a/base-commons/common-core/pom.xml +++ b/base-commons/common-core/pom.xml @@ -71,6 +71,12 @@ org.slf4j slf4j-api + + com.alibaba + fastjson + 1.2.58 + compile + diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/OrderSwapBatteryStep.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/OrderSwapBatteryStep.java index de507f3..1aa9354 100644 --- a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/OrderSwapBatteryStep.java +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/cloud/OrderSwapBatteryStep.java @@ -1,19 +1,15 @@ package com.evotech.hd.common.core.entity.cloud; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; +import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.annotation.TableName; import com.evotech.hd.common.core.entity.BaseEntity; import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; import java.io.Serializable; import java.util.Date; -import org.springframework.format.annotation.DateTimeFormat; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - /** * @author zrb * @since 2024-12-11 @@ -35,6 +31,7 @@ public class OrderSwapBatteryStep extends BaseEntity implements Serializable { private String stepName; @Schema(description = "步骤时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date stepTime; } 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 6d02222..f417b87 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,12 +26,8 @@ public class InsertAndUpdateMybatisHandler implements MetaObjectHandler { public void insertFill(MetaObject metaObject) { try { AuthUser user = RedisPermissionUtils.getUser(); - if(BeanUtil.isEmpty(user)){ - log.info("当前操作位登录, 无需执行"); - return; - } if(BeanUtil.isNotEmpty(metaObject)){ - mySetFieldValByName("creater",user.getUid(),metaObject); + mySetFieldValByName("creater",(BeanUtil.isEmpty(user) ? "system" : user.getUid()),metaObject); mySetFieldValByName("ctime",new Date(),metaObject); } } catch (Exception e) { @@ -52,12 +48,8 @@ public class InsertAndUpdateMybatisHandler implements MetaObjectHandler { public void updateFill(MetaObject metaObject) { try { AuthUser user = RedisPermissionUtils.getUser(); - if(BeanUtil.isEmpty(user)){ - log.info("当前操作未登录, 无需执行"); - return; - } if(BeanUtil.isNotEmpty(metaObject)){ - mySetFieldValByName("updater",user.getUid(),metaObject); + mySetFieldValByName("updater",(BeanUtil.isEmpty(user) ? "system" : user.getUid()),metaObject); mySetFieldValByName("uptime",new Date(),metaObject); } } catch (Exception e) { 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/event/MqttEventSwapCompleteExchangeProcessorImpl.java index 50c3435..4a45a77 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/event/MqttEventSwapCompleteExchangeProcessorImpl.java @@ -107,7 +107,7 @@ public class MqttEventSwapCompleteExchangeProcessorImpl implements MqttStrategyE orderService.updateById(order); //修改订单状态及金额 alterOrderStatus(order, statusData); - //记录换电步骤 + //记录电池信息 or 记录最后的换电步骤 alterSwapBatteryStep(orderStatus, statusData, order); } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestBatteryInfoExchangeProcessorImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestBatteryInfoExchangeProcessorImpl.java index 6a826e2..628789e 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestBatteryInfoExchangeProcessorImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestBatteryInfoExchangeProcessorImpl.java @@ -1,69 +1,69 @@ -package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request; - -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum; -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.dto.newer.req.battery.BatteryData; -import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatteryInfoReq; -import com.evotech.hd.cloud.service.BatteryStationDcService; -import com.evotech.hd.common.core.constant.HDConstant; -import com.evotech.hd.common.core.entity.cloud.BatteryStationDc; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -/** - * 站端请求电池数据 - * - * @ClassName:MqttRequestBatteryInfoExchangeProcessorImpl - * @date: 2025年05月19日 17:41 - * @author: andy.shi - * @contact: 17330188597 - * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 - */ -@Service -@Slf4j -public class MqttRequestBatteryInfoExchangeProcessorImpl implements MqttStrategyRequestExchangeProcessor { - - @Resource - BatteryStationDcService batteryStationDcService; - - @Override - public boolean accept(String functionName) { - return RequestFunctionTypesEnum.FUN_BATTERYINFO.getFunction().equals(functionName); - } - - @Override - public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { - BatteryInfoReq batteryInfoReq = JSONUtil.toBean(dataBody, BatteryInfoReq.class); - String batCode = batteryInfoReq.getBatCode(); - //直接默认为错误 - MqttResponse> response = new MqttResponse>().createError(batteryInfoReq.getBatteryInfoRequestId()); - - List list = Collections.emptyList(); - if(org.apache.commons.lang3.StringUtils.isNotEmpty(batCode)){ - list.addAll(batteryStationDcService.list(new LambdaQueryWrapper().eq(BatteryStationDc::getBatCode, batCode).eq(BatteryStationDc::getDelFlag, HDConstant.DELETE_NO))); - }else{ - //如果没有电池编号, 则以当前站的电池数据为准 - list.addAll(batteryStationDcService.listByStationCode(topic.getStationCode())); - } - if(com.evotech.hd.common.core.utils.Collections.isNotEmpty(list)){ - response.setCode(MqttResponse.PUBLIC_SUCCESS); - response.setData(list.stream().map(x -> new BatteryData(x.getBatCode(), x.getProductionDate(), x.getRegistrationDate())).collect(Collectors.toList())); - }else { - response.setMsg("未查询到电池信息"); - } - - logger.info("\r\n站端请求电池数据: MqttRequestBatteryInfoExchangeProcessorImpl =====>>>message:{}", response.getMsg()); - sendAESMessage(topic, header, RequestFunctionTypesEnum.FUN_BATTERYINFO, response); - } - -} +//package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request; +// +//import cn.hutool.json.JSONObject; +//import cn.hutool.json.JSONUtil; +//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +//import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum; +//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.dto.newer.req.battery.BatteryData; +//import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatteryInfoReq; +//import com.evotech.hd.cloud.service.BatteryStationDcService; +//import com.evotech.hd.common.core.constant.HDConstant; +//import com.evotech.hd.common.core.entity.cloud.BatteryStationDc; +//import jakarta.annotation.Resource; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Service; +// +//import java.util.Collections; +//import java.util.List; +//import java.util.stream.Collectors; +// +///** +// * 站端请求电池数据 +// * +// * @ClassName:MqttRequestBatteryInfoExchangeProcessorImpl +// * @date: 2025年05月19日 17:41 +// * @author: andy.shi +// * @contact: 17330188597 +// * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 +// */ +//@Service +//@Slf4j +//public class MqttRequestBatteryInfoExchangeProcessorImpl implements MqttStrategyRequestExchangeProcessor { +// +// @Resource +// BatteryStationDcService batteryStationDcService; +// +// @Override +// public boolean accept(String functionName) { +// return RequestFunctionTypesEnum.FUN_BATTERYINFO.getFunction().equals(functionName); +// } +// +// @Override +// public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { +// BatteryInfoReq batteryInfoReq = JSONUtil.toBean(dataBody, BatteryInfoReq.class); +// String batCode = batteryInfoReq.getBatCode(); +// //直接默认为错误 +// MqttResponse> response = new MqttResponse>().createError(batteryInfoReq.getBatteryInfoRequestId()); +// +// List list = Collections.emptyList(); +// if(org.apache.commons.lang3.StringUtils.isNotEmpty(batCode)){ +// list.addAll(batteryStationDcService.list(new LambdaQueryWrapper().eq(BatteryStationDc::getBatCode, batCode).eq(BatteryStationDc::getDelFlag, HDConstant.DELETE_NO))); +// }else{ +// //如果没有电池编号, 则以当前站的电池数据为准 +// list.addAll(batteryStationDcService.listByStationCode(topic.getStationCode())); +// } +// if(com.evotech.hd.common.core.utils.Collections.isNotEmpty(list)){ +// response.setCode(MqttResponse.PUBLIC_SUCCESS); +// response.setData(list.stream().map(x -> new BatteryData(x.getBatCode(), x.getProductionDate(), x.getRegistrationDate())).collect(Collectors.toList())); +// }else { +// response.setMsg("未查询到电池信息"); +// } +// +// logger.info("\r\n站端请求电池数据: MqttRequestBatteryInfoExchangeProcessorImpl =====>>>message:{}", response.getMsg()); +// sendAESMessage(topic, header, RequestFunctionTypesEnum.FUN_BATTERYINFO, response); +// } +// +//} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestBatterySwapExchangeProcessorImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestBatterySwapExchangeProcessorImpl.java index 5993ff5..8119f01 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestBatterySwapExchangeProcessorImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestBatterySwapExchangeProcessorImpl.java @@ -23,7 +23,7 @@ import org.springframework.stereotype.Service; import java.util.Date; /** - * 站端回复开始换电通知信息类 + * 换电信息--站端回复开始换电通知信息类 * * @ClassName:MqttRequestBatterySwapExchangeProcessorImpl * @date: 2025年06月20日 11:29 diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestCancelOrderExchangeProcessorImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestCancelOrderExchangeProcessorImpl.java index d4b35bf..2a33ab1 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestCancelOrderExchangeProcessorImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestCancelOrderExchangeProcessorImpl.java @@ -14,7 +14,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.Assert; /** - * 取消订单请求类 + * 取消订单--取消订单请求类 * @ClassName:MqttRequestCancelOrderExchangeProcessorImpl * @date: 2025年05月19日 14:51 * @author: andy.shi diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestCarInfoExchangeProcessorImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestCarInfoExchangeProcessorImpl.java index 819217c..914c198 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestCarInfoExchangeProcessorImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestCarInfoExchangeProcessorImpl.java @@ -1,73 +1,73 @@ -package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request; - -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.evotech.hd.cloud.dao.VehicleWechatUserRelationDao; -import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum; -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.dto.newer.req.carinfo.CarInfoReq; -import com.evotech.hd.cloud.mqtt.message.dto.newer.req.carinfo.VehicleData; -import com.evotech.hd.common.core.entity.cloud.VehicleWechatUserRelation; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * 站端请求车辆信息 - * @ClassName:MqttRequestCarInfoExchangeProcessorImpl - * @date: 2025年06月19日 11:21 - * @author: andy.shi - * @contact: 17330188597 - * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 - */ -@Service -@Slf4j -public class MqttRequestCarInfoExchangeProcessorImpl implements MqttStrategyRequestExchangeProcessor { - - @Resource - private VehicleWechatUserRelationDao vehicleWechatUserRelationDao; - - @Override - public boolean accept(String functionName) { - return RequestFunctionTypesEnum.FUN_CARINFO.getFunction().equals(functionName); - } - - @Override - public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { - CarInfoReq carInfoReq = JSONUtil.toBean(dataBody, CarInfoReq.class); - //直接默认为错误 - MqttResponse> response = new MqttResponse>().createError(carInfoReq.getCarInfoRequestId()); - String plateNum = carInfoReq.getPlateNum(); - if(StringUtils.isEmpty(plateNum)){ - response.setMsg("没有车牌号参数"); - }else{ - List list = vehicleWechatUserRelationDao.selectList(new LambdaQueryWrapper().eq( VehicleWechatUserRelation::getPlateNum, plateNum)); - if(com.evotech.hd.common.core.utils.Collections.isNotEmpty(list)){ - response.setCode(MqttResponse.PUBLIC_SUCCESS); - response.setData(list.stream().map(x->convertVehicleData(x)).collect(Collectors.toList())); - }else { - response.setMsg("未查询到车辆信息"); - } - } - - logger.info("\r\n站端请求车辆信息: MqttRequestCarInfoExchangeProcessorImpl =====>>>message:{}", response.getMsg()); - sendAESMessage(topic, header, RequestFunctionTypesEnum.FUN_CARINFO, response); - } - - - public static VehicleData convertVehicleData(VehicleWechatUserRelation data){ - VehicleData vd = new VehicleData(); - BeanUtils.copyProperties(data, vd); - return vd; - } - - -} +//package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request; +// +//import cn.hutool.json.JSONObject; +//import cn.hutool.json.JSONUtil; +//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +//import com.evotech.hd.cloud.dao.VehicleWechatUserRelationDao; +//import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum; +//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.dto.newer.req.carinfo.CarInfoReq; +//import com.evotech.hd.cloud.mqtt.message.dto.newer.req.carinfo.VehicleData; +//import com.evotech.hd.common.core.entity.cloud.VehicleWechatUserRelation; +//import jakarta.annotation.Resource; +//import lombok.extern.slf4j.Slf4j; +//import org.apache.commons.lang3.StringUtils; +//import org.springframework.beans.BeanUtils; +//import org.springframework.stereotype.Service; +// +//import java.util.List; +//import java.util.stream.Collectors; +// +///** +// * 站端请求车辆信息 +// * @ClassName:MqttRequestCarInfoExchangeProcessorImpl +// * @date: 2025年06月19日 11:21 +// * @author: andy.shi +// * @contact: 17330188597 +// * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 +// */ +//@Service +//@Slf4j +//public class MqttRequestCarInfoExchangeProcessorImpl implements MqttStrategyRequestExchangeProcessor { +// +// @Resource +// private VehicleWechatUserRelationDao vehicleWechatUserRelationDao; +// +// @Override +// public boolean accept(String functionName) { +// return RequestFunctionTypesEnum.FUN_CARINFO.getFunction().equals(functionName); +// } +// +// @Override +// public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { +// CarInfoReq carInfoReq = JSONUtil.toBean(dataBody, CarInfoReq.class); +// //直接默认为错误 +// MqttResponse> response = new MqttResponse>().createError(carInfoReq.getCarInfoRequestId()); +// String plateNum = carInfoReq.getPlateNum(); +// if(StringUtils.isEmpty(plateNum)){ +// response.setMsg("没有车牌号参数"); +// }else{ +// List list = vehicleWechatUserRelationDao.selectList(new LambdaQueryWrapper().eq( VehicleWechatUserRelation::getPlateNum, plateNum)); +// if(com.evotech.hd.common.core.utils.Collections.isNotEmpty(list)){ +// response.setCode(MqttResponse.PUBLIC_SUCCESS); +// response.setData(list.stream().map(x->convertVehicleData(x)).collect(Collectors.toList())); +// }else { +// response.setMsg("未查询到车辆信息"); +// } +// } +// +// logger.info("\r\n站端请求车辆信息: MqttRequestCarInfoExchangeProcessorImpl =====>>>message:{}", response.getMsg()); +// sendAESMessage(topic, header, RequestFunctionTypesEnum.FUN_CARINFO, response); +// } +// +// +// public static VehicleData convertVehicleData(VehicleWechatUserRelation data){ +// VehicleData vd = new VehicleData(); +// BeanUtils.copyProperties(data, vd); +// return vd; +// } +// +// +//} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestPreOrderExchangeProcessorImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestPreOrderExchangeProcessorImpl.java index ba3d63a..b7215e7 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestPreOrderExchangeProcessorImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestPreOrderExchangeProcessorImpl.java @@ -19,7 +19,7 @@ import org.springframework.stereotype.Service; import java.util.stream.Stream; /** - * 站端请求创建预约单类 + * 预约订单--站端请求创建预约单类 * * @ClassName:MqttRequestPreOrderExchangeProcessorImpl * @date: 2025年05月19日 17:41 @@ -42,7 +42,7 @@ public class MqttRequestPreOrderExchangeProcessorImpl implements MqttStrategyReq @Override public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { OrderSwapBatteryPre orderSwapBatteryPre = JSONUtil.toBean(dataBody, OrderSwapBatteryPre.class); - MqttResponse response = new MqttResponse().createError(orderSwapBatteryPre.getSourceId()); + MqttResponse response = new MqttResponse().error(""); // 1. 基础字段校验 if (validateRequiredFields(orderSwapBatteryPre)) { response.setMsg("预约信息不完整"); @@ -55,6 +55,7 @@ public class MqttRequestPreOrderExchangeProcessorImpl implements MqttStrategyReq // 创建预约单信息 orderSwapBatteryPre.setUcode(wechatUser.getWuid()); orderSwapBatteryPre.setSource(3); + orderSwapBatteryPre.setStationCode(topic.getStationCode()); Result integerResult = orderSwapBatteryPreService.addOrderSwapBatteryPre(orderSwapBatteryPre); //检查结果 if (integerResult.getData()){ @@ -85,12 +86,12 @@ public class MqttRequestPreOrderExchangeProcessorImpl implements MqttStrategyReq return Stream.of( order.getPlateNum(), order.getPhone(), - order.getStationCode(), - order.getStationName(), - order.getUname(), - order.getSwapDay(), - order.getSwapDuration(), - order.getReservationTime() +// order.getStationCode(), +// order.getStationName(), + order.getUname() +// order.getSwapDay(), +// order.getSwapDuration(), +// order.getReservationTime() ).anyMatch(StrUtil::isBlankIfStr); } } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestPushCarInfoExchangeProcessorImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestPushCarInfoExchangeProcessorImpl.java index f9e570c..162659d 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestPushCarInfoExchangeProcessorImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestPushCarInfoExchangeProcessorImpl.java @@ -15,7 +15,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.Assert; /** - * 接收站端推送的车牌照, 创建车辆信息和预约单 + * 初始化车辆和预约单--接收站端推送的车牌照, 创建车辆信息和预约单 * * @ClassName:MqttRequestPushCarCreateMakeAppointmentExchangeProcessorImpl * @date: 2025年04月30日 15:34 diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestQueryOrderExchangeProcessorImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestQueryOrderExchangeProcessorImpl.java index e88c404..a95ca1c 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestQueryOrderExchangeProcessorImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestQueryOrderExchangeProcessorImpl.java @@ -20,6 +20,7 @@ import com.evotech.hd.common.core.entity.order.Order; import com.evotech.hd.common.core.enums.CodeMsg; import com.evotech.hd.common.core.enums.OrderStatusEnums; import com.evotech.hd.common.core.enums.SwapBatteryStepEnum; +import com.evotech.hd.common.core.utils.Collections; import com.evotech.hd.common.redis.utils.RedisServiceUtils; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; @@ -30,7 +31,7 @@ import org.springframework.stereotype.Service; import java.util.Date; /** - * 站端根据车牌号查询订单 + * 查询订单--站端根据车牌号查询订单 * * @ClassName:MqttRequestQueryOrderExchangeProcessorImpl * @date: 2025年05月19日 17:41 @@ -72,7 +73,7 @@ public class MqttRequestQueryOrderExchangeProcessorImpl implements MqttStrategyR .eq(Order::getPlateNum, orderSwapBatteryPre.getPlateNum()) .eq(Order::getStationCode, orderSwapBatteryPre.getStationCode()) .eq(Order::getOrderPreId, orderSwapBatteryPre.getPkId()) - .eq(Order::getStatus, OrderStatusEnums.CREATE.getCode())); + .in(Order::getStatus, Collections.asList(OrderStatusEnums.CREATE.getCode(), OrderStatusEnums.SWAP.getCode()))); if (ObjectUtils.isNotEmpty(order)) { response.setCode(MqttResponse.PUBLIC_SUCCESS); }else{ diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestStrategyExchangeProcessorImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestStrategyExchangeProcessorImpl.java index 4a2f465..922d0fa 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestStrategyExchangeProcessorImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/request/MqttRequestStrategyExchangeProcessorImpl.java @@ -16,7 +16,7 @@ import org.springframework.util.StringUtils; import java.util.List; /** - * Mqtt查询充电策略 + * 查询充电策略--Mqtt查询充电策略 * @ClassName:StrategyMqttMessageRequestExchangeProcessorImpl * @date: 2025年04月08日 11:36 * @author: andy.shi diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/state/MqttStateOrderStatusDataExchangeProcessor.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/state/MqttStateOrderStatusDataExchangeProcessor.java index 62d21fa..fc4c172 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/state/MqttStateOrderStatusDataExchangeProcessor.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/state/MqttStateOrderStatusDataExchangeProcessor.java @@ -1,42 +1,42 @@ -package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.state; - -import cn.hutool.json.JSONObject; -import com.evotech.hd.cloud.dao.OrderSwapBatteryStepDao; -import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum; -import com.evotech.hd.cloud.mqtt.message.MessageTopic; -import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; -import com.evotech.hd.cloud.utils.components.HDStepDictComponent; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * 站端反馈订单状态 - * - * @ClassName:MqttStateSwapStepDataExchangeProcessor - * @date: 2025年04月29日 13:26 - * @author: andy.shi - * @contact: 17330188597 - * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 - */ -@Slf4j -@Service -public class MqttStateOrderStatusDataExchangeProcessor implements MqttStrategyStateExchangeProcessor { - - @Resource - private HDStepDictComponent hdStepDictComponent; - @Resource - private OrderSwapBatteryStepDao orderSwapBatteryStepDao; - - @Override - public boolean accept(String functionName) { - return StateFunctionTypesEnum.FUN_ORDERSTATUS.getFunction().equals(functionName); - } - - @Override - public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { -// OrderStatus orderStatus = JSONUtil.toBean(dataBody, OrderStatus.class); -// OrderStatusData statusData = JSONUtil.toBean(dataBody.getJSONObject("statusData"), OrderStatusData.class); - log.info("\r\n=====>>>站端反馈订单状态--MQTT收到消息主题:{},换电步骤名称:{}",topic, dataBody.toString()); - } -} +//package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.state; +// +//import cn.hutool.json.JSONObject; +//import com.evotech.hd.cloud.dao.OrderSwapBatteryStepDao; +//import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum; +//import com.evotech.hd.cloud.mqtt.message.MessageTopic; +//import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; +//import com.evotech.hd.cloud.utils.components.HDStepDictComponent; +//import jakarta.annotation.Resource; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Service; +// +///** +// * 站端反馈订单状态 +// * +// * @ClassName:MqttStateSwapStepDataExchangeProcessor +// * @date: 2025年04月29日 13:26 +// * @author: andy.shi +// * @contact: 17330188597 +// * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 +// */ +//@Slf4j +//@Service +//public class MqttStateOrderStatusDataExchangeProcessor implements MqttStrategyStateExchangeProcessor { +// +// @Resource +// private HDStepDictComponent hdStepDictComponent; +// @Resource +// private OrderSwapBatteryStepDao orderSwapBatteryStepDao; +// +// @Override +// public boolean accept(String functionName) { +// return StateFunctionTypesEnum.FUN_ORDERSTATUS.getFunction().equals(functionName); +// } +// +// @Override +// public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { +//// OrderStatus orderStatus = JSONUtil.toBean(dataBody, OrderStatus.class); +//// OrderStatusData statusData = JSONUtil.toBean(dataBody.getJSONObject("statusData"), OrderStatusData.class); +// log.info("\r\n=====>>>站端反馈订单状态--MQTT收到消息主题:{},换电步骤名称:{}",topic, dataBody.toString()); +// } +//} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/state/MqttStateSwapStepDataExchangeProcessor.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/state/MqttStateSwapStepDataExchangeProcessor.java index 47f774d..a78be7c 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/state/MqttStateSwapStepDataExchangeProcessor.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/processor/strategy/impl/state/MqttStateSwapStepDataExchangeProcessor.java @@ -50,16 +50,11 @@ public class MqttStateSwapStepDataExchangeProcessor implements MqttStrategyState public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { SwapStep swapStep = JSONUtil.toBean(dataBody, SwapStep.class); // 记录换电步骤 -// OrderSwapBatteryStep step = new OrderSwapBatteryStep(); -// BeanUtils.copyProperties(swapStep, step); -// step.setCtime(new Date()); -// step.setCreater("SYS"); -// step.setStepName(hdStepDictComponent.hdStepDictName(step.getStep())); log.info("\r\n=====>>>站端反馈换电步骤--MQTT收到消息主题:{},换电步骤名称:{}",topic, hdStepDictComponent.hdStepDictName(swapStep.getStep())); if(orderSwapBatteryStepService.addOrderSwapBatteryStepBySwapComplete(swapStep.getOrderNo(), swapStep.getStep(), swapStep.getStepTime())){ Order order = orderService.getOne(new LambdaQueryWrapper().eq(Order::getOrderNo, swapStep.getOrderNo()).eq(Order::getDelFlag, HDConstant.DELETE_NO)); //发送通知到指定客户端 - wechatService.sendClientMessage(order.getPreWechatId(), JSON.toJSONString(orderSwapBatteryStepService.list(new LambdaQueryWrapper().eq(OrderSwapBatteryStep::getOrderNo, order.getOrderNo()).orderByAsc(OrderSwapBatteryStep::getStepTime)))); + wechatService.sendClientMessage(order.getPreWechatId(), JSON.toJSONString(orderSwapBatteryStepService.list(new LambdaQueryWrapper().eq(OrderSwapBatteryStep::getOrderNo, order.getOrderNo()).orderByAsc(OrderSwapBatteryStep::getStep)))); } } } 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 d34278e..daa97f2 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 @@ -201,7 +201,8 @@ public class OrderServiceImpl extends ServiceImpl implements Or order.setPlateNum(orderSwapBatteryPre.getPlateNum()); order.setOrderTime(new Date()); order.setOrderType(HDConstant.OrderConstant.ORDER_TYPE_SWAP); - order.setStatus(OrderStatusEnums.CREATE.getCode()); + //站端不会推送换电中事件, 所以根据预约单创建订单, 即为换电中 + order.setStatus(OrderStatusEnums.SWAP.getCode()); order.setStationCode(orderSwapBatteryPre.getStationCode()); order.setStationName(orderSwapBatteryPre.getStationName()); order.setDelFlag(HDConstant.DELETE_NO); diff --git a/wechat-server/src/main/java/com/evotech/hd/wechat/Dao/LogWebSocketDao.java b/wechat-server/src/main/java/com/evotech/hd/wechat/Dao/LogWebSocketDao.java new file mode 100644 index 0000000..2f2d101 --- /dev/null +++ b/wechat-server/src/main/java/com/evotech/hd/wechat/Dao/LogWebSocketDao.java @@ -0,0 +1,16 @@ +package com.evotech.hd.wechat.Dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.evotech.hd.wechat.websocket.entity.LogWebSocket; + +/** + * 接口 + * + * @ClassName:LogWebSocketDao + * @date: 2025年07月25日 8:45 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +public interface LogWebSocketDao extends BaseMapper { +} diff --git a/wechat-server/src/main/java/com/evotech/hd/wechat/Dao/OnlineWebSocketUserDao.java b/wechat-server/src/main/java/com/evotech/hd/wechat/Dao/OnlineWebSocketUserDao.java new file mode 100644 index 0000000..8fdeed6 --- /dev/null +++ b/wechat-server/src/main/java/com/evotech/hd/wechat/Dao/OnlineWebSocketUserDao.java @@ -0,0 +1,16 @@ +package com.evotech.hd.wechat.Dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.evotech.hd.wechat.websocket.entity.OnlineWebSocketUser; + +/** + * 接口 + * + * @ClassName:LogWebSocketDao + * @date: 2025年07月25日 8:45 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +public interface OnlineWebSocketUserDao extends BaseMapper { +} diff --git a/wechat-server/src/main/java/com/evotech/hd/wechat/websocket/controller/WebSocketService.java b/wechat-server/src/main/java/com/evotech/hd/wechat/websocket/controller/WebSocketService.java index c32b0d9..93206d0 100644 --- a/wechat-server/src/main/java/com/evotech/hd/wechat/websocket/controller/WebSocketService.java +++ b/wechat-server/src/main/java/com/evotech/hd/wechat/websocket/controller/WebSocketService.java @@ -1,5 +1,9 @@ package com.evotech.hd.wechat.websocket.controller; +import cn.hutool.extra.spring.SpringUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.evotech.hd.wechat.Dao.OnlineWebSocketUserDao; +import com.evotech.hd.wechat.websocket.entity.OnlineWebSocketUser; import jakarta.websocket.OnClose; import jakarta.websocket.OnError; import jakarta.websocket.OnOpen; @@ -9,6 +13,8 @@ import jakarta.websocket.server.ServerEndpoint; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import java.util.Date; + /** * websocket服务类 @@ -28,6 +34,7 @@ import org.springframework.stereotype.Component; public class WebSocketService { + /** * 建立连接 * @@ -38,6 +45,12 @@ public class WebSocketService { public void openConnection(Session session, @PathParam(value = "wechatId") String wechatId) { WebSocketUtils.SESSION_POOLS.put(wechatId, session); WebSocketUtils.onlineNum.incrementAndGet(); + try { + SpringUtil.getBean(OnlineWebSocketUserDao.class).insert(new OnlineWebSocketUser(new Date(), wechatId)); + } catch (Exception e) { + log.error("记录连接用户出现错误"+e.getMessage()); + e.printStackTrace(); + } log.info(wechatId + "建立连接! 当前连接数为: {}", WebSocketUtils.onlineNum); } @@ -50,6 +63,12 @@ public class WebSocketService { public void closeConnection(@PathParam(value = "wechatId") String wechatId) { WebSocketUtils.SESSION_POOLS.remove(wechatId); int cnt = WebSocketUtils.onlineNum.decrementAndGet(); + try { + SpringUtil.getBean(OnlineWebSocketUserDao.class).delete(new LambdaQueryWrapper().eq(OnlineWebSocketUser::getWechatId, wechatId)); + } catch (Exception e) { + log.error("删除连接用户出现错误"+e.getMessage()); + e.printStackTrace(); + } log.info(wechatId + "断开连接, 当前连接数为:{}", cnt); } diff --git a/wechat-server/src/main/java/com/evotech/hd/wechat/websocket/controller/WebSocketUtils.java b/wechat-server/src/main/java/com/evotech/hd/wechat/websocket/controller/WebSocketUtils.java index 7f603bc..a51156e 100644 --- a/wechat-server/src/main/java/com/evotech/hd/wechat/websocket/controller/WebSocketUtils.java +++ b/wechat-server/src/main/java/com/evotech/hd/wechat/websocket/controller/WebSocketUtils.java @@ -1,5 +1,8 @@ package com.evotech.hd.wechat.websocket.controller; +import cn.hutool.extra.spring.SpringUtil; +import com.evotech.hd.wechat.Dao.LogWebSocketDao; +import com.evotech.hd.wechat.websocket.entity.LogWebSocket; import jakarta.websocket.Session; import lombok.extern.slf4j.Slf4j; @@ -54,6 +57,12 @@ public class WebSocketUtils { */ public static void sendMessage(String wechatId , String message){ try { + //记录日志 + try { + SpringUtil.getBean(LogWebSocketDao.class).insert(new LogWebSocket(wechatId, message)); + } catch (Exception e) { + log.error("日志记录错误"+e.getMessage()); + } sendMessage(WebSocketUtils.SESSION_POOLS.get(wechatId), message); } catch (IOException e) { log.error("信息推送失败, 用户的微信ID: {}, 推送消息是: {}, 异常原因是:{}", wechatId, message, e.getMessage()); diff --git a/wechat-server/src/main/java/com/evotech/hd/wechat/websocket/entity/LogWebSocket.java b/wechat-server/src/main/java/com/evotech/hd/wechat/websocket/entity/LogWebSocket.java new file mode 100644 index 0000000..b56d67b --- /dev/null +++ b/wechat-server/src/main/java/com/evotech/hd/wechat/websocket/entity/LogWebSocket.java @@ -0,0 +1,33 @@ +package com.evotech.hd.wechat.websocket.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.evotech.hd.common.core.entity.IdEntity; +import lombok.Data; + +import java.io.Serializable; + +/** + * 类 + * + * @ClassName:LogWebSocket + * @date: 2025年07月25日 8:37 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Data +@TableName(value = "yt_t_log_web_socket", schema = "hd_wechat") +public class LogWebSocket extends IdEntity implements Serializable { + + String clientWechatId; + + String sendInfo; + + public LogWebSocket() { + } + + public LogWebSocket(String clientWechatId, String sendInfo) { + this.clientWechatId = clientWechatId; + this.sendInfo = sendInfo; + } +} diff --git a/wechat-server/src/main/java/com/evotech/hd/wechat/websocket/entity/OnlineWebSocketUser.java b/wechat-server/src/main/java/com/evotech/hd/wechat/websocket/entity/OnlineWebSocketUser.java new file mode 100644 index 0000000..034b5ad --- /dev/null +++ b/wechat-server/src/main/java/com/evotech/hd/wechat/websocket/entity/OnlineWebSocketUser.java @@ -0,0 +1,33 @@ +package com.evotech.hd.wechat.websocket.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.evotech.hd.common.core.entity.IdEntity; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 类 + * + * @ClassName:OnlineWebSocketUser + * @date: 2025年07月25日 8:42 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Data +@TableName(value = "yt_t_online_web_socket_user", schema = "hd_wechat") +public class OnlineWebSocketUser extends IdEntity implements Serializable { + String wechatId; + //链接时间 + Date linkDate; + + public OnlineWebSocketUser() { + } + + public OnlineWebSocketUser(Date linkDate, String wechatId) { + this.linkDate = linkDate; + this.wechatId = wechatId; + } +}