定义专项核查拓展查询接口契约

This commit is contained in:
wkc
2026-03-24 22:54:36 +08:00
parent dd93798cb9
commit 1d013dc6df
19 changed files with 838 additions and 0 deletions

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;
@@ -48,4 +60,70 @@ public class CcdiProjectSpecialCheckController extends BaseController {
CcdiProjectFamilyAssetLiabilityDetailVO result = specialCheckService.getFamilyAssetLiabilityDetail(queryDTO);
return AjaxResult.success(result);
}
/**
* 查询采购拓展列表
*/
@GetMapping("/extended-query/purchase/list")
@Operation(summary = "查询采购拓展列表")
@PreAuthorize("@ss.hasPermi('ccdi:project:query')")
public AjaxResult getExtendedPurchaseList(@Validated CcdiProjectExtendedPurchaseQueryDTO queryDTO) {
CcdiProjectExtendedPurchaseListVO result = specialCheckService.getExtendedPurchaseList(queryDTO);
return AjaxResult.success(result);
}
/**
* 查询采购拓展详情
*/
@GetMapping("/extended-query/purchase/detail")
@Operation(summary = "查询采购拓展详情")
@PreAuthorize("@ss.hasPermi('ccdi:project:query')")
public AjaxResult getExtendedPurchaseDetail(@Validated CcdiProjectExtendedPurchaseDetailQueryDTO queryDTO) {
CcdiProjectExtendedPurchaseDetailVO result = specialCheckService.getExtendedPurchaseDetail(queryDTO);
return AjaxResult.success(result);
}
/**
* 查询招聘拓展列表
*/
@GetMapping("/extended-query/recruitment/list")
@Operation(summary = "查询招聘拓展列表")
@PreAuthorize("@ss.hasPermi('ccdi:project:query')")
public AjaxResult getExtendedRecruitmentList(@Validated CcdiProjectExtendedRecruitmentQueryDTO queryDTO) {
CcdiProjectExtendedRecruitmentListVO result = specialCheckService.getExtendedRecruitmentList(queryDTO);
return AjaxResult.success(result);
}
/**
* 查询招聘拓展详情
*/
@GetMapping("/extended-query/recruitment/detail")
@Operation(summary = "查询招聘拓展详情")
@PreAuthorize("@ss.hasPermi('ccdi:project:query')")
public AjaxResult getExtendedRecruitmentDetail(@Validated CcdiProjectExtendedRecruitmentDetailQueryDTO queryDTO) {
CcdiProjectExtendedRecruitmentDetailVO result = specialCheckService.getExtendedRecruitmentDetail(queryDTO);
return AjaxResult.success(result);
}
/**
* 查询调动拓展列表
*/
@GetMapping("/extended-query/transfer/list")
@Operation(summary = "查询调动拓展列表")
@PreAuthorize("@ss.hasPermi('ccdi:project:query')")
public AjaxResult getExtendedTransferList(@Validated CcdiProjectExtendedTransferQueryDTO queryDTO) {
CcdiProjectExtendedTransferListVO result = specialCheckService.getExtendedTransferList(queryDTO);
return AjaxResult.success(result);
}
/**
* 查询调动拓展详情
*/
@GetMapping("/extended-query/transfer/detail")
@Operation(summary = "查询调动拓展详情")
@PreAuthorize("@ss.hasPermi('ccdi:project:query')")
public AjaxResult getExtendedTransferDetail(@Validated CcdiProjectExtendedTransferDetailQueryDTO queryDTO) {
CcdiProjectExtendedTransferDetailVO result = specialCheckService.getExtendedTransferDetail(queryDTO);
return AjaxResult.success(result);
}
}

View File

@@ -0,0 +1,20 @@
package com.ruoyi.ccdi.project.domain.dto;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* 专项核查采购拓展查询详情入参
*/
@Data
public class CcdiProjectExtendedPurchaseDetailQueryDTO {
/** 项目ID */
@NotNull(message = "项目ID不能为空")
private Long projectId;
/** 采购事项ID */
@NotBlank(message = "采购事项ID不能为空")
private String purchaseId;
}

View File

