调整微信websocket的数据推送接口调整

取消没用的mqtt
This commit is contained in:
andy 2025-07-25 15:35:42 +08:00
parent c87d090a71
commit 3a040fe510
21 changed files with 343 additions and 224 deletions

View File

@ -71,6 +71,12 @@
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId> <artifactId>slf4j-api</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
<scope>compile</scope>
</dependency>
</dependencies> </dependencies>

View File

@ -1,19 +1,15 @@
package com.evotech.hd.common.core.entity.cloud; package com.evotech.hd.common.core.entity.cloud;
import com.baomidou.mybatisplus.annotation.IdType; import com.alibaba.fastjson.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.evotech.hd.common.core.entity.BaseEntity; import com.evotech.hd.common.core.entity.BaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/** /**
* @author zrb * @author zrb
* @since 2024-12-11 * @since 2024-12-11
@ -35,6 +31,7 @@ public class OrderSwapBatteryStep extends BaseEntity implements Serializable {
private String stepName; private String stepName;
@Schema(description = "步骤时间") @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; private Date stepTime;
} }

View File

@ -26,12 +26,8 @@ public class InsertAndUpdateMybatisHandler implements MetaObjectHandler {
public void insertFill(MetaObject metaObject) { public void insertFill(MetaObject metaObject) {
try { try {
AuthUser user = RedisPermissionUtils.getUser(); AuthUser user = RedisPermissionUtils.getUser();
if(BeanUtil.isEmpty(user)){
log.info("当前操作位登录, 无需执行");
return;
}
if(BeanUtil.isNotEmpty(metaObject)){ if(BeanUtil.isNotEmpty(metaObject)){
mySetFieldValByName("creater",user.getUid(),metaObject); mySetFieldValByName("creater",(BeanUtil.isEmpty(user) ? "system" : user.getUid()),metaObject);
mySetFieldValByName("ctime",new Date(),metaObject); mySetFieldValByName("ctime",new Date(),metaObject);
} }
} catch (Exception e) { } catch (Exception e) {
@ -52,12 +48,8 @@ public class InsertAndUpdateMybatisHandler implements MetaObjectHandler {
public void updateFill(MetaObject metaObject) { public void updateFill(MetaObject metaObject) {
try { try {
AuthUser user = RedisPermissionUtils.getUser(); AuthUser user = RedisPermissionUtils.getUser();
if(BeanUtil.isEmpty(user)){
log.info("当前操作未登录, 无需执行");
return;
}
if(BeanUtil.isNotEmpty(metaObject)){ if(BeanUtil.isNotEmpty(metaObject)){
mySetFieldValByName("updater",user.getUid(),metaObject); mySetFieldValByName("updater",(BeanUtil.isEmpty(user) ? "system" : user.getUid()),metaObject);
mySetFieldValByName("uptime",new Date(),metaObject); mySetFieldValByName("uptime",new Date(),metaObject);
} }
} catch (Exception e) { } catch (Exception e) {

View File

@ -107,7 +107,7 @@ public class MqttEventSwapCompleteExchangeProcessorImpl implements MqttStrategyE
orderService.updateById(order); orderService.updateById(order);
//修改订单状态及金额 //修改订单状态及金额
alterOrderStatus(order, statusData); alterOrderStatus(order, statusData);
//记录换电步骤 //记录电池信息 or 记录最后的换电步骤
alterSwapBatteryStep(orderStatus, statusData, order); alterSwapBatteryStep(orderStatus, statusData, order);
} }

View File

@ -1,69 +1,69 @@
package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request; //package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request;
//
import cn.hutool.json.JSONObject; //import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; //import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; //import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum; //import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum;
import com.evotech.hd.cloud.mqtt.message.MessageTopic; //import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; //import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse; //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.BatteryData;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatteryInfoReq; //import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatteryInfoReq;
import com.evotech.hd.cloud.service.BatteryStationDcService; //import com.evotech.hd.cloud.service.BatteryStationDcService;
import com.evotech.hd.common.core.constant.HDConstant; //import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.entity.cloud.BatteryStationDc; //import com.evotech.hd.common.core.entity.cloud.BatteryStationDc;
import jakarta.annotation.Resource; //import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; //import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; //import org.springframework.stereotype.Service;
//
import java.util.Collections; //import java.util.Collections;
import java.util.List; //import java.util.List;
import java.util.stream.Collectors; //import java.util.stream.Collectors;
//
/** ///**
* 站端请求电池数据 // * 站端请求电池数据
* // *
* @ClassName:MqttRequestBatteryInfoExchangeProcessorImpl // * @ClassName:MqttRequestBatteryInfoExchangeProcessorImpl
* @date: 2025年05月19日 17:41 // * @date: 2025年05月19日 17:41
* @author: andy.shi // * @author: andy.shi
* @contact: 17330188597 // * @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步 // * @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/ // */
@Service //@Service
@Slf4j //@Slf4j
public class MqttRequestBatteryInfoExchangeProcessorImpl implements MqttStrategyRequestExchangeProcessor { //public class MqttRequestBatteryInfoExchangeProcessorImpl implements MqttStrategyRequestExchangeProcessor {
//
@Resource // @Resource
BatteryStationDcService batteryStationDcService; // BatteryStationDcService batteryStationDcService;
//
@Override // @Override
public boolean accept(String functionName) { // public boolean accept(String functionName) {
return RequestFunctionTypesEnum.FUN_BATTERYINFO.getFunction().equals(functionName); // return RequestFunctionTypesEnum.FUN_BATTERYINFO.getFunction().equals(functionName);
} // }
//
@Override // @Override
public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { // public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
BatteryInfoReq batteryInfoReq = JSONUtil.toBean(dataBody, BatteryInfoReq.class); // BatteryInfoReq batteryInfoReq = JSONUtil.toBean(dataBody, BatteryInfoReq.class);
String batCode = batteryInfoReq.getBatCode(); // String batCode = batteryInfoReq.getBatCode();
//直接默认为错误 // //直接默认为错误
MqttResponse<List<BatteryData>> response = new MqttResponse<List<BatteryData>>().createError(batteryInfoReq.getBatteryInfoRequestId()); // MqttResponse<List<BatteryData>> response = new MqttResponse<List<BatteryData>>().createError(batteryInfoReq.getBatteryInfoRequestId());
//
List<BatteryStationDc> list = Collections.emptyList(); // List<BatteryStationDc> list = Collections.emptyList();
if(org.apache.commons.lang3.StringUtils.isNotEmpty(batCode)){ // if(org.apache.commons.lang3.StringUtils.isNotEmpty(batCode)){
list.addAll(batteryStationDcService.list(new LambdaQueryWrapper<BatteryStationDc>().eq(BatteryStationDc::getBatCode, batCode).eq(BatteryStationDc::getDelFlag, HDConstant.DELETE_NO))); // list.addAll(batteryStationDcService.list(new LambdaQueryWrapper<BatteryStationDc>().eq(BatteryStationDc::getBatCode, batCode).eq(BatteryStationDc::getDelFlag, HDConstant.DELETE_NO)));
}else{ // }else{
//如果没有电池编号, 则以当前站的电池数据为准 // //如果没有电池编号, 则以当前站的电池数据为准
list.addAll(batteryStationDcService.listByStationCode(topic.getStationCode())); // list.addAll(batteryStationDcService.listByStationCode(topic.getStationCode()));
} // }
if(com.evotech.hd.common.core.utils.Collections.isNotEmpty(list)){ // if(com.evotech.hd.common.core.utils.Collections.isNotEmpty(list)){
response.setCode(MqttResponse.PUBLIC_SUCCESS); // response.setCode(MqttResponse.PUBLIC_SUCCESS);
response.setData(list.stream().map(x -> new BatteryData(x.getBatCode(), x.getProductionDate(), x.getRegistrationDate())).collect(Collectors.toList())); // response.setData(list.stream().map(x -> new BatteryData(x.getBatCode(), x.getProductionDate(), x.getRegistrationDate())).collect(Collectors.toList()));
}else { // }else {
response.setMsg("未查询到电池信息"); // response.setMsg("未查询到电池信息");
} // }
//
logger.info("\r\n站端请求电池数据: MqttRequestBatteryInfoExchangeProcessorImpl =====>>>message:{}", response.getMsg()); // logger.info("\r\n站端请求电池数据: MqttRequestBatteryInfoExchangeProcessorImpl =====>>>message:{}", response.getMsg());
sendAESMessage(topic, header, RequestFunctionTypesEnum.FUN_BATTERYINFO, response); // sendAESMessage(topic, header, RequestFunctionTypesEnum.FUN_BATTERYINFO, response);
} // }
//
} //}

