From 3080d55319ab40fe99064aa4689dbe0c38301e9d Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 31 七月 2026 18:49:55 +0800
Subject: [PATCH] 修改管理后台 1、修改退款后没有重新添加新的分账记录
---
ruoyi-service/ruoyi-chargingPile/src/test/java/com/ruoyi/chargingPile/service/impl/SiteServiceImplTest.java | 146 +++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 141 insertions(+), 5 deletions(-)
diff --git a/ruoyi-service/ruoyi-chargingPile/src/test/java/com/ruoyi/chargingPile/service/impl/SiteServiceImplTest.java b/ruoyi-service/ruoyi-chargingPile/src/test/java/com/ruoyi/chargingPile/service/impl/SiteServiceImplTest.java
index 4c4ef7f..d333b88 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/test/java/com/ruoyi/chargingPile/service/impl/SiteServiceImplTest.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/test/java/com/ruoyi/chargingPile/service/impl/SiteServiceImplTest.java
@@ -1,33 +1,76 @@
package com.ruoyi.chargingPile.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.chargingPile.api.dto.GetSiteListDTO;
+import com.ruoyi.chargingPile.api.model.Site;
+import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
+import com.ruoyi.chargingPile.api.model.TChargingGun;
+import com.ruoyi.chargingPile.api.model.TChargingPile;
import com.ruoyi.chargingPile.mapper.SiteMapper;
import com.ruoyi.chargingPile.service.IPartnerService;
+import com.ruoyi.chargingPile.service.ITAccountingStrategyDetailService;
+import com.ruoyi.chargingPile.service.ITChargingGunService;
+import com.ruoyi.chargingPile.service.ITChargingPileService;
import com.ruoyi.common.core.domain.R;
+import com.ruoyi.integration.api.feignClient.ChengDuJianGuanClient;
+import com.ruoyi.integration.api.feignClient.IntegrationClient;
+import com.ruoyi.integration.api.feignClient.TcecClient;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.test.util.ReflectionTestUtils;
+import java.util.ArrayList;
import java.util.Collections;
+import java.util.List;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
class SiteServiceImplTest {
+ private SiteServiceImpl service;
+ private SiteMapper siteMapper;
+ private ITChargingGunService chargingGunService;
+ private ITAccountingStrategyDetailService accountingStrategyDetailService;
+ private ITChargingPileService chargingPileService;
+ private IntegrationClient integrationClient;
+ private ChengDuJianGuanClient chengDuJianGuanClient;
+ private TcecClient tcecClient;
+
+ @BeforeEach
+ void setUp() {
+ service = new SiteServiceImpl();
+ siteMapper = mock(SiteMapper.class);
+ chargingGunService = mock(ITChargingGunService.class);
+ accountingStrategyDetailService = mock(ITAccountingStrategyDetailService.class);
+ chargingPileService = mock(ITChargingPileService.class);
+ integrationClient = mock(IntegrationClient.class);
+ chengDuJianGuanClient = mock(ChengDuJianGuanClient.class);
+ tcecClient = mock(TcecClient.class);
+
+ ReflectionTestUtils.setField(service, "baseMapper", siteMapper);
+ ReflectionTestUtils.setField(service, "chargingGunService", chargingGunService);
+ ReflectionTestUtils.setField(service, "accountingStrategyDetailService", accountingStrategyDetailService);
+ ReflectionTestUtils.setField(service, "chargingPileService", chargingPileService);
+ ReflectionTestUtils.setField(service, "integrationClient", integrationClient);
+ ReflectionTestUtils.setField(service, "chengDuJianGuanClient", chengDuJianGuanClient);
+ ReflectionTestUtils.setField(service, "tcecClient", tcecClient);
+ }
+
@Test
void partnerSiteListIncludesAllSitesRelatedToCurrentPartner() {
- SiteServiceImpl service = new SiteServiceImpl();
- SiteMapper mapper = mock(SiteMapper.class);
IPartnerService partnerService = mock(IPartnerService.class);
SysUserClient sysUserClient = mock(SysUserClient.class);
- ReflectionTestUtils.setField(service, "baseMapper", mapper);
ReflectionTestUtils.setField(service, "partnerService", partnerService);
ReflectionTestUtils.setField(service, "sysUserClient", sysUserClient);
@@ -37,13 +80,106 @@
sysUser.setObjectId(715);
when(sysUserClient.getSysUser(100L)).thenReturn(R.ok(sysUser));
- when(mapper.getSiteOptions(isNull(), eq(715)))
+ when(siteMapper.getSiteOptions(isNull(), eq(715)))
.thenReturn(Collections.<GetSiteListDTO>emptyList());
service.getSiteList1(100L);
- verify(mapper).getSiteOptions(isNull(), eq(715));
+ verify(siteMapper).getSiteOptions(isNull(), eq(715));
verify(partnerService, never()).authSite(any(), any());
verify(sysUserClient, never()).isAdmin(any());
}
+
+ /**
+ * 验证 setAccountingStrategy 使用 lambdaUpdate 只更新 accountingStrategyId 字段,
+ * 并且远程调用在异步线程中执行,避免事务长时间占用数据库连接
+ */
+ @Test
+ void setAccountingStrategyUpdatesOnlyTargetFieldAndAsyncRemoteCalls() throws Exception {
+ Integer siteId = 1;
+ Integer accountingStrategyId = 100;
+
+ // mock 充电枪列表
+ List<TChargingGun> guns = new ArrayList<>();
+ TChargingGun gun = new TChargingGun();
+ gun.setId(10);
+ gun.setSiteId(siteId);
+ guns.add(gun);
+
+ // mock 充电桩列表
+ List<TChargingPile> piles = new ArrayList<>();
+ TChargingPile pile = new TChargingPile();
+ pile.setCode("PILE001");
+ pile.setId(200);
+ pile.setSiteId(siteId);
+ piles.add(pile);
+
+ // mock 计费策略明细
+ List<TAccountingStrategyDetail> details = new ArrayList<>();
+
+ // mock Site 查询(用于 isOpenSynchronization)
+ Site mockSite = new Site();
+ mockSite.setId(siteId);
+ mockSite.setIsOpenSynchronization(1);
+
+ when(siteMapper.selectList(any(LambdaQueryWrapper.class))).thenReturn(Collections.singletonList(mockSite));
+ when(chargingGunService.list(any(LambdaQueryWrapper.class))).thenReturn(guns);
+ when(accountingStrategyDetailService.list(any(LambdaQueryWrapper.class))).thenReturn(details);
+
+ assertDoesNotThrow(() -> service.setAccountingStrategy(siteId, accountingStrategyId));
+
+ // 验证数据库操作:站点和充电枪都通过 lambdaUpdate 更新
+ verify(siteMapper, atLeastOnce()).update(any(), any());
+ verify(siteMapper).selectList(any(LambdaQueryWrapper.class));
+
+ // 异步线程执行需要等待一小段时间
+ Thread.sleep(500);
+
+ // 验证远程调用在异步线程中执行
+ verify(integrationClient, timeout(1000)).setupBillingModel1(eq("PILE001"), any());
+ verify(chengDuJianGuanClient, timeout(1000)).notificationStationFee(eq(200));
+ verify(tcecClient, timeout(1000)).notificationStationChange(any());
+ }
+
+ /**
+ * 验证 setAccountingStrategy 在站点无需同步时不会调用三方平台推送
+ */
+ @Test
+ void setAccountingStrategySkipsSyncWhenNotOpen() throws Exception {
+ Integer siteId = 2;
+ Integer accountingStrategyId = 200;
+
+ // mock 充电枪列表
+ TChargingGun gun = new TChargingGun();
+ gun.setId(20);
+ gun.setSiteId(siteId);
+ List<TChargingGun> guns = Collections.singletonList(gun);
+
+ // mock 充电桩列表
+ TChargingPile pile = new TChargingPile();
+ pile.setCode("PILE002");
+ pile.setId(201);
+ pile.setSiteId(siteId);
+ List<TChargingPile> piles = Collections.singletonList(pile);
+
+ List<TAccountingStrategyDetail> details = new ArrayList<>();
+
+ // isOpenSynchronization = 0,不需要同步
+ Site mockSite = new Site();
+ mockSite.setId(siteId);
+ mockSite.setIsOpenSynchronization(0);
+
+ when(siteMapper.selectList(any(LambdaQueryWrapper.class))).thenReturn(Collections.singletonList(mockSite));
+ when(chargingGunService.list(any(LambdaQueryWrapper.class))).thenReturn(guns);
+ when(accountingStrategyDetailService.list(any(LambdaQueryWrapper.class))).thenReturn(details);
+
+ assertDoesNotThrow(() -> service.setAccountingStrategy(siteId, accountingStrategyId));
+
+ Thread.sleep(500);
+
+ verify(integrationClient, timeout(1000)).setupBillingModel1(eq("PILE002"), any());
+ verify(chengDuJianGuanClient, timeout(1000)).notificationStationFee(eq(201));
+ // tcecClient.notificationStationChange 不应被调用
+ verify(tcecClient, never()).notificationStationChange(any());
+ }
}
--
Gitblit v1.7.1