⚡ 优化应收合计查询并补充导出汇总
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
package com.bms.receivable;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.mockito.ArgumentMatchers.isNull;
|
||||
import static org.mockito.ArgumentMatchers.same;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.math.BigDecimal;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.poi.ss.usermodel.Row;
|
||||
import org.apache.poi.ss.usermodel.Sheet;
|
||||
import org.apache.poi.ss.usermodel.Workbook;
|
||||
import org.apache.poi.ss.usermodel.WorkbookFactory;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.io.TempDir;
|
||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||
import org.springframework.test.util.ReflectionTestUtils;
|
||||
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.bms.common.config.BmsConfig;
|
||||
import com.bms.common.core.domain.AjaxResult;
|
||||
import com.bms.common.core.redis.RedisCache;
|
||||
import com.bms.price.domain.PrcOrderBill;
|
||||
import com.bms.receivable.domain.vo.ArBillGenerateQuery;
|
||||
import com.bms.receivable.security.ArBillScopeResolver;
|
||||
import com.bms.receivable.service.IArBillService;
|
||||
import com.bms.receivable.task.ArBillGeneratePreviewExportRunner;
|
||||
import com.bms.web.controller.receivable.ArBillController;
|
||||
|
||||
class ArBillGeneratePreviewTest {
|
||||
@TempDir
|
||||
Path tempDir;
|
||||
|
||||
@Test
|
||||
void previewDoesNotCalculateAmountUntilAmountEndpointIsCalled() {
|
||||
IArBillService service = mock(IArBillService.class);
|
||||
ArBillController controller = new ArBillController();
|
||||
ReflectionTestUtils.setField(controller, "billService", service);
|
||||
ArBillGenerateQuery query = new ArBillGenerateQuery();
|
||||
when(service.previewBill(query)).thenReturn(List.of(new PrcOrderBill()));
|
||||
when(service.sumPreviewBill(query)).thenReturn(new BigDecimal("12.34"));
|
||||
|
||||
try {
|
||||
AjaxResult preview = controller.preview(query);
|
||||
assertFalse(preview.containsKey("totalAmount"));
|
||||
verify(service, never()).sumPreviewBill(query);
|
||||
} finally {
|
||||
PageHelper.clearPage();
|
||||
}
|
||||
|
||||
assertEquals(new BigDecimal("12.34"), controller.previewAmount(query).get("data"));
|
||||
verify(service).sumPreviewBill(query);
|
||||
}
|
||||
|
||||
@Test
|
||||
void exportEndsWithTheSumOfTheExportedAmounts() throws Exception {
|
||||
String previousProfile = BmsConfig.getProfile();
|
||||
try {
|
||||
new BmsConfig().setProfile(tempDir.toString());
|
||||
IArBillService service = mock(IArBillService.class);
|
||||
ArBillGenerateQuery query = new ArBillGenerateQuery();
|
||||
when(service.previewBill(same(query), isNull())).thenReturn(List.of(
|
||||
bill("A", "0.10"), bill("B", "0.20"), bill("C", "-0.05"), bill("D", null)));
|
||||
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor() {
|
||||
@Override
|
||||
public void execute(Runnable task) {
|
||||
task.run();
|
||||
}
|
||||
};
|
||||
ArBillGeneratePreviewExportRunner runner = new ArBillGeneratePreviewExportRunner(
|
||||
service, mock(RedisCache.class), mock(ArBillScopeResolver.class), executor);
|
||||
for (String dateType : List.of("BIZ_DATE", "PICKUP_DATE")) {
|
||||
query.setDateType(dateType);
|
||||
String taskId = runner.submit(query, 1L);
|
||||
Path file = tempDir.resolve("download/arBillGeneratePreviewExport/" + taskId + ".xlsx");
|
||||
|
||||
try (InputStream in = Files.newInputStream(file); Workbook workbook = WorkbookFactory.create(in)) {
|
||||
Sheet sheet = workbook.getSheetAt(0);
|
||||
Row header = sheet.getRow(0);
|
||||
Row lastRow = sheet.getRow(sheet.getLastRowNum());
|
||||
assertEquals("合计", lastRow.getCell(column(header, "订单号")).getStringCellValue());
|
||||
assertEquals(0.25, lastRow.getCell(column(header, "应收金额")).getNumericCellValue(), 0.000001);
|
||||
assertEquals(5, sheet.getLastRowNum());
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
new BmsConfig().setProfile(previousProfile);
|
||||
}
|
||||
}
|
||||
|
||||
private static PrcOrderBill bill(String orderNo, String amount) {
|
||||
PrcOrderBill bill = new PrcOrderBill();
|
||||
bill.setOrderNo(orderNo);
|
||||
bill.setIncomeTotal(amount == null ? null : new BigDecimal(amount));
|
||||
return bill;
|
||||
}
|
||||
|
||||
private static int column(Row header, String name) {
|
||||
for (int i = 0; i < header.getLastCellNum(); i++) {
|
||||
if (name.equals(header.getCell(i).getStringCellValue())) return i;
|
||||
}
|
||||
throw new AssertionError("缺少导出列: " + name);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user