diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiBankStatementController.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiBankStatementController.java new file mode 100644 index 0000000..e8520b3 --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiBankStatementController.java @@ -0,0 +1,88 @@ +package com.ruoyi.ccdi.project.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.ccdi.project.domain.dto.CcdiBankStatementQueryDTO; +import com.ruoyi.ccdi.project.domain.excel.CcdiBankStatementExcel; +import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementDetailVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementFilterOptionsVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementListVO; +import com.ruoyi.ccdi.project.service.ICcdiBankStatementService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.PageDomain; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.page.TableSupport; +import com.ruoyi.common.utils.poi.ExcelUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 流水明细查询Controller + * + * @author ruoyi + */ +@RestController +@RequestMapping("/ccdi/project/bank-statement") +@Tag(name = "流水明细查询") +public class CcdiBankStatementController extends BaseController { + + @Resource + private ICcdiBankStatementService bankStatementService; + + /** + * 分页查询流水明细 + */ + @GetMapping("/list") + @Operation(summary = "分页查询流水明细") + @PreAuthorize("@ss.hasPermi('ccdi:project:query')") + public TableDataInfo list(CcdiBankStatementQueryDTO queryDTO) { + PageDomain pageDomain = TableSupport.buildPageRequest(); + Page page = new Page<>(pageDomain.getPageNum(), pageDomain.getPageSize()); + Page result = bankStatementService.selectStatementPage(page, queryDTO); + return getDataTable(result.getRecords(), result.getTotal()); + } + + /** + * 查询项目级筛选项 + */ + @GetMapping("/options") + @Operation(summary = "查询项目级筛选项") + @PreAuthorize("@ss.hasPermi('ccdi:project:query')") + public AjaxResult getOptions(Long projectId) { + CcdiBankStatementFilterOptionsVO options = bankStatementService.getFilterOptions(projectId); + return AjaxResult.success(options); + } + + /** + * 查询流水详情 + */ + @GetMapping("/detail/{bankStatementId}") + @Operation(summary = "查询流水详情") + @PreAuthorize("@ss.hasPermi('ccdi:project:query')") + public AjaxResult getDetail(@PathVariable Long bankStatementId) { + CcdiBankStatementDetailVO detail = bankStatementService.getStatementDetail(bankStatementId); + return AjaxResult.success(detail); + } + + /** + * 导出流水明细 + */ + @PostMapping("/export") + @Operation(summary = "导出流水明细") + @PreAuthorize("@ss.hasPermi('ccdi:project:export')") + public void export(HttpServletResponse response, CcdiBankStatementQueryDTO queryDTO) { + List list = bankStatementService.selectStatementListForExport(queryDTO); + ExcelUtil util = new ExcelUtil<>(CcdiBankStatementExcel.class); + util.exportExcel(response, list, "流水明细"); + } +} diff --git a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiBankStatementControllerTest.java b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiBankStatementControllerTest.java new file mode 100644 index 0000000..dc38fe1 --- /dev/null +++ b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiBankStatementControllerTest.java @@ -0,0 +1,106 @@ +package com.ruoyi.ccdi.project.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.ccdi.project.domain.dto.CcdiBankStatementQueryDTO; +import com.ruoyi.ccdi.project.domain.excel.CcdiBankStatementExcel; +import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementDetailVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementFilterOptionsVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementListVO; +import com.ruoyi.ccdi.project.service.ICcdiBankStatementService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import org.junit.jupiter.api.AfterEach; +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 org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.math.BigDecimal; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.same; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class CcdiBankStatementControllerTest { + + @InjectMocks + private CcdiBankStatementController controller; + + @Mock + private ICcdiBankStatementService bankStatementService; + + @AfterEach + void tearDown() { + RequestContextHolder.resetRequestAttributes(); + } + + @Test + void options_shouldReturnAjaxResultSuccess() { + when(bankStatementService.getFilterOptions(100L)).thenReturn(new CcdiBankStatementFilterOptionsVO()); + + AjaxResult result = controller.getOptions(100L); + + assertEquals(200, result.get("code")); + } + + @Test + void list_shouldReturnTableData() { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setParameter("pageNum", "1"); + request.setParameter("pageSize", "10"); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + + CcdiBankStatementQueryDTO queryDTO = new CcdiBankStatementQueryDTO(); + queryDTO.setProjectId(100L); + CcdiBankStatementListVO row = new CcdiBankStatementListVO(); + row.setBankStatementId(1L); + Page page = new Page<>(1, 10); + page.setRecords(List.of(row)); + page.setTotal(1); + when(bankStatementService.selectStatementPage(any(), same(queryDTO))).thenReturn(page); + + TableDataInfo result = controller.list(queryDTO); + + assertEquals(200, result.getCode()); + assertEquals(1L, result.getTotal()); + assertEquals(1, result.getRows().size()); + } + + @Test + void detail_shouldReturnAjaxResultSuccess() { + CcdiBankStatementDetailVO detailVO = new CcdiBankStatementDetailVO(); + detailVO.setBankStatementId(1000L); + when(bankStatementService.getStatementDetail(1000L)).thenReturn(detailVO); + + AjaxResult result = controller.getDetail(1000L); + + assertEquals(200, result.get("code")); + assertEquals(detailVO, result.get("data")); + } + + @Test + void export_shouldWriteExcelResponse() { + MockHttpServletResponse response = new MockHttpServletResponse(); + CcdiBankStatementQueryDTO queryDTO = new CcdiBankStatementQueryDTO(); + CcdiBankStatementExcel row = new CcdiBankStatementExcel(); + row.setLeAccountNo("6222"); + row.setDisplayAmount(new BigDecimal("10.00")); + when(bankStatementService.selectStatementListForExport(same(queryDTO))).thenReturn(List.of(row)); + + controller.export(response, queryDTO); + + verify(bankStatementService).selectStatementListForExport(same(queryDTO)); + assertTrue(response.getContentType().startsWith("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")); + assertTrue(response.getContentAsByteArray().length > 0); + } +}