View File

@ -23,7 +23,7 @@ import org.springframework.stereotype.Service;
import java.util.Date; import java.util.Date;
/** /**
* 站端回复开始换电通知信息类 * 换电信息--站端回复开始换电通知信息类
* *
* @ClassName:MqttRequestBatterySwapExchangeProcessorImpl * @ClassName:MqttRequestBatterySwapExchangeProcessorImpl
* @date: 2025年06月20日 11:29 * @date: 2025年06月20日 11:29

View File

@ -14,7 +14,7 @@ import org.springframework.stereotype.Service;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
* 取消订单请求类 * 取消订单--取消订单请求类
* @ClassName:MqttRequestCancelOrderExchangeProcessorImpl * @ClassName:MqttRequestCancelOrderExchangeProcessorImpl
* @date: 2025年05月19日 14:51 * @date: 2025年05月19日 14:51
* @author: andy.shi * @author: andy.shi

View File

@ -1,73 +1,73 @@
package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request; //package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.request;
//
import cn.hutool.json.JSONObject; //import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; //import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; //import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.evotech.hd.cloud.dao.VehicleWechatUserRelationDao; //import com.evotech.hd.cloud.dao.VehicleWechatUserRelationDao;
import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum; //import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum;
import com.evotech.hd.cloud.mqtt.message.MessageTopic; //import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; //import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse; //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.CarInfoReq;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.carinfo.VehicleData; //import com.evotech.hd.cloud.mqtt.message.dto.newer.req.carinfo.VehicleData;
import com.evotech.hd.common.core.entity.cloud.VehicleWechatUserRelation; //import com.evotech.hd.common.core.entity.cloud.VehicleWechatUserRelation;
import jakarta.annotation.Resource; //import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; //import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; //import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; //import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; //import org.springframework.stereotype.Service;
//
import java.util.List; //import java.util.List;
import java.util.stream.Collectors; //import java.util.stream.Collectors;
//
/** ///**
* 站端请求车辆信息 // * 站端请求车辆信息
* @ClassName:MqttRequestCarInfoExchangeProcessorImpl // * @ClassName:MqttRequestCarInfoExchangeProcessorImpl
* @date: 2025年06月19日 11:21 // * @date: 2025年06月19日 11:21
* @author: andy.shi // * @author: andy.shi
* @contact: 17330188597 // * @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步 // * @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/ // */
@Service //@Service
@Slf4j //@Slf4j
public class MqttRequestCarInfoExchangeProcessorImpl implements MqttStrategyRequestExchangeProcessor { //public class MqttRequestCarInfoExchangeProcessorImpl implements MqttStrategyRequestExchangeProcessor {
//
@Resource // @Resource
private VehicleWechatUserRelationDao vehicleWechatUserRelationDao; // private VehicleWechatUserRelationDao vehicleWechatUserRelationDao;
//
@Override // @Override
public boolean accept(String functionName) { // public boolean accept(String functionName) {
return RequestFunctionTypesEnum.FUN_CARINFO.getFunction().equals(functionName); // return RequestFunctionTypesEnum.FUN_CARINFO.getFunction().equals(functionName);
} // }
//
@Override // @Override
public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { // public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
CarInfoReq carInfoReq = JSONUtil.toBean(dataBody, CarInfoReq.class); // CarInfoReq carInfoReq = JSONUtil.toBean(dataBody, CarInfoReq.class);
//直接默认为错误 // //直接默认为错误
MqttResponse<List<VehicleData>> response = new MqttResponse<List<VehicleData>>().createError(carInfoReq.getCarInfoRequestId()); // MqttResponse<List<VehicleData>> response = new MqttResponse<List<VehicleData>>().createError(carInfoReq.getCarInfoRequestId());
String plateNum = carInfoReq.getPlateNum(); // String plateNum = carInfoReq.getPlateNum();
if(StringUtils.isEmpty(plateNum)){ // if(StringUtils.isEmpty(plateNum)){
response.setMsg("没有车牌号参数"); // response.setMsg("没有车牌号参数");
}else{ // }else{
List<VehicleWechatUserRelation> list = vehicleWechatUserRelationDao.selectList(new LambdaQueryWrapper<VehicleWechatUserRelation>().eq( VehicleWechatUserRelation::getPlateNum, plateNum)); // List<VehicleWechatUserRelation> list = vehicleWechatUserRelationDao.selectList(new LambdaQueryWrapper<VehicleWechatUserRelation>().eq( VehicleWechatUserRelation::getPlateNum, plateNum));
if(com.evotech.hd.common.core.utils.Collections.isNotEmpty(list)){ // if(com.evotech.hd.common.core.utils.Collections.isNotEmpty(list)){
response.setCode(MqttResponse.PUBLIC_SUCCESS); // response.setCode(MqttResponse.PUBLIC_SUCCESS);
response.setData(list.stream().map(x->convertVehicleData(x)).collect(Collectors.toList())); // response.setData(list.stream().map(x->convertVehicleData(x)).collect(Collectors.toList()));
}else { // }else {
response.setMsg("未查询到车辆信息"); // response.setMsg("未查询到车辆信息");
} // }
} // }
//
logger.info("\r\n站端请求车辆信息: MqttRequestCarInfoExchangeProcessorImpl =====>>>message:{}", response.getMsg()); // logger.info("\r\n站端请求车辆信息: MqttRequestCarInfoExchangeProcessorImpl =====>>>message:{}", response.getMsg());
sendAESMessage(topic, header, RequestFunctionTypesEnum.FUN_CARINFO, response); // sendAESMessage(topic, header, RequestFunctionTypesEnum.FUN_CARINFO, response);
} // }
//
//
public static VehicleData convertVehicleData(VehicleWechatUserRelation data){ // public static VehicleData convertVehicleData(VehicleWechatUserRelation data){
VehicleData vd = new VehicleData(); // VehicleData vd = new VehicleData();
BeanUtils.copyProperties(data, vd); // BeanUtils.copyProperties(data, vd);
return vd; // return vd;
} // }
//
//
} //}

