!33 新增云快充启动充电的逻辑卡号和物理卡号,和双枪并充序号以及双枪并充的测试接口

* 新增云快充启动充电的逻辑卡号和物理卡号,和双枪并充序号以及双枪并充的测试接口
* CMD路由优化
* Merge remote-tracking branch 'gitee/master' into Feat_Lvneng_module_optimize
* cmd路由优化
* cmd路由优化
* 绿能模块优化
* 新增云快充1.7 0x3D
* 添加停止充电的TestController
This commit is contained in:
三丙
2025-08-25 14:04:25 +00:00
parent 7c26534dff
commit 921045af8f
63 changed files with 795 additions and 380 deletions

View File

@@ -8,6 +8,7 @@ package sanbing.jcpp.app.adapter;
import com.google.common.collect.Lists;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -32,7 +33,26 @@ public class TestController {
@GetMapping("/api/startCharge")
public ResponseEntity<String> startCharge() {
pileProtocolService.startCharge("20231212000010", "01", new BigDecimal("50"), "12345678901234567890");
String orderNo = "ORD" + RandomStringUtils.secure().nextNumeric(20);
String logicalCardNo = RandomStringUtils.secure().nextNumeric(12);
String physicalCardNo = RandomStringUtils.secure().nextNumeric(12);
pileProtocolService.startCharge("20231212000010", "01", new BigDecimal("50"), orderNo,
logicalCardNo, physicalCardNo, null);
return ResponseEntity.ok("success");
}
@GetMapping("/api/parallelStartCharge")
public ResponseEntity<String> parallelStartCharge() {
String orderNo = "PAR" + RandomStringUtils.secure().nextNumeric(20);
String logicalCardNo = RandomStringUtils.secure().nextNumeric(12);
String physicalCardNo = RandomStringUtils.secure().nextNumeric(12);
String parallelNo = RandomStringUtils.secure().nextNumeric(6);
pileProtocolService.startCharge("20231212000010", "01", new BigDecimal("100"),
orderNo, logicalCardNo, physicalCardNo, parallelNo);
return ResponseEntity.ok("success");
}

View File

@@ -74,9 +74,11 @@ public interface PileProtocolService {
void onTransactionRecordRequest(UplinkQueueMessage uplinkQueueMessage, Callback callback);
/**
* 启动充电
* 启动充电(支持卡号和并充序号)
* 当 parallelNo 不为空时,自动使用并充启机命令
*/
void startCharge(String pileCode, String gunCode, BigDecimal limitYuan, String orderNo);
void startCharge(String pileCode, String gunCode, BigDecimal limitYuan, String orderNo,
String logicalCardNo, String physicalCardNo, String parallelNo);
/**
* 停止充电
@@ -163,8 +165,15 @@ public interface PileProtocolService {
* 离线卡数据同步应答
*/
void onOfflineCardSyncResponse(UplinkQueueMessage uplinkQueueMessage, Callback callback);
/**
* 实时同步桩时间
*/
void timeSync(String pileCode, LocalDateTime time);
void onTimeSync(UplinkQueueMessage uplinkQueueMessage, Callback callback);
/**
* 实时同步桩时间应答
*/
void onTimeSyncResponse(UplinkQueueMessage uplinkQueueMessage, Callback callback);
}

View File

@@ -281,24 +281,42 @@ public class DefaultPileProtocolService implements PileProtocolService {
}
@Override
public void startCharge(String pileCode, String gunCode, BigDecimal limitYuan, String orderNo) {
public void startCharge(String pileCode, String gunCode, BigDecimal limitYuan, String orderNo,
String logicalCardNo, String physicalCardNo, String parallelNo) {
UUID messageId = UUID.randomUUID();
UUID requestId = UUID.randomUUID();
RemoteStartChargingRequest.Builder requestBuilder = RemoteStartChargingRequest.newBuilder()
.setPileCode(pileCode)
.setGunCode(gunCode)
.setLimitYuan(limitYuan.toPlainString())
.setTradeNo(orderNo);
// 添加可选字段
if (logicalCardNo != null) {
requestBuilder.setLogicalCardNo(logicalCardNo);
}
if (physicalCardNo != null) {
requestBuilder.setPhysicalCardNo(physicalCardNo);
}
if (parallelNo != null) {
requestBuilder.setParallelNo(parallelNo);
}
// 根据是否有并充序号自动选择命令类型
DownlinkCmdEnum downlinkCmd = (parallelNo != null && !parallelNo.trim().isEmpty())
? DownlinkCmdEnum.REMOTE_PARALLEL_START_CHARGING
: DownlinkCmdEnum.REMOTE_START_CHARGING;
DownlinkRequestMessage.Builder downlinkRequestMessageBuilder = DownlinkRequestMessage.newBuilder()
.setMessageIdMSB(messageId.getMostSignificantBits())
.setMessageIdLSB(messageId.getLeastSignificantBits())
.setPileCode(pileCode)
.setRequestIdMSB(requestId.getMostSignificantBits())
.setRequestIdLSB(requestId.getLeastSignificantBits())
.setDownlinkCmd(DownlinkCmdEnum.REMOTE_START_CHARGING.name())
.setRemoteStartChargingRequest(RemoteStartChargingRequest.newBuilder()
.setPileCode(pileCode)
.setGunCode(gunCode)
.setLimitYuan(limitYuan.toPlainString())
.setTradeNo(orderNo)
.build());
.setDownlinkCmd(downlinkCmd.name())
.setRemoteStartChargingRequest(requestBuilder.build());
downlinkCallService.sendDownlinkMessage(downlinkRequestMessageBuilder, pileCode);
}
@@ -476,7 +494,7 @@ public class DefaultPileProtocolService implements PileProtocolService {
}
@Override
public void onTimeSync(UplinkQueueMessage uplinkQueueMessage, Callback callback) {
public void onTimeSyncResponse(UplinkQueueMessage uplinkQueueMessage, Callback callback) {
log.info("对时设置应答 {}", uplinkQueueMessage);
TimeSyncResponse timeSyncResponse = uplinkQueueMessage.getTimeSyncResponse();
String pileCode = timeSyncResponse.getPileCode();

View File

@@ -234,7 +234,7 @@ public class ProtocolUplinkConsumerService extends AbstractConsumerService imple
} else if (uplinkQueueMsg.hasTimeSyncResponse()) {
pileProtocolService.onTimeSync(uplinkQueueMsg, callback);
pileProtocolService.onTimeSyncResponse(uplinkQueueMsg, callback);
} else {