package com.ruoyi.order.mapper;
|
|
import org.junit.jupiter.api.Test;
|
|
import java.io.BufferedReader;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.io.InputStreamReader;
|
import java.nio.charset.StandardCharsets;
|
import java.util.stream.Collectors;
|
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
|
class EnterpriseChargingAnalysisMapperTest {
|
|
@Test
|
void countsInvoicesWithoutRequiringTheHistoricalChargingOrderToStillExist() throws IOException {
|
InputStream input = getClass().getClassLoader()
|
.getResourceAsStream("mapper/order/TChargingOrderMapper.xml");
|
assertNotNull(input);
|
|
String mapper;
|
try (BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8))) {
|
mapper = reader.lines().collect(Collectors.joining("\n"));
|
}
|
|
String invoiceRows = block(mapper, "enterpriseInvoiceRows");
|
String detailRows = block(mapper, "enterpriseInvoiceDetailRows");
|
String orderRows = block(mapper, "enterpriseAnalysisChargingOrders");
|
|
// 企业发票单表查(逆反查,不再跨分片 JOIN):抬头级别过滤可下推到各分片
|
assertTrue(invoiceRows.contains("invoicing_object_type = 2"));
|
assertTrue(invoiceRows.contains("status IN (2, 3)"));
|
assertFalse(invoiceRows.contains("LEFT JOIN"));
|
assertFalse(invoiceRows.contains("INNER JOIN"));
|
// 不按订单维度过滤:历史充电订单被删除的发票仍会计数(订单缺失的兜底逻辑在 Service 层)
|
assertFalse(invoiceRows.contains("co.del_flag"));
|
assertFalse(invoiceRows.contains("recharge_payment_status"));
|
|
// 明细只取充电订单(order_type=1),按 order_invoice_id 分片键 IN 路由
|
assertTrue(detailRows.contains("order_type = 1"));
|
assertTrue(detailRows.contains("order_invoice_id IN"));
|
|
// 订单数据按 id IN 走主键、单表不 JOIN(t_charging_order 50 片按 app_user_id 分片,不可与发票跨片 JOIN)
|
assertTrue(orderRows.contains("FROM t_charging_order"));
|
assertTrue(orderRows.contains("WHERE id IN"));
|
assertFalse(orderRows.contains("JOIN"));
|
}
|
|
private static String block(String mapper, String id) {
|
int start = mapper.indexOf("<select id=\"" + id + "\"");
|
int end = mapper.indexOf("</select>", start);
|
if (start < 0 || end < 0) {
|
throw new AssertionError("missing select block: " + id);
|
}
|
return mapper.substring(start, end);
|
}
|
}
|