补充项目详情风险人员导出能力

This commit is contained in:
wkc
2026-03-30 15:59:06 +08:00
parent b96161ecf4
commit 933214a495
16 changed files with 386 additions and 25 deletions

View File

@@ -5,6 +5,7 @@ import com.ruoyi.ccdi.project.domain.dto.CcdiProjectPersonAnalysisDetailQueryDTO
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskPeopleQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectSuspiciousTransactionQueryDTO;
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectRiskPeopleOverviewExcel;
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectSuspiciousTransactionExcel;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeCreditNegativePageVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectPersonAnalysisDetailVO;
@@ -145,6 +146,19 @@ public class CcdiProjectOverviewController extends BaseController {
util.exportExcel(response, rows, "涉疑交易明细");
}
/**
* 导出风险人员总览
*/
@PostMapping("/risk-people/export")
@Operation(summary = "导出风险人员总览")
@PreAuthorize("@ss.hasPermi('ccdi:project:query')")
public void exportRiskPeople(HttpServletResponse response, Long projectId) {
List<CcdiProjectRiskPeopleOverviewExcel> rows = overviewService.exportRiskPeopleOverview(projectId);
ExcelUtil<CcdiProjectRiskPeopleOverviewExcel> util =
new ExcelUtil<>(CcdiProjectRiskPeopleOverviewExcel.class);
util.exportExcel(response, rows, "风险人员总览");
}
/**
* 导出风险明细
*/

View File

@@ -0,0 +1,32 @@
package com.ruoyi.ccdi.project.domain.excel;
import com.ruoyi.common.annotation.Excel;
import lombok.Data;
/**
* 风险人员总览导出对象
*/
@Data
public class CcdiProjectRiskPeopleOverviewExcel {
@Excel(name = "姓名")
private String name;
@Excel(name = "身份证号")
private String idNo;
@Excel(name = "所属部门")
private String department;
@Excel(name = "疑似违规数")
private Integer riskCount;
@Excel(name = "风险等级")
private String riskLevel;
@Excel(name = "命中模型数")
private Integer modelCount;
@Excel(name = "核心异常点")
private String riskPoint;
}

View File

@@ -46,6 +46,14 @@ public interface CcdiProjectOverviewMapper {
@Param("query") CcdiProjectRiskPeopleQueryDTO query
);
/**
* 查询风险人员总览导出列表
*
* @param projectId 项目ID
* @return 风险人员聚合列表
*/
List<CcdiProjectEmployeeRiskAggregateVO> selectRiskPeopleOverviewList(@Param("projectId") Long projectId);
/**
* 查询中高风险TOP10
*

View File

@@ -6,6 +6,7 @@ import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskPeopleQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectSuspiciousTransactionQueryDTO;
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectEmployeeCreditNegativeExcel;
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectRiskPeopleOverviewExcel;
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectSuspiciousTransactionExcel;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeCreditNegativePageVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectPersonAnalysisDetailVO;
@@ -102,6 +103,16 @@ public interface ICcdiProjectOverviewService {
return List.of();
}
/**
* 导出风险人员总览
*
* @param projectId 项目ID
* @return 导出列表
*/
default List<CcdiProjectRiskPeopleOverviewExcel> exportRiskPeopleOverview(Long projectId) {
return List.of();
}
/**
* 统一导出风险明细
*

View File

@@ -8,6 +8,7 @@ import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskPeopleQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectSuspiciousTransactionQueryDTO;
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectEmployeeCreditNegativeExcel;
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectRiskPeopleOverviewExcel;
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectSuspiciousTransactionExcel;
import com.ruoyi.ccdi.project.domain.entity.CcdiProjectOverviewEmployeeResult;
import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementListVO;
@@ -228,6 +229,16 @@ public class CcdiProjectOverviewServiceImpl implements ICcdiProjectOverviewServi
.toList();
}
@Override
public List<CcdiProjectRiskPeopleOverviewExcel> exportRiskPeopleOverview(Long projectId) {
ensureProjectExists(projectId);
return defaultList(overviewMapper.selectRiskPeopleOverviewList(projectId)).stream()
.map(aggregate -> buildRiskPeopleItem(projectId, aggregate))
.map(this::buildRiskPeopleExcelRow)
.toList();
}
@Override
public CcdiProjectEmployeeCreditNegativePageVO getEmployeeCreditNegative(
CcdiProjectEmployeeCreditNegativeQueryDTO queryDTO
@@ -337,6 +348,18 @@ public class CcdiProjectOverviewServiceImpl implements ICcdiProjectOverviewServi
return item;
}
private CcdiProjectRiskPeopleOverviewExcel buildRiskPeopleExcelRow(CcdiProjectRiskPeopleOverviewItemVO item) {
CcdiProjectRiskPeopleOverviewExcel row = new CcdiProjectRiskPeopleOverviewExcel();
row.setName(item.getName());
row.setIdNo(item.getIdNo());
row.setDepartment(item.getDepartment());
row.setRiskCount(item.getRiskCount());
row.setRiskLevel(item.getRiskLevel());
row.setModelCount(item.getModelCount());
row.setRiskPoint(item.getRiskPoint());
return row;
}
private void ensureProjectExists(Long projectId) {
getRequiredProject(projectId);
}

View File

@@ -223,32 +223,48 @@
and del_flag = '0'
</select>
<sql id="riskPeopleOverviewSelectColumns">
result.staff_id_card,
result.staff_name,
result.dept_id,
result.dept_name,
result.rule_count,
result.model_count,
result.hit_count,
null as top_rule_code,
null as top_rule_name,
result.risk_point,
result.risk_level_code,
case
when result.risk_level_code = 'HIGH' then '高风险'
when result.risk_level_code = 'MEDIUM' then '中风险'
else '低风险'
end as risk_level_name,
case
when result.risk_level_code = 'HIGH' then 1
when result.risk_level_code = 'MEDIUM' then 2
else 3
end as risk_level_sort
</sql>
<sql id="riskPeopleOverviewOrderBy">
order by risk_level_sort asc, result.model_count desc, result.rule_count desc, result.staff_id_card asc
</sql>
<select id="selectRiskPeopleOverviewPage" resultMap="EmployeeRiskAggregateResultMap">
select
result.staff_id_card,
result.staff_name,
result.dept_id,
result.dept_name,
result.rule_count,
result.model_count,
result.hit_count,
null as top_rule_code,
null as top_rule_name,
result.risk_point,
result.risk_level_code,
case
when result.risk_level_code = 'HIGH' then '高风险'
when result.risk_level_code = 'MEDIUM' then '中风险'
else '低风险'
end as risk_level_name,
case
when result.risk_level_code = 'HIGH' then 1
when result.risk_level_code = 'MEDIUM' then 2
else 3
end as risk_level_sort
<include refid="riskPeopleOverviewSelectColumns"/>
from ccdi_project_overview_employee_result result
where result.project_id = #{query.projectId}
order by risk_level_sort asc, result.model_count desc, result.rule_count desc, result.staff_id_card asc
<include refid="riskPeopleOverviewOrderBy"/>
</select>
<select id="selectRiskPeopleOverviewList" resultMap="EmployeeRiskAggregateResultMap">
select
<include refid="riskPeopleOverviewSelectColumns"/>
from ccdi_project_overview_employee_result result
where result.project_id = #{projectId}
<include refid="riskPeopleOverviewOrderBy"/>
</select>
<select id="selectTopRiskPeopleByProjectId" resultMap="EmployeeRiskAggregateResultMap">