feat(shop): 添加订单取消和退款时的水票撤销功能

- 在ShopOrderController中注入GltTicketRevokeService服务
- 实现订单状态改为已取消时同步撤销相关水票、释放计划和送水订单
- 实现退款成功后自动撤销水票相关数据的功能
- 新增GltTicketRevokeService服务处理水票撤销逻辑
- 添加批量订单取消时的水票撤销支持
- 实现撤销操作的幂等性确保无副作用
- 添加单元测试验证水票撤销功能的正确性
This commit is contained in:
2026-03-01 00:30:21 +08:00
parent 2044bdc87a
commit a8af20bcde
3 changed files with 263 additions and 1 deletions

View File

@@ -0,0 +1,65 @@
package com.gxwebsoft.glt.service;
import com.gxwebsoft.glt.entity.GltUserTicket;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.*;
@ExtendWith(MockitoExtension.class)
class GltTicketRevokeServiceTest {
@Mock
private GltUserTicketService gltUserTicketService;
@Mock
private GltUserTicketReleaseService gltUserTicketReleaseService;
@Mock
private GltTicketOrderService gltTicketOrderService;
@InjectMocks
private GltTicketRevokeService gltTicketRevokeService;
@Test
void revokeByShopOrder_noTenant_noop() {
int revoked = gltTicketRevokeService.revokeByShopOrder(null, 1, "O1", "r");
assertEquals(0, revoked);
verifyNoInteractions(gltUserTicketService, gltUserTicketReleaseService, gltTicketOrderService);
}
@Test
void revokeByShopOrder_noTickets_noop() {
when(gltUserTicketService.list(any())).thenReturn(List.of());
int revoked = gltTicketRevokeService.revokeByShopOrder(10584, 1, "O1", "r");
assertEquals(0, revoked);
verify(gltUserTicketService, times(1)).list(any());
verifyNoMoreInteractions(gltUserTicketService);
verifyNoInteractions(gltUserTicketReleaseService, gltTicketOrderService);
}
@Test
void revokeByShopOrder_hasTickets_revokesAll() {
GltUserTicket t = new GltUserTicket();
t.setId(123);
t.setTenantId(10584);
when(gltUserTicketService.list(any())).thenReturn(List.of(t));
when(gltUserTicketService.update(isNull(), any())).thenReturn(true);
when(gltTicketOrderService.update(isNull(), any())).thenReturn(true);
when(gltUserTicketReleaseService.update(isNull(), any())).thenReturn(true);
int revoked = gltTicketRevokeService.revokeByShopOrder(10584, 1, "O1", "退款撤销");
assertEquals(1, revoked);
verify(gltTicketOrderService, times(1)).update(isNull(), any());
verify(gltUserTicketReleaseService, times(1)).update(isNull(), any());
verify(gltUserTicketService, times(1)).update(isNull(), any());
}
}