@@ -0,0 +1,30 @@
package com.ruoyi.ccdi.project.domain.dto;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* 专项核查采购拓展查询列表入参
*/
@Data
public class CcdiProjectExtendedPurchaseQueryDTO {
/** 项目ID */
@NotNull(message = "项目ID不能为空")
private Long projectId;
/** 申请人姓名 */
private String applicantName;
/** 申请日期开始 */
private String applyDateStart;
/** 申请日期结束 */
private String applyDateEnd;
/** 页码 */
private Integer pageNum = 1;
/** 每页条数 */
private Integer pageSize = 10;
}

View File

@@ -0,0 +1,20 @@
package com.ruoyi.ccdi.project.domain.dto;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* 专项核查招聘拓展查询详情入参
*/
@Data
public class CcdiProjectExtendedRecruitmentDetailQueryDTO {
/** 项目ID */
@NotNull(message = "项目ID不能为空")
private Long projectId;
/** 招聘项目编号 */
@NotBlank(message = "招聘项目编号不能为空")
private String recruitId;
}

View File

@@ -0,0 +1,24 @@
package com.ruoyi.ccdi.project.domain.dto;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* 专项核查招聘拓展查询列表入参
*/
@Data
public class CcdiProjectExtendedRecruitmentQueryDTO {
/** 项目ID */
@NotNull(message = "项目ID不能为空")
private Long projectId;
/** 面试官姓名 */
private String interviewerName;
/** 页码 */
private Integer pageNum = 1;
/** 每页条数 */
private Integer pageSize = 10;
}

View File

@@ -0,0 +1,19 @@
package com.ruoyi.ccdi.project.domain.dto;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* 专项核查调动拓展查询详情入参
*/
@Data
public class CcdiProjectExtendedTransferDetailQueryDTO {
/** 项目ID */
@NotNull(message = "项目ID不能为空")
private Long projectId;
/** 主键ID */
@NotNull(message = "主键ID不能为空")
private Long id;
}

View File

@@ -0,0 +1,30 @@
package com.ruoyi.ccdi.project.domain.dto;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* 专项核查调动拓展查询列表入参
*/
@Data
public class CcdiProjectExtendedTransferQueryDTO {
/** 项目ID */
@NotNull(message = "项目ID不能为空")
private Long projectId;
/** 员工姓名 */
private String staffName;
/** 调动日期开始 */
private String transferDateStart;
/** 调动日期结束 */
private String transferDateEnd;
/** 页码 */
private Integer pageNum = 1;
/** 每页条数 */
private Integer pageSize = 10;
}

View File

@@ -0,0 +1,83 @@
package com.ruoyi.ccdi.project.domain.vo;
import java.math.BigDecimal;
import lombok.Data;
/**
* 专项核查采购拓展查询详情
*/
@Data
public class CcdiProjectExtendedPurchaseDetailVO {
private String purchaseId;
private String purchaseCategory;
private String projectName;
private String subjectName;
private String subjectDesc;
private BigDecimal purchaseQty;
private BigDecimal budgetAmount;
private BigDecimal bidAmount;
private BigDecimal actualAmount;
private BigDecimal contractAmount;
private BigDecimal settlementAmount;
private String purchaseMethod;
private String supplierName;
private String contactPerson;
private String contactPhone;
private String supplierUscc;
private String supplierBankAccount;
private String applyDate;
private String planApproveDate;
private String announceDate;
private String bidOpenDate;
private String contractSignDate;
private String expectedDeliveryDate;
private String actualDeliveryDate;
private String acceptanceDate;
private String settlementDate;
private String applicantId;
private String applicantName;
private String applyDepartment;
private String purchaseLeaderId;
private String purchaseLeaderName;
private String purchaseDepartment;
private String createdBy;
private String createTime;
private String updatedBy;
private String updateTime;
}

View File

@@ -0,0 +1,25 @@
package com.ruoyi.ccdi.project.domain.vo;
import lombok.Data;
/**
* 专项核查采购拓展查询列表项
*/
@Data
public class CcdiProjectExtendedPurchaseListItemVO {
/** 采购事项ID */
private String purchaseId;
/** 项目名称 */
private String projectName;
/** 标的物名称 */
private String subjectName;
/** 申请人姓名 */
private String applicantName;
/** 申请日期 */
private String applyDate;
}

View File

