mirror of
https://gitee.com/san-bing/JChargePointProtocol
synced 2026-05-09 20:39:55 +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.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import sanbing.jcpp.app.service.PileProtocolService;
|
import sanbing.jcpp.app.service.PileProtocolService;
|
||||||
|
import sanbing.jcpp.proto.gen.ProtocolProto.*;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author baigod
|
* @author baigod
|
||||||
@@ -30,4 +32,116 @@ public class TestController {
|
|||||||
|
|
||||||
return ResponseEntity.ok("success");
|
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;
|
package sanbing.jcpp.app.service;
|
||||||
|
|
||||||
import sanbing.jcpp.infrastructure.queue.Callback;
|
import sanbing.jcpp.infrastructure.queue.Callback;
|
||||||
|
import sanbing.jcpp.proto.gen.ProtocolProto.SetPricingRequest;
|
||||||
import sanbing.jcpp.proto.gen.ProtocolProto.UplinkQueueMessage;
|
import sanbing.jcpp.proto.gen.ProtocolProto.UplinkQueueMessage;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
@@ -72,4 +73,9 @@ public interface PileProtocolService {
|
|||||||
* 启动充电
|
* 启动充电
|
||||||
*/
|
*/
|
||||||
void startCharge(String pileCode, String gunCode, BigDecimal limitYuan, String orderNo);
|
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
|
@Override
|
||||||
public void onSetPricingResponse(UplinkQueueMessage uplinkQueueMessage, Callback callback) {
|
public void onSetPricingResponse(UplinkQueueMessage uplinkQueueMessage, Callback callback) {
|
||||||
log.info("接收到充电桩上费率下发反馈 {}", uplinkQueueMessage);
|
log.info("接收到充电桩上报费率下发反馈 {}", uplinkQueueMessage);
|
||||||
|
|
||||||
// TODO 处理相关业务逻辑
|
// TODO 处理相关业务逻辑
|
||||||
|
|
||||||
@@ -277,7 +277,6 @@ public class DefaultPileProtocolService implements PileProtocolService {
|
|||||||
@Override
|
@Override
|
||||||
public void startCharge(String pileCode, String gunCode, BigDecimal limitYuan, String orderNo) {
|
public void startCharge(String pileCode, String gunCode, BigDecimal limitYuan, String orderNo) {
|
||||||
|
|
||||||
|
|
||||||
UUID messageId = UUID.randomUUID();
|
UUID messageId = UUID.randomUUID();
|
||||||
UUID requestId = UUID.randomUUID();
|
UUID requestId = UUID.randomUUID();
|
||||||
|
|
||||||
@@ -295,6 +294,22 @@ public class DefaultPileProtocolService implements PileProtocolService {
|
|||||||
.setTradeNo(orderNo)
|
.setTradeNo(orderNo)
|
||||||
.build());
|
.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);
|
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.YunKuaiChongDwonlinkMessage;
|
||||||
import sanbing.jcpp.protocol.yunkuaichong.annotation.YunKuaiChongCmd;
|
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 运营平台远程停机
|
* 云快充1.5.0 运营平台远程停机
|
||||||
@@ -44,7 +44,7 @@ public class YunKuaiChongV150RemoteStopDLCmd extends YunKuaiChongDownlinkCmdExe
|
|||||||
// 枪号
|
// 枪号
|
||||||
msgBody.writeBytes(encodeGunCode(gunCode));
|
msgBody.writeBytes(encodeGunCode(gunCode));
|
||||||
|
|
||||||
encodeAndWriteFlush(REMOTE_START_CHARGING,
|
encodeAndWriteFlush(REMOTE_STOP_CHARGING,
|
||||||
msgBody,
|
msgBody,
|
||||||
tcpSession);
|
tcpSession);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongUplinkCmdExe;
|
|||||||
import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongUplinkMessage;
|
import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongUplinkMessage;
|
||||||
import sanbing.jcpp.protocol.yunkuaichong.annotation.YunKuaiChongCmd;
|
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 计费模型应答
|
* 云快充1.5.0 计费模型应答
|
||||||
@@ -42,7 +42,7 @@ public class YunKuaiChongV150SetPricingModelAckULCmd extends YunKuaiChongUplinkC
|
|||||||
boolean isSuccess = (byteBuf.readByte() == 0x01);
|
boolean isSuccess = (byteBuf.readByte() == 0x01);
|
||||||
|
|
||||||
// 从缓存取上个请求的pricingId
|
// 从缓存取上个请求的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) {
|
if (pricingId instanceof Long pricingIdL) {
|
||||||
// 转发到后端
|
// 转发到后端
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static sanbing.jcpp.proto.gen.ProtocolProto.PricingModelFlag.*;
|
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;
|
import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.SET_PRICING;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -84,7 +83,7 @@ public class YunKuaiChongV150SetPricingModelDLCmd extends YunKuaiChongDownlinkCm
|
|||||||
setPricingAckMsgBody.writeBytes(bytes);
|
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,
|
encodeAndWriteFlush(SET_PRICING,
|
||||||
setPricingAckMsgBody,
|
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.FAILURE_BYTE;
|
||||||
import static sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDwonlinkMessage.SUCCESS_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 交易记录确认
|
* 云快充1.5.0 交易记录确认
|
||||||
@@ -46,7 +46,7 @@ public class YunKuaiChongV150TransactionRecordAckDLCmd extends YunKuaiChongDownl
|
|||||||
msgBody.writeBytes(encodeTradeNo(transactionRecordAck.getTradeNo()));
|
msgBody.writeBytes(encodeTradeNo(transactionRecordAck.getTradeNo()));
|
||||||
msgBody.writeByte(transactionRecordAck.getSuccess() ? SUCCESS_BYTE : FAILURE_BYTE);
|
msgBody.writeByte(transactionRecordAck.getSuccess() ? SUCCESS_BYTE : FAILURE_BYTE);
|
||||||
|
|
||||||
encodeAndWriteFlush(VERIFY_PRICING_ACK,
|
encodeAndWriteFlush(TRANSACTION_RECORD,
|
||||||
requestData.getSequenceNumber(),
|
requestData.getSequenceNumber(),
|
||||||
requestData.getEncryptionFlag(),
|
requestData.getEncryptionFlag(),
|
||||||
msgBody,
|
msgBody,
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import java.math.BigDecimal;
|
|||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
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 运营平台远程控制并充启机
|
* 云快充1.6.0 运营平台远程控制并充启机
|
||||||
@@ -67,7 +67,7 @@ public class YunKuaiChongV160RemoteParallelStartDLCmd extends YunKuaiChongDownli
|
|||||||
// 并充序号
|
// 并充序号
|
||||||
msgBody.writeBytes(BCDUtil.toBytes(LocalDateTime.now().format(dateTimeFormatter)));
|
msgBody.writeBytes(BCDUtil.toBytes(LocalDateTime.now().format(dateTimeFormatter)));
|
||||||
|
|
||||||
encodeAndWriteFlush(REMOTE_START_CHARGING,
|
encodeAndWriteFlush(REMOTE_PARALLEL_START_CHARGING,
|
||||||
msgBody,
|
msgBody,
|
||||||
tcpSession);
|
tcpSession);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user