补充结果总览模型区人员分页查询
This commit is contained in:
@@ -2,6 +2,7 @@ package com.ruoyi.ccdi.project.domain.dto;
|
|||||||
|
|
||||||
import jakarta.validation.constraints.Pattern;
|
import jakarta.validation.constraints.Pattern;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -31,4 +32,15 @@ public class CcdiProjectRiskModelPeopleQueryDTO {
|
|||||||
|
|
||||||
/** 每页数量 */
|
/** 每页数量 */
|
||||||
private Integer pageSize;
|
private Integer pageSize;
|
||||||
|
|
||||||
|
public String getModelCodesCsv() {
|
||||||
|
if (modelCodes == null || modelCodes.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return modelCodes.stream()
|
||||||
|
.filter(item -> item != null && !item.isBlank())
|
||||||
|
.map(String::trim)
|
||||||
|
.distinct()
|
||||||
|
.collect(Collectors.joining(","));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
package com.ruoyi.ccdi.project.mapper;
|
package com.ruoyi.ccdi.project.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
|
||||||
import com.ruoyi.ccdi.project.domain.CcdiProject;
|
import com.ruoyi.ccdi.project.domain.CcdiProject;
|
||||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeRiskAggregateVO;
|
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeRiskAggregateVO;
|
||||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelCardVO;
|
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelCardVO;
|
||||||
|
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelPeopleItemVO;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
@@ -46,6 +49,18 @@ public interface CcdiProjectOverviewMapper {
|
|||||||
*/
|
*/
|
||||||
List<CcdiProjectRiskModelCardVO> selectRiskModelCardsByProjectId(@Param("projectId") Long projectId);
|
List<CcdiProjectRiskModelCardVO> selectRiskModelCardsByProjectId(@Param("projectId") Long projectId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页查询风险模型命中人员
|
||||||
|
*
|
||||||
|
* @param page 分页参数
|
||||||
|
* @param query 查询条件
|
||||||
|
* @return 命中人员分页结果
|
||||||
|
*/
|
||||||
|
Page<CcdiProjectRiskModelPeopleItemVO> selectRiskModelPeoplePage(
|
||||||
|
Page<CcdiProjectRiskModelPeopleItemVO> page,
|
||||||
|
@Param("query") CcdiProjectRiskModelPeopleQueryDTO query
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询项目风险人数汇总
|
* 查询项目风险人数汇总
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -18,17 +18,34 @@
|
|||||||
<result property="riskLevelSort" column="risk_level_sort"/>
|
<result property="riskLevelSort" column="risk_level_sort"/>
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
|
<resultMap id="RiskModelPeopleItemResultMap" type="com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelPeopleItemVO">
|
||||||
|
<id property="idNo" column="staff_id_card"/>
|
||||||
|
<result property="staffName" column="staff_name"/>
|
||||||
|
<result property="staffCode" column="staff_code"/>
|
||||||
|
<result property="department" column="department"/>
|
||||||
|
<collection property="modelNames"
|
||||||
|
column="{projectId=project_id,staffIdCard=staff_id_card,selectedModelCodes=selected_model_codes}"
|
||||||
|
ofType="java.lang.String"
|
||||||
|
select="selectRiskModelNamesByScope"/>
|
||||||
|
<collection property="hitTagList"
|
||||||
|
column="{projectId=project_id,staffIdCard=staff_id_card,selectedModelCodes=selected_model_codes}"
|
||||||
|
ofType="com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskHitTagVO"
|
||||||
|
select="selectRiskHitTagsByScope"/>
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
<sql id="resolvedEmployeeRiskBaseSql">
|
<sql id="resolvedEmployeeRiskBaseSql">
|
||||||
select distinct
|
select distinct
|
||||||
tr.id,
|
tr.id,
|
||||||
tr.project_id,
|
tr.project_id,
|
||||||
coalesce(direct_staff.id_card, statement_staff.id_card, family_staff.id_card) as staff_id_card,
|
coalesce(direct_staff.id_card, statement_staff.id_card, family_staff.id_card) as staff_id_card,
|
||||||
coalesce(direct_staff.name, statement_staff.name, family_staff.name) as staff_name,
|
coalesce(direct_staff.name, statement_staff.name, family_staff.name) as staff_name,
|
||||||
|
cast(coalesce(direct_staff.staff_id, statement_staff.staff_id, family_staff.staff_id) as char) as staff_code,
|
||||||
coalesce(direct_staff.dept_id, statement_staff.dept_id, family_staff.dept_id) as dept_id,
|
coalesce(direct_staff.dept_id, statement_staff.dept_id, family_staff.dept_id) as dept_id,
|
||||||
tr.rule_code,
|
tr.rule_code,
|
||||||
tr.rule_name,
|
tr.rule_name,
|
||||||
tr.model_code,
|
tr.model_code,
|
||||||
tr.model_name
|
tr.model_name,
|
||||||
|
tr.risk_level
|
||||||
from ccdi_bank_statement_tag_result tr
|
from ccdi_bank_statement_tag_result tr
|
||||||
left join ccdi_base_staff direct_staff
|
left join ccdi_base_staff direct_staff
|
||||||
on tr.object_type = 'STAFF_ID_CARD'
|
on tr.object_type = 'STAFF_ID_CARD'
|
||||||
@@ -193,6 +210,76 @@
|
|||||||
order by warning_count desc, model_code asc
|
order by warning_count desc, model_code asc
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="selectRiskModelPeoplePage" resultMap="RiskModelPeopleItemResultMap">
|
||||||
|
select
|
||||||
|
base.project_id,
|
||||||
|
base.staff_id_card,
|
||||||
|
max(base.staff_name) as staff_name,
|
||||||
|
max(base.staff_code) as staff_code,
|
||||||
|
max(dept.dept_name) as department,
|
||||||
|
#{query.modelCodesCsv} as selected_model_codes
|
||||||
|
from (
|
||||||
|
<include refid="resolvedEmployeeRiskBaseSql"/>
|
||||||
|
) base
|
||||||
|
left join sys_dept dept on base.dept_id = dept.dept_id
|
||||||
|
where 1 = 1
|
||||||
|
<if test="query.modelCodes != null and query.modelCodes.size() > 0">
|
||||||
|
and base.model_code in
|
||||||
|
<foreach collection="query.modelCodes" item="modelCode" open="(" separator="," close=")">
|
||||||
|
#{modelCode}
|
||||||
|
</foreach>
|
||||||
|
</if>
|
||||||
|
<if test="query.keyword != null and query.keyword != ''">
|
||||||
|
and (
|
||||||
|
base.staff_name like concat('%', trim(#{query.keyword}), '%')
|
||||||
|
or cast(base.staff_code as char) like concat('%', trim(#{query.keyword}), '%')
|
||||||
|
)
|
||||||
|
</if>
|
||||||
|
<if test="query.deptId != null">
|
||||||
|
and base.dept_id = #{query.deptId}
|
||||||
|
</if>
|
||||||
|
group by base.project_id, base.staff_id_card
|
||||||
|
<if test="query.modelCodes != null and query.modelCodes.size() > 0 and query.matchMode == 'ALL'">
|
||||||
|
having count(distinct base.model_code) = #{query.modelCodes.size}
|
||||||
|
</if>
|
||||||
|
order by max(base.staff_name) asc, base.staff_id_card asc
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="selectRiskModelNamesByScope" resultType="java.lang.String">
|
||||||
|
select distinct scoped.model_name
|
||||||
|
from (
|
||||||
|
<include refid="resolvedEmployeeRiskBaseSql"/>
|
||||||
|
) scoped
|
||||||
|
where scoped.project_id = #{projectId}
|
||||||
|
and scoped.staff_id_card = #{staffIdCard}
|
||||||
|
<if test="selectedModelCodes != null and selectedModelCodes != ''">
|
||||||
|
and find_in_set(scoped.model_code, #{selectedModelCodes})
|
||||||
|
</if>
|
||||||
|
order by scoped.model_code asc
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="selectRiskHitTagsByScope" resultType="com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskHitTagVO">
|
||||||
|
select
|
||||||
|
scoped.rule_code,
|
||||||
|
max(scoped.rule_name) as rule_name,
|
||||||
|
max(scoped.risk_level) as risk_level
|
||||||
|
from (
|
||||||
|
<include refid="resolvedEmployeeRiskBaseSql"/>
|
||||||
|
) scoped
|
||||||
|
where scoped.project_id = #{projectId}
|
||||||
|
and scoped.staff_id_card = #{staffIdCard}
|
||||||
|
<if test="selectedModelCodes != null and selectedModelCodes != ''">
|
||||||
|
and find_in_set(scoped.model_code, #{selectedModelCodes})
|
||||||
|
</if>
|
||||||
|
group by scoped.rule_code
|
||||||
|
order by case max(scoped.risk_level)
|
||||||
|
when 'HIGH' then 1
|
||||||
|
when 'MEDIUM' then 2
|
||||||
|
else 3
|
||||||
|
end,
|
||||||
|
scoped.rule_code asc
|
||||||
|
</select>
|
||||||
|
|
||||||
<select id="selectRiskCountSummaryByProjectId" resultType="map">
|
<select id="selectRiskCountSummaryByProjectId" resultType="map">
|
||||||
select
|
select
|
||||||
coalesce(sum(case when agg.rule_count >= 5 then 1 else 0 end), 0) as highRiskCount,
|
coalesce(sum(case when agg.rule_count >= 5 then 1 else 0 end), 0) as highRiskCount,
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
package com.ruoyi.ccdi.project.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
class CcdiProjectOverviewMapperRiskModelPeopleTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldExposeRiskModelPeoplePageMapperMethod() throws Exception {
|
||||||
|
Method method = CcdiProjectOverviewMapper.class.getMethod(
|
||||||
|
"selectRiskModelPeoplePage",
|
||||||
|
Page.class,
|
||||||
|
CcdiProjectRiskModelPeopleQueryDTO.class
|
||||||
|
);
|
||||||
|
|
||||||
|
assertEquals(Page.class, method.getReturnType());
|
||||||
|
assertEquals(Page.class, method.getParameterTypes()[0]);
|
||||||
|
assertEquals(CcdiProjectRiskModelPeopleQueryDTO.class, method.getParameterTypes()[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldDefineRiskModelPeopleSqlForAnyAllKeywordDeptAndScopedCollections() throws Exception {
|
||||||
|
String xml = Files.readString(Path.of("src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml"));
|
||||||
|
|
||||||
|
assertTrue(xml.contains("<select id=\"selectRiskModelPeoplePage\""));
|
||||||
|
assertTrue(xml.contains("query.modelCodes != null and query.modelCodes.size() > 0"));
|
||||||
|
assertTrue(xml.contains("query.matchMode == 'ALL'"));
|
||||||
|
assertTrue(xml.contains("count(distinct base.model_code) = #{query.modelCodes.size}"));
|
||||||
|
assertTrue(xml.contains("base.staff_name like concat('%', trim(#{query.keyword}), '%')"));
|
||||||
|
assertTrue(xml.contains("cast(base.staff_code as char) like concat('%', trim(#{query.keyword}), '%')"));
|
||||||
|
assertTrue(xml.contains("base.dept_id = #{query.deptId}"));
|
||||||
|
assertTrue(xml.contains("select=\"selectRiskModelNamesByScope\""));
|
||||||
|
assertTrue(xml.contains("select=\"selectRiskHitTagsByScope\""));
|
||||||
|
assertTrue(xml.contains("find_in_set(scoped.model_code, #{selectedModelCodes})"));
|
||||||
|
assertTrue(xml.contains("order by case max(scoped.risk_level)"));
|
||||||
|
assertTrue(xml.contains("scoped.rule_code asc"));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user