完成专项核查拓展查询服务组装

This commit is contained in:
wkc
2026-03-24 23:01:21 +08:00
parent 0dbf5c5ca4
commit 8a6b844509
3 changed files with 377 additions and 9 deletions

View File

@@ -1,5 +1,6 @@
package com.ruoyi.ccdi.project.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.ccdi.project.domain.CcdiProject;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedPurchaseDetailQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedPurchaseQueryDTO;
@@ -10,10 +11,13 @@ import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedTransferQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectFamilyAssetLiabilityDetailQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectFamilyAssetLiabilityListQueryDTO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseDetailVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseListItemVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseListVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedRecruitmentDetailVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedRecruitmentListItemVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedRecruitmentListVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedTransferDetailVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedTransferListItemVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedTransferListVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetDetailVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityDetailVO;
@@ -72,9 +76,17 @@ public class CcdiProjectSpecialCheckServiceImpl implements ICcdiProjectSpecialCh
@Override
public CcdiProjectExtendedPurchaseListVO getExtendedPurchaseList(CcdiProjectExtendedPurchaseQueryDTO queryDTO) {
ensureProjectExists(queryDTO.getProjectId());
Page<CcdiProjectExtendedPurchaseListItemVO> page = new Page<>(
defaultPageNum(queryDTO.getPageNum()),
defaultPageSize(queryDTO.getPageSize())
);
Page<CcdiProjectExtendedPurchaseListItemVO> resultPage = specialCheckMapper.selectExtendedPurchasePage(page, queryDTO);
CcdiProjectExtendedPurchaseListVO result = new CcdiProjectExtendedPurchaseListVO();
result.setRows(List.of());
result.setTotal(0L);
result.setRows(resultPage == null ? List.of() : defaultList(resultPage.getRecords()));
result.setTotal(resultPage == null ? 0L : resultPage.getTotal());
return result;
}
@@ -82,16 +94,36 @@ public class CcdiProjectSpecialCheckServiceImpl implements ICcdiProjectSpecialCh
public CcdiProjectExtendedPurchaseDetailVO getExtendedPurchaseDetail(
CcdiProjectExtendedPurchaseDetailQueryDTO queryDTO
) {
return new CcdiProjectExtendedPurchaseDetailVO();
ensureProjectExists(queryDTO.getProjectId());
CcdiProjectExtendedPurchaseDetailVO detail = specialCheckMapper.selectExtendedPurchaseDetail(
queryDTO.getProjectId(),
queryDTO.getPurchaseId()
);
if (detail == null) {
throw new ServiceException("当前记录不属于该项目专项核查范围");
}
return detail;
}
@Override
public CcdiProjectExtendedRecruitmentListVO getExtendedRecruitmentList(
CcdiProjectExtendedRecruitmentQueryDTO queryDTO
) {
ensureProjectExists(queryDTO.getProjectId());
Page<CcdiProjectExtendedRecruitmentListItemVO> page = new Page<>(
defaultPageNum(queryDTO.getPageNum()),
defaultPageSize(queryDTO.getPageSize())
);
Page<CcdiProjectExtendedRecruitmentListItemVO> resultPage = specialCheckMapper.selectExtendedRecruitmentPage(
page,
queryDTO
);
CcdiProjectExtendedRecruitmentListVO result = new CcdiProjectExtendedRecruitmentListVO();
result.setRows(List.of());
result.setTotal(0L);
result.setRows(resultPage == null ? List.of() : defaultList(resultPage.getRecords()));
result.setTotal(resultPage == null ? 0L : resultPage.getTotal());
return result;
}
@@ -99,14 +131,31 @@ public class CcdiProjectSpecialCheckServiceImpl implements ICcdiProjectSpecialCh
public CcdiProjectExtendedRecruitmentDetailVO getExtendedRecruitmentDetail(
CcdiProjectExtendedRecruitmentDetailQueryDTO queryDTO
) {
return new CcdiProjectExtendedRecruitmentDetailVO();
ensureProjectExists(queryDTO.getProjectId());
CcdiProjectExtendedRecruitmentDetailVO detail = specialCheckMapper.selectExtendedRecruitmentDetail(
queryDTO.getProjectId(),
queryDTO.getRecruitId()
);
if (detail == null) {
throw new ServiceException("当前记录不属于该项目专项核查范围");
}
return detail;
}
@Override
public CcdiProjectExtendedTransferListVO getExtendedTransferList(CcdiProjectExtendedTransferQueryDTO queryDTO) {
ensureProjectExists(queryDTO.getProjectId());
Page<CcdiProjectExtendedTransferListItemVO> page = new Page<>(
defaultPageNum(queryDTO.getPageNum()),
defaultPageSize(queryDTO.getPageSize())
);
Page<CcdiProjectExtendedTransferListItemVO> resultPage = specialCheckMapper.selectExtendedTransferPage(page, queryDTO);
CcdiProjectExtendedTransferListVO result = new CcdiProjectExtendedTransferListVO();
result.setRows(List.of());
result.setTotal(0L);
result.setRows(resultPage == null ? List.of() : defaultList(resultPage.getRecords()));
result.setTotal(resultPage == null ? 0L : resultPage.getTotal());
return result;
}
@@ -114,7 +163,16 @@ public class CcdiProjectSpecialCheckServiceImpl implements ICcdiProjectSpecialCh
public CcdiProjectExtendedTransferDetailVO getExtendedTransferDetail(
CcdiProjectExtendedTransferDetailQueryDTO queryDTO
) {
return new CcdiProjectExtendedTransferDetailVO();
ensureProjectExists(queryDTO.getProjectId());
CcdiProjectExtendedTransferDetailVO detail = specialCheckMapper.selectExtendedTransferDetail(
queryDTO.getProjectId(),
queryDTO.getId()
);
if (detail == null) {
throw new ServiceException("当前记录不属于该项目专项核查范围");
}
return detail;
}
private void ensureProjectExists(Long projectId) {
@@ -171,4 +229,12 @@ public class CcdiProjectSpecialCheckServiceImpl implements ICcdiProjectSpecialCh
private <T> List<T> defaultList(List<T> list) {
return list == null ? List.of() : list;
}
private long defaultPageNum(Integer pageNum) {
return pageNum == null || pageNum < 1 ? 1L : pageNum.longValue();
}
private long defaultPageSize(Integer pageSize) {
return pageSize == null || pageSize < 1 ? 10L : pageSize.longValue();
}
}

