充电桩报文记录表,添加交易流水号字段

This commit is contained in:
bl\GQS02
2025-11-06 15:32:45 +08:00
parent 5c5f8c565c
commit 66ba4ce4a3
18 changed files with 188 additions and 18 deletions

View File

@@ -15,6 +15,7 @@ import com.jsowell.netty.factory.YKCOperateFactory;
import com.jsowell.pile.domain.PileBasicInfo;
import com.jsowell.pile.dto.ConfirmStartChargingData;
import com.jsowell.pile.dto.GenerateOrderDTO;
import com.jsowell.pile.dto.SavePileMsgDTO;
import com.jsowell.pile.service.*;
import com.jsowell.pile.vo.base.ConfirmStartChargingMemberVO;
import io.netty.channel.ChannelHandlerContext;
@@ -239,7 +240,17 @@ public class ConfirmStartChargingRequestHandler extends AbstractYkcHandler {
// 保存报文
String jsonMsg = JSON.toJSONString(confirmStartChargingData);
pileMsgRecordService.save(pileSn, pileSn, type, jsonMsg, ykcDataProtocol.getHEXString());
// pileMsgRecordService.save(pileSn, pileSn, type, jsonMsg, ykcDataProtocol.getHEXString());
SavePileMsgDTO savePileMsgDTO = SavePileMsgDTO.builder()
.pileSn(pileSn)
.connectorCode(connectorCode)
.transactionCode(transactionCode)
.frameType(type)
.jsonMsg(jsonMsg)
.originalMsg(ykcDataProtocol.getHEXString())
.build();
pileMsgRecordService.save(savePileMsgDTO);
// 拼装消息体
byte[] msgBodyByteArr = Bytes.concat(serialNumByteArr, pileSnByteArr, connectorNumByteArr, cardNumByteArr, accountBalanceByteArr,

View File

@@ -16,6 +16,7 @@ import com.jsowell.pile.domain.PileBasicInfo;
import com.jsowell.pile.domain.ykcCommond.IssueQRCodeCommand;
import com.jsowell.pile.domain.ykcCommond.ProofreadTimeCommand;
import com.jsowell.pile.domain.ykcCommond.PublishPileBillingTemplateCommand;
import com.jsowell.pile.dto.SavePileMsgDTO;
import com.jsowell.pile.service.PileBasicInfoService;
import com.jsowell.pile.service.PileBillingTemplateService;
import com.jsowell.pile.service.PileMsgRecordService;
@@ -274,7 +275,16 @@ public class LoginRequestHandler extends AbstractYkcHandler {
// 保存报文 没有登录认证通过还要不要保存报文?
try {
String jsonMsg = JSON.toJSONString(loginRequestData);
pileMsgRecordService.save(pileSn, pileSn, type, jsonMsg, ykcDataProtocol.getHEXString());
// pileMsgRecordService.save(pileSn, pileSn, type, jsonMsg, ykcDataProtocol.getHEXString());
SavePileMsgDTO dto = SavePileMsgDTO.builder()
.pileSn(pileSn)
.connectorCode(null)
.transactionCode(null)
.frameType(type)
.jsonMsg(jsonMsg)
.originalMsg(ykcDataProtocol.getHEXString())
.build();
pileMsgRecordService.save(dto);
} catch (Exception e) {
log.error("保存报文失败pileSn:{}", pileSn, e);
}

View File

@@ -9,6 +9,7 @@ import com.jsowell.common.util.BytesUtil;
import com.jsowell.common.util.StringUtils;
import com.jsowell.common.util.YKCUtils;
import com.jsowell.netty.factory.YKCOperateFactory;
import com.jsowell.pile.dto.SavePileMsgDTO;
import com.jsowell.pile.dto.VerifyMergeChargeOrderDTO;
import com.jsowell.pile.service.OrderBasicInfoService;
import com.jsowell.pile.service.PileMsgRecordService;
@@ -164,7 +165,16 @@ public class PileApplyMergeChargeHandler extends AbstractYkcHandler{
// 并充序号
// 保存报文
String jsonMsg = JSON.toJSONString(dto);
pileMsgRecordService.save(pileSn, pileSn, type, jsonMsg, ykcDataProtocol.getHEXString());
// pileMsgRecordService.save(pileSn, pileSn, type, jsonMsg, ykcDataProtocol.getHEXString());
SavePileMsgDTO dto1 = SavePileMsgDTO.builder()
.pileSn(pileSn)
.connectorCode(connectorCode)
.transactionCode(transactionCode)
.frameType(type)
.jsonMsg(jsonMsg)
.originalMsg(ykcDataProtocol.getHEXString())
.build();
pileMsgRecordService.save(dto1);
byte[] msgBodyByteArr = Bytes.concat(serialNumByteArr, pileSnByteArr, connectorNumByteArr, cardNumByteArr,

View File

@@ -6,6 +6,7 @@ import com.jsowell.common.core.domain.ykc.YKCFrameTypeCode;
import com.jsowell.common.util.BytesUtil;
import com.jsowell.common.util.YKCUtils;
import com.jsowell.netty.factory.YKCOperateFactory;
import com.jsowell.pile.dto.SavePileMsgDTO;
import com.jsowell.pile.service.PileMsgRecordService;
import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j;
@@ -49,7 +50,14 @@ public class RemoteRestartResponseHandler extends AbstractYkcHandler {
// 保存报文
String jsonMsg = JSON.toJSONString(ykcDataProtocol);
pileMsgRecordService.save(pileSn, null, type, jsonMsg, ykcDataProtocol.getHEXString());
// pileMsgRecordService.save(pileSn, null, type, jsonMsg, ykcDataProtocol.getHEXString());
SavePileMsgDTO savePileMsgDTO = SavePileMsgDTO.builder()
.pileSn(pileSn)
.frameType(type)
.jsonMsg(jsonMsg)
.originalMsg(ykcDataProtocol.getHEXString())
.build();
pileMsgRecordService.save(savePileMsgDTO);
// 设置结果
startIndex += length;

View File

@@ -4,7 +4,6 @@ import com.alibaba.fastjson2.JSON;
import com.google.common.primitives.Bytes;
import com.jsowell.common.constant.CacheConstants;
import com.jsowell.common.constant.Constants;
import com.jsowell.common.constant.mq.ThirdPartyRabbitConstants;
import com.jsowell.common.core.domain.ykc.TransactionRecordsData;
import com.jsowell.common.core.domain.ykc.YKCDataProtocol;
import com.jsowell.common.core.domain.ykc.YKCFrameTypeCode;
@@ -21,6 +20,7 @@ import com.jsowell.common.util.spring.SpringUtils;
import com.jsowell.netty.factory.YKCOperateFactory;
import com.jsowell.pile.domain.OrderBasicInfo;
import com.jsowell.pile.domain.PileBasicInfo;
import com.jsowell.pile.dto.SavePileMsgDTO;
import com.jsowell.pile.service.*;
import com.jsowell.pile.service.programlogic.AbstractProgramLogic;
import com.jsowell.pile.service.programlogic.ProgramLogicFactory;
@@ -582,7 +582,16 @@ public class TransactionRecordsRequestHandler extends AbstractYkcHandler {
// 保存报文
String jsonMsg = JSON.toJSONString(data);
pileMsgRecordService.save(pileSn, pileSn + connectorCode, type, jsonMsg, ykcDataProtocol.getHEXString());
// pileMsgRecordService.save(pileSn, pileSn + connectorCode, type, jsonMsg, ykcDataProtocol.getHEXString());
SavePileMsgDTO dto2 = SavePileMsgDTO.builder()
.pileSn(pileSn)
.connectorCode(connectorCode)
.transactionCode(transactionCode)
.frameType(type)
.jsonMsg(jsonMsg)
.originalMsg(ykcDataProtocol.getHEXString())
.build();
pileMsgRecordService.save(dto2);
// 处理订单加锁
String lockKey = "settle_order_" + transactionCode;

View File

@@ -13,6 +13,7 @@ import com.jsowell.netty.factory.EBikeOperateFactory;
import com.jsowell.netty.handler.electricbicycles.AbstractEBikeHandler;
import com.jsowell.netty.service.electricbicycles.EBikeBusinessService;
import com.jsowell.pile.domain.ebike.EBikeCommandEnum;
import com.jsowell.pile.dto.SavePileMsgDTO;
import com.jsowell.pile.service.OrderBasicInfoService;
import com.jsowell.pile.service.PileConnectorInfoService;
import com.jsowell.pile.service.PileMsgRecordService;
@@ -82,7 +83,16 @@ public class EBikeBusinessServiceImpl implements EBikeBusinessService {
// 保存报文
String type = YKCFrameTypeCode.PILE_LOG_OUT.getCode() + "";
String jsonMsg = YKCFrameTypeCode.PILE_LOG_OUT.getValue();
pileMsgRecordService.save(pileSn, pileSn, type, jsonMsg, "");
// pileMsgRecordService.save(pileSn, pileSn, type, jsonMsg, "");
SavePileMsgDTO dto = SavePileMsgDTO.builder()
.pileSn(pileSn)
.connectorCode(pileSn)
.transactionCode("")
.frameType(type)
.jsonMsg(jsonMsg)
.originalMsg(jsonMsg)
.build();
pileMsgRecordService.save(dto);
// 删除桩编号和channel的关系
// PileChannelEntity.removeByPileSn(pileSn);

View File

@@ -4,7 +4,6 @@ import com.alibaba.fastjson2.JSON;
import com.google.common.primitives.Bytes;
import com.jsowell.common.constant.CacheConstants;
import com.jsowell.common.constant.Constants;
import com.jsowell.common.constant.mq.ThirdPartyRabbitConstants;
import com.jsowell.common.core.domain.ykc.LoginRequestData;
import com.jsowell.common.core.domain.ykc.RealTimeMonitorData;
import com.jsowell.common.core.domain.ykc.YKCDataProtocol;
@@ -24,6 +23,7 @@ import com.jsowell.pile.domain.OrderBasicInfo;
import com.jsowell.pile.domain.PileBasicInfo;
import com.jsowell.pile.domain.ykcCommond.IssueQRCodeCommand;
import com.jsowell.pile.domain.ykcCommond.ProofreadTimeCommand;
import com.jsowell.pile.dto.SavePileMsgDTO;
import com.jsowell.pile.service.OrderBasicInfoService;
import com.jsowell.pile.service.PileBasicInfoService;
import com.jsowell.pile.service.PileMsgRecordService;
@@ -216,7 +216,14 @@ public class PileRabbitListener {
// 保存报文 没有登录认证通过还要不要保存报文?
try {
String jsonMsg = JSON.toJSONString(loginRequestData);
pileMsgRecordService.save(pileSn, pileSn, YKCUtils.frameType2Str(YKCFrameTypeCode.LOGIN_CODE.getBytes()), jsonMsg, ykcDataProtocol.getHEXString());
// pileMsgRecordService.save(pileSn, pileSn, YKCUtils.frameType2Str(YKCFrameTypeCode.LOGIN_CODE.getBytes()), jsonMsg, ykcDataProtocol.getHEXString());
SavePileMsgDTO savePileMsgDTO = SavePileMsgDTO.builder()
.pileSn(pileSn)
.frameType(YKCUtils.frameType2Str(YKCFrameTypeCode.LOGIN_CODE.getBytes()))
.jsonMsg(jsonMsg)
.originalMsg(ykcDataProtocol.getHEXString())
.build();
pileMsgRecordService.save(savePileMsgDTO);
} catch (Exception e) {
log.error("保存报文失败pileSn:{}", pileSn, e);
}

View File

@@ -11,11 +11,11 @@ import com.jsowell.netty.factory.YKCOperateFactoryV2;
import com.jsowell.netty.handler.yunkuaichong.AbstractYkcHandler;
import com.jsowell.netty.service.yunkuaichong.YKCBusinessService;
import com.jsowell.netty.strategy.ykc.AbstractYkcStrategy;
import com.jsowell.pile.dto.SavePileMsgDTO;
import com.jsowell.pile.service.OrderBasicInfoService;
import com.jsowell.pile.service.PileConnectorInfoService;
import com.jsowell.pile.service.PileMsgRecordService;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelId;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -85,7 +85,16 @@ public class YKCBusinessServiceImpl implements YKCBusinessService {
// 保存报文
String type = YKCFrameTypeCode.PILE_LOG_OUT.getCode() + "";
String jsonMsg = YKCFrameTypeCode.PILE_LOG_OUT.getValue() + ": 充电桩主动断开链接";
pileMsgRecordService.save(pileSn, pileSn, type, jsonMsg, "");
// pileMsgRecordService.save(pileSn, pileSn, type, jsonMsg, "");
SavePileMsgDTO dto = SavePileMsgDTO.builder()
.pileSn(pileSn)
.connectorCode(pileSn)
.transactionCode("")
.frameType(type)
.jsonMsg(jsonMsg)
.originalMsg(jsonMsg)
.build();
pileMsgRecordService.save(dto);
// 删除连接
// PileChannelEntity.deleteChannel(pileSn, ctx);

View File

@@ -259,7 +259,7 @@ public class ConfirmStartChargingStrategy implements AbstractYkcStrategy {
// 保存报文
String jsonMsg = JSON.toJSONString(confirmStartChargingData);
pileMsgRecordService.save(pileSn, pileSn, type, jsonMsg, ykcDataProtocol.getHEXString());
// pileMsgRecordService.save(pileSn, pileSn, type, jsonMsg, ykcDataProtocol.getHEXString());
// 拼装消息体
byte[] msgBodyByteArr = Bytes.concat(serialNumByteArr, pileSnByteArr, connectorNumByteArr, cardNumByteArr, accountBalanceByteArr,

View File

@@ -218,7 +218,7 @@ public class LoginStrategy implements AbstractYkcStrategy {
// 保存报文 没有登录认证通过还要不要保存报文?
try {
String jsonMsg = JSON.toJSONString(data0x01);
pileMsgRecordService.save(pileSn, pileSn, type, jsonMsg, ykcDataProtocol.getHEXString());
// pileMsgRecordService.save(pileSn, pileSn, type, jsonMsg, ykcDataProtocol.getHEXString());
} catch (Exception e) {
log.error("保存报文失败pileSn:{}", pileSn, e);
}

View File

@@ -51,7 +51,7 @@ public class RemoteRestartStrategy implements AbstractYkcStrategy {
// 保存报文
String jsonMsg = JSON.toJSONString(ykcDataProtocol);
pileMsgRecordService.save(pileSn, null, type, jsonMsg, ykcDataProtocol.getHEXString());
// pileMsgRecordService.save(pileSn, null, type, jsonMsg, ykcDataProtocol.getHEXString());
// 设置结果
startIndex += length;

View File

@@ -563,7 +563,7 @@ public class TransactionRecordsStrategy implements AbstractYkcStrategy {
// 保存报文
String jsonMsg = JSON.toJSONString(data);
pileMsgRecordService.save(pileSn, pileSn + connectorCode, type, jsonMsg, ykcDataProtocol.getHEXString());
// pileMsgRecordService.save(pileSn, pileSn + connectorCode, type, jsonMsg, ykcDataProtocol.getHEXString());
// 处理订单加锁
String lockKey = "settle_order_" + transactionCode;

View File

@@ -20,6 +20,9 @@ public class PileMsgRecord {
*/
private String pileSn;
// 交易流水号
private String transactionCode;
/**
* 帧类型
*/

View File

@@ -0,0 +1,30 @@
package com.jsowell.pile.dto;
import lombok.*;
/**
* 充电桩消息保存DTO
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SavePileMsgDTO {
// 充电桩编号
private String pileSn;
// 充电枪口编号
private String connectorCode;
// 交易流水号
private String transactionCode;
// 帧类型
private String frameType;
// json格式报文
private String jsonMsg;
// 原始报文
private String originalMsg;
}

View File

@@ -3,6 +3,7 @@ package com.jsowell.pile.service;
import com.jsowell.common.core.page.PageResponse;
import com.jsowell.pile.domain.PileMsgRecord;
import com.jsowell.pile.dto.QueryPileDTO;
import com.jsowell.pile.dto.SavePileMsgDTO;
import java.time.LocalDateTime;
import java.util.Date;
@@ -22,7 +23,9 @@ public interface PileMsgRecordService {
// List<PileMsgRecord> getByConnectorCodeList(List<String> connectorCodeList);
/**
void save(SavePileMsgDTO dto);
/**
* 查询充电桩通信日志 分页
*/
PageResponse getPileFeedList(QueryPileDTO dto);

View File

@@ -12,10 +12,12 @@ import com.jsowell.common.util.YKCUtils;
import com.jsowell.pile.domain.OrderBasicInfo;
import com.jsowell.pile.domain.PileMsgRecord;
import com.jsowell.pile.dto.QueryPileDTO;
import com.jsowell.pile.dto.SavePileMsgDTO;
import com.jsowell.pile.mapper.PileMsgRecordMapper;
import com.jsowell.pile.service.OrderBasicInfoService;
import com.jsowell.pile.service.PileMsgRecordService;
import com.jsowell.pile.vo.web.PileCommunicationLogVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -24,6 +26,7 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Slf4j
@Service
public class PileMsgRecordServiceImpl implements PileMsgRecordService {
@@ -45,6 +48,37 @@ public class PileMsgRecordServiceImpl implements PileMsgRecordService {
pileMsgRecordMapper.insertSelective(pileMsgRecord);
}
@Override
public void save(SavePileMsgDTO dto) {
// 取出dto中的值
String pileSn = dto.getPileSn();
String connectorCode = dto.getConnectorCode();
String transactionCode = dto.getTransactionCode();
String frameType = dto.getFrameType();
String jsonMsg = dto.getJsonMsg();
String originalMsg = dto.getOriginalMsg();
// 必传字段pileSn frameType originalMsg, 任一为空,则返回错误
if (StringUtils.isBlank(pileSn) || StringUtils.isBlank(frameType) || StringUtils.isBlank(originalMsg)) {
// 打印错误信息并返回
log.error("保存桩消息记录 error -pileSn, frameType, originalMsg不能为空");
return;
}
PileMsgRecord pileMsgRecord = new PileMsgRecord();
pileMsgRecord.setPileSn(pileSn);
pileMsgRecord.setTransactionCode(transactionCode);
// 如果pileSn与connectorCode都不为空则设置pileConnectorCode为pileSn+connectorCode
if (StringUtils.isNotBlank(pileSn) && StringUtils.isNotBlank(connectorCode)) {
pileMsgRecord.setPileConnectorCode(pileSn + connectorCode);
}
pileMsgRecord.setFrameType(frameType);
pileMsgRecord.setJsonMsg(jsonMsg);
pileMsgRecord.setOriginalMsg(originalMsg);
pileMsgRecord.setCreateTime(DateUtils.getDateTime());
pileMsgRecordMapper.insertSelective(pileMsgRecord);
}
// @Override
// public List<PileMsgRecord> getByConnectorCodeList(List<String> connectorCodeList) {
// if (CollectionUtils.isEmpty(connectorCodeList)) {

View File

@@ -13,6 +13,7 @@ import com.jsowell.common.util.*;
import com.jsowell.common.util.Cp56Time2a.Cp56Time2aUtil;
import com.jsowell.common.util.spring.SpringUtils;
import com.jsowell.pile.domain.ykcCommond.*;
import com.jsowell.pile.dto.SavePileMsgDTO;
import com.jsowell.pile.service.*;
import com.jsowell.pile.vo.web.BillingTemplateVO;
import com.jsowell.pile.vo.web.PileModelInfoVO;
@@ -144,7 +145,16 @@ public class YKCPushCommandServiceImpl implements YKCPushCommandService {
// 保存报文
String frameTypeStr = YKCUtils.frameType2Str(((YKCFrameTypeCode) frameTypeCode).getBytes());
if (frameTypeList.contains(frameTypeStr)) {
pileMsgRecordService.save(pileSn, null, frameTypeStr, null, wholeMsg);
// pileMsgRecordService.save(pileSn, null, frameTypeStr, null, wholeMsg);
SavePileMsgDTO savePileMsgDTO = SavePileMsgDTO.builder()
.pileSn(pileSn)
.connectorCode(null)
.transactionCode(null)
.frameType(frameTypeStr)
.jsonMsg(null)
.originalMsg(wholeMsg)
.build();
pileMsgRecordService.save(savePileMsgDTO);
}
}
@@ -262,7 +272,16 @@ public class YKCPushCommandServiceImpl implements YKCPushCommandService {
// 保存报文
String frameTypeStr = YKCUtils.frameType2Str(((YKCFrameTypeCode) frameTypeCode).getBytes());
if (frameTypeList.contains(frameTypeStr)) {
pileMsgRecordService.save(pileSn, null, frameTypeStr, null, wholeMsg);
// pileMsgRecordService.save(pileSn, null, frameTypeStr, null, wholeMsg);
SavePileMsgDTO savePileMsgDTO = SavePileMsgDTO.builder()
.pileSn(pileSn)
.connectorCode(null)
.transactionCode(null)
.frameType(frameTypeStr)
.jsonMsg(null)
.originalMsg(wholeMsg)
.build();
pileMsgRecordService.save(savePileMsgDTO);
}
return rpcResponse;
}

View File

@@ -6,6 +6,7 @@
<!--@Table pile_msg_record-->
<id column="id" jdbcType="INTEGER" property="id" />
<result column="pile_sn" jdbcType="VARCHAR" property="pileSn" />
<result column="transaction_code" jdbcType="VARCHAR" property="transactionCode" />
<result column="frame_type" jdbcType="VARCHAR" property="frameType" />
<result column="connector_code" jdbcType="VARCHAR" property="connectorCode" />
<result column="pile_connector_code" jdbcType="VARCHAR" property="pileConnectorCode" />
@@ -35,6 +36,9 @@
<if test="pileSn != null and pileSn != ''">
pile_sn,
</if>
<if test="transactionCode != null and transactionCode != ''">
transaction_code,
</if>
<if test="frameType != null and frameType != ''">
frame_type,
</if>
@@ -61,6 +65,9 @@
<if test="pileSn != null and pileSn != ''">
#{pileSn,jdbcType=VARCHAR},
</if>
<if test="transactionCode != null and transactionCode != ''">
#{transactionCode,jdbcType=VARCHAR},
</if>
<if test="frameType != null and frameType != ''">
#{frameType,jdbcType=VARCHAR},
</if>