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("