From ca536a55f2171d389ae682956e04af29e31d874a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E4=B8=99?= <10604541+sanbing-os@user.noreply.gitee.com> Date: Mon, 11 Aug 2025 10:53:06 +0000 Subject: [PATCH] =?UTF-8?q?!20=20=E6=94=B9=E9=80=A0=E4=BA=A4=E6=98=93?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E9=A2=86=E5=9F=9F=E6=A8=A1=E5=9E=8B=20*=20?= =?UTF-8?q?=E6=94=B9=E9=80=A0=E4=BA=A4=E6=98=93=E8=AE=B0=E5=BD=95=E9=A2=86?= =?UTF-8?q?=E5=9F=9F=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/proto/protocol.proto | 67 +++++++++++++------ .../enums/YunKuaiChongDownlinkCmdEnum.java | 2 +- ...uaiChongV150TransactionRecordAckDLCmd.java | 4 +- ...unKuaiChongV150TransactionRecordULCmd.java | 27 +++++--- 4 files changed, 69 insertions(+), 31 deletions(-) diff --git a/jcpp-infrastructure-proto/src/main/proto/protocol.proto b/jcpp-infrastructure-proto/src/main/proto/protocol.proto index 2b7dbd5..68cc4b5 100644 --- a/jcpp-infrastructure-proto/src/main/proto/protocol.proto +++ b/jcpp-infrastructure-proto/src/main/proto/protocol.proto @@ -281,27 +281,54 @@ message RemoteStopChargingResponse { optional string additionalInfo = 20; } +enum DetailType { + PEAK_VALLEY = 0; // 峰谷电量明细 + TIME_PERIOD = 1; // 时段电量明细 +} + +message PeakValleyDetail { + string topEnergyKWh = 1; // 尖峰电量 + string topAmountYuan = 2; // 尖峰电费 + string peakEnergyKWh = 3; // 峰时电量 + string peakAmountYuan = 4; // 峰时电费 + string flatEnergyKWh = 5; // 平时电量 + string flatAmountYuan = 6; // 平时电费 + string valleyEnergyKWh = 7; // 谷时电量 + string valleyAmountYuan = 8; // 谷时电费 + string deepEnergyKWh = 9; // 深谷电量 + string deepAmountYuan = 10; // 深谷电费 +} + +message TimePeriodDetail { + message PeriodItem { + int32 periodNo = 1; // 时段序号,从1开始 + string startTime = 2; // 开始时间,格式 HH:mm:ss + string endTime = 3; // 结束时间,格式 HH:mm:ss + string energyKWh = 4; // 该时段电量 + optional string amountYuan = 5; // 该时段电费,可选 + } + repeated PeriodItem periods = 1; // 时段列表 +} + +message TransactionDetail { + DetailType type = 1; // 明细类型 + optional PeakValleyDetail peakValley = 2; // 峰谷电量明细 + optional TimePeriodDetail timePeriod = 3; // 时段电量明细 +} + message TransactionRecord { - string pileCode = 4; - string gunCode = 5; - string tradeNo = 6; - int64 startTs = 51; - int64 endTs = 52; - string topEnergyKWh = 53; - string topAmountYuan = 54; - string peakEnergyKWh = 55; - string peakAmountYuan = 56; - string flatEnergyKWh = 57; - string flatAmountYuan = 58; - string valleyEnergyKWh = 59; - string valleyAmountYuan = 60; - string deepEnergyKWh = 61; - string deepAmountYuan = 62; - string totalEnergyKWh = 63; - string totalAmountYuan = 64; - int64 tradeTs = 65; - string stopReason = 66; - optional string additionalInfo = 20; + string pileCode = 4; // 充电桩编码 + string gunCode = 5; // 枪编号 + string tradeNo = 6; // 交易流水号 + int64 startTs = 51; // 开始时间戳 + int64 endTs = 52; // 结束时间戳 + string totalEnergyKWh = 53; // 总电量(必填) + optional string totalAmountYuan = 54; // 总电费(可选) + int64 tradeTs = 55; // 交易时间戳 + string stopReason = 56; // 停止原因 + int64 pricingId = 57; // 计费ID + optional TransactionDetail detail = 58; // 电量电费明细 + optional string additionalInfo = 20; // 附加信息 } message BmsChargingErrorProto { diff --git a/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/enums/YunKuaiChongDownlinkCmdEnum.java b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/enums/YunKuaiChongDownlinkCmdEnum.java index eb5b3b8..09f5a71 100644 --- a/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/enums/YunKuaiChongDownlinkCmdEnum.java +++ b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/enums/YunKuaiChongDownlinkCmdEnum.java @@ -32,7 +32,7 @@ public enum YunKuaiChongDownlinkCmdEnum { REMOTE_STOP_CHARGING(0x36), - TRANSACTION_RECORD(0x40), + TRANSACTION_RECORD_ACK(0x40), REMOTE_PARALLEL_START_CHARGING(0xA4), diff --git a/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150TransactionRecordAckDLCmd.java b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150TransactionRecordAckDLCmd.java index e4bda2b..68be983 100644 --- a/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150TransactionRecordAckDLCmd.java +++ b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150TransactionRecordAckDLCmd.java @@ -20,7 +20,7 @@ import sanbing.jcpp.protocol.yunkuaichong.annotation.YunKuaiChongCmd; import static sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDwonlinkMessage.FAILURE_BYTE; import static sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDwonlinkMessage.SUCCESS_BYTE; -import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.TRANSACTION_RECORD; +import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.TRANSACTION_RECORD_ACK; /** * 云快充1.5.0 交易记录确认 @@ -46,7 +46,7 @@ public class YunKuaiChongV150TransactionRecordAckDLCmd extends YunKuaiChongDownl msgBody.writeBytes(encodeTradeNo(transactionRecordAck.getTradeNo())); msgBody.writeByte(transactionRecordAck.getSuccess() ? SUCCESS_BYTE : FAILURE_BYTE); - encodeAndWriteFlush(TRANSACTION_RECORD, + encodeAndWriteFlush(TRANSACTION_RECORD_ACK, requestData.getSequenceNumber(), requestData.getEncryptionFlag(), msgBody, diff --git a/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150TransactionRecordULCmd.java b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150TransactionRecordULCmd.java index a2b6754..1129e79 100644 --- a/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150TransactionRecordULCmd.java +++ b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150TransactionRecordULCmd.java @@ -13,8 +13,7 @@ import lombok.extern.slf4j.Slf4j; import sanbing.jcpp.infrastructure.util.codec.BCDUtil; import sanbing.jcpp.infrastructure.util.codec.CP56Time2aUtil; import sanbing.jcpp.infrastructure.util.jackson.JacksonUtil; -import sanbing.jcpp.proto.gen.ProtocolProto.TransactionRecord; -import sanbing.jcpp.proto.gen.ProtocolProto.UplinkQueueMessage; +import sanbing.jcpp.proto.gen.ProtocolProto.*; import sanbing.jcpp.protocol.ProtocolContext; import sanbing.jcpp.protocol.listener.tcp.TcpSession; import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongUplinkCmdExe; @@ -154,12 +153,8 @@ public class YunKuaiChongV150TransactionRecordULCmd extends YunKuaiChongUplinkCm String cardNo = BCDUtil.toString(cardNoBytes); additionalInfo.put("物理卡号", cardNo); - TransactionRecord transactionRecord = TransactionRecord.newBuilder() - .setPileCode(pileCode) - .setGunCode(gunCode) - .setTradeNo(tradeNo) - .setStartTs(startTime.toEpochMilli()) - .setEndTs(endTime.toEpochMilli()) + // 构建峰谷电量明细 + PeakValleyDetail peakValleyDetail = PeakValleyDetail.newBuilder() .setTopEnergyKWh(topEnergy.toPlainString()) .setTopAmountYuan(topAmount.toPlainString()) .setPeakEnergyKWh(peakEnergy.toPlainString()) @@ -168,10 +163,26 @@ public class YunKuaiChongV150TransactionRecordULCmd extends YunKuaiChongUplinkCm .setFlatAmountYuan(flatAmount.toPlainString()) .setValleyEnergyKWh(valleyEnergy.toPlainString()) .setValleyAmountYuan(valleyAmount.toPlainString()) + .build(); + + // 构建交易明细 + TransactionDetail transactionDetail = TransactionDetail.newBuilder() + .setType(DetailType.PEAK_VALLEY) + .setPeakValley(peakValleyDetail) + .build(); + + // 构建交易记录 + TransactionRecord transactionRecord = TransactionRecord.newBuilder() + .setPileCode(pileCode) + .setGunCode(gunCode) + .setTradeNo(tradeNo) + .setStartTs(startTime.toEpochMilli()) + .setEndTs(endTime.toEpochMilli()) .setTotalEnergyKWh(totalEnergy.toPlainString()) .setTotalAmountYuan(totalAmount.toPlainString()) .setTradeTs(tradeTime.toEpochMilli()) .setStopReason(stopReason) + .setDetail(transactionDetail) .setAdditionalInfo(additionalInfo.toString()) .build();