添加查询充电枪状态接口

This commit is contained in:
三丙
2025-09-27 18:04:00 +08:00
parent 7a03cc98a7
commit a1e0a09320
74 changed files with 1727 additions and 259 deletions

View File

@@ -160,6 +160,13 @@ queue:
enabled: "${QUEUE_APP_STATS_ENABLED:true}"
print-interval-ms: "${QUEUE_APP_STATS_PRINT_INTERVAL_MS:60000}"
timer-top-n: "${QUEUE_APP_STATS_TIMER_TOP_N:5}"
# rpc:
# topic: "${QUEUE_RPC_TOPIC:app_rpc}"
# poll-interval: "${QUEUE_RPC_POLL_INTERVAL_MS:5}"
# pack-processing-timeout: "${QUEUE_RPC_PACK_PROCESSING_TIMEOUT_MS:2000}"
# consumer-per-partition: "${QUEUE_RPC_CONSUMER_PER_PARTITION:true}"
# partitions: "${QUEUE_RPC_PARTITIONS:10}"
# decoder: "${QUEUE_RPC_DECODER:protobuf}"
# 应用程序缓存配置
cache:

View File

@@ -0,0 +1,157 @@
/**
* 开源代码,仅供学习和交流研究使用,商用请联系三丙
* 微信mohan_88888
* 抖音:程序员三丙
* 付费课程知识星球https://t.zsxq.com/aKtXo
*/
package sanbing.jcpp.app.service.impl;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import sanbing.jcpp.AbstractTestBase;
import sanbing.jcpp.app.dal.entity.Gun;
import sanbing.jcpp.app.service.GunService;
import static org.junit.jupiter.api.Assertions.*;
/**
* DefaultGunService 集成测试
* 专门测试 findByPileCodeAndGunNo 方法的数据库连接和查询功能
*
* @author 九筒
*/
class DefaultGunServiceIT extends AbstractTestBase {
@Autowired
private GunService gunService;
/**
* 测试根据充电桩编码和枪编号查询充电枪
* 这个测试专门验证之前出现的数据库连接中断问题是否已解决
*/
@Test
public void testFindByPileCodeAndGunNo_Success() {
log.info("开始测试 findByPileCodeAndGunNo 方法");
// 使用测试数据中存在的充电桩编码和枪编号
String pileCode = "20231212000028";
String gunNo = "2";
try {
// 执行查询
Gun result = gunService.findByPileCodeAndGunNo(pileCode, gunNo);
// 验证结果
if (result != null) {
log.info("查询成功 - 充电枪信息: ID={}, 名称={}, 编码={}, 枪号={}",
result.getId(), result.getGunName(), result.getGunCode(), result.getGunNo());
// 验证查询结果的正确性
assertEquals(gunNo, result.getGunNo(), "枪编号应该匹配");
assertNotNull(result.getGunCode(), "充电枪编码不应为空");
assertNotNull(result.getGunName(), "充电枪名称不应为空");
log.info("✅ 测试通过:成功查询到充电枪数据");
} else {
log.warn("⚠️ 查询结果为空,可能是测试数据不存在");
// 不抛出异常,因为数据为空不代表连接有问题
}
} catch (Exception e) {
log.error("❌ 测试失败:查询过程中出现异常", e);
fail("查询充电枪时出现异常: " + e.getMessage());
}
}
/**
* 测试查询不存在的充电枪
* 验证异常处理是否正常
*/
@Test
public void testFindByPileCodeAndGunNo_NotFound() {
log.info("开始测试查询不存在的充电枪");
String pileCode = "NONEXISTENT";
String gunNo = "999";
try {
Gun result = gunService.findByPileCodeAndGunNo(pileCode, gunNo);
// 查询不存在的数据应该返回 null
assertNull(result, "查询不存在的充电枪应该返回 null");
log.info("✅ 测试通过:正确处理了不存在的数据查询");
} catch (Exception e) {
log.error("❌ 测试失败:查询不存在数据时出现异常", e);
fail("查询不存在数据时不应该抛出异常: " + e.getMessage());
}
}
/**
* 测试参数验证
* 验证空参数的处理
*/
@Test
public void testFindByPileCodeAndGunNo_InvalidParameters() {
log.info("开始测试参数验证");
// 测试空的 pileCode
assertThrows(IllegalArgumentException.class, () -> {
gunService.findByPileCodeAndGunNo(null, "1");
}, "空的 pileCode 应该抛出 IllegalArgumentException");
// 测试空的 gunNo
assertThrows(IllegalArgumentException.class, () -> {
gunService.findByPileCodeAndGunNo("20231212000028", null);
}, "空的 gunNo 应该抛出 IllegalArgumentException");
// 测试空字符串
assertThrows(IllegalArgumentException.class, () -> {
gunService.findByPileCodeAndGunNo("", "1");
}, "空字符串的 pileCode 应该抛出 IllegalArgumentException");
assertThrows(IllegalArgumentException.class, () -> {
gunService.findByPileCodeAndGunNo("20231212000028", "");
}, "空字符串的 gunNo 应该抛出 IllegalArgumentException");
log.info("✅ 测试通过:参数验证正常工作");
}
/**
* 压力测试 - 多次连续查询
* 验证连接池和缓存是否正常工作
*/
@Test
public void testFindByPileCodeAndGunNo_StressTest() {
log.info("开始压力测试 - 连续查询100次");
String pileCode = "20231212000028";
String gunNo = "2";
int successCount = 0;
int totalQueries = 100;
for (int i = 0; i < totalQueries; i++) {
try {
Gun result = gunService.findByPileCodeAndGunNo(pileCode, gunNo);
successCount++;
if (i % 20 == 0) {
log.info("已完成 {} 次查询", i + 1);
}
} catch (Exception e) {
log.error("第 {} 次查询失败", i + 1, e);
}
}
log.info("压力测试完成:{}/{} 次查询成功", successCount, totalQueries);
// 至少95%的查询应该成功
assertTrue(successCount >= totalQueries * 0.95,
String.format("成功率过低:%d/%d (%.2f%%)", successCount, totalQueries,
(double) successCount / totalQueries * 100));
log.info("✅ 压力测试通过:连接池和缓存工作正常");
}
}

View File

@@ -1,3 +1,5 @@
service.protocols.yunkuaichongV150.listener.tcp.bind-port=0
service.protocols.yunkuaichongV160.listener.tcp.bind-port=0
service.protocols.yunkuaichongV170.listener.tcp.bind-port=0
service.protocols.lvnengV340.listener.tcp.bind-port=0
service.protocol.rpc.port=0