From c79eacc6b761522c2cb10cffe978855d0fb22649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E4=B8=99?= Date: Mon, 14 Apr 2025 20:54:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E8=AE=A1=E8=B4=B9=E7=AD=96?= =?UTF-8?q?=E7=95=A5=E4=B8=8B=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jcpp/app/adapter/TestController.java | 114 ++++++++++++++++++ .../jcpp/app/service/PileProtocolService.java | 6 + .../impl/DefaultPileProtocolService.java | 19 ++- .../cmd/YunKuaiChongV150RemoteStopDLCmd.java | 4 +- ...nKuaiChongV150SetPricingModelAckULCmd.java | 4 +- .../YunKuaiChongV150SetPricingModelDLCmd.java | 3 +- ...uaiChongV150TransactionRecordAckDLCmd.java | 4 +- ...KuaiChongV160RemoteParallelStartDLCmd.java | 4 +- 8 files changed, 146 insertions(+), 12 deletions(-) diff --git a/jcpp-app/src/main/java/sanbing/jcpp/app/adapter/TestController.java b/jcpp-app/src/main/java/sanbing/jcpp/app/adapter/TestController.java index b2a2c0e..ee25da2 100644 --- a/jcpp-app/src/main/java/sanbing/jcpp/app/adapter/TestController.java +++ b/jcpp-app/src/main/java/sanbing/jcpp/app/adapter/TestController.java @@ -11,8 +11,10 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import sanbing.jcpp.app.service.PileProtocolService; +import sanbing.jcpp.proto.gen.ProtocolProto.*; import java.math.BigDecimal; +import java.util.HashMap; /** * @author baigod @@ -30,4 +32,116 @@ public class TestController { return ResponseEntity.ok("success"); } + + @GetMapping("/api/setPricing") + public ResponseEntity setPricing() { + + String pileCode = "20231212000010"; + + FlagPriceProto flagPriceTop = FlagPriceProto.newBuilder() + .setFlag(PricingModelFlag.TOP) + .setElec("1.5") + .setServ("0.5") + .build(); + + FlagPriceProto flagPricePeak = FlagPriceProto.newBuilder() + .setFlag(PricingModelFlag.PEAK) + .setElec("1.2") + .setServ("0.4") + .build(); + + FlagPriceProto flagPriceFlat = FlagPriceProto.newBuilder() + .setFlag(PricingModelFlag.FLAT) + .setElec("1.0") + .setServ("0.3") + .build(); + + FlagPriceProto flagPriceValley = FlagPriceProto.newBuilder() + .setFlag(PricingModelFlag.VALLEY) + .setElec("0.7") + .setServ("0.2") + .build(); + + // 构建 PeriodProto 对象 + PeriodProto topPeriod1 = PeriodProto.newBuilder() + .setSn(1) + .setBegin("10:00") + .setEnd("15:00") + .setFlag(PricingModelFlag.TOP) + .build(); + + PeriodProto topPeriod2 = PeriodProto.newBuilder() + .setSn(2) + .setBegin("18:00") + .setEnd("21:00") + .setFlag(PricingModelFlag.TOP) + .build(); + + PeriodProto peakPeriod1 = PeriodProto.newBuilder() + .setSn(3) + .setBegin("07:00") + .setEnd("10:00") + .setFlag(PricingModelFlag.PEAK) + .build(); + + PeriodProto peakPeriod2 = PeriodProto.newBuilder() + .setSn(4) + .setBegin("15:00") + .setEnd("18:00") + .setFlag(PricingModelFlag.PEAK) + .build(); + + PeriodProto flatPeriod1 = PeriodProto.newBuilder() + .setSn(5) + .setBegin("06:00") + .setEnd("07:00") + .setFlag(PricingModelFlag.FLAT) + .build(); + + PeriodProto flatPeriod2 = PeriodProto.newBuilder() + .setSn(6) + .setBegin("21:00") + .setEnd("23:00") + .setFlag(PricingModelFlag.FLAT) + .build(); + + PeriodProto valleyPeriod = PeriodProto.newBuilder() + .setSn(7) + .setBegin("23:00") + .setEnd("06:00") + .setFlag(PricingModelFlag.VALLEY) + .build(); + + // 构建 flagPrice 映射 + HashMap flagPriceMap = new HashMap<>(); + flagPriceMap.put(PricingModelFlag.TOP_VALUE, flagPriceTop); + flagPriceMap.put(PricingModelFlag.PEAK_VALUE, flagPricePeak); + flagPriceMap.put(PricingModelFlag.FLAT_VALUE, flagPriceFlat); + flagPriceMap.put(PricingModelFlag.VALLEY_VALUE, flagPriceValley); + + // 构建 PricingModelProto 对象 + PricingModelProto pricingModel = PricingModelProto.newBuilder() + .setType(PricingModelType.CHARGE) // 设置为充电计费模型 + .setRule(PricingModelRule.SPLIT_TIME) // 使用分时计费规则 + .setStandardElec("1.0") // 标准电费(默认值) + .setStandardServ("0.3") // 标准服务费(默认值) + .putAllFlagPrice(flagPriceMap) // 设置尖峰平谷对应的价格 + .addPeriod(topPeriod1) // 添加尖峰时段1 + .addPeriod(topPeriod2) // 添加尖峰时段2 + .addPeriod(peakPeriod1) // 添加峰时段1 + .addPeriod(peakPeriod2) // 添加峰时段2 + .addPeriod(flatPeriod1) // 添加平时段1 + .addPeriod(flatPeriod2) // 添加平时段2 + .addPeriod(valleyPeriod) // 添加谷时段 + .build(); + + pileProtocolService.setPricing(pileCode, + SetPricingRequest.newBuilder() + .setPileCode(pileCode) + .setPricingId(1000L) + .setPricingModel(pricingModel) + .build()); + + return ResponseEntity.ok("success"); + } } \ No newline at end of file diff --git a/jcpp-app/src/main/java/sanbing/jcpp/app/service/PileProtocolService.java b/jcpp-app/src/main/java/sanbing/jcpp/app/service/PileProtocolService.java index 2d56f59..ffd512c 100644 --- a/jcpp-app/src/main/java/sanbing/jcpp/app/service/PileProtocolService.java +++ b/jcpp-app/src/main/java/sanbing/jcpp/app/service/PileProtocolService.java @@ -7,6 +7,7 @@ package sanbing.jcpp.app.service; import sanbing.jcpp.infrastructure.queue.Callback; +import sanbing.jcpp.proto.gen.ProtocolProto.SetPricingRequest; import sanbing.jcpp.proto.gen.ProtocolProto.UplinkQueueMessage; import java.math.BigDecimal; @@ -72,4 +73,9 @@ public interface PileProtocolService { * 启动充电 */ void startCharge(String pileCode, String gunCode, BigDecimal limitYuan, String orderNo); + + /** + * 下发计费 + */ + void setPricing(String pileCode, SetPricingRequest setPricingRequest); } \ No newline at end of file diff --git a/jcpp-app/src/main/java/sanbing/jcpp/app/service/impl/DefaultPileProtocolService.java b/jcpp-app/src/main/java/sanbing/jcpp/app/service/impl/DefaultPileProtocolService.java index 91f5ee0..fc00196 100644 --- a/jcpp-app/src/main/java/sanbing/jcpp/app/service/impl/DefaultPileProtocolService.java +++ b/jcpp-app/src/main/java/sanbing/jcpp/app/service/impl/DefaultPileProtocolService.java @@ -226,7 +226,7 @@ public class DefaultPileProtocolService implements PileProtocolService { @Override public void onSetPricingResponse(UplinkQueueMessage uplinkQueueMessage, Callback callback) { - log.info("接收到充电桩上费率下发反馈 {}", uplinkQueueMessage); + log.info("接收到充电桩上报费率下发反馈 {}", uplinkQueueMessage); // TODO 处理相关业务逻辑 @@ -277,7 +277,6 @@ public class DefaultPileProtocolService implements PileProtocolService { @Override public void startCharge(String pileCode, String gunCode, BigDecimal limitYuan, String orderNo) { - UUID messageId = UUID.randomUUID(); UUID requestId = UUID.randomUUID(); @@ -295,6 +294,22 @@ public class DefaultPileProtocolService implements PileProtocolService { .setTradeNo(orderNo) .build()); + downlinkCallService.sendDownlinkMessage(downlinkRequestMessageBuilder, pileCode); + } + + @Override + public void setPricing(String pileCode, SetPricingRequest setPricingRequest) { + UUID messageId = UUID.randomUUID(); + UUID requestId = UUID.randomUUID(); + + DownlinkRequestMessage.Builder downlinkRequestMessageBuilder = DownlinkRequestMessage.newBuilder() + .setMessageIdMSB(messageId.getMostSignificantBits()) + .setMessageIdLSB(messageId.getLeastSignificantBits()) + .setPileCode(pileCode) + .setRequestIdMSB(requestId.getMostSignificantBits()) + .setRequestIdLSB(requestId.getLeastSignificantBits()) + .setDownlinkCmd(DownlinkCmdEnum.SET_PRICING.name()) + .setSetPricingRequest(setPricingRequest); downlinkCallService.sendDownlinkMessage(downlinkRequestMessageBuilder, pileCode); } diff --git a/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150RemoteStopDLCmd.java b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150RemoteStopDLCmd.java index 8dd29a0..1137ebb 100644 --- a/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150RemoteStopDLCmd.java +++ b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150RemoteStopDLCmd.java @@ -16,7 +16,7 @@ import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDownlinkCmdExe; import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDwonlinkMessage; import sanbing.jcpp.protocol.yunkuaichong.annotation.YunKuaiChongCmd; -import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.REMOTE_START_CHARGING; +import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.REMOTE_STOP_CHARGING; /** * 云快充1.5.0 运营平台远程停机 @@ -44,7 +44,7 @@ public class YunKuaiChongV150RemoteStopDLCmd extends YunKuaiChongDownlinkCmdExe // 枪号 msgBody.writeBytes(encodeGunCode(gunCode)); - encodeAndWriteFlush(REMOTE_START_CHARGING, + encodeAndWriteFlush(REMOTE_STOP_CHARGING, msgBody, tcpSession); } diff --git a/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150SetPricingModelAckULCmd.java b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150SetPricingModelAckULCmd.java index 8dc19f6..6a9823c 100644 --- a/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150SetPricingModelAckULCmd.java +++ b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150SetPricingModelAckULCmd.java @@ -18,7 +18,7 @@ import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongUplinkCmdExe; import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongUplinkMessage; import sanbing.jcpp.protocol.yunkuaichong.annotation.YunKuaiChongCmd; -import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.QUERY_PRICING_ACK; +import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.SET_PRICING; /** * 云快充1.5.0 计费模型应答 @@ -42,7 +42,7 @@ public class YunKuaiChongV150SetPricingModelAckULCmd extends YunKuaiChongUplinkC boolean isSuccess = (byteBuf.readByte() == 0x01); // 从缓存取上个请求的pricingId - Object pricingId = tcpSession.getRequestCache().asMap().getOrDefault(pileCode + QUERY_PRICING_ACK.getCmd(), null); + Object pricingId = tcpSession.getRequestCache().asMap().getOrDefault(pileCode + SET_PRICING.getCmd(), null); if (pricingId instanceof Long pricingIdL) { // 转发到后端 diff --git a/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150SetPricingModelDLCmd.java b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150SetPricingModelDLCmd.java index fe3b0c0..20923ba 100644 --- a/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150SetPricingModelDLCmd.java +++ b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150SetPricingModelDLCmd.java @@ -25,7 +25,6 @@ import java.util.List; import java.util.Map; import static sanbing.jcpp.proto.gen.ProtocolProto.PricingModelFlag.*; -import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.QUERY_PRICING_ACK; import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.SET_PRICING; /** @@ -84,7 +83,7 @@ public class YunKuaiChongV150SetPricingModelDLCmd extends YunKuaiChongDownlinkCm setPricingAckMsgBody.writeBytes(bytes); // 放进缓存后再下发 - tcpSession.getRequestCache().put(pileCode + QUERY_PRICING_ACK.getCmd(), Long.valueOf(pricingId)); + tcpSession.getRequestCache().put(pileCode + SET_PRICING.getCmd(), pricingId); encodeAndWriteFlush(SET_PRICING, setPricingAckMsgBody, 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 06f82d7..e4bda2b 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.VERIFY_PRICING_ACK; +import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.TRANSACTION_RECORD; /** * 云快充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(VERIFY_PRICING_ACK, + encodeAndWriteFlush(TRANSACTION_RECORD, requestData.getSequenceNumber(), requestData.getEncryptionFlag(), msgBody, diff --git a/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v160/cmd/YunKuaiChongV160RemoteParallelStartDLCmd.java b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v160/cmd/YunKuaiChongV160RemoteParallelStartDLCmd.java index 8d346d9..76e1730 100644 --- a/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v160/cmd/YunKuaiChongV160RemoteParallelStartDLCmd.java +++ b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v160/cmd/YunKuaiChongV160RemoteParallelStartDLCmd.java @@ -22,7 +22,7 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.REMOTE_START_CHARGING; +import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.REMOTE_PARALLEL_START_CHARGING; /** * 云快充1.6.0 运营平台远程控制并充启机 @@ -67,7 +67,7 @@ public class YunKuaiChongV160RemoteParallelStartDLCmd extends YunKuaiChongDownli // 并充序号 msgBody.writeBytes(BCDUtil.toBytes(LocalDateTime.now().format(dateTimeFormatter))); - encodeAndWriteFlush(REMOTE_START_CHARGING, + encodeAndWriteFlush(REMOTE_PARALLEL_START_CHARGING, msgBody, tcpSession); }