@@ -0,0 +1,17 @@
package com.ruoyi.ccdi.project.domain.vo;
import java.util.List;
import lombok.Data;
/**
* 专项核查采购拓展查询列表结果
*/
@Data
public class CcdiProjectExtendedPurchaseListVO {
/** 列表数据 */
private List<CcdiProjectExtendedPurchaseListItemVO> rows;
/** 总数 */
private Long total;
}

View File

@@ -0,0 +1,51 @@
package com.ruoyi.ccdi.project.domain.vo;
import java.util.Date;
import lombok.Data;
/**
* 专项核查招聘拓展查询详情
*/
@Data
public class CcdiProjectExtendedRecruitmentDetailVO {
private String recruitId;
private String recruitName;
private String posName;
private String posCategory;
private String posDesc;
private String candName;
private String candEdu;
private String candId;
private String candSchool;
private String candMajor;
private String candGrad;
private String admitStatus;
private String interviewerName1;
private String interviewerId1;
private String interviewerName2;
private String interviewerId2;
private String createdBy;
private Date createTime;
private String updatedBy;
private Date updateTime;
}

View File

@@ -0,0 +1,25 @@
package com.ruoyi.ccdi.project.domain.vo;
import lombok.Data;
/**
* 专项核查招聘拓展查询列表项
*/
@Data
public class CcdiProjectExtendedRecruitmentListItemVO {
/** 招聘项目编号 */
private String recruitId;
/** 招聘项目名称 */
private String recruitName;
/** 职位名称 */
private String posName;
/** 面试官摘要 */
private String interviewerNameSummary;
/** 录用情况 */
private String admitStatus;
}

View File

@@ -0,0 +1,17 @@
package com.ruoyi.ccdi.project.domain.vo;
import java.util.List;
import lombok.Data;
/**
* 专项核查招聘拓展查询列表结果
*/
@Data
public class CcdiProjectExtendedRecruitmentListVO {
/** 列表数据 */
private List<CcdiProjectExtendedRecruitmentListItemVO> rows;
/** 总数 */
private Long total;
}

View File

@@ -0,0 +1,51 @@
package com.ruoyi.ccdi.project.domain.vo;
import java.util.Date;
import lombok.Data;
/**
* 专项核查调动拓展查询详情
*/
@Data
public class CcdiProjectExtendedTransferDetailVO {
private Long id;
private Long staffId;
private String staffName;
private String transferType;
private String transferSubType;
private Long deptIdBefore;
private String deptNameBefore;
private String gradeBefore;
private String positionBefore;
private String salaryLevelBefore;
private Long deptIdAfter;
private String deptNameAfter;
private String gradeAfter;
private String positionAfter;
private String salaryLevelAfter;
private Date transferDate;
private String createdBy;
private Date createTime;
private String updatedBy;
private Date updateTime;
}

View File

@@ -0,0 +1,25 @@
package com.ruoyi.ccdi.project.domain.vo;
import lombok.Data;
/**
* 专项核查调动拓展查询列表项
*/
@Data
public class CcdiProjectExtendedTransferListItemVO {
/** 员工姓名 */
private String staffName;
/** 调动类型 */
private String transferType;
/** 调动前部门 */
private String deptNameBefore;
/** 调动后部门 */
private String deptNameAfter;
/** 调动日期 */
private String transferDate;
}

View File

@@ -0,0 +1,17 @@
package com.ruoyi.ccdi.project.domain.vo;
import java.util.List;
import lombok.Data;
/**
* 专项核查调动拓展查询列表结果
*/
@Data
public class CcdiProjectExtendedTransferListVO {
/** 列表数据 */
private List<CcdiProjectExtendedTransferListItemVO> rows;
/** 总数 */
private Long total;
}

View File

