mirror of
https://gitee.com/san-bing/JChargePointProtocol
synced 2026-05-05 18:39:56 +08:00
测试计费策略下发
This commit is contained in:
@@ -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<String> 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<Integer, FlagPriceProto> 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");
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
// 转发到后端
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user