View File

@ -19,7 +19,7 @@ import org.springframework.stereotype.Service;
import java.util.stream.Stream; import java.util.stream.Stream;
/** /**
* 站端请求创建预约单类 * 预约订单--站端请求创建预约单类
* *
* @ClassName:MqttRequestPreOrderExchangeProcessorImpl * @ClassName:MqttRequestPreOrderExchangeProcessorImpl
* @date: 2025年05月19日 17:41 * @date: 2025年05月19日 17:41
@ -42,7 +42,7 @@ public class MqttRequestPreOrderExchangeProcessorImpl implements MqttStrategyReq
@Override @Override
public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
OrderSwapBatteryPre orderSwapBatteryPre = JSONUtil.toBean(dataBody, OrderSwapBatteryPre.class); OrderSwapBatteryPre orderSwapBatteryPre = JSONUtil.toBean(dataBody, OrderSwapBatteryPre.class);
MqttResponse response = new MqttResponse().createError(orderSwapBatteryPre.getSourceId()); MqttResponse response = new MqttResponse().error("");
// 1. 基础字段校验 // 1. 基础字段校验
if (validateRequiredFields(orderSwapBatteryPre)) { if (validateRequiredFields(orderSwapBatteryPre)) {
response.setMsg("预约信息不完整"); response.setMsg("预约信息不完整");
@ -55,6 +55,7 @@ public class MqttRequestPreOrderExchangeProcessorImpl implements MqttStrategyReq
// 创建预约单信息 // 创建预约单信息
orderSwapBatteryPre.setUcode(wechatUser.getWuid()); orderSwapBatteryPre.setUcode(wechatUser.getWuid());
orderSwapBatteryPre.setSource(3); orderSwapBatteryPre.setSource(3);
orderSwapBatteryPre.setStationCode(topic.getStationCode());
Result<Boolean> integerResult = orderSwapBatteryPreService.addOrderSwapBatteryPre(orderSwapBatteryPre); Result<Boolean> integerResult = orderSwapBatteryPreService.addOrderSwapBatteryPre(orderSwapBatteryPre);
//检查结果 //检查结果
if (integerResult.getData()){ if (integerResult.getData()){
@ -85,12 +86,12 @@ public class MqttRequestPreOrderExchangeProcessorImpl implements MqttStrategyReq
return Stream.of( return Stream.of(
order.getPlateNum(), order.getPlateNum(),
order.getPhone(), order.getPhone(),
order.getStationCode(), // order.getStationCode(),
order.getStationName(), // order.getStationName(),
order.getUname(), order.getUname()
order.getSwapDay(), // order.getSwapDay(),
order.getSwapDuration(), // order.getSwapDuration(),
order.getReservationTime() // order.getReservationTime()
).anyMatch(StrUtil::isBlankIfStr); ).anyMatch(StrUtil::isBlankIfStr);
} }
} }

View File

@ -15,7 +15,7 @@ import org.springframework.stereotype.Service;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
* 接收站端推送的车牌照, 创建车辆信息和预约单 * 初始化车辆和预约单--接收站端推送的车牌照, 创建车辆信息和预约单
* *
* @ClassName:MqttRequestPushCarCreateMakeAppointmentExchangeProcessorImpl * @ClassName:MqttRequestPushCarCreateMakeAppointmentExchangeProcessorImpl
* @date: 2025年04月30日 15:34 * @date: 2025年04月30日 15:34

View File

@ -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.CodeMsg;
import com.evotech.hd.common.core.enums.OrderStatusEnums; import com.evotech.hd.common.core.enums.OrderStatusEnums;
import com.evotech.hd.common.core.enums.SwapBatteryStepEnum; 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 com.evotech.hd.common.redis.utils.RedisServiceUtils;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -30,7 +31,7 @@ import org.springframework.stereotype.Service;
import java.util.Date; import java.util.Date;
/** /**
* 站端根据车牌号查询订单 * 查询订单--站端根据车牌号查询订单
* *
* @ClassName:MqttRequestQueryOrderExchangeProcessorImpl * @ClassName:MqttRequestQueryOrderExchangeProcessorImpl
* @date: 2025年05月19日 17:41 * @date: 2025年05月19日 17:41
@ -72,7 +73,7 @@ public class MqttRequestQueryOrderExchangeProcessorImpl implements MqttStrategyR
.eq(Order::getPlateNum, orderSwapBatteryPre.getPlateNum()) .eq(Order::getPlateNum, orderSwapBatteryPre.getPlateNum())
.eq(Order::getStationCode, orderSwapBatteryPre.getStationCode()) .eq(Order::getStationCode, orderSwapBatteryPre.getStationCode())
.eq(Order::getOrderPreId, orderSwapBatteryPre.getPkId()) .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)) { if (ObjectUtils.isNotEmpty(order)) {
response.setCode(MqttResponse.PUBLIC_SUCCESS); response.setCode(MqttResponse.PUBLIC_SUCCESS);
}else{ }else{

View File

@ -16,7 +16,7 @@ import org.springframework.util.StringUtils;
import java.util.List; import java.util.List;
/** /**
* Mqtt查询充电策略 * 查询充电策略--Mqtt查询充电策略
* @ClassName:StrategyMqttMessageRequestExchangeProcessorImpl * @ClassName:StrategyMqttMessageRequestExchangeProcessorImpl
* @date: 2025年04月08日 11:36 * @date: 2025年04月08日 11:36
* @author: andy.shi * @author: andy.shi

View File

@ -1,42 +1,42 @@
package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.state; //package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.state;
//
import cn.hutool.json.JSONObject; //import cn.hutool.json.JSONObject;
import com.evotech.hd.cloud.dao.OrderSwapBatteryStepDao; //import com.evotech.hd.cloud.dao.OrderSwapBatteryStepDao;
import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum; //import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum;
import com.evotech.hd.cloud.mqtt.message.MessageTopic; //import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; //import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
import com.evotech.hd.cloud.utils.components.HDStepDictComponent; //import com.evotech.hd.cloud.utils.components.HDStepDictComponent;
import jakarta.annotation.Resource; //import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; //import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; //import org.springframework.stereotype.Service;
//
/** ///**
* 站端反馈订单状态 // * 站端反馈订单状态
* // *
* @ClassName:MqttStateSwapStepDataExchangeProcessor // * @ClassName:MqttStateSwapStepDataExchangeProcessor
* @date: 2025年04月29日 13:26 // * @date: 2025年04月29日 13:26
* @author: andy.shi // * @author: andy.shi
* @contact: 17330188597 // * @contact: 17330188597
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步 // * @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/ // */
@Slf4j //@Slf4j
@Service //@Service
public class MqttStateOrderStatusDataExchangeProcessor implements MqttStrategyStateExchangeProcessor { //public class MqttStateOrderStatusDataExchangeProcessor implements MqttStrategyStateExchangeProcessor {
//
@Resource // @Resource
private HDStepDictComponent hdStepDictComponent; // private HDStepDictComponent hdStepDictComponent;
@Resource // @Resource
private OrderSwapBatteryStepDao orderSwapBatteryStepDao; // private OrderSwapBatteryStepDao orderSwapBatteryStepDao;
//
@Override // @Override
public boolean accept(String functionName) { // public boolean accept(String functionName) {
return StateFunctionTypesEnum.FUN_ORDERSTATUS.getFunction().equals(functionName); // return StateFunctionTypesEnum.FUN_ORDERSTATUS.getFunction().equals(functionName);
} // }
//
@Override // @Override
public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { // public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
// OrderStatus orderStatus = JSONUtil.toBean(dataBody, OrderStatus.class); //// OrderStatus orderStatus = JSONUtil.toBean(dataBody, OrderStatus.class);
// OrderStatusData statusData = JSONUtil.toBean(dataBody.getJSONObject("statusData"), OrderStatusData.class); //// OrderStatusData statusData = JSONUtil.toBean(dataBody.getJSONObject("statusData"), OrderStatusData.class);
log.info("\r\n=====>>>站端反馈订单状态--MQTT收到消息主题{},换电步骤名称:{}",topic, dataBody.toString()); // log.info("\r\n=====>>>站端反馈订单状态--MQTT收到消息主题{},换电步骤名称:{}",topic, dataBody.toString());
} // }
} //}