@@ -1,7 +1,19 @@
package com.ruoyi.ccdi.project.service;
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;
@@ -29,4 +41,54 @@ public interface ICcdiProjectSpecialCheckService {
CcdiProjectFamilyAssetLiabilityDetailVO getFamilyAssetLiabilityDetail(
CcdiProjectFamilyAssetLiabilityDetailQueryDTO queryDTO
);
/**
* 查询采购拓展列表
*
* @param queryDTO 查询条件
* @return 列表结果
*/
CcdiProjectExtendedPurchaseListVO getExtendedPurchaseList(CcdiProjectExtendedPurchaseQueryDTO queryDTO);
/**
* 查询采购拓展详情
*
* @param queryDTO 查询条件
* @return 详情结果
*/
CcdiProjectExtendedPurchaseDetailVO getExtendedPurchaseDetail(CcdiProjectExtendedPurchaseDetailQueryDTO queryDTO);
/**
* 查询招聘拓展列表
*
* @param queryDTO 查询条件
* @return 列表结果
*/
CcdiProjectExtendedRecruitmentListVO getExtendedRecruitmentList(CcdiProjectExtendedRecruitmentQueryDTO queryDTO);
/**
* 查询招聘拓展详情
*
* @param queryDTO 查询条件
* @return 详情结果
*/
CcdiProjectExtendedRecruitmentDetailVO getExtendedRecruitmentDetail(
CcdiProjectExtendedRecruitmentDetailQueryDTO queryDTO
);
/**
* 查询调动拓展列表
*
* @param queryDTO 查询条件
* @return 列表结果
*/
CcdiProjectExtendedTransferListVO getExtendedTransferList(CcdiProjectExtendedTransferQueryDTO queryDTO);
/**
* 查询调动拓展详情
*
* @param queryDTO 查询条件
* @return 详情结果
*/
CcdiProjectExtendedTransferDetailVO getExtendedTransferDetail(CcdiProjectExtendedTransferDetailQueryDTO queryDTO);
}

View File

