From c1b4514806680832b1a96870306a4461178ef45b Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Tue, 24 Mar 2026 20:42:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=B8=93=E9=A1=B9=E6=A0=B8?= =?UTF-8?q?=E6=9F=A5=E5=AE=B6=E5=BA=AD=E8=B5=84=E4=BA=A7=E8=B4=9F=E5=80=BA?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CcdiProjectSpecialCheckController.java | 51 ++ ...ectFamilyAssetLiabilityDetailQueryDTO.java | 20 + ...ojectFamilyAssetLiabilityListQueryDTO.java | 15 + .../vo/CcdiProjectFamilyAssetDetailVO.java | 27 + .../vo/CcdiProjectFamilyAssetItemVO.java | 33 ++ ...diProjectFamilyAssetLiabilityDetailVO.java | 22 + ...ProjectFamilyAssetLiabilityListItemVO.java | 41 ++ ...CcdiProjectFamilyAssetLiabilityListVO.java | 14 + .../vo/CcdiProjectFamilyDebtDetailVO.java | 27 + .../vo/CcdiProjectFamilyDebtItemVO.java | 36 ++ .../vo/CcdiProjectFamilyIncomeDetailVO.java | 20 + .../mapper/CcdiProjectSpecialCheckMapper.java | 64 +++ .../ICcdiProjectSpecialCheckService.java | 32 ++ .../CcdiProjectSpecialCheckServiceImpl.java | 115 +++++ .../project/CcdiProjectSpecialCheckMapper.xml | 465 ++++++++++++++++++ ...ectSpecialCheckControllerContractTest.java | 143 ++++++ ...CcdiProjectSpecialCheckControllerTest.java | 90 ++++ ...rojectSpecialCheckMapperDetailSqlTest.java | 45 ++ ...iProjectSpecialCheckMapperListSqlTest.java | 43 ++ ...cdiProjectSpecialCheckServiceImplTest.java | 159 ++++++ ...k-family-asset-liability-backend-record.md | 94 ++++ ...-family-asset-liability-frontend-record.md | 82 +++ ...heck-family-asset-liability-plan-record.md | 10 +- ...ly-asset-liability-backend-verification.md | 54 ++ ...y-asset-liability-frontend-verification.md | 67 +++ ruoyi-ui/src/api/ccdi/projectSpecialCheck.js | 20 + .../detail/FamilyAssetLiabilityDetail.vue | 225 +++++++++ .../detail/FamilyAssetLiabilitySection.vue | 211 ++++++++ .../components/detail/SpecialCheck.vue | 115 ++++- .../components/detail/specialCheck.mock.js | 24 + .../unit/special-check-detail-expand.test.js | 16 + .../unit/special-check-detail-layout.test.js | 33 ++ ...l-check-family-asset-liability-api.test.js | 22 + .../unit/special-check-family-table.test.js | 25 + .../tests/unit/special-check-layout.test.js | 13 + .../tests/unit/special-check-risk-tag.test.js | 15 + .../tests/unit/special-check-states.test.js | 20 + .../special-check-visual-alignment.test.js | 25 + 38 files changed, 2514 insertions(+), 19 deletions(-) create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckController.java create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectFamilyAssetLiabilityDetailQueryDTO.java create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectFamilyAssetLiabilityListQueryDTO.java create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetDetailVO.java create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetItemVO.java create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetLiabilityDetailVO.java create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetLiabilityListItemVO.java create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetLiabilityListVO.java create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyDebtDetailVO.java create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyDebtItemVO.java create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyIncomeDetailVO.java create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapper.java create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiProjectSpecialCheckService.java create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectSpecialCheckServiceImpl.java create mode 100644 ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectSpecialCheckMapper.xml create mode 100644 ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckControllerContractTest.java create mode 100644 ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckControllerTest.java create mode 100644 ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapperDetailSqlTest.java create mode 100644 ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapperListSqlTest.java create mode 100644 ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectSpecialCheckServiceImplTest.java create mode 100644 docs/reports/implementation/2026-03-24-special-check-family-asset-liability-backend-record.md create mode 100644 docs/reports/implementation/2026-03-24-special-check-family-asset-liability-frontend-record.md create mode 100644 docs/tests/records/2026-03-24-special-check-family-asset-liability-backend-verification.md create mode 100644 docs/tests/records/2026-03-24-special-check-family-asset-liability-frontend-verification.md create mode 100644 ruoyi-ui/src/api/ccdi/projectSpecialCheck.js create mode 100644 ruoyi-ui/src/views/ccdiProject/components/detail/FamilyAssetLiabilityDetail.vue create mode 100644 ruoyi-ui/src/views/ccdiProject/components/detail/FamilyAssetLiabilitySection.vue create mode 100644 ruoyi-ui/src/views/ccdiProject/components/detail/specialCheck.mock.js create mode 100644 ruoyi-ui/tests/unit/special-check-detail-expand.test.js create mode 100644 ruoyi-ui/tests/unit/special-check-detail-layout.test.js create mode 100644 ruoyi-ui/tests/unit/special-check-family-asset-liability-api.test.js create mode 100644 ruoyi-ui/tests/unit/special-check-family-table.test.js create mode 100644 ruoyi-ui/tests/unit/special-check-layout.test.js create mode 100644 ruoyi-ui/tests/unit/special-check-risk-tag.test.js create mode 100644 ruoyi-ui/tests/unit/special-check-states.test.js create mode 100644 ruoyi-ui/tests/unit/special-check-visual-alignment.test.js diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckController.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckController.java new file mode 100644 index 00000000..b5f52c90 --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckController.java @@ -0,0 +1,51 @@ +package com.ruoyi.ccdi.project.controller; + +import com.ruoyi.ccdi.project.domain.dto.CcdiProjectFamilyAssetLiabilityDetailQueryDTO; +import com.ruoyi.ccdi.project.domain.dto.CcdiProjectFamilyAssetLiabilityListQueryDTO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityDetailVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityListVO; +import com.ruoyi.ccdi.project.service.ICcdiProjectSpecialCheckService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 项目专项核查控制器 + */ +@RestController +@RequestMapping("/ccdi/project/special-check") +@Tag(name = "项目专项核查") +public class CcdiProjectSpecialCheckController extends BaseController { + + @Resource + private ICcdiProjectSpecialCheckService specialCheckService; + + /** + * 查询员工家庭资产负债列表 + */ + @GetMapping("/family-asset-liability/list") + @Operation(summary = "查询员工家庭资产负债列表") + @PreAuthorize("@ss.hasPermi('ccdi:project:query')") + public AjaxResult getFamilyAssetLiabilityList(@Validated CcdiProjectFamilyAssetLiabilityListQueryDTO queryDTO) { + CcdiProjectFamilyAssetLiabilityListVO result = specialCheckService.getFamilyAssetLiabilityList(queryDTO); + return AjaxResult.success(result); + } + + /** + * 查询员工家庭资产负债详情 + */ + @GetMapping("/family-asset-liability/detail") + @Operation(summary = "查询员工家庭资产负债详情") + @PreAuthorize("@ss.hasPermi('ccdi:project:query')") + public AjaxResult getFamilyAssetLiabilityDetail(@Validated CcdiProjectFamilyAssetLiabilityDetailQueryDTO queryDTO) { + CcdiProjectFamilyAssetLiabilityDetailVO result = specialCheckService.getFamilyAssetLiabilityDetail(queryDTO); + return AjaxResult.success(result); + } +} diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectFamilyAssetLiabilityDetailQueryDTO.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectFamilyAssetLiabilityDetailQueryDTO.java new file mode 100644 index 00000000..3e7bf00f --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectFamilyAssetLiabilityDetailQueryDTO.java @@ -0,0 +1,20 @@ +package com.ruoyi.ccdi.project.domain.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * 员工家庭资产负债详情查询DTO + */ +@Data +public class CcdiProjectFamilyAssetLiabilityDetailQueryDTO { + + /** 项目ID */ + @NotNull(message = "项目ID不能为空") + private Long projectId; + + /** 员工身份证号 */ + @NotBlank(message = "员工身份证号不能为空") + private String staffIdCard; +} diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectFamilyAssetLiabilityListQueryDTO.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectFamilyAssetLiabilityListQueryDTO.java new file mode 100644 index 00000000..c33cd8f6 --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectFamilyAssetLiabilityListQueryDTO.java @@ -0,0 +1,15 @@ +package com.ruoyi.ccdi.project.domain.dto; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * 员工家庭资产负债列表查询DTO + */ +@Data +public class CcdiProjectFamilyAssetLiabilityListQueryDTO { + + /** 项目ID */ + @NotNull(message = "项目ID不能为空") + private Long projectId; +} diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetDetailVO.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetDetailVO.java new file mode 100644 index 00000000..1fa7c29f --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetDetailVO.java @@ -0,0 +1,27 @@ +package com.ruoyi.ccdi.project.domain.vo; + +import java.math.BigDecimal; +import java.util.List; +import lombok.Data; + +/** + * 员工家庭资产明细VO + */ +@Data +public class CcdiProjectFamilyAssetDetailVO { + + /** 本人是否缺少资产信息 */ + private Boolean missingSelfAssetInfo; + + /** 本人资产小计 */ + private BigDecimal selfTotalAsset; + + /** 配偶资产小计 */ + private BigDecimal spouseTotalAsset; + + /** 家庭总资产 */ + private BigDecimal totalAsset; + + /** 资产明细 */ + private List items; +} diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetItemVO.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetItemVO.java new file mode 100644 index 00000000..e79d00f5 --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetItemVO.java @@ -0,0 +1,33 @@ +package com.ruoyi.ccdi.project.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; +import lombok.Data; + +/** + * 员工家庭资产明细项VO + */ +@Data +public class CcdiProjectFamilyAssetItemVO { + + /** 资产名称 */ + private String assetName; + + /** 资产大类 */ + private String assetMainType; + + /** 资产小类 */ + private String assetSubType; + + /** 持有人姓名 */ + private String holderName; + + /** 持有人证件号 */ + private String holderIdCard; + + /** 当前估值 */ + private BigDecimal currentValue; + + /** 估值日期 */ + private Date valuationDate; +} diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetLiabilityDetailVO.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetLiabilityDetailVO.java new file mode 100644 index 00000000..fdab27c6 --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetLiabilityDetailVO.java @@ -0,0 +1,22 @@ +package com.ruoyi.ccdi.project.domain.vo; + +import lombok.Data; + +/** + * 员工家庭资产负债详情VO + */ +@Data +public class CcdiProjectFamilyAssetLiabilityDetailVO { + + /** 收入明细 */ + private CcdiProjectFamilyIncomeDetailVO incomeDetail; + + /** 资产明细 */ + private CcdiProjectFamilyAssetDetailVO assetDetail; + + /** 负债明细 */ + private CcdiProjectFamilyDebtDetailVO debtDetail; + + /** 汇总信息 */ + private CcdiProjectFamilyAssetLiabilityListItemVO summary; +} diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetLiabilityListItemVO.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetLiabilityListItemVO.java new file mode 100644 index 00000000..23b90ed2 --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetLiabilityListItemVO.java @@ -0,0 +1,41 @@ +package com.ruoyi.ccdi.project.domain.vo; + +import java.math.BigDecimal; +import lombok.Data; + +/** + * 员工家庭资产负债列表项VO + */ +@Data +public class CcdiProjectFamilyAssetLiabilityListItemVO { + + /** 员工身份证号 */ + private String staffIdCard; + + /** 员工工号 */ + private String staffCode; + + /** 员工姓名 */ + private String staffName; + + /** 所属部门 */ + private String deptName; + + /** 家庭总年收入 */ + private BigDecimal totalIncome; + + /** 家庭总资产 */ + private BigDecimal totalAsset; + + /** 家庭总负债 */ + private BigDecimal totalDebt; + + /** 收入负债对比金额 */ + private BigDecimal comparisonAmount; + + /** 风险等级编码 */ + private String riskLevelCode; + + /** 风险等级名称 */ + private String riskLevelName; +} diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetLiabilityListVO.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetLiabilityListVO.java new file mode 100644 index 00000000..c79e7840 --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetLiabilityListVO.java @@ -0,0 +1,14 @@ +package com.ruoyi.ccdi.project.domain.vo; + +import java.util.List; +import lombok.Data; + +/** + * 员工家庭资产负债列表VO + */ +@Data +public class CcdiProjectFamilyAssetLiabilityListVO { + + /** 列表数据 */ + private List rows; +} diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyDebtDetailVO.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyDebtDetailVO.java new file mode 100644 index 00000000..1d19efe6 --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyDebtDetailVO.java @@ -0,0 +1,27 @@ +package com.ruoyi.ccdi.project.domain.vo; + +import java.math.BigDecimal; +import java.util.List; +import lombok.Data; + +/** + * 员工家庭负债明细VO + */ +@Data +public class CcdiProjectFamilyDebtDetailVO { + + /** 本人是否缺少负债信息 */ + private Boolean missingSelfDebtInfo; + + /** 本人负债小计 */ + private BigDecimal selfTotalDebt; + + /** 配偶负债小计 */ + private BigDecimal spouseTotalDebt; + + /** 家庭总负债 */ + private BigDecimal totalDebt; + + /** 负债明细 */ + private List items; +} diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyDebtItemVO.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyDebtItemVO.java new file mode 100644 index 00000000..500fc952 --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyDebtItemVO.java @@ -0,0 +1,36 @@ +package com.ruoyi.ccdi.project.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; +import lombok.Data; + +/** + * 员工家庭负债明细项VO + */ +@Data +public class CcdiProjectFamilyDebtItemVO { + + /** 负债名称 */ + private String debtName; + + /** 负债大类 */ + private String debtMainType; + + /** 负债小类 */ + private String debtSubType; + + /** 债权人类型 */ + private String creditorType; + + /** 归属人姓名 */ + private String ownerName; + + /** 归属人证件号 */ + private String ownerIdCard; + + /** 本金余额 */ + private BigDecimal principalBalance; + + /** 查询日期 */ + private Date queryDate; +} diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyIncomeDetailVO.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyIncomeDetailVO.java new file mode 100644 index 00000000..ee2ddb43 --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyIncomeDetailVO.java @@ -0,0 +1,20 @@ +package com.ruoyi.ccdi.project.domain.vo; + +import java.math.BigDecimal; +import lombok.Data; + +/** + * 员工家庭收入明细VO + */ +@Data +public class CcdiProjectFamilyIncomeDetailVO { + + /** 本人年收入 */ + private BigDecimal selfIncome; + + /** 配偶年收入 */ + private BigDecimal spouseIncome; + + /** 家庭总年收入 */ + private BigDecimal totalIncome; +} diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapper.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapper.java new file mode 100644 index 00000000..75867f51 --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapper.java @@ -0,0 +1,64 @@ +package com.ruoyi.ccdi.project.mapper; + +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetItemVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityDetailVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityListItemVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyDebtItemVO; +import java.util.List; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 项目专项核查Mapper + */ +@Mapper +public interface CcdiProjectSpecialCheckMapper { + + /** + * 查询员工家庭资产负债列表 + * + * @param projectId 项目ID + * @return 列表数据 + */ + List selectFamilyAssetLiabilityList(@Param("projectId") Long projectId); + + /** + * 查询员工家庭资产负债详情 + * + * @param projectId 项目ID + * @param staffIdCard 员工身份证号 + * @return 详情结果 + */ + CcdiProjectFamilyAssetLiabilityDetailVO selectFamilyAssetLiabilityDetail( + @Param("projectId") Long projectId, + @Param("staffIdCard") String staffIdCard + ); + + /** + * 查询员工家庭资产明细 + * + * @param projectId 项目ID + * @param staffIdCard 员工身份证号 + * @param spouseIdCard 配偶身份证号 + * @return 资产明细 + */ + List selectFamilyAssetItemsByScope( + @Param("projectId") Long projectId, + @Param("staffIdCard") String staffIdCard, + @Param("spouseIdCard") String spouseIdCard + ); + + /** + * 查询员工家庭负债明细 + * + * @param projectId 项目ID + * @param staffIdCard 员工身份证号 + * @param spouseIdCard 配偶身份证号 + * @return 负债明细 + */ + List selectFamilyDebtItemsByScope( + @Param("projectId") Long projectId, + @Param("staffIdCard") String staffIdCard, + @Param("spouseIdCard") String spouseIdCard + ); +} diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiProjectSpecialCheckService.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiProjectSpecialCheckService.java new file mode 100644 index 00000000..b736bbdd --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiProjectSpecialCheckService.java @@ -0,0 +1,32 @@ +package com.ruoyi.ccdi.project.service; + +import com.ruoyi.ccdi.project.domain.dto.CcdiProjectFamilyAssetLiabilityDetailQueryDTO; +import com.ruoyi.ccdi.project.domain.dto.CcdiProjectFamilyAssetLiabilityListQueryDTO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityDetailVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityListVO; + +/** + * 项目专项核查服务接口 + */ +public interface ICcdiProjectSpecialCheckService { + + /** + * 查询员工家庭资产负债列表 + * + * @param queryDTO 查询条件 + * @return 列表结果 + */ + CcdiProjectFamilyAssetLiabilityListVO getFamilyAssetLiabilityList( + CcdiProjectFamilyAssetLiabilityListQueryDTO queryDTO + ); + + /** + * 查询员工家庭资产负债详情 + * + * @param queryDTO 查询条件 + * @return 详情结果 + */ + CcdiProjectFamilyAssetLiabilityDetailVO getFamilyAssetLiabilityDetail( + CcdiProjectFamilyAssetLiabilityDetailQueryDTO queryDTO + ); +} diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectSpecialCheckServiceImpl.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectSpecialCheckServiceImpl.java new file mode 100644 index 00000000..e2b58499 --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectSpecialCheckServiceImpl.java @@ -0,0 +1,115 @@ +package com.ruoyi.ccdi.project.service.impl; + +import com.ruoyi.ccdi.project.domain.CcdiProject; +import com.ruoyi.ccdi.project.domain.dto.CcdiProjectFamilyAssetLiabilityDetailQueryDTO; +import com.ruoyi.ccdi.project.domain.dto.CcdiProjectFamilyAssetLiabilityListQueryDTO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetDetailVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityDetailVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityListItemVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityListVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyDebtDetailVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyIncomeDetailVO; +import com.ruoyi.ccdi.project.mapper.CcdiProjectMapper; +import com.ruoyi.ccdi.project.mapper.CcdiProjectSpecialCheckMapper; +import com.ruoyi.ccdi.project.service.ICcdiProjectSpecialCheckService; +import com.ruoyi.common.exception.ServiceException; +import jakarta.annotation.Resource; +import java.math.BigDecimal; +import java.util.List; +import org.springframework.stereotype.Service; + +/** + * 项目专项核查服务实现 + */ +@Service +public class CcdiProjectSpecialCheckServiceImpl implements ICcdiProjectSpecialCheckService { + + @Resource + private CcdiProjectSpecialCheckMapper specialCheckMapper; + + @Resource + private CcdiProjectMapper projectMapper; + + @Override + public CcdiProjectFamilyAssetLiabilityListVO getFamilyAssetLiabilityList( + CcdiProjectFamilyAssetLiabilityListQueryDTO queryDTO + ) { + ensureProjectExists(queryDTO.getProjectId()); + + CcdiProjectFamilyAssetLiabilityListVO result = new CcdiProjectFamilyAssetLiabilityListVO(); + result.setRows(defaultList(specialCheckMapper.selectFamilyAssetLiabilityList(queryDTO.getProjectId()))); + return result; + } + + @Override + public CcdiProjectFamilyAssetLiabilityDetailVO getFamilyAssetLiabilityDetail( + CcdiProjectFamilyAssetLiabilityDetailQueryDTO queryDTO + ) { + ensureProjectExists(queryDTO.getProjectId()); + + CcdiProjectFamilyAssetLiabilityDetailVO detail = specialCheckMapper.selectFamilyAssetLiabilityDetail( + queryDTO.getProjectId(), + queryDTO.getStaffIdCard() + ); + if (detail == null) { + throw new ServiceException("当前员工不属于该项目专项核查范围"); + } + normalizeDetail(detail); + return detail; + } + + private void ensureProjectExists(Long projectId) { + CcdiProject project = projectMapper.selectById(projectId); + if (project == null) { + throw new ServiceException("项目不存在"); + } + } + + private void normalizeDetail(CcdiProjectFamilyAssetLiabilityDetailVO detail) { + if (detail.getIncomeDetail() == null) { + CcdiProjectFamilyIncomeDetailVO incomeDetail = new CcdiProjectFamilyIncomeDetailVO(); + incomeDetail.setSelfIncome(BigDecimal.ZERO); + incomeDetail.setSpouseIncome(BigDecimal.ZERO); + incomeDetail.setTotalIncome(BigDecimal.ZERO); + detail.setIncomeDetail(incomeDetail); + } + + if (detail.getAssetDetail() == null) { + CcdiProjectFamilyAssetDetailVO assetDetail = new CcdiProjectFamilyAssetDetailVO(); + assetDetail.setMissingSelfAssetInfo(false); + assetDetail.setSelfTotalAsset(BigDecimal.ZERO); + assetDetail.setSpouseTotalAsset(BigDecimal.ZERO); + assetDetail.setTotalAsset(BigDecimal.ZERO); + assetDetail.setItems(List.of()); + detail.setAssetDetail(assetDetail); + } else if (detail.getAssetDetail().getItems() == null) { + detail.getAssetDetail().setItems(List.of()); + } + if (detail.getAssetDetail().getMissingSelfAssetInfo() == null) { + detail.getAssetDetail().setMissingSelfAssetInfo(false); + } + + if (detail.getDebtDetail() == null) { + CcdiProjectFamilyDebtDetailVO debtDetail = new CcdiProjectFamilyDebtDetailVO(); + debtDetail.setMissingSelfDebtInfo(false); + debtDetail.setSelfTotalDebt(BigDecimal.ZERO); + debtDetail.setSpouseTotalDebt(BigDecimal.ZERO); + debtDetail.setTotalDebt(BigDecimal.ZERO); + debtDetail.setItems(List.of()); + detail.setDebtDetail(debtDetail); + } else if (detail.getDebtDetail().getItems() == null) { + detail.getDebtDetail().setItems(List.of()); + } + if (detail.getDebtDetail().getMissingSelfDebtInfo() == null) { + detail.getDebtDetail().setMissingSelfDebtInfo(false); + } + + if (detail.getSummary() == null) { + detail.setSummary(new CcdiProjectFamilyAssetLiabilityListItemVO()); + } + } + + private List defaultList(List list) { + return list == null ? List.of() : list; + } +} diff --git a/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectSpecialCheckMapper.xml b/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectSpecialCheckMapper.xml new file mode 100644 index 00000000..424a6664 --- /dev/null +++ b/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectSpecialCheckMapper.xml @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select distinct + coalesce(direct_staff.id_card, statement_staff.id_card, family_staff.id_card) as staff_id_card, + cast(coalesce(direct_staff.staff_id, statement_staff.staff_id, family_staff.staff_id) as char) as staff_code, + coalesce(direct_staff.name, statement_staff.name, family_staff.name) as staff_name, + dept.dept_name + from ccdi_bank_statement_tag_result tr + left join ccdi_base_staff direct_staff + on tr.object_type = 'STAFF_ID_CARD' + and tr.object_key = direct_staff.id_card + left join ccdi_bank_statement bs + on tr.bank_statement_id = bs.bank_statement_id + left join ccdi_base_staff statement_staff + on (tr.object_key is null or tr.object_key = '') + and bs.cret_no = statement_staff.id_card + left join ccdi_staff_fmy_relation relation + on relation.status = 1 + and ( + ((tr.object_key is null or tr.object_key = '') and bs.cret_no = relation.relation_cert_no) + or ((tr.object_key is not null and tr.object_key != '') and tr.object_type != 'STAFF_ID_CARD' + and tr.object_key = relation.relation_cert_no) + ) + left join ccdi_base_staff family_staff + on relation.person_id = family_staff.id_card + left join sys_dept dept + on dept.dept_id = coalesce(direct_staff.dept_id, statement_staff.dept_id, family_staff.dept_id) + where tr.project_id = #{projectId} + and coalesce(direct_staff.id_card, statement_staff.id_card, family_staff.id_card) is not null + + + + select + person_id, + max(relation_name) as spouse_name, + min(relation_cert_no) as spouse_id_card, + max(annual_income) as spouse_income + from ccdi_staff_fmy_relation + where status = 1 + and is_emp_family = 1 + and relation_type = '配偶' + group by person_id + + + + + + + + + + + diff --git a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckControllerContractTest.java b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckControllerContractTest.java new file mode 100644 index 00000000..b687bdf7 --- /dev/null +++ b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckControllerContractTest.java @@ -0,0 +1,143 @@ +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.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +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 CcdiProjectSpecialCheckControllerContractTest { + + @Test + void shouldExposeFamilyAssetLiabilityListEndpointContract() throws Exception { + Class controllerClass = Class.forName("com.ruoyi.ccdi.project.controller.CcdiProjectSpecialCheckController"); + Class queryDtoClass = Class.forName( + "com.ruoyi.ccdi.project.domain.dto.CcdiProjectFamilyAssetLiabilityListQueryDTO" + ); + RequestMapping requestMapping = controllerClass.getAnnotation(RequestMapping.class); + + Method method = controllerClass.getMethod("getFamilyAssetLiabilityList", queryDtoClass); + GetMapping getMapping = method.getAnnotation(GetMapping.class); + Operation operation = method.getAnnotation(Operation.class); + + assertNotNull(requestMapping); + assertEquals("/ccdi/project/special-check", requestMapping.value()[0]); + assertNotNull(getMapping); + assertEquals("/family-asset-liability/list", getMapping.value()[0]); + assertNotNull(operation); + assertEquals(queryDtoClass, method.getParameterTypes()[0]); + } + + @Test + void shouldExposeFamilyAssetLiabilityDetailEndpointContract() throws Exception { + Class controllerClass = Class.forName("com.ruoyi.ccdi.project.controller.CcdiProjectSpecialCheckController"); + Class queryDtoClass = Class.forName( + "com.ruoyi.ccdi.project.domain.dto.CcdiProjectFamilyAssetLiabilityDetailQueryDTO" + ); + + Method method = controllerClass.getMethod("getFamilyAssetLiabilityDetail", queryDtoClass); + GetMapping getMapping = method.getAnnotation(GetMapping.class); + Operation operation = method.getAnnotation(Operation.class); + + assertNotNull(getMapping); + assertEquals("/family-asset-liability/detail", getMapping.value()[0]); + assertNotNull(operation); + assertEquals(queryDtoClass, method.getParameterTypes()[0]); + } + + @Test + void shouldExposeFamilyAssetLiabilityDtoFields() throws Exception { + Class listDtoClass = Class.forName( + "com.ruoyi.ccdi.project.domain.dto.CcdiProjectFamilyAssetLiabilityListQueryDTO" + ); + Class detailDtoClass = Class.forName( + "com.ruoyi.ccdi.project.domain.dto.CcdiProjectFamilyAssetLiabilityDetailQueryDTO" + ); + + List listFields = Arrays.stream(listDtoClass.getDeclaredFields()) + .map(Field::getName) + .collect(Collectors.toList()); + List detailFields = Arrays.stream(detailDtoClass.getDeclaredFields()) + .map(Field::getName) + .collect(Collectors.toList()); + + assertTrue(listFields.contains("projectId")); + assertTrue(detailFields.contains("projectId")); + assertTrue(detailFields.contains("staffIdCard")); + } + + @Test + void shouldExposeFamilyAssetLiabilityListVoFields() throws Exception { + Class itemVoClass = Class.forName( + "com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityListItemVO" + ); + Class listVoClass = Class.forName( + "com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityListVO" + ); + + List itemFields = Arrays.stream(itemVoClass.getDeclaredFields()) + .map(Field::getName) + .collect(Collectors.toList()); + List listFields = Arrays.stream(listVoClass.getDeclaredFields()) + .map(Field::getName) + .collect(Collectors.toList()); + + assertTrue(itemFields.contains("staffIdCard")); + assertTrue(itemFields.contains("staffCode")); + assertTrue(itemFields.contains("staffName")); + assertTrue(itemFields.contains("deptName")); + assertTrue(itemFields.contains("totalIncome")); + assertTrue(itemFields.contains("totalAsset")); + assertTrue(itemFields.contains("totalDebt")); + assertTrue(itemFields.contains("comparisonAmount")); + assertTrue(itemFields.contains("riskLevelCode")); + assertTrue(itemFields.contains("riskLevelName")); + assertTrue(listFields.contains("rows")); + } + + @Test + void shouldExposeFamilyAssetLiabilityDetailVoFields() throws Exception { + Class detailVoClass = Class.forName( + "com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityDetailVO" + ); + Class incomeDetailClass = Class.forName( + "com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyIncomeDetailVO" + ); + Class assetDetailClass = Class.forName( + "com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetDetailVO" + ); + Class debtDetailClass = Class.forName( + "com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyDebtDetailVO" + ); + + List detailFields = Arrays.stream(detailVoClass.getDeclaredFields()) + .map(Field::getName) + .collect(Collectors.toList()); + List incomeFields = Arrays.stream(incomeDetailClass.getDeclaredFields()) + .map(Field::getName) + .collect(Collectors.toList()); + List assetFields = Arrays.stream(assetDetailClass.getDeclaredFields()) + .map(Field::getName) + .collect(Collectors.toList()); + List debtFields = Arrays.stream(debtDetailClass.getDeclaredFields()) + .map(Field::getName) + .collect(Collectors.toList()); + + assertTrue(detailFields.contains("incomeDetail")); + assertTrue(detailFields.contains("assetDetail")); + assertTrue(detailFields.contains("debtDetail")); + assertTrue(detailFields.contains("summary")); + assertTrue(incomeFields.contains("selfIncome")); + assertTrue(incomeFields.contains("spouseIncome")); + assertTrue(assetFields.contains("items")); + assertTrue(debtFields.contains("items")); + } +} diff --git a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckControllerTest.java b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckControllerTest.java new file mode 100644 index 00000000..d3861bcf --- /dev/null +++ b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckControllerTest.java @@ -0,0 +1,90 @@ +package com.ruoyi.ccdi.project.controller; + +import com.ruoyi.ccdi.project.domain.dto.CcdiProjectFamilyAssetLiabilityDetailQueryDTO; +import com.ruoyi.ccdi.project.domain.dto.CcdiProjectFamilyAssetLiabilityListQueryDTO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityDetailVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityListVO; +import com.ruoyi.ccdi.project.service.ICcdiProjectSpecialCheckService; +import com.ruoyi.common.core.domain.AjaxResult; +import io.swagger.v3.oas.annotations.Operation; +import java.lang.reflect.Method; +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.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class CcdiProjectSpecialCheckControllerTest { + + @InjectMocks + private CcdiProjectSpecialCheckController controller; + + @Mock + private ICcdiProjectSpecialCheckService specialCheckService; + + @Test + void shouldExposeFamilyAssetLiabilityListEndpoint() throws Exception { + CcdiProjectFamilyAssetLiabilityListQueryDTO queryDTO = new CcdiProjectFamilyAssetLiabilityListQueryDTO(); + queryDTO.setProjectId(40L); + when(specialCheckService.getFamilyAssetLiabilityList(queryDTO)).thenReturn(new CcdiProjectFamilyAssetLiabilityListVO()); + + AjaxResult result = controller.getFamilyAssetLiabilityList(queryDTO); + + assertEquals(200, result.get("code")); + verify(specialCheckService).getFamilyAssetLiabilityList(queryDTO); + + RequestMapping mapping = CcdiProjectSpecialCheckController.class.getAnnotation(RequestMapping.class); + Method method = CcdiProjectSpecialCheckController.class.getMethod( + "getFamilyAssetLiabilityList", + CcdiProjectFamilyAssetLiabilityListQueryDTO.class + ); + GetMapping getMapping = method.getAnnotation(GetMapping.class); + PreAuthorize preAuthorize = method.getAnnotation(PreAuthorize.class); + Operation operation = method.getAnnotation(Operation.class); + + assertNotNull(mapping); + assertEquals("/ccdi/project/special-check", mapping.value()[0]); + assertNotNull(getMapping); + assertEquals("/family-asset-liability/list", getMapping.value()[0]); + assertNotNull(preAuthorize); + assertEquals("@ss.hasPermi('ccdi:project:query')", preAuthorize.value()); + assertNotNull(operation); + } + + @Test + void shouldExposeFamilyAssetLiabilityDetailEndpoint() throws Exception { + CcdiProjectFamilyAssetLiabilityDetailQueryDTO queryDTO = new CcdiProjectFamilyAssetLiabilityDetailQueryDTO(); + queryDTO.setProjectId(40L); + queryDTO.setStaffIdCard("330102199001011234"); + when(specialCheckService.getFamilyAssetLiabilityDetail(queryDTO)) + .thenReturn(new CcdiProjectFamilyAssetLiabilityDetailVO()); + + AjaxResult result = controller.getFamilyAssetLiabilityDetail(queryDTO); + + assertEquals(200, result.get("code")); + verify(specialCheckService).getFamilyAssetLiabilityDetail(queryDTO); + + Method method = CcdiProjectSpecialCheckController.class.getMethod( + "getFamilyAssetLiabilityDetail", + CcdiProjectFamilyAssetLiabilityDetailQueryDTO.class + ); + GetMapping getMapping = method.getAnnotation(GetMapping.class); + PreAuthorize preAuthorize = method.getAnnotation(PreAuthorize.class); + Operation operation = method.getAnnotation(Operation.class); + + assertNotNull(getMapping); + assertEquals("/family-asset-liability/detail", getMapping.value()[0]); + assertNotNull(preAuthorize); + assertEquals("@ss.hasPermi('ccdi:project:query')", preAuthorize.value()); + assertNotNull(operation); + } +} diff --git a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapperDetailSqlTest.java b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapperDetailSqlTest.java new file mode 100644 index 00000000..c892e87a --- /dev/null +++ b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapperDetailSqlTest.java @@ -0,0 +1,45 @@ +package com.ruoyi.ccdi.project.mapper; + +import java.nio.file.Files; +import java.nio.file.Path; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class CcdiProjectSpecialCheckMapperDetailSqlTest { + + @Test + void shouldBuildFamilyAssetLiabilityDetailStructureFromProjectScope() throws Exception { + String xml = Files.readString(Path.of("src/main/resources/mapper/ccdi/project/CcdiProjectSpecialCheckMapper.xml")); + + assertTrue(xml.contains("select id=\"selectFamilyAssetLiabilityDetail\"")); + assertTrue(xml.contains("select id=\"selectFamilyAssetItemsByScope\"")); + assertTrue(xml.contains("select id=\"selectFamilyDebtItemsByScope\"")); + assertTrue(xml.contains("scope.staff_id_card = #{staffIdCard}")); + assertTrue(xml.contains("incomeDetail")); + assertTrue(xml.contains("assetDetail")); + assertTrue(xml.contains("debtDetail")); + assertTrue(xml.contains("summary")); + assertTrue(xml.contains("self_total_asset")); + assertTrue(xml.contains("spouse_total_asset")); + assertTrue(xml.contains("self_total_debt")); + assertTrue(xml.contains("spouse_total_debt")); + assertTrue(xml.contains("asset_missing_self_asset_info")); + assertTrue(xml.contains("debt_missing_self_debt_info")); + assertTrue(xml.contains("asset_name")); + assertTrue(xml.contains("asset_main_type")); + assertTrue(xml.contains("asset_sub_type")); + assertTrue(xml.contains("holder_name")); + assertTrue(xml.contains("current_value")); + assertTrue(xml.contains("valuation_date")); + assertTrue(xml.contains("debt_name")); + assertTrue(xml.contains("debt_main_type")); + assertTrue(xml.contains("debt_sub_type")); + assertTrue(xml.contains("creditor_type")); + assertTrue(xml.contains("owner_name")); + assertTrue(xml.contains("principal_balance")); + assertTrue(xml.contains("query_date")); + assertFalse(xml.contains("ccdi_project_overview_employee_result")); + } +} diff --git a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapperListSqlTest.java b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapperListSqlTest.java new file mode 100644 index 00000000..b885b18d --- /dev/null +++ b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapperListSqlTest.java @@ -0,0 +1,43 @@ +package com.ruoyi.ccdi.project.mapper; + +import java.nio.file.Files; +import java.nio.file.Path; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class CcdiProjectSpecialCheckMapperListSqlTest { + + @Test + void shouldAggregateFamilyAssetLiabilityListByProjectEmployeeScope() throws Exception { + String xml = Files.readString(Path.of("src/main/resources/mapper/ccdi/project/CcdiProjectSpecialCheckMapper.xml")); + String listSql = extractSelect(xml, "selectFamilyAssetLiabilityList"); + + assertTrue(listSql.contains("order by risk_level_sort desc, comparison_amount desc, staff_name asc")); + assertTrue(xml.contains("from ccdi_bank_statement_tag_result")); + assertTrue(xml.contains("ccdi_base_staff")); + assertTrue(xml.contains("ccdi_staff_fmy_relation")); + assertTrue(xml.contains("relation_type = '配偶'")); + assertTrue(xml.contains("annual_income")); + assertTrue(xml.contains("current_value")); + assertTrue(xml.contains("principal_balance")); + assertTrue(listSql.contains("self_asset_record_count")); + assertTrue(listSql.contains("self_debt_record_count")); + assertTrue(listSql.contains("then 'MISSING_INFO'")); + assertTrue(listSql.contains("then '缺少信息'")); + assertTrue(listSql.contains("comparison_amount")); + assertTrue(listSql.contains("<= total_asset * 1.5")); + assertTrue(listSql.contains("> total_asset * 1.5")); + assertTrue(listSql.contains("<= total_asset * 3")); + assertTrue(listSql.contains("> total_asset * 3")); + assertFalse(xml.contains("ccdi_project_overview_employee_result")); + } + + private String extractSelect(String xml, String selectId) { + String start = "