View File

@ -50,16 +50,11 @@ public class MqttStateSwapStepDataExchangeProcessor implements MqttStrategyState
public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) { public void exchange(MessageTopic topic, MqttMessageHeader header, JSONObject dataBody) {
SwapStep swapStep = JSONUtil.toBean(dataBody, SwapStep.class); 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())); log.info("\r\n=====>>>站端反馈换电步骤--MQTT收到消息主题{},换电步骤名称:{}",topic, hdStepDictComponent.hdStepDictName(swapStep.getStep()));
if(orderSwapBatteryStepService.addOrderSwapBatteryStepBySwapComplete(swapStep.getOrderNo(), swapStep.getStep(), swapStep.getStepTime())){ if(orderSwapBatteryStepService.addOrderSwapBatteryStepBySwapComplete(swapStep.getOrderNo(), swapStep.getStep(), swapStep.getStepTime())){
Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, swapStep.getOrderNo()).eq(Order::getDelFlag, HDConstant.DELETE_NO)); Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, swapStep.getOrderNo()).eq(Order::getDelFlag, HDConstant.DELETE_NO));
//发送通知到指定客户端 //发送通知到指定客户端
wechatService.sendClientMessage(order.getPreWechatId(), JSON.toJSONString(orderSwapBatteryStepService.list(new LambdaQueryWrapper<OrderSwapBatteryStep>().eq(OrderSwapBatteryStep::getOrderNo, order.getOrderNo()).orderByAsc(OrderSwapBatteryStep::getStepTime)))); wechatService.sendClientMessage(order.getPreWechatId(), JSON.toJSONString(orderSwapBatteryStepService.list(new LambdaQueryWrapper<OrderSwapBatteryStep>().eq(OrderSwapBatteryStep::getOrderNo, order.getOrderNo()).orderByAsc(OrderSwapBatteryStep::getStep))));
} }
} }
} }