@@ -1,8 +1,20 @@
package com.ruoyi.ccdi.project.service.impl;
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.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.CcdiProjectFamilyAssetDetailVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityDetailVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityListItemVO;
@@ -58,6 +70,53 @@ public class CcdiProjectSpecialCheckServiceImpl implements ICcdiProjectSpecialCh
return detail;
}
@Override
public CcdiProjectExtendedPurchaseListVO getExtendedPurchaseList(CcdiProjectExtendedPurchaseQueryDTO queryDTO) {
CcdiProjectExtendedPurchaseListVO result = new CcdiProjectExtendedPurchaseListVO();
result.setRows(List.of());
result.setTotal(0L);
return result;
}
@Override
public CcdiProjectExtendedPurchaseDetailVO getExtendedPurchaseDetail(
CcdiProjectExtendedPurchaseDetailQueryDTO queryDTO
) {
return new CcdiProjectExtendedPurchaseDetailVO();
}
@Override
public CcdiProjectExtendedRecruitmentListVO getExtendedRecruitmentList(
CcdiProjectExtendedRecruitmentQueryDTO queryDTO
) {
CcdiProjectExtendedRecruitmentListVO result = new CcdiProjectExtendedRecruitmentListVO();
result.setRows(List.of());
result.setTotal(0L);
return result;
}
@Override
public CcdiProjectExtendedRecruitmentDetailVO getExtendedRecruitmentDetail(
CcdiProjectExtendedRecruitmentDetailQueryDTO queryDTO
) {
return new CcdiProjectExtendedRecruitmentDetailVO();
}
@Override
public CcdiProjectExtendedTransferListVO getExtendedTransferList(CcdiProjectExtendedTransferQueryDTO queryDTO) {
CcdiProjectExtendedTransferListVO result = new CcdiProjectExtendedTransferListVO();
result.setRows(List.of());
result.setTotal(0L);
return result;
}
@Override
public CcdiProjectExtendedTransferDetailVO getExtendedTransferDetail(
CcdiProjectExtendedTransferDetailQueryDTO queryDTO
) {
return new CcdiProjectExtendedTransferDetailVO();
}
private void ensureProjectExists(Long projectId) {
CcdiProject project = projectMapper.selectById(projectId);
if (project == null) {

View File

@@ -0,0 +1,185 @@
package com.ruoyi.ccdi.project.controller;
import io.swagger.v3.oas.annotations.Operation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.junit.jupiter.api.Test;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
class CcdiProjectSpecialCheckExtendedQueryContractTest {
@Test
void shouldExposeExtendedPurchaseEndpointsAndContracts() throws Exception {
assertEndpoint(
"getExtendedPurchaseList",
"com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedPurchaseQueryDTO",
"/extended-query/purchase/list"
);
assertEndpoint(
"getExtendedPurchaseDetail",
"com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedPurchaseDetailQueryDTO",
"/extended-query/purchase/detail"
);
assertFields(
"com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedPurchaseQueryDTO",
"projectId",
"applicantName",
"applyDateStart",
"applyDateEnd",
"pageNum",
"pageSize"
);
assertFields(
"com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedPurchaseDetailQueryDTO",
"projectId",
"purchaseId"
);
assertFields(
"com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseListVO",
"rows",
"total"
);
assertExactFields(
"com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseListItemVO",
"purchaseId",
"projectName",
"subjectName",
"applicantName",
"applyDate"
);
assertDetailVoOwnedByProject("com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseDetailVO");
}
@Test
void shouldExposeExtendedRecruitmentEndpointsAndContracts() throws Exception {
assertEndpoint(
"getExtendedRecruitmentList",
"com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedRecruitmentQueryDTO",
"/extended-query/recruitment/list"
);
assertEndpoint(
"getExtendedRecruitmentDetail",
"com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedRecruitmentDetailQueryDTO",
"/extended-query/recruitment/detail"
);
assertFields(
"com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedRecruitmentQueryDTO",
"projectId",
"interviewerName",
"pageNum",
"pageSize"
);
assertFields(
"com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedRecruitmentDetailQueryDTO",
"projectId",
"recruitId"
);
assertFields(
"com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedRecruitmentListVO",
"rows",
"total"
);
assertExactFields(
"com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedRecruitmentListItemVO",
"recruitId",
"recruitName",
"posName",
"interviewerNameSummary",
"admitStatus"
);
assertDetailVoOwnedByProject("com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedRecruitmentDetailVO");
}
@Test
void shouldExposeExtendedTransferEndpointsAndContracts() throws Exception {
assertEndpoint(
"getExtendedTransferList",
"com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedTransferQueryDTO",
"/extended-query/transfer/list"
);
assertEndpoint(
"getExtendedTransferDetail",
"com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedTransferDetailQueryDTO",
"/extended-query/transfer/detail"
);
assertFields(
"com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedTransferQueryDTO",
"projectId",
"staffName",
"transferDateStart",
"transferDateEnd",
"pageNum",
"pageSize"
);
assertFields(
"com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedTransferDetailQueryDTO",
"projectId",
"id"
);
assertFields(
"com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedTransferListVO",
"rows",
"total"
);
assertExactFields(
"com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedTransferListItemVO",
"staffName",
"transferType",
"deptNameBefore",
"deptNameAfter",
"transferDate"
);
assertDetailVoOwnedByProject("com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedTransferDetailVO");
}
private void assertEndpoint(String methodName, String dtoClassName, String expectedPath) throws Exception {
Class<?> controllerClass = Class.forName("com.ruoyi.ccdi.project.controller.CcdiProjectSpecialCheckController");
Class<?> dtoClass = Class.forName(dtoClassName);
Method method = controllerClass.getMethod(methodName, dtoClass);
GetMapping getMapping = method.getAnnotation(GetMapping.class);
PreAuthorize preAuthorize = method.getAnnotation(PreAuthorize.class);
Operation operation = method.getAnnotation(Operation.class);
assertNotNull(getMapping);
assertEquals(expectedPath, getMapping.value()[0]);
assertNotNull(preAuthorize);
assertEquals("@ss.hasPermi('ccdi:project:query')", preAuthorize.value());
assertNotNull(operation);
}
private void assertFields(String className, String... expectedFields) throws Exception {
Class<?> type = Class.forName(className);
List<String> fieldNames = Arrays.stream(type.getDeclaredFields()).map(Field::getName).collect(Collectors.toList());
for (String expectedField : expectedFields) {
assertTrue(fieldNames.contains(expectedField), className + " 缺少字段 " + expectedField);
}
}
private void assertExactFields(String className, String... expectedFields) throws Exception {
Class<?> type = Class.forName(className);
List<String> fieldNames = Arrays.stream(type.getDeclaredFields()).map(Field::getName).collect(Collectors.toList());
assertEquals(expectedFields.length, fieldNames.size(), className + " 字段数量不符合预期");
for (String expectedField : expectedFields) {
assertTrue(fieldNames.contains(expectedField), className + " 缺少字段 " + expectedField);
}
}
private void assertDetailVoOwnedByProject(String className) throws Exception {
Class<?> type = Class.forName(className);
assertTrue(type.getName().startsWith("com.ruoyi.ccdi.project.domain.vo."));
assertTrue(!type.getName().contains("info.collection"));
}
}