From bb41fd7e89ece0dc6c47db048084fb557a49edea Mon Sep 17 00:00:00 2001 From: wjj <2069666735@qq.com> Date: Fri, 3 Jul 2026 10:01:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=96=B0=E5=A2=9E=E8=B4=B7?= =?UTF-8?q?=E6=AC=BE=E6=9F=A5=E8=AF=A2=E5=92=8C=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CcdiProjectSpecialCheckController.java | 32 +++ .../CcdiProjectIncreaseLendingQueryDTO.java | 36 +++ .../CcdiProjectIncreaseLendingExcel.java | 84 ++++++ .../CcdiProjectIncreaseLendingListItemVO.java | 65 +++++ .../vo/CcdiProjectIncreaseLendingListVO.java | 17 ++ .../mapper/CcdiProjectSpecialCheckMapper.java | 25 ++ .../ICcdiProjectSpecialCheckService.java | 20 ++ .../CcdiProjectSpecialCheckServiceImpl.java | 36 +++ .../project/CcdiProjectSpecialCheckMapper.xml | 113 ++++++++ .../2026-07-02-increase-lending-query-plan.md | 38 +++ ...2-increase-lending-query-implementation.md | 34 +++ ruoyi-ui/src/api/ccdi/projectSpecialCheck.js | 18 ++ .../detail/IncreaseLendingSection.vue | 272 ++++++++++++++++++ .../components/detail/SpecialCheck.vue | 4 + 14 files changed, 794 insertions(+) create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectIncreaseLendingQueryDTO.java create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/excel/CcdiProjectIncreaseLendingExcel.java create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectIncreaseLendingListItemVO.java create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectIncreaseLendingListVO.java create mode 100644 docs/plans/fullstack/2026-07-02-increase-lending-query-plan.md create mode 100644 docs/reports/implementation/2026-07-02-increase-lending-query-implementation.md create mode 100644 ruoyi-ui/src/views/ccdiProject/components/detail/IncreaseLendingSection.vue 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 index a85d6636..bcdb00e6 100644 --- 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 @@ -8,6 +8,8 @@ import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedTransferDetailQueryD 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.dto.CcdiProjectIncreaseLendingQueryDTO; +import com.ruoyi.ccdi.project.domain.excel.CcdiProjectIncreaseLendingExcel; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseDetailVO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseListVO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedRecruitmentDetailVO; @@ -16,16 +18,21 @@ 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.domain.vo.CcdiProjectIncreaseLendingListVO; import com.ruoyi.ccdi.project.service.CcdiProjectAccessService; import com.ruoyi.ccdi.project.service.ICcdiProjectSpecialCheckService; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.poi.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import java.util.List; 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.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -138,4 +145,29 @@ public class CcdiProjectSpecialCheckController extends BaseController { CcdiProjectExtendedTransferDetailVO result = specialCheckService.getExtendedTransferDetail(queryDTO); return AjaxResult.success(result); } + + /** + * 查询新增贷款列表 + */ + @GetMapping("/increase-lending/list") + @Operation(summary = "查询新增贷款列表") + @PreAuthorize("@ss.hasPermi('ccdi:project:query')") + public AjaxResult getIncreaseLendingList(@Validated CcdiProjectIncreaseLendingQueryDTO queryDTO) { + projectAccessService.assertCanRead(queryDTO.getProjectId()); + CcdiProjectIncreaseLendingListVO result = specialCheckService.getIncreaseLendingList(queryDTO); + return AjaxResult.success(result); + } + + /** + * 导出新增贷款列表 + */ + @PostMapping("/increase-lending/export") + @Operation(summary = "导出新增贷款列表") + @PreAuthorize("@ss.hasPermi('ccdi:project:query')") + public void exportIncreaseLending(HttpServletResponse response, @Validated CcdiProjectIncreaseLendingQueryDTO queryDTO) { + projectAccessService.assertCanRead(queryDTO.getProjectId()); + List rows = specialCheckService.exportIncreaseLendingList(queryDTO); + ExcelUtil util = new ExcelUtil<>(CcdiProjectIncreaseLendingExcel.class); + util.exportExcel(response, rows, "新增贷款查询"); + } } diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectIncreaseLendingQueryDTO.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectIncreaseLendingQueryDTO.java new file mode 100644 index 00000000..1616aa90 --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectIncreaseLendingQueryDTO.java @@ -0,0 +1,36 @@ +package com.ruoyi.ccdi.project.domain.dto; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * 项目新增贷款查询入参 + */ +@Data +public class CcdiProjectIncreaseLendingQueryDTO { + + /** 项目ID */ + @NotNull(message = "项目ID不能为空") + private Long projectId; + + /** 柜员号 */ + private String staffId; + + /** 员工身份证号 */ + private String staffIdCard; + + /** 审核人柜员号 */ + private String approver; + + /** 发放日期起 */ + private String loanStartDate; + + /** 发放日期止 */ + private String loanEndDate; + + /** 页码 */ + private Integer pageNum = 1; + + /** 每页条数 */ + private Integer pageSize = 10; +} diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/excel/CcdiProjectIncreaseLendingExcel.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/excel/CcdiProjectIncreaseLendingExcel.java new file mode 100644 index 00000000..ff53b762 --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/excel/CcdiProjectIncreaseLendingExcel.java @@ -0,0 +1,84 @@ +package com.ruoyi.ccdi.project.domain.excel; + +import com.ruoyi.common.annotation.Excel; +import java.math.BigDecimal; +import lombok.Data; + +/** + * 新增贷款查询导出对象 + */ +@Data +public class CcdiProjectIncreaseLendingExcel { + + /** 柜员号 */ + @Excel(name = "柜员号") + private String staffId; + + /** 员工姓名 */ + @Excel(name = "员工姓名") + private String staffName; + + /** 员工身份证 */ + @Excel(name = "员工身份证") + private String staffIdCard; + + /** 部门 */ + @Excel(name = "部门") + private String deptName; + + /** 合同编号 */ + @Excel(name = "合同编号") + private String contractNo; + + /** 放款机构号 */ + @Excel(name = "放款机构号") + private String lendingOrgNo; + + /** 借款人 */ + @Excel(name = "借款人") + private String borrowerName; + + /** 借款人证件号 */ + @Excel(name = "借款人证件号") + private String borrowerCertNo; + + /** 贷款产品 */ + @Excel(name = "贷款产品") + private String loanProduct; + + /** 合同金额 */ + @Excel(name = "合同金额") + private BigDecimal contractAmount; + + /** 当前余额 */ + @Excel(name = "当前余额") + private BigDecimal loanBalance; + + /** 发放日期 */ + @Excel(name = "发放日期") + private String loanStartDate; + + /** 到期日期 */ + @Excel(name = "到期日期") + private String loanEndDate; + + /** 合同状态 */ + @Excel(name = "合同状态") + private String status; + + /** 五级分类 */ + @Excel(name = "五级分类") + private String fiveClassification; + + /** 客户经理ID */ + @Excel(name = "客户经理ID") + private String customerManagerId; + + /** 客户经理 */ + @Excel(name = "客户经理") + private String customerManagerName; + + /** 审批人 */ + @Excel(name = "审批人") + private String approver; +} diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectIncreaseLendingListItemVO.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectIncreaseLendingListItemVO.java new file mode 100644 index 00000000..6e8a2730 --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectIncreaseLendingListItemVO.java @@ -0,0 +1,65 @@ +package com.ruoyi.ccdi.project.domain.vo; + +import java.math.BigDecimal; +import lombok.Data; + +/** + * 项目新增贷款查询列表项 + */ +@Data +public class CcdiProjectIncreaseLendingListItemVO { + + /** 员工ID/柜员号 */ + private String staffId; + + /** 员工姓名 */ + private String staffName; + + /** 员工身份证号 */ + private String staffIdCard; + + /** 所属部门 */ + private String deptName; + + /** 合同编号 */ + private String contractNo; + + /** 放款机构号 */ + private String lendingOrgNo; + + /** 借款人名称 */ + private String borrowerName; + + /** 借款人证件号码 */ + private String borrowerCertNo; + + /** 贷款产品 */ + private String loanProduct; + + /** 合同金额 */ + private BigDecimal contractAmount; + + /** 当前贷款余额 */ + private BigDecimal loanBalance; + + /** 贷款发放日期 */ + private String loanStartDate; + + /** 贷款到期日期 */ + private String loanEndDate; + + /** 合同状态 */ + private String status; + + /** 五级分类 */ + private String fiveClassification; + + /** 客户经理ID */ + private String customerManagerId; + + /** 客户经理姓名 */ + private String customerManagerName; + + /** 审批人 */ + private String approver; +} diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectIncreaseLendingListVO.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectIncreaseLendingListVO.java new file mode 100644 index 00000000..ec4106ea --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectIncreaseLendingListVO.java @@ -0,0 +1,17 @@ +package com.ruoyi.ccdi.project.domain.vo; + +import java.util.List; +import lombok.Data; + +/** + * 项目新增贷款查询列表结果 + */ +@Data +public class CcdiProjectIncreaseLendingListVO { + + /** 列表数据 */ + private List rows; + + /** 总数 */ + private Long total; +} 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 index 6dc3e8ab..19bbbd24 100644 --- 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 @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedPurchaseQueryDTO; import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedRecruitmentQueryDTO; import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedTransferQueryDTO; +import com.ruoyi.ccdi.project.domain.dto.CcdiProjectIncreaseLendingQueryDTO; +import com.ruoyi.ccdi.project.domain.excel.CcdiProjectIncreaseLendingExcel; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseDetailVO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseListItemVO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseSupplierVO; @@ -15,6 +17,7 @@ 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 com.ruoyi.ccdi.project.domain.vo.CcdiProjectIncreaseLendingListItemVO; import java.util.List; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -145,6 +148,28 @@ public interface CcdiProjectSpecialCheckMapper { @Param("query") CcdiProjectExtendedTransferQueryDTO queryDTO ); + /** + * 查询项目新增贷款列表 + * + * @param page 分页对象 + * @param queryDTO 查询条件 + * @return 分页结果 + */ + Page selectIncreaseLendingPage( + @Param("page") Page page, + @Param("query") CcdiProjectIncreaseLendingQueryDTO queryDTO + ); + + /** + * 查询项目新增贷款导出列表 + * + * @param queryDTO 查询条件 + * @return 导出列表 + */ + List selectIncreaseLendingExportList( + @Param("query") CcdiProjectIncreaseLendingQueryDTO queryDTO + ); + /** * 查询专项核查调动拓展详情 * 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 index a144aaf8..7abfce39 100644 --- 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 @@ -8,6 +8,8 @@ import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedTransferDetailQueryD 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.dto.CcdiProjectIncreaseLendingQueryDTO; +import com.ruoyi.ccdi.project.domain.excel.CcdiProjectIncreaseLendingExcel; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseDetailVO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseListVO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedRecruitmentDetailVO; @@ -16,6 +18,8 @@ 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.domain.vo.CcdiProjectIncreaseLendingListVO; +import java.util.List; /** * 项目专项核查服务接口 @@ -91,4 +95,20 @@ public interface ICcdiProjectSpecialCheckService { * @return 详情结果 */ CcdiProjectExtendedTransferDetailVO getExtendedTransferDetail(CcdiProjectExtendedTransferDetailQueryDTO queryDTO); + + /** + * 查询项目新增贷款列表 + * + * @param queryDTO 查询条件 + * @return 列表结果 + */ + CcdiProjectIncreaseLendingListVO getIncreaseLendingList(CcdiProjectIncreaseLendingQueryDTO queryDTO); + + /** + * 导出项目新增贷款列表 + * + * @param queryDTO 查询条件 + * @return 导出列表 + */ + List exportIncreaseLendingList(CcdiProjectIncreaseLendingQueryDTO 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 index 17d2844e..5cb4f093 100644 --- 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 @@ -10,6 +10,8 @@ import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExtendedTransferDetailQueryD 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.dto.CcdiProjectIncreaseLendingQueryDTO; +import com.ruoyi.ccdi.project.domain.excel.CcdiProjectIncreaseLendingExcel; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseDetailVO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseListItemVO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExtendedPurchaseListVO; @@ -25,10 +27,13 @@ import com.ruoyi.ccdi.project.domain.vo.CcdiProjectFamilyAssetLiabilityListItemV 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.domain.vo.CcdiProjectIncreaseLendingListItemVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectIncreaseLendingListVO; 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 com.ruoyi.common.utils.StringUtils; import jakarta.annotation.Resource; import java.math.BigDecimal; import java.util.List; @@ -178,6 +183,37 @@ public class CcdiProjectSpecialCheckServiceImpl implements ICcdiProjectSpecialCh return detail; } + @Override + public CcdiProjectIncreaseLendingListVO getIncreaseLendingList(CcdiProjectIncreaseLendingQueryDTO queryDTO) { + validateIncreaseLendingQuery(queryDTO); + + Page page = new Page<>( + defaultPageNum(queryDTO.getPageNum()), + defaultPageSize(queryDTO.getPageSize()) + ); + Page resultPage = specialCheckMapper.selectIncreaseLendingPage(page, queryDTO); + + CcdiProjectIncreaseLendingListVO result = new CcdiProjectIncreaseLendingListVO(); + result.setRows(resultPage == null ? List.of() : defaultList(resultPage.getRecords())); + result.setTotal(resultPage == null ? 0L : resultPage.getTotal()); + return result; + } + + @Override + public List exportIncreaseLendingList(CcdiProjectIncreaseLendingQueryDTO queryDTO) { + validateIncreaseLendingQuery(queryDTO); + return defaultList(specialCheckMapper.selectIncreaseLendingExportList(queryDTO)); + } + + private void validateIncreaseLendingQuery(CcdiProjectIncreaseLendingQueryDTO queryDTO) { + ensureProjectExists(queryDTO.getProjectId()); + if (StringUtils.isBlank(queryDTO.getStaffId()) + && StringUtils.isBlank(queryDTO.getStaffIdCard()) + && StringUtils.isBlank(queryDTO.getApprover())) { + throw new ServiceException("柜员号、员工身份证和审核人柜员号至少填写一项"); + } + } + private void ensureProjectExists(Long projectId) { CcdiProject project = projectMapper.selectById(projectId); if (project == null) { diff --git a/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectSpecialCheckMapper.xml b/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectSpecialCheckMapper.xml index be2249d0..d913cc05 100644 --- a/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectSpecialCheckMapper.xml +++ b/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectSpecialCheckMapper.xml @@ -67,6 +67,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/plans/fullstack/2026-07-02-increase-lending-query-plan.md b/docs/plans/fullstack/2026-07-02-increase-lending-query-plan.md new file mode 100644 index 00000000..745b6a3c --- /dev/null +++ b/docs/plans/fullstack/2026-07-02-increase-lending-query-plan.md @@ -0,0 +1,38 @@ +# 新增贷款查询模块实施计划 + +## 需求范围 + +在项目详情的“专项排查”页面中,于资金流向图谱下方新增“新增贷款查询”模块。模块用于查询某个员工经办/管户或审核的新增贷款合同,支持通过柜员号、员工身份证、审核人柜员号和发放日期筛选,并支持导出单人查询结果。 + +## 设计口径 + +- 页面位置:`项目详情 > 专项排查 > 资金流向图谱下方` +- 数据范围:按输入的柜员号或员工身份证查询对应贷款,不默认展开全量列表,不再限定当前项目排查人员范围;柜员号精确匹配 +- 关联方式:柜员号对应 `ccdi_increase_lending.customer_manager_id` +- 查询条件:柜员号、员工身份证、审核人柜员号、发放日期范围;柜员号、员工身份证、审核人柜员号均使用等值查询,不做模糊匹配 +- 查询交互:默认展示筛选框和空表头;输入柜员号或员工身份证并点击查询后加载分页结果 +- 导出口径:导出当前单人查询条件下的全部匹配贷款明细,不受当前分页页码限制 + +## 后端实施 + +1. 在 `CcdiProjectSpecialCheckController` 新增 `/increase-lending/list` 查询接口。 +2. 新增 `CcdiProjectIncreaseLendingQueryDTO`,包含 `projectId`、`staffId`、`staffIdCard`、`approver`、`loanStartDate`、`loanEndDate`、分页参数。 +3. 新增 `CcdiProjectIncreaseLendingListVO` 与 `CcdiProjectIncreaseLendingListItemVO`。 +4. 在 `CcdiProjectSpecialCheckServiceImpl` 增加分页查询方法。 +5. 在 `CcdiProjectSpecialCheckMapper.xml` 使用 `ccdi_increase_lending.customer_manager_id` 直接精确匹配柜员号查询,员工身份证通过 `ccdi_base_staff.id_card` 精确过滤,审核人柜员号通过 `ccdi_increase_lending.approver` 精确过滤,并按 `loan_start_date` 支持发放日期范围筛选。 +6. 新增导出 Excel 对象和 `/increase-lending/export` 接口,复用同一查询口径导出全部匹配明细。 + +## 前端实施 + +1. 在 `projectSpecialCheck.js` 新增 `getIncreaseLendingList` API。 +2. 新增 `IncreaseLendingSection.vue`,默认展示筛选区和空表头,查询后展示贷款列表与分页;筛选区包含柜员号、员工身份证、审核人柜员号、发放日期范围。 +3. 在 `SpecialCheck.vue` 的资金流向图谱下方挂载新增贷款查询模块。 +4. 在筛选按钮区新增“导出”按钮,仅在填写柜员号、员工身份证或审核人柜员号后允许导出。 + +## 验证计划 + +- 后端执行 `mvn -pl ccdi-project -DskipTests compile` +- 前端执行 `npm run build:prod` +- 打开真实项目详情页,进入专项排查,确认新增贷款查询模块显示在资金流向图谱下方 +- 验证柜员号、员工身份证、审核人柜员号、发放日期筛选条件能触发列表查询 +- 验证导出接口导出当前查询条件下的全部结果 diff --git a/docs/reports/implementation/2026-07-02-increase-lending-query-implementation.md b/docs/reports/implementation/2026-07-02-increase-lending-query-implementation.md new file mode 100644 index 00000000..be17d203 --- /dev/null +++ b/docs/reports/implementation/2026-07-02-increase-lending-query-implementation.md @@ -0,0 +1,34 @@ +# 新增贷款查询模块实施记录 + +## 本次修改 + +- 在项目专项排查后端新增“新增贷款查询”分页接口。 +- 新增查询 DTO 与列表 VO,返回员工信息、合同编号、借款人、贷款产品、合同金额、当前余额、发放日期、到期日期、合同状态、五级分类等字段。 +- 柜员号查询直接精确匹配 `ccdi_increase_lending.customer_manager_id`,员工身份证查询通过 `ccdi_base_staff.id_card` 精确过滤,审核人柜员号查询直接精确匹配 `ccdi_increase_lending.approver`,并支持按贷款发放日期范围过滤。 +- 前后端均限制柜员号、员工身份证和审核人柜员号至少填写一项,避免默认展开大列表。 +- 新增“新增贷款查询”导出接口与 Excel 导出对象,按当前单人查询条件导出全部匹配贷款明细,不受表格分页页码限制。 +- 在前端专项排查页面新增 `IncreaseLendingSection`,放置于资金流向图谱下方、拓展查询上方。 +- 新增柜员号、员工身份证、审核人柜员号与发放日期筛选框;默认展示空表头,点击查询后加载分页贷款列表,并支持导出当前查询结果。 + +## 影响范围 + +- 后端:`ccdi-project` 模块项目专项排查接口。 +- 前端:`ruoyi-ui` 项目详情专项排查页面。 +- 数据库:不新增或修改表结构,依赖既有 `ccdi_increase_lending` 表。 + +## 验证情况 + +- 后端执行 `mvn -pl ccdi-project -DskipTests compile`,编译被既有 `CcdiFileUploadServiceImpl` 调用 `LsfxAnalysisClient.uploadFile(Integer, File, String)` 与当前客户端方法签名 `uploadFile(Integer, File)` 不一致阻塞;阻塞点不在本次新增贷款查询改动范围内。 +- 前端执行 `npm run build:prod` 成功,存在既有资源体积告警;已覆盖“默认不展示结果表、输入柜员号或员工身份证查询后展开列表”的交互调整。 +- 当前数据库 `ccdi_increase_lending` 已存在 6 条演示数据,柜员号为 `9021001` 至 `9021006`。 +- 早期联调用本地 mock 验证过页面交互;最终验收以真实 Java 后端 `62318` 为准。 +- 按项目要求执行 `nvm use` 时,由于未指定版本返回“缺少版本参数”;随后使用当前 Node `v22.22.3`、npm `10.9.8` 执行 `npm run build:prod` 通过。 +- 真实页面浏览器自动化检查受本地 Node/npm 环境限制未复跑;本地 8080 前端服务已存在,可刷新页面手工验证。 +- 后续调整柜员号口径:`customer_manager_id` 已由模糊匹配改为精确匹配,前端不做 7 位格式提示,输入半截柜员号自然无结果。 +- 审核人字段口径:当前按 `approver` 精确匹配“审核人柜员号”,字段为空时查询自然无结果;后续数据入库后无需改代码即可按审核人柜员号联动查询和导出。 +- 后端验证:`mvn -pl ruoyi-admin -am -DskipTests compile` 与 `mvn -pl ruoyi-admin -am clean package -DskipTests` 均通过;真实后端已在 `62318` 启动,未登录直接访问业务接口返回 `401`,说明当前端口已由 Java 后端接管。 +- 提交前检查:当前 `dev-ui` 可继续提交本次功能;但 `dev` 与 `dev-ui` 之间已有大量历史冲突,后续直接合入 `dev` 需要单独解决冲突,不能视为无冲突直合。 +- 本次收紧单人查询:员工身份证条件同步改为精确匹配;真实接口验证 `projectId=90337&staffId=9021001` 返回 `total=1` 且 `staffId/customerManagerId` 均为 `9021001`,`staffId=902100` 返回 `total=0`。 +- 新增导出验证:真实接口 `projectId=90337&staffId=9021001` 导出 Excel 成功,文件 sheet 为“新增贷款查询”,表头包含“审批人”,导出 1 行贷款明细。 +- 审核人柜员号验证:当前 `approver` 字段缺少有效数据,真实接口 `projectId=90337&approver=9021001` 返回 `total=0`;后续 `approver` 有柜员号数据后可直接联动查询和导出。 +- 按 `.nvmrc` 执行 `nvm use 14.21.3` 后,本地 nvm 目录缺少 `npm.cmd`,无法用 Node 14 启动前端构建;改用本机可用的 Node `v22.22.3` / npm `10.9.8` 执行 `npm run build:prod` 通过,存在既有资源体积告警。 diff --git a/ruoyi-ui/src/api/ccdi/projectSpecialCheck.js b/ruoyi-ui/src/api/ccdi/projectSpecialCheck.js index 8f52a460..dc41afae 100644 --- a/ruoyi-ui/src/api/ccdi/projectSpecialCheck.js +++ b/ruoyi-ui/src/api/ccdi/projectSpecialCheck.js @@ -100,3 +100,21 @@ export function getExtendedTransferDetail(params) { }, }); } + +export function getIncreaseLendingList(params) { + const { projectId, staffId, staffIdCard, approver, loanStartDate, loanEndDate, pageNum, pageSize } = params; + return request({ + url: "/ccdi/project/special-check/increase-lending/list", + method: "get", + params: { + projectId, + staffId, + staffIdCard, + approver, + loanStartDate, + loanEndDate, + pageNum, + pageSize, + }, + }); +} diff --git a/ruoyi-ui/src/views/ccdiProject/components/detail/IncreaseLendingSection.vue b/ruoyi-ui/src/views/ccdiProject/components/detail/IncreaseLendingSection.vue new file mode 100644 index 00000000..e92d8730 --- /dev/null +++ b/ruoyi-ui/src/views/ccdiProject/components/detail/IncreaseLendingSection.vue @@ -0,0 +1,272 @@ + + + + + diff --git a/ruoyi-ui/src/views/ccdiProject/components/detail/SpecialCheck.vue b/ruoyi-ui/src/views/ccdiProject/components/detail/SpecialCheck.vue index 178207e6..883644cf 100644 --- a/ruoyi-ui/src/views/ccdiProject/components/detail/SpecialCheck.vue +++ b/ruoyi-ui/src/views/ccdiProject/components/detail/SpecialCheck.vue @@ -27,6 +27,8 @@ ref="fundGraphSection" :project-id="projectId" /> + +
@@ -41,6 +43,7 @@ import { getFamilyAssetLiabilityList } from "@/api/ccdi/projectSpecialCheck"; import ExtendedQuerySection from "./ExtendedQuerySection"; import FamilyAssetLiabilitySection from "./FamilyAssetLiabilitySection"; import FundGraphSection from "./graph/FundGraphSection"; +import IncreaseLendingSection from "./IncreaseLendingSection"; export default { name: "SpecialCheck", @@ -48,6 +51,7 @@ export default { ExtendedQuerySection, FamilyAssetLiabilitySection, FundGraphSection, + IncreaseLendingSection, }, props: { projectId: {