View File

@ -201,7 +201,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
order.setPlateNum(orderSwapBatteryPre.getPlateNum()); order.setPlateNum(orderSwapBatteryPre.getPlateNum());
order.setOrderTime(new Date()); order.setOrderTime(new Date());
order.setOrderType(HDConstant.OrderConstant.ORDER_TYPE_SWAP); order.setOrderType(HDConstant.OrderConstant.ORDER_TYPE_SWAP);
order.setStatus(OrderStatusEnums.CREATE.getCode()); //站端不会推送换电中事件, 所以根据预约单创建订单, 即为换电中
order.setStatus(OrderStatusEnums.SWAP.getCode());
order.setStationCode(orderSwapBatteryPre.getStationCode()); order.setStationCode(orderSwapBatteryPre.getStationCode());
order.setStationName(orderSwapBatteryPre.getStationName()); order.setStationName(orderSwapBatteryPre.getStationName());
order.setDelFlag(HDConstant.DELETE_NO); order.setDelFlag(HDConstant.DELETE_NO);

View File

@ -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<LogWebSocket> {
}

View File

@ -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<OnlineWebSocketUser> {
}

View File

@ -1,5 +1,9 @@
package com.evotech.hd.wechat.websocket.controller; 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.OnClose;
import jakarta.websocket.OnError; import jakarta.websocket.OnError;
import jakarta.websocket.OnOpen; import jakarta.websocket.OnOpen;
@ -9,6 +13,8 @@ import jakarta.websocket.server.ServerEndpoint;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Date;
/** /**
* websocket服务类 * websocket服务类
@ -28,6 +34,7 @@ import org.springframework.stereotype.Component;
public class WebSocketService { public class WebSocketService {
/** /**
* 建立连接 * 建立连接
* *
@ -38,6 +45,12 @@ public class WebSocketService {
public void openConnection(Session session, @PathParam(value = "wechatId") String wechatId) { public void openConnection(Session session, @PathParam(value = "wechatId") String wechatId) {
WebSocketUtils.SESSION_POOLS.put(wechatId, session); WebSocketUtils.SESSION_POOLS.put(wechatId, session);
WebSocketUtils.onlineNum.incrementAndGet(); 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); log.info(wechatId + "建立连接! 当前连接数为: {}", WebSocketUtils.onlineNum);
} }
@ -50,6 +63,12 @@ public class WebSocketService {
public void closeConnection(@PathParam(value = "wechatId") String wechatId) { public void closeConnection(@PathParam(value = "wechatId") String wechatId) {
WebSocketUtils.SESSION_POOLS.remove(wechatId); WebSocketUtils.SESSION_POOLS.remove(wechatId);
int cnt = WebSocketUtils.onlineNum.decrementAndGet(); int cnt = WebSocketUtils.onlineNum.decrementAndGet();
try {
SpringUtil.getBean(OnlineWebSocketUserDao.class).delete(new LambdaQueryWrapper<OnlineWebSocketUser>().eq(OnlineWebSocketUser::getWechatId, wechatId));
} catch (Exception e) {
log.error("删除连接用户出现错误"+e.getMessage());
e.printStackTrace();
}
log.info(wechatId + "断开连接, 当前连接数为:{}", cnt); log.info(wechatId + "断开连接, 当前连接数为:{}", cnt);
} }

View File

@ -1,5 +1,8 @@
package com.evotech.hd.wechat.websocket.controller; 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 jakarta.websocket.Session;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -54,6 +57,12 @@ public class WebSocketUtils {
*/ */
public static void sendMessage(String wechatId , String message){ public static void sendMessage(String wechatId , String message){
try { 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); sendMessage(WebSocketUtils.SESSION_POOLS.get(wechatId), message);
} catch (IOException e) { } catch (IOException e) {
log.error("信息推送失败, 用户的微信ID: {}, 推送消息是: {}, 异常原因是:{}", wechatId, message, e.getMessage()); log.error("信息推送失败, 用户的微信ID: {}, 推送消息是: {}, 异常原因是:{}", wechatId, message, e.getMessage());

View File

@ -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;
}
}

View File

@ -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;
}
}