实现流水明细导出模型与详情查询

This commit is contained in:
wkc
2026-03-10 16:16:55 +08:00
parent 1c607c0b2d
commit 4384c7a4ff
4 changed files with 131 additions and 1 deletions

View File

@@ -0,0 +1,47 @@
package com.ruoyi.ccdi.project.domain.excel;
import com.ruoyi.common.annotation.Excel;
import lombok.Data;
import java.math.BigDecimal;
/**
* 流水明细导出对象
*
* @author ruoyi
*/
@Data
public class CcdiBankStatementExcel {
/** 交易时间 */
@Excel(name = "交易时间")
private String trxDate;
/** 本方账户 */
@Excel(name = "本方账户")
private String leAccountNo;
/** 本方主体 */
@Excel(name = "本方主体")
private String leAccountName;
/** 对方名称 */
@Excel(name = "对方名称")
private String customerAccountName;
/** 对方账户 */
@Excel(name = "对方账户")
private String customerAccountNo;
/** 摘要 */
@Excel(name = "摘要")
private String userMemo;
/** 交易类型 */
@Excel(name = "交易类型")
private String cashType;
/** 交易金额 */
@Excel(name = "交易金额")
private BigDecimal displayAmount;
}

View File

@@ -2,9 +2,13 @@ package com.ruoyi.ccdi.project.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.ccdi.project.domain.dto.CcdiBankStatementQueryDTO; 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.CcdiBankStatementFilterOptionsVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementListVO; import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementListVO;
import java.util.List;
/** /**
* 流水明细查询Service接口 * 流水明细查询Service接口
* *
@@ -29,4 +33,20 @@ public interface ICcdiBankStatementService {
*/ */
Page<CcdiBankStatementListVO> selectStatementPage(Page<CcdiBankStatementListVO> page, Page<CcdiBankStatementListVO> selectStatementPage(Page<CcdiBankStatementListVO> page,
CcdiBankStatementQueryDTO queryDTO); CcdiBankStatementQueryDTO queryDTO);
/**
* 查询导出列表
*
* @param queryDTO 查询条件
* @return 导出列表
*/
List<CcdiBankStatementExcel> selectStatementListForExport(CcdiBankStatementQueryDTO queryDTO);
/**
* 查询流水详情
*
* @param bankStatementId 流水ID
* @return 详情
*/
CcdiBankStatementDetailVO getStatementDetail(Long bankStatementId);
} }

View File

@@ -2,6 +2,8 @@ package com.ruoyi.ccdi.project.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.ccdi.project.domain.dto.CcdiBankStatementQueryDTO; 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.CcdiBankStatementFilterOptionsVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementListVO; import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementListVO;
import com.ruoyi.ccdi.project.mapper.CcdiBankStatementMapper; import com.ruoyi.ccdi.project.mapper.CcdiBankStatementMapper;
@@ -12,6 +14,7 @@ import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Set; import java.util.Set;
import java.util.Collections;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@@ -42,6 +45,22 @@ public class CcdiBankStatementServiceImpl implements ICcdiBankStatementService {
return bankStatementMapper.selectStatementPage(page, normalizedQuery); return bankStatementMapper.selectStatementPage(page, normalizedQuery);
} }
@Override
public List<CcdiBankStatementExcel> selectStatementListForExport(CcdiBankStatementQueryDTO queryDTO) {
CcdiBankStatementQueryDTO normalizedQuery = queryDTO == null ? new CcdiBankStatementQueryDTO() : queryDTO;
normalizeQuery(normalizedQuery);
List<CcdiBankStatementListVO> rows = bankStatementMapper.selectStatementListForExport(normalizedQuery);
if (rows == null || rows.isEmpty()) {
return Collections.emptyList();
}
return rows.stream().map(this::toExcel).collect(Collectors.toList());
}
@Override
public CcdiBankStatementDetailVO getStatementDetail(Long bankStatementId) {
return bankStatementMapper.selectStatementDetailById(bankStatementId);
}
private void normalizeQuery(CcdiBankStatementQueryDTO queryDTO) { private void normalizeQuery(CcdiBankStatementQueryDTO queryDTO) {
queryDTO.setTransactionStartTime(normalizeText(queryDTO.getTransactionStartTime())); queryDTO.setTransactionStartTime(normalizeText(queryDTO.getTransactionStartTime()));
queryDTO.setTransactionEndTime(normalizeText(queryDTO.getTransactionEndTime())); queryDTO.setTransactionEndTime(normalizeText(queryDTO.getTransactionEndTime()));
@@ -109,4 +128,17 @@ public class CcdiBankStatementServiceImpl implements ICcdiBankStatementService {
.collect(Collectors.toList()); .collect(Collectors.toList());
return normalized.isEmpty() ? null : normalized; return normalized.isEmpty() ? null : normalized;
} }
private CcdiBankStatementExcel toExcel(CcdiBankStatementListVO row) {
CcdiBankStatementExcel excel = new CcdiBankStatementExcel();
excel.setTrxDate(row.getTrxDate());
excel.setLeAccountNo(row.getLeAccountNo());
excel.setLeAccountName(row.getLeAccountName());
excel.setCustomerAccountName(row.getCustomerAccountName());
excel.setCustomerAccountNo(row.getCustomerAccountNo());
excel.setUserMemo(row.getUserMemo());
excel.setCashType(row.getCashType());
excel.setDisplayAmount(row.getDisplayAmount());
return excel;
}
} }

View File

@@ -2,6 +2,8 @@ package com.ruoyi.ccdi.project.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.ccdi.project.domain.dto.CcdiBankStatementQueryDTO; 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.CcdiBankStatementFilterOptionsVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementListVO; import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementListVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementOptionVO; import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementOptionVO;
@@ -12,14 +14,17 @@ import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoExtension;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.same; import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class) @ExtendWith(MockitoExtension.class)
@@ -90,4 +95,30 @@ class CcdiBankStatementServiceImplTest {
assertNull(queryDTO.getCounterpartyAccount()); assertNull(queryDTO.getCounterpartyAccount());
assertNull(queryDTO.getTransactionType()); assertNull(queryDTO.getTransactionType());
} }
@Test
void selectStatementListForExport_shouldMapDisplayColumns() {
CcdiBankStatementListVO row = new CcdiBankStatementListVO();
row.setTrxDate("2024-02-01 10:33:44");
row.setLeAccountNo("6222");
row.setLeAccountName("张三");
row.setDisplayAmount(new BigDecimal("-8.00"));
when(bankStatementMapper.selectStatementListForExport(any())).thenReturn(List.of(row));
List<CcdiBankStatementExcel> result = service.selectStatementListForExport(new CcdiBankStatementQueryDTO());
assertEquals(1, result.size());
assertEquals("6222", result.get(0).getLeAccountNo());
}
@Test
void getStatementDetail_shouldDelegateToMapper() {
CcdiBankStatementDetailVO detailVO = new CcdiBankStatementDetailVO();
detailVO.setBankStatementId(200L);
when(bankStatementMapper.selectStatementDetailById(200L)).thenReturn(detailVO);
CcdiBankStatementDetailVO result = service.getStatementDetail(200L);
assertSame(detailVO, result);
}
} }