View File

@@ -1,7 +1,19 @@
package com.ruoyi.ccdi.project.controller;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedPurchaseDetailQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedPurchaseQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedRecruitmentDetailQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedRecruitmentQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedTransferDetailQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedTransferQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectFamilyAssetLiabilityDetailQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectFamilyAssetLiabilityListQueryDTO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseDetailVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseListVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedRecruitmentDetailVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedRecruitmentListVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedTransferDetailVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedTransferListVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityDetailVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityListVO;
import com.ruoyi.ccdi.project.service.ICcdiProjectSpecialCheckService;
@@ -87,4 +99,76 @@ class CcdiProjectSpecialCheckControllerTest {
assertEquals("@ss.hasPermi('ccdi:project:query')", preAuthorize.value());
assertNotNull(operation);
}
@Test
void shouldReturnAjaxResultSuccessForExtendedPurchaseEndpoints() {
CcdiProjectExtendedPurchaseQueryDTO listQuery = new CcdiProjectExtendedPurchaseQueryDTO();
listQuery.setProjectId(40L);
CcdiProjectExtendedPurchaseListVO listVO = new CcdiProjectExtendedPurchaseListVO();
when(specialCheckService.getExtendedPurchaseList(listQuery)).thenReturn(listVO);
AjaxResult listResult = controller.getExtendedPurchaseList(listQuery);
assertEquals(200, listResult.get("code"));
assertEquals(listVO, listResult.get("data"));
CcdiProjectExtendedPurchaseDetailQueryDTO detailQuery = new CcdiProjectExtendedPurchaseDetailQueryDTO();
detailQuery.setProjectId(40L);
detailQuery.setPurchaseId("CG-001");
CcdiProjectExtendedPurchaseDetailVO detailVO = new CcdiProjectExtendedPurchaseDetailVO();
when(specialCheckService.getExtendedPurchaseDetail(detailQuery)).thenReturn(detailVO);
AjaxResult detailResult = controller.getExtendedPurchaseDetail(detailQuery);
assertEquals(200, detailResult.get("code"));
assertEquals(detailVO, detailResult.get("data"));
}
@Test
void shouldReturnAjaxResultSuccessForExtendedRecruitmentEndpoints() {
CcdiProjectExtendedRecruitmentQueryDTO listQuery = new CcdiProjectExtendedRecruitmentQueryDTO();
listQuery.setProjectId(40L);
CcdiProjectExtendedRecruitmentListVO listVO = new CcdiProjectExtendedRecruitmentListVO();
when(specialCheckService.getExtendedRecruitmentList(listQuery)).thenReturn(listVO);
AjaxResult listResult = controller.getExtendedRecruitmentList(listQuery);
assertEquals(200, listResult.get("code"));
assertEquals(listVO, listResult.get("data"));
CcdiProjectExtendedRecruitmentDetailQueryDTO detailQuery = new CcdiProjectExtendedRecruitmentDetailQueryDTO();
detailQuery.setProjectId(40L);
detailQuery.setRecruitId("ZP-001");
CcdiProjectExtendedRecruitmentDetailVO detailVO = new CcdiProjectExtendedRecruitmentDetailVO();
when(specialCheckService.getExtendedRecruitmentDetail(detailQuery)).thenReturn(detailVO);
AjaxResult detailResult = controller.getExtendedRecruitmentDetail(detailQuery);
assertEquals(200, detailResult.get("code"));
assertEquals(detailVO, detailResult.get("data"));
}
@Test
void shouldReturnAjaxResultSuccessForExtendedTransferEndpoints() {
CcdiProjectExtendedTransferQueryDTO listQuery = new CcdiProjectExtendedTransferQueryDTO();
listQuery.setProjectId(40L);
CcdiProjectExtendedTransferListVO listVO = new CcdiProjectExtendedTransferListVO();
when(specialCheckService.getExtendedTransferList(listQuery)).thenReturn(listVO);
AjaxResult listResult = controller.getExtendedTransferList(listQuery);
assertEquals(200, listResult.get("code"));
assertEquals(listVO, listResult.get("data"));
CcdiProjectExtendedTransferDetailQueryDTO detailQuery = new CcdiProjectExtendedTransferDetailQueryDTO();
detailQuery.setProjectId(40L);
detailQuery.setId(1L);
CcdiProjectExtendedTransferDetailVO detailVO = new CcdiProjectExtendedTransferDetailVO();
when(specialCheckService.getExtendedTransferDetail(detailQuery)).thenReturn(detailVO);
AjaxResult detailResult = controller.getExtendedTransferDetail(detailQuery);
assertEquals(200, detailResult.get("code"));
assertEquals(detailVO, detailResult.get("data"));
}
}

View File

@@ -0,0 +1,218 @@
package com.ruoyi.ccdi.project.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.ccdi.project.domain.CcdiProject;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedPurchaseDetailQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedPurchaseQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedRecruitmentDetailQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedRecruitmentQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedTransferDetailQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedTransferQueryDTO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseListItemVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseListVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedRecruitmentListItemVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedRecruitmentListVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedTransferListItemVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedTransferListVO;
import com.ruoyi.ccdi.project.mapper.CcdiProjectMapper;
import com.ruoyi.ccdi.project.mapper.CcdiProjectSpecialCheckMapper;
import com.ruoyi.common.exception.ServiceException;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class CcdiProjectSpecialCheckExtendedQueryServiceImplTest {
@InjectMocks
private CcdiProjectSpecialCheckServiceImpl service;
@Mock
private CcdiProjectSpecialCheckMapper specialCheckMapper;
@Mock
private CcdiProjectMapper projectMapper;
@Test
void shouldThrowProjectNotFoundForExtendedQueries() {
when(projectMapper.selectById(99L)).thenReturn(null);
ServiceException purchaseListException = assertThrows(
ServiceException.class,
() -> service.getExtendedPurchaseList(buildPurchaseQuery(99L, 1, 10))
);
ServiceException purchaseDetailException = assertThrows(
ServiceException.class,
() -> service.getExtendedPurchaseDetail(buildPurchaseDetailQuery(99L, "CG-001"))
);
ServiceException recruitmentListException = assertThrows(
ServiceException.class,
() -> service.getExtendedRecruitmentList(buildRecruitmentQuery(99L, "张三", 1, 10))
);
ServiceException transferDetailException = assertThrows(
ServiceException.class,
() -> service.getExtendedTransferDetail(buildTransferDetailQuery(99L, 1L))
);
assertEquals("项目不存在", purchaseListException.getMessage());
assertEquals("项目不存在", purchaseDetailException.getMessage());
assertEquals("项目不存在", recruitmentListException.getMessage());
assertEquals("项目不存在", transferDetailException.getMessage());
}
@Test
void shouldBuildPurchaseListRowsAndTotalFromPage() {
when(projectMapper.selectById(40L)).thenReturn(buildProject(40L));
Page<CcdiProjectExtendedPurchaseListItemVO> page = new Page<>(2, 5, 8);
CcdiProjectExtendedPurchaseListItemVO item = new CcdiProjectExtendedPurchaseListItemVO();
item.setPurchaseId("CG-001");
page.setRecords(List.of(item));
when(specialCheckMapper.selectExtendedPurchasePage(any(), any())).thenReturn(page);
CcdiProjectExtendedPurchaseListVO result = service.getExtendedPurchaseList(buildPurchaseQuery(40L, 2, 5));
assertNotNull(result.getRows());
assertEquals(1, result.getRows().size());
assertEquals(8L, result.getTotal());
ArgumentCaptor<Page<CcdiProjectExtendedPurchaseListItemVO>> pageCaptor = ArgumentCaptor.forClass(Page.class);
verify(specialCheckMapper).selectExtendedPurchasePage(pageCaptor.capture(), any());
assertEquals(2L, pageCaptor.getValue().getCurrent());
assertEquals(5L, pageCaptor.getValue().getSize());
}
@Test
void shouldReturnEmptyRecruitmentAndTransferRowsInsteadOfNull() {
when(projectMapper.selectById(40L)).thenReturn(buildProject(40L));
when(specialCheckMapper.selectExtendedRecruitmentPage(any(), any())).thenReturn(new Page<>(1, 10, 0));
when(specialCheckMapper.selectExtendedTransferPage(any(), any())).thenReturn(new Page<>(1, 10, 0));
CcdiProjectExtendedRecruitmentListVO recruitmentResult =
service.getExtendedRecruitmentList(buildRecruitmentQuery(40L, "李四", 1, 10));
CcdiProjectExtendedTransferListVO transferResult = service.getExtendedTransferList(buildTransferQuery(40L, 1, 10));
assertNotNull(recruitmentResult.getRows());
assertEquals(0, recruitmentResult.getRows().size());
assertEquals(0L, recruitmentResult.getTotal());
assertNotNull(transferResult.getRows());
assertEquals(0, transferResult.getRows().size());
assertEquals(0L, transferResult.getTotal());
}
@Test
void shouldPassInterviewerNameAndPaginationToRecruitmentMapper() {
when(projectMapper.selectById(40L)).thenReturn(buildProject(40L));
Page<CcdiProjectExtendedRecruitmentListItemVO> page = new Page<>(3, 4, 2);
page.setRecords(List.of(new CcdiProjectExtendedRecruitmentListItemVO()));
when(specialCheckMapper.selectExtendedRecruitmentPage(any(), any())).thenReturn(page);
CcdiProjectExtendedRecruitmentQueryDTO queryDTO = buildRecruitmentQuery(40L, "王五", 3, 4);
CcdiProjectExtendedRecruitmentListVO result = service.getExtendedRecruitmentList(queryDTO);
assertEquals(2L, result.getTotal());
ArgumentCaptor<Page<CcdiProjectExtendedRecruitmentListItemVO>> pageCaptor = ArgumentCaptor.forClass(Page.class);
ArgumentCaptor<CcdiProjectExtendedRecruitmentQueryDTO> queryCaptor = ArgumentCaptor.forClass(
CcdiProjectExtendedRecruitmentQueryDTO.class
);
verify(specialCheckMapper).selectExtendedRecruitmentPage(pageCaptor.capture(), queryCaptor.capture());
assertEquals(3L, pageCaptor.getValue().getCurrent());
assertEquals(4L, pageCaptor.getValue().getSize());
assertEquals("王五", queryCaptor.getValue().getInterviewerName());
}
@Test
void shouldThrowClearErrorWhenExtendedDetailDoesNotBelongToProjectScope() {
when(projectMapper.selectById(40L)).thenReturn(buildProject(40L));
when(specialCheckMapper.selectExtendedPurchaseDetail(40L, "CG-001")).thenReturn(null);
when(specialCheckMapper.selectExtendedRecruitmentDetail(40L, "ZP-001")).thenReturn(null);
when(specialCheckMapper.selectExtendedTransferDetail(40L, 1L)).thenReturn(null);
ServiceException purchaseException = assertThrows(
ServiceException.class,
() -> service.getExtendedPurchaseDetail(buildPurchaseDetailQuery(40L, "CG-001"))
);
ServiceException recruitmentException = assertThrows(
ServiceException.class,
() -> service.getExtendedRecruitmentDetail(buildRecruitmentDetailQuery(40L, "ZP-001"))
);
ServiceException transferException = assertThrows(
ServiceException.class,
() -> service.getExtendedTransferDetail(buildTransferDetailQuery(40L, 1L))
);
assertEquals("当前记录不属于该项目专项核查范围", purchaseException.getMessage());
assertEquals("当前记录不属于该项目专项核查范围", recruitmentException.getMessage());
assertEquals("当前记录不属于该项目专项核查范围", transferException.getMessage());
}
private CcdiProject buildProject(Long projectId) {
CcdiProject project = new CcdiProject();
project.setProjectId(projectId);
return project;
}
private CcdiProjectExtendedPurchaseQueryDTO buildPurchaseQuery(Long projectId, int pageNum, int pageSize) {
CcdiProjectExtendedPurchaseQueryDTO queryDTO = new CcdiProjectExtendedPurchaseQueryDTO();
queryDTO.setProjectId(projectId);
queryDTO.setPageNum(pageNum);
queryDTO.setPageSize(pageSize);
return queryDTO;
}
private CcdiProjectExtendedPurchaseDetailQueryDTO buildPurchaseDetailQuery(Long projectId, String purchaseId) {
CcdiProjectExtendedPurchaseDetailQueryDTO queryDTO = new CcdiProjectExtendedPurchaseDetailQueryDTO();
queryDTO.setProjectId(projectId);
queryDTO.setPurchaseId(purchaseId);
return queryDTO;
}
private CcdiProjectExtendedRecruitmentQueryDTO buildRecruitmentQuery(
Long projectId,
String interviewerName,
int pageNum,
int pageSize
) {
CcdiProjectExtendedRecruitmentQueryDTO queryDTO = new CcdiProjectExtendedRecruitmentQueryDTO();
queryDTO.setProjectId(projectId);
queryDTO.setInterviewerName(interviewerName);
queryDTO.setPageNum(pageNum);
queryDTO.setPageSize(pageSize);
return queryDTO;
}
private CcdiProjectExtendedRecruitmentDetailQueryDTO buildRecruitmentDetailQuery(Long projectId, String recruitId) {
CcdiProjectExtendedRecruitmentDetailQueryDTO queryDTO = new CcdiProjectExtendedRecruitmentDetailQueryDTO();
queryDTO.setProjectId(projectId);
queryDTO.setRecruitId(recruitId);
return queryDTO;
}
private CcdiProjectExtendedTransferQueryDTO buildTransferQuery(Long projectId, int pageNum, int pageSize) {
CcdiProjectExtendedTransferQueryDTO queryDTO = new CcdiProjectExtendedTransferQueryDTO();
queryDTO.setProjectId(projectId);
queryDTO.setPageNum(pageNum);
queryDTO.setPageSize(pageSize);
return queryDTO;
}
private CcdiProjectExtendedTransferDetailQueryDTO buildTransferDetailQuery(Long projectId, Long id) {
CcdiProjectExtendedTransferDetailQueryDTO queryDTO = new CcdiProjectExtendedTransferDetailQueryDTO();
queryDTO.setProjectId(projectId);
queryDTO.setId(id);
return queryDTO;
}
}