完善外部人员预警与项目分析上线内容
This commit is contained in:
@@ -215,6 +215,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
#{item}
|
||||
</foreach>
|
||||
</if>
|
||||
<if test="query.ourCertNos != null and query.ourCertNos.size() > 0">
|
||||
AND bs.cret_no IN
|
||||
<foreach collection="query.ourCertNos" item="item" open="(" separator="," close=")">
|
||||
#{item}
|
||||
</foreach>
|
||||
</if>
|
||||
<if test="query.ourBanks != null and query.ourBanks.size() > 0">
|
||||
AND bs.BANK IN
|
||||
<foreach collection="query.ourBanks" item="item" open="(" separator="," close=")">
|
||||
|
||||
@@ -41,6 +41,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
and trim(bs.cret_no) != ''
|
||||
</sql>
|
||||
|
||||
<sql id="externalPersonPredicateSql">
|
||||
bs.cret_no is not null
|
||||
and trim(bs.cret_no) != ''
|
||||
and not exists (
|
||||
select 1
|
||||
from ccdi_base_staff staff
|
||||
where staff.id_card = bs.cret_no
|
||||
)
|
||||
and not exists (
|
||||
select 1
|
||||
from ccdi_staff_fmy_relation relation
|
||||
where relation.status = 1
|
||||
and relation.relation_cert_no = bs.cret_no
|
||||
)
|
||||
and trim(IFNULL(bs.LE_ACCOUNT_NAME, '')) <> trim(IFNULL(bs.CUSTOMER_ACCOUNT_NAME, ''))
|
||||
</sql>
|
||||
|
||||
<sql id="cashDepositPredicate">
|
||||
(
|
||||
(
|
||||
@@ -466,6 +483,74 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
)
|
||||
</select>
|
||||
|
||||
<select id="selectExternalSingleLargeAmountStatements" resultMap="BankTagStatementHitResultMap">
|
||||
select
|
||||
bs.bank_statement_id AS bankStatementId,
|
||||
bs.group_id AS groupId,
|
||||
bs.batch_id AS logId,
|
||||
CONCAT(
|
||||
'外部人员“', IFNULL(bs.LE_ACCOUNT_NAME, ''),
|
||||
'”单笔交易金额 ', CAST(GREATEST(IFNULL(bs.AMOUNT_DR, 0), IFNULL(bs.AMOUNT_CR, 0)) AS CHAR),
|
||||
' 元,超过阈值 ', CAST(#{threshold} AS CHAR),
|
||||
' 元,对手方“', IFNULL(bs.CUSTOMER_ACCOUNT_NAME, ''), '”'
|
||||
) AS reasonDetail
|
||||
from ccdi_bank_statement bs
|
||||
where bs.project_id = #{projectId}
|
||||
and <include refid="externalPersonPredicateSql"/>
|
||||
and GREATEST(IFNULL(bs.AMOUNT_DR, 0), IFNULL(bs.AMOUNT_CR, 0)) > #{threshold}
|
||||
and GREATEST(IFNULL(bs.AMOUNT_DR, 0), IFNULL(bs.AMOUNT_CR, 0)) > 0
|
||||
and <include refid="financialProductExclusionPredicate"/>
|
||||
</select>
|
||||
|
||||
<select id="selectExternalCumulativeTransactionAmountObjects" resultMap="BankTagObjectHitResultMap">
|
||||
select
|
||||
'EXTERNAL_CERT_NO' AS objectType,
|
||||
t.certNo AS objectKey,
|
||||
CONCAT(
|
||||
'外部人员“', IFNULL(t.personName, ''),
|
||||
'”累计交易金额 ', CAST(t.totalAmount AS CHAR),
|
||||
' 元,超过阈值 ', CAST(#{threshold} AS CHAR), ' 元'
|
||||
) AS reasonDetail
|
||||
from (
|
||||
select
|
||||
bs.cret_no AS certNo,
|
||||
max(IFNULL(bs.LE_ACCOUNT_NAME, '')) AS personName,
|
||||
ROUND(SUM(GREATEST(IFNULL(bs.AMOUNT_DR, 0), IFNULL(bs.AMOUNT_CR, 0))), 2) AS totalAmount
|
||||
from ccdi_bank_statement bs
|
||||
where bs.project_id = #{projectId}
|
||||
and <include refid="externalPersonPredicateSql"/>
|
||||
and GREATEST(IFNULL(bs.AMOUNT_DR, 0), IFNULL(bs.AMOUNT_CR, 0)) > 0
|
||||
and <include refid="financialProductExclusionPredicate"/>
|
||||
group by bs.cret_no
|
||||
having ROUND(SUM(GREATEST(IFNULL(bs.AMOUNT_DR, 0), IFNULL(bs.AMOUNT_CR, 0))), 2) > #{threshold}
|
||||
) t
|
||||
</select>
|
||||
|
||||
<select id="selectExternalAnnualTurnoverObjects" resultMap="BankTagObjectHitResultMap">
|
||||
select
|
||||
'EXTERNAL_CERT_NO' AS objectType,
|
||||
t.certNo AS objectKey,
|
||||
CONCAT(
|
||||
'外部人员“', IFNULL(t.personName, ''),
|
||||
'”近一年流水交易额 ', CAST(t.annualAmount AS CHAR),
|
||||
' 元,超过阈值 ', CAST(#{threshold} AS CHAR), ' 元'
|
||||
) AS reasonDetail
|
||||
from (
|
||||
select
|
||||
bs.cret_no AS certNo,
|
||||
max(IFNULL(bs.LE_ACCOUNT_NAME, '')) AS personName,
|
||||
ROUND(SUM(GREATEST(IFNULL(bs.AMOUNT_DR, 0), IFNULL(bs.AMOUNT_CR, 0))), 2) AS annualAmount
|
||||
from ccdi_bank_statement bs
|
||||
where bs.project_id = #{projectId}
|
||||
and <include refid="externalPersonPredicateSql"/>
|
||||
and GREATEST(IFNULL(bs.AMOUNT_DR, 0), IFNULL(bs.AMOUNT_CR, 0)) > 0
|
||||
and <include refid="financialProductExclusionPredicate"/>
|
||||
and STR_TO_DATE(LEFT(TRIM(bs.TRX_DATE), 10), '%Y-%m-%d') >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
|
||||
group by bs.cret_no
|
||||
having ROUND(SUM(GREATEST(IFNULL(bs.AMOUNT_DR, 0), IFNULL(bs.AMOUNT_CR, 0))), 2) > #{threshold}
|
||||
) t
|
||||
</select>
|
||||
|
||||
<select id="selectAbnormalCustomerTransactionStatements" resultMap="BankTagStatementHitResultMap">
|
||||
select
|
||||
hit.bankStatementId AS bankStatementId,
|
||||
@@ -702,6 +787,72 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
)
|
||||
</select>
|
||||
|
||||
<select id="selectExternalGamblingMemoStatements" resultMap="BankTagStatementHitResultMap">
|
||||
select
|
||||
bs.bank_statement_id AS bankStatementId,
|
||||
bs.group_id AS groupId,
|
||||
bs.batch_id AS logId,
|
||||
CONCAT(
|
||||
'外部人员“', IFNULL(bs.LE_ACCOUNT_NAME, ''),
|
||||
'”摘要/对手方命中疑似赌博关键词,摘要“', IFNULL(bs.USER_MEMO, ''),
|
||||
'”,对手方“', IFNULL(bs.CUSTOMER_ACCOUNT_NAME, ''),
|
||||
'”,交易金额 ', CAST(GREATEST(IFNULL(bs.AMOUNT_DR, 0), IFNULL(bs.AMOUNT_CR, 0)) AS CHAR), ' 元'
|
||||
) AS reasonDetail
|
||||
from ccdi_bank_statement bs
|
||||
where bs.project_id = #{projectId}
|
||||
and <include refid="externalPersonPredicateSql"/>
|
||||
and GREATEST(IFNULL(bs.AMOUNT_DR, 0), IFNULL(bs.AMOUNT_CR, 0)) > 0
|
||||
and (
|
||||
IFNULL(bs.USER_MEMO, '') REGEXP '游戏|抖币|体彩|福彩|彩票|赌博|赌球|下注|投注|球赛投注|外围|博彩|六合|时时彩|赛车|赌场|筹码|盘口|返水|洗码|庄家|闲家|百家乐|斗牛|炸金花|牌九|麻将|牌局|捕鱼|电子游艺|VIP666|USDT下注'
|
||||
or IFNULL(bs.CUSTOMER_ACCOUNT_NAME, '') REGEXP '游戏|抖币|体彩|福彩|彩票|赌博|赌球|下注|投注|球赛投注|外围|博彩|六合|时时彩|赛车|赌场|筹码|盘口|返水|洗码|庄家|闲家|百家乐|斗牛|炸金花|牌九|麻将|牌局|捕鱼|电子游艺|VIP666|USDT下注'
|
||||
or IFNULL(bs.CASH_TYPE, '') REGEXP '游戏|抖币|体彩|福彩|彩票|赌博|赌球|下注|投注|球赛投注|外围|博彩|六合|时时彩|赛车|赌场|筹码|盘口|返水|洗码|庄家|闲家|百家乐|斗牛|炸金花|牌九|麻将|牌局|捕鱼|电子游艺|VIP666|USDT下注'
|
||||
)
|
||||
</select>
|
||||
|
||||
<select id="selectExternalMultiPartyGamblingTransferObjects" resultMap="BankTagObjectHitResultMap">
|
||||
select
|
||||
'EXTERNAL_CERT_NO' AS objectType,
|
||||
t.certNo AS objectKey,
|
||||
CONCAT(
|
||||
'外部人员“', IFNULL(MAX(t.personName), ''),
|
||||
'”交易日 ', MAX(t.tradeDate),
|
||||
' 发生 ', CAST(MAX(t.hitCount) AS CHAR),
|
||||
' 笔疑似赌博交易,涉及 ', CAST(MAX(t.partyCount) AS CHAR),
|
||||
' 个对手方,金额合计 ', CAST(MAX(t.totalAmount) AS CHAR), ' 元'
|
||||
) AS reasonDetail
|
||||
from (
|
||||
select
|
||||
source.certNo AS certNo,
|
||||
max(source.personName) AS personName,
|
||||
source.tradeDate AS tradeDate,
|
||||
COUNT(1) AS hitCount,
|
||||
COUNT(DISTINCT source.customerAccountName) AS partyCount,
|
||||
ROUND(SUM(source.tradeAmount), 2) AS totalAmount
|
||||
from (
|
||||
select
|
||||
bs.cret_no AS certNo,
|
||||
IFNULL(bs.LE_ACCOUNT_NAME, '') AS personName,
|
||||
LEFT(TRIM(bs.TRX_DATE), 10) AS tradeDate,
|
||||
bs.CUSTOMER_ACCOUNT_NAME AS customerAccountName,
|
||||
GREATEST(IFNULL(bs.AMOUNT_DR, 0), IFNULL(bs.AMOUNT_CR, 0)) AS tradeAmount
|
||||
from ccdi_bank_statement bs
|
||||
where bs.project_id = #{projectId}
|
||||
and <include refid="externalPersonPredicateSql"/>
|
||||
and GREATEST(IFNULL(bs.AMOUNT_DR, 0), IFNULL(bs.AMOUNT_CR, 0)) between #{amountMinThreshold} and #{amountMaxThreshold}
|
||||
and IFNULL(bs.CUSTOMER_ACCOUNT_NAME, '') <> ''
|
||||
and (
|
||||
IFNULL(bs.USER_MEMO, '') REGEXP '微信|wechat|WeChat|财付通|Tenpay|支付宝|Alipay|转账|红包|牌局|赌'
|
||||
or IFNULL(bs.CASH_TYPE, '') REGEXP '微信|wechat|WeChat|财付通|Tenpay|支付宝|Alipay|转账|红包|牌局|赌'
|
||||
or IFNULL(bs.CUSTOMER_ACCOUNT_NAME, '') REGEXP '微信|wechat|WeChat|财付通|Tenpay|支付宝|Alipay'
|
||||
)
|
||||
) source
|
||||
group by source.certNo, source.tradeDate
|
||||
having COUNT(1) > 2
|
||||
and COUNT(DISTINCT source.customerAccountName) >= 2
|
||||
) t
|
||||
group by t.certNo
|
||||
</select>
|
||||
|
||||
<select id="selectSpecialAmountTransactionStatements" resultMap="BankTagStatementHitResultMap">
|
||||
select
|
||||
bs.bank_statement_id AS bankStatementId,
|
||||
@@ -728,6 +879,74 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
)
|
||||
</select>
|
||||
|
||||
<select id="selectExternalToStaffOrFamilyTransactionStatements" resultMap="BankTagStatementHitResultMap">
|
||||
select distinct
|
||||
bs.bank_statement_id AS bankStatementId,
|
||||
bs.group_id AS groupId,
|
||||
bs.batch_id AS logId,
|
||||
CONCAT(
|
||||
'外部人员“', IFNULL(bs.LE_ACCOUNT_NAME, ''),
|
||||
'”与', CASE
|
||||
WHEN counter_account.owner_type = 'EMPLOYEE' THEN '员工'
|
||||
WHEN counter_account.owner_type = 'RELATION' THEN '员工亲属'
|
||||
WHEN counter_staff.id_card is not null THEN '员工'
|
||||
WHEN counter_relation.relation_cert_no is not null THEN '员工亲属'
|
||||
ELSE '员工/员工亲属'
|
||||
END,
|
||||
'“', IFNULL(bs.CUSTOMER_ACCOUNT_NAME, ''),
|
||||
'”发生资金往来,交易金额 ',
|
||||
CAST(GREATEST(IFNULL(bs.AMOUNT_DR, 0), IFNULL(bs.AMOUNT_CR, 0)) AS CHAR), ' 元'
|
||||
) AS reasonDetail
|
||||
from ccdi_bank_statement bs
|
||||
left join ccdi_account_info counter_account
|
||||
on trim(bs.CUSTOMER_ACCOUNT_NO) != ''
|
||||
and counter_account.account_no = trim(bs.CUSTOMER_ACCOUNT_NO)
|
||||
and counter_account.owner_type in ('EMPLOYEE', 'RELATION', 'INTERMEDIARY', 'CREDIT_CUSTOMER')
|
||||
left join ccdi_base_staff counter_staff
|
||||
on counter_account.account_no is null
|
||||
and trim(bs.CUSTOMER_ACCOUNT_NAME) != ''
|
||||
and counter_staff.name = trim(bs.CUSTOMER_ACCOUNT_NAME)
|
||||
left join ccdi_staff_fmy_relation counter_relation
|
||||
on counter_account.account_no is null
|
||||
and counter_relation.status = 1
|
||||
and trim(bs.CUSTOMER_ACCOUNT_NAME) != ''
|
||||
and counter_relation.relation_name = trim(bs.CUSTOMER_ACCOUNT_NAME)
|
||||
where bs.project_id = #{projectId}
|
||||
and <include refid="externalPersonPredicateSql"/>
|
||||
and GREATEST(IFNULL(bs.AMOUNT_DR, 0), IFNULL(bs.AMOUNT_CR, 0)) > 0
|
||||
and (
|
||||
counter_account.owner_type in ('EMPLOYEE', 'RELATION')
|
||||
or (
|
||||
counter_account.account_no is null
|
||||
and (
|
||||
counter_staff.id_card is not null
|
||||
or counter_relation.relation_cert_no is not null
|
||||
)
|
||||
)
|
||||
)
|
||||
</select>
|
||||
|
||||
<select id="selectExternalNightTransactionStatements" resultMap="BankTagStatementHitResultMap">
|
||||
select
|
||||
bs.bank_statement_id AS bankStatementId,
|
||||
bs.group_id AS groupId,
|
||||
bs.batch_id AS logId,
|
||||
CONCAT(
|
||||
'外部人员“', IFNULL(bs.LE_ACCOUNT_NAME, ''),
|
||||
'”夜间交易,交易时间 ', IFNULL(bs.TRX_DATE, ''),
|
||||
',对手方“', IFNULL(bs.CUSTOMER_ACCOUNT_NAME, ''),
|
||||
'”,交易金额 ', CAST(GREATEST(IFNULL(bs.AMOUNT_DR, 0), IFNULL(bs.AMOUNT_CR, 0)) AS CHAR), ' 元'
|
||||
) AS reasonDetail
|
||||
from ccdi_bank_statement bs
|
||||
where bs.project_id = #{projectId}
|
||||
and <include refid="externalPersonPredicateSql"/>
|
||||
and GREATEST(IFNULL(bs.AMOUNT_DR, 0), IFNULL(bs.AMOUNT_CR, 0)) > 0
|
||||
and (
|
||||
HOUR(STR_TO_DATE(LEFT(TRIM(bs.TRX_DATE), 19), '%Y-%m-%d %H:%i:%s')) >= 22
|
||||
or HOUR(STR_TO_DATE(LEFT(TRIM(bs.TRX_DATE), 19), '%Y-%m-%d %H:%i:%s')) < 6
|
||||
)
|
||||
</select>
|
||||
|
||||
<select id="selectMonthlyFixedIncomeObjects" resultMap="BankTagObjectHitResultMap">
|
||||
select
|
||||
'STAFF_ID_CARD' AS objectType,
|
||||
|
||||
@@ -33,6 +33,38 @@
|
||||
select="selectRiskHitTagsByScope"/>
|
||||
</resultMap>
|
||||
|
||||
<resultMap id="ExternalRiskModelPeopleItemResultMap" type="com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelPeopleItemVO">
|
||||
<id property="idNo" column="cert_no"/>
|
||||
<result property="staffName" column="person_name"/>
|
||||
<result property="staffCode" column="subject_type"/>
|
||||
<result property="department" column="related_object"/>
|
||||
<collection property="modelNames"
|
||||
column="{projectId=project_id,certNo=cert_no,selectedModelCodes=selected_model_codes}"
|
||||
ofType="java.lang.String"
|
||||
select="selectExternalRiskModelNamesByScope"/>
|
||||
<collection property="hitTagList"
|
||||
column="{projectId=project_id,certNo=cert_no,selectedModelCodes=selected_model_codes}"
|
||||
ofType="com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskHitTagVO"
|
||||
select="selectExternalRiskHitTagsByScope"/>
|
||||
</resultMap>
|
||||
|
||||
<resultMap id="ExternalPersonWarningItemResultMap" type="com.ruoyi.ccdi.project.domain.vo.CcdiProjectExternalPersonWarningItemVO">
|
||||
<result property="name" column="person_name"/>
|
||||
<result property="idNo" column="cert_no"/>
|
||||
<result property="subjectType" column="subject_type"/>
|
||||
<result property="riskLevel" column="risk_level_name"/>
|
||||
<result property="riskLevelType" column="risk_level_type"/>
|
||||
<result property="riskCount" column="risk_count"/>
|
||||
<result property="modelCount" column="model_count"/>
|
||||
<result property="riskPoint" column="risk_point"/>
|
||||
<result property="relatedObject" column="related_object"/>
|
||||
<result property="latestTradeTime" column="latest_trade_time"/>
|
||||
<collection property="riskPointTagList"
|
||||
column="{projectId=project_id,certNo=cert_no,selectedModelCodes=selected_model_codes}"
|
||||
ofType="com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskHitTagVO"
|
||||
select="selectExternalRiskHitTagsByScope"/>
|
||||
</resultMap>
|
||||
|
||||
<resultMap id="SuspiciousTransactionItemResultMap" type="com.ruoyi.ccdi.project.domain.vo.CcdiProjectSuspiciousTransactionItemVO">
|
||||
<id property="bankStatementId" column="bankStatementId"/>
|
||||
<result property="trxDate" column="trxDate"/>
|
||||
@@ -115,6 +147,13 @@
|
||||
) tens
|
||||
</sql>
|
||||
|
||||
<sql id="externalModelCodeFilterSql">
|
||||
('EXTERNAL_LARGE_TRANSACTION',
|
||||
'EXTERNAL_ABNORMAL_TRANSACTION',
|
||||
'EXTERNAL_SUSPICIOUS_GAMBLING',
|
||||
'EXTERNAL_SUSPICIOUS_RELATION')
|
||||
</sql>
|
||||
|
||||
<sql id="resolvedEmployeeRiskBaseSql">
|
||||
select distinct
|
||||
tr.id,
|
||||
@@ -494,6 +533,401 @@
|
||||
order by result.staff_name asc, result.staff_id_card asc
|
||||
</select>
|
||||
|
||||
<select id="selectRiskModelPeopleList" resultMap="RiskModelPeopleItemResultMap">
|
||||
<bind name="projectId" value="query.projectId"/>
|
||||
select
|
||||
result.project_id,
|
||||
result.staff_id_card,
|
||||
result.staff_name,
|
||||
result.staff_code,
|
||||
result.dept_name as department,
|
||||
#{query.modelCodesCsv} as selected_model_codes
|
||||
from ccdi_project_overview_employee_result result
|
||||
where 1 = 1
|
||||
and result.project_id = #{query.projectId}
|
||||
<if test="query.modelCodes != null and query.modelCodes.size() > 0">
|
||||
<choose>
|
||||
<when test="query.matchMode == 'ALL'">
|
||||
<foreach collection="query.modelCodes" item="modelCode">
|
||||
and find_in_set(#{modelCode}, result.model_codes_csv)
|
||||
</foreach>
|
||||
</when>
|
||||
<otherwise>
|
||||
and (
|
||||
<foreach collection="query.modelCodes" item="modelCode" separator=" or ">
|
||||
find_in_set(#{modelCode}, result.model_codes_csv)
|
||||
</foreach>
|
||||
)
|
||||
</otherwise>
|
||||
</choose>
|
||||
</if>
|
||||
<if test="query.keyword != null and query.keyword != ''">
|
||||
and (
|
||||
result.staff_name like concat('%', trim(#{query.keyword}), '%')
|
||||
or result.staff_code like concat('%', trim(#{query.keyword}), '%')
|
||||
)
|
||||
</if>
|
||||
<if test="query.deptId != null">
|
||||
and result.dept_id = #{query.deptId}
|
||||
</if>
|
||||
order by result.staff_name asc, result.staff_id_card asc
|
||||
</select>
|
||||
|
||||
<sql id="externalPersonSubjectSql">
|
||||
select
|
||||
bs.project_id,
|
||||
bs.cret_no as cert_no,
|
||||
coalesce(
|
||||
max(intermediary.name),
|
||||
max(customer.name),
|
||||
max(nullif(trim(bs.LE_ACCOUNT_NAME), '')),
|
||||
'外部人员'
|
||||
) as person_name,
|
||||
case
|
||||
when max(case when intermediary.person_id is not null then 1 else 0 end) > 0 then '中介'
|
||||
when max(case when customer.person_id is not null then 1 else 0 end) > 0 then '客户'
|
||||
else '外部人员'
|
||||
end as subject_type
|
||||
from ccdi_bank_statement bs
|
||||
left join ccdi_base_staff staff
|
||||
on staff.id_card = bs.cret_no
|
||||
left join ccdi_staff_fmy_relation relation
|
||||
on relation.status = 1
|
||||
and relation.relation_cert_no = bs.cret_no
|
||||
left join ccdi_biz_intermediary intermediary
|
||||
on intermediary.person_sub_type = '本人'
|
||||
and intermediary.person_id = bs.cret_no
|
||||
left join ccdi_credit_customer_base customer
|
||||
on customer.person_id = bs.cret_no
|
||||
where bs.project_id = #{externalProjectId}
|
||||
and bs.cret_no is not null
|
||||
and trim(bs.cret_no) != ''
|
||||
and staff.id_card is null
|
||||
and relation.relation_cert_no is null
|
||||
group by bs.project_id, bs.cret_no
|
||||
</sql>
|
||||
|
||||
<sql id="externalPersonSourceSql">
|
||||
select
|
||||
subject.project_id,
|
||||
subject.cert_no,
|
||||
subject.person_name,
|
||||
subject.subject_type,
|
||||
bs.bank_statement_id,
|
||||
bs.TRX_DATE as trx_date,
|
||||
bs.CUSTOMER_ACCOUNT_NAME as customer_account_name,
|
||||
bs.customer_cert_no,
|
||||
case
|
||||
when counter_account.owner_type = 'EMPLOYEE' then '员工'
|
||||
when counter_account.owner_type = 'RELATION' then '员工亲属'
|
||||
when counter_account.owner_type = 'CREDIT_CUSTOMER' then '信贷客户'
|
||||
when counter_account.owner_type = 'INTERMEDIARY' then '中介库人员'
|
||||
when counter_staff.id_card is not null then '员工'
|
||||
when counter_relation.relation_cert_no is not null then '员工亲属'
|
||||
when counter_intermediary.person_id is not null then '中介库人员'
|
||||
else null
|
||||
end as related_object,
|
||||
tr.model_code,
|
||||
tr.model_name,
|
||||
tr.rule_code,
|
||||
tr.rule_name,
|
||||
tr.risk_level
|
||||
from (
|
||||
<include refid="externalPersonSubjectSql"/>
|
||||
) subject
|
||||
inner join ccdi_bank_statement bs
|
||||
on bs.project_id = subject.project_id
|
||||
and bs.cret_no = subject.cert_no
|
||||
inner join ccdi_bank_statement_tag_result tr
|
||||
on tr.project_id = bs.project_id
|
||||
and tr.bank_statement_id = bs.bank_statement_id
|
||||
and tr.model_code in <include refid="externalModelCodeFilterSql"/>
|
||||
left join ccdi_account_info counter_account
|
||||
on trim(bs.CUSTOMER_ACCOUNT_NO) != ''
|
||||
and counter_account.account_no = trim(bs.CUSTOMER_ACCOUNT_NO)
|
||||
and counter_account.owner_type in ('EMPLOYEE', 'RELATION', 'INTERMEDIARY', 'CREDIT_CUSTOMER')
|
||||
left join ccdi_base_staff counter_staff
|
||||
on counter_account.account_no is null
|
||||
and trim(bs.CUSTOMER_ACCOUNT_NAME) != ''
|
||||
and counter_staff.name = trim(bs.CUSTOMER_ACCOUNT_NAME)
|
||||
left join ccdi_staff_fmy_relation counter_relation
|
||||
on counter_account.account_no is null
|
||||
and counter_relation.status = 1
|
||||
and trim(bs.CUSTOMER_ACCOUNT_NAME) != ''
|
||||
and counter_relation.relation_name = trim(bs.CUSTOMER_ACCOUNT_NAME)
|
||||
left join ccdi_biz_intermediary counter_intermediary
|
||||
on counter_account.account_no is null
|
||||
and counter_intermediary.person_sub_type = '本人'
|
||||
and trim(bs.CUSTOMER_ACCOUNT_NAME) != ''
|
||||
and counter_intermediary.name = trim(bs.CUSTOMER_ACCOUNT_NAME)
|
||||
where trim(ifnull(bs.LE_ACCOUNT_NAME, '')) != trim(ifnull(bs.CUSTOMER_ACCOUNT_NAME, ''))
|
||||
|
||||
union all
|
||||
|
||||
select
|
||||
subject.project_id,
|
||||
subject.cert_no,
|
||||
subject.person_name,
|
||||
subject.subject_type,
|
||||
null as bank_statement_id,
|
||||
null as trx_date,
|
||||
null as customer_account_name,
|
||||
null as customer_cert_no,
|
||||
'资金' as related_object,
|
||||
tr.model_code,
|
||||
tr.model_name,
|
||||
tr.rule_code,
|
||||
tr.rule_name,
|
||||
tr.risk_level
|
||||
from (
|
||||
<include refid="externalPersonSubjectSql"/>
|
||||
) subject
|
||||
inner join ccdi_bank_statement_tag_result tr
|
||||
on tr.project_id = subject.project_id
|
||||
and tr.object_type = 'EXTERNAL_CERT_NO'
|
||||
and tr.object_key = subject.cert_no
|
||||
and tr.model_code in <include refid="externalModelCodeFilterSql"/>
|
||||
</sql>
|
||||
|
||||
<sql id="externalPersonAggregateSql">
|
||||
select
|
||||
source.project_id,
|
||||
source.cert_no,
|
||||
max(source.person_name) as person_name,
|
||||
max(source.subject_type) as subject_type,
|
||||
count(*) as risk_count,
|
||||
count(distinct source.model_code) as model_count,
|
||||
group_concat(distinct source.rule_name order by source.rule_name separator '、') as risk_point,
|
||||
group_concat(distinct source.related_object order by source.related_object separator '、') as related_object,
|
||||
max(source.trx_date) as latest_trade_time,
|
||||
case
|
||||
when sum(case when source.risk_level = 'HIGH' then 1 else 0 end) > 0 then 'HIGH'
|
||||
when sum(case when source.risk_level = 'MEDIUM' then 1 else 0 end) > 0 then 'MEDIUM'
|
||||
else 'LOW'
|
||||
end as risk_level_code,
|
||||
null as selected_model_codes
|
||||
from (
|
||||
<include refid="externalPersonSourceSql"/>
|
||||
) source
|
||||
group by source.project_id, source.cert_no
|
||||
</sql>
|
||||
|
||||
<sql id="externalPersonWarningSelectSql">
|
||||
select
|
||||
agg.project_id,
|
||||
agg.cert_no,
|
||||
agg.person_name,
|
||||
agg.subject_type,
|
||||
agg.risk_count,
|
||||
agg.model_count,
|
||||
agg.risk_point,
|
||||
coalesce(agg.related_object, '-') as related_object,
|
||||
agg.latest_trade_time,
|
||||
agg.risk_level_code,
|
||||
case
|
||||
when agg.risk_level_code = 'HIGH' then '高风险'
|
||||
when agg.risk_level_code = 'MEDIUM' then '中风险'
|
||||
else '低风险'
|
||||
end as risk_level_name,
|
||||
case
|
||||
when agg.risk_level_code = 'HIGH' then 'danger'
|
||||
when agg.risk_level_code = 'MEDIUM' then 'warning'
|
||||
else 'info'
|
||||
end as risk_level_type,
|
||||
case
|
||||
when agg.risk_level_code = 'HIGH' then 1
|
||||
when agg.risk_level_code = 'MEDIUM' then 2
|
||||
else 3
|
||||
end as risk_level_sort,
|
||||
agg.selected_model_codes
|
||||
from (
|
||||
<include refid="externalPersonAggregateSql"/>
|
||||
) agg
|
||||
</sql>
|
||||
|
||||
<select id="selectExternalPersonWarningPage" resultMap="ExternalPersonWarningItemResultMap">
|
||||
<bind name="externalProjectId" value="query.projectId"/>
|
||||
select *
|
||||
from (
|
||||
<include refid="externalPersonWarningSelectSql"/>
|
||||
) warning
|
||||
order by warning.risk_level_sort asc, warning.model_count desc, warning.risk_count desc, warning.latest_trade_time desc
|
||||
</select>
|
||||
|
||||
<select id="selectExternalPersonWarningList" resultMap="ExternalPersonWarningItemResultMap">
|
||||
<bind name="externalProjectId" value="projectId"/>
|
||||
select *
|
||||
from (
|
||||
<include refid="externalPersonWarningSelectSql"/>
|
||||
) warning
|
||||
order by warning.risk_level_sort asc, warning.model_count desc, warning.risk_count desc, warning.latest_trade_time desc
|
||||
</select>
|
||||
|
||||
<select id="selectExternalRiskSummaryByProjectId" resultType="com.ruoyi.ccdi.project.domain.vo.CcdiProjectExternalRiskSummaryVO">
|
||||
<bind name="externalProjectId" value="projectId"/>
|
||||
select
|
||||
count(*) as total,
|
||||
coalesce(sum(case when risk.risk_level_code = 'HIGH' then 1 else 0 end), 0) as high,
|
||||
coalesce(sum(case when risk.risk_level_code = 'MEDIUM' then 1 else 0 end), 0) as medium,
|
||||
coalesce(sum(case when risk.risk_level_code = 'LOW' then 1 else 0 end), 0) as low,
|
||||
coalesce(sum(case when risk.risk_level_code is null then 1 else 0 end), 0) as noRisk
|
||||
from (
|
||||
<include refid="externalPersonSubjectSql"/>
|
||||
) subject
|
||||
left join (
|
||||
<include refid="externalPersonAggregateSql"/>
|
||||
) risk
|
||||
on risk.project_id = subject.project_id
|
||||
and risk.cert_no = subject.cert_no
|
||||
</select>
|
||||
|
||||
<select id="selectExternalRiskModelCardsByProjectId" resultType="com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelCardVO">
|
||||
<bind name="externalProjectId" value="projectId"/>
|
||||
select
|
||||
model_scope.model_code,
|
||||
max(model_scope.model_name) as model_name,
|
||||
count(*) as warning_count,
|
||||
count(distinct model_scope.cert_no) as people_count
|
||||
from (
|
||||
<include refid="externalPersonSourceSql"/>
|
||||
) model_scope
|
||||
group by model_scope.model_code
|
||||
order by warning_count desc, model_scope.model_code asc
|
||||
</select>
|
||||
|
||||
<select id="selectExternalRiskModelPeoplePage" resultMap="ExternalRiskModelPeopleItemResultMap">
|
||||
<bind name="externalProjectId" value="query.projectId"/>
|
||||
select
|
||||
warning.project_id,
|
||||
warning.cert_no,
|
||||
warning.person_name,
|
||||
warning.subject_type,
|
||||
warning.related_object,
|
||||
#{query.modelCodesCsv} as selected_model_codes
|
||||
from (
|
||||
<include refid="externalPersonWarningSelectSql"/>
|
||||
) warning
|
||||
where 1 = 1
|
||||
<if test="query.modelCodes != null and query.modelCodes.size() > 0">
|
||||
<choose>
|
||||
<when test="query.matchMode == 'ALL'">
|
||||
<foreach collection="query.modelCodes" item="modelCode">
|
||||
and exists (
|
||||
select 1
|
||||
from (
|
||||
<include refid="externalPersonSourceSql"/>
|
||||
) source
|
||||
where source.cert_no = warning.cert_no
|
||||
and source.model_code = #{modelCode}
|
||||
)
|
||||
</foreach>
|
||||
</when>
|
||||
<otherwise>
|
||||
and exists (
|
||||
select 1
|
||||
from (
|
||||
<include refid="externalPersonSourceSql"/>
|
||||
) source
|
||||
where source.cert_no = warning.cert_no
|
||||
and source.model_code in
|
||||
<foreach collection="query.modelCodes" item="modelCode" open="(" separator="," close=")">
|
||||
#{modelCode}
|
||||
</foreach>
|
||||
)
|
||||
</otherwise>
|
||||
</choose>
|
||||
</if>
|
||||
<if test="query.keyword != null and query.keyword != ''">
|
||||
and (
|
||||
warning.person_name like concat('%', trim(#{query.keyword}), '%')
|
||||
or warning.cert_no like concat('%', trim(#{query.keyword}), '%')
|
||||
)
|
||||
</if>
|
||||
order by warning.person_name asc, warning.cert_no asc
|
||||
</select>
|
||||
|
||||
<select id="selectExternalRiskModelPeopleList" resultMap="ExternalRiskModelPeopleItemResultMap">
|
||||
<bind name="externalProjectId" value="query.projectId"/>
|
||||
select
|
||||
warning.project_id,
|
||||
warning.cert_no,
|
||||
warning.person_name,
|
||||
warning.subject_type,
|
||||
warning.related_object,
|
||||
#{query.modelCodesCsv} as selected_model_codes
|
||||
from (
|
||||
<include refid="externalPersonWarningSelectSql"/>
|
||||
) warning
|
||||
where 1 = 1
|
||||
<if test="query.modelCodes != null and query.modelCodes.size() > 0">
|
||||
<choose>
|
||||
<when test="query.matchMode == 'ALL'">
|
||||
<foreach collection="query.modelCodes" item="modelCode">
|
||||
and exists (
|
||||
select 1
|
||||
from (
|
||||
<include refid="externalPersonSourceSql"/>
|
||||
) source
|
||||
where source.cert_no = warning.cert_no
|
||||
and source.model_code = #{modelCode}
|
||||
)
|
||||
</foreach>
|
||||
</when>
|
||||
<otherwise>
|
||||
and exists (
|
||||
select 1
|
||||
from (
|
||||
<include refid="externalPersonSourceSql"/>
|
||||
) source
|
||||
where source.cert_no = warning.cert_no
|
||||
and source.model_code in
|
||||
<foreach collection="query.modelCodes" item="modelCode" open="(" separator="," close=")">
|
||||
#{modelCode}
|
||||
</foreach>
|
||||
)
|
||||
</otherwise>
|
||||
</choose>
|
||||
</if>
|
||||
<if test="query.keyword != null and query.keyword != ''">
|
||||
and (
|
||||
warning.person_name like concat('%', trim(#{query.keyword}), '%')
|
||||
or warning.cert_no like concat('%', trim(#{query.keyword}), '%')
|
||||
)
|
||||
</if>
|
||||
order by warning.person_name asc, warning.cert_no asc
|
||||
</select>
|
||||
|
||||
<select id="selectExternalRiskModelNamesByScope" resultType="java.lang.String">
|
||||
<bind name="externalProjectId" value="projectId"/>
|
||||
select distinct source.model_name
|
||||
from (
|
||||
<include refid="externalPersonSourceSql"/>
|
||||
) source
|
||||
where source.cert_no = #{certNo}
|
||||
<if test="selectedModelCodes != null and selectedModelCodes != ''">
|
||||
and find_in_set(source.model_code, #{selectedModelCodes})
|
||||
</if>
|
||||
order by source.model_name asc
|
||||
</select>
|
||||
|
||||
<select id="selectExternalRiskHitTagsByScope" resultType="com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskHitTagVO">
|
||||
<bind name="externalProjectId" value="projectId"/>
|
||||
select distinct
|
||||
source.model_code as modelCode,
|
||||
source.model_name as modelName,
|
||||
source.rule_code as ruleCode,
|
||||
source.rule_name as ruleName,
|
||||
source.risk_level as riskLevel
|
||||
from (
|
||||
<include refid="externalPersonSourceSql"/>
|
||||
) source
|
||||
where source.cert_no = #{certNo}
|
||||
<if test="selectedModelCodes != null and selectedModelCodes != ''">
|
||||
and find_in_set(source.model_code, #{selectedModelCodes})
|
||||
</if>
|
||||
order by source.model_code asc, source.rule_code asc
|
||||
</select>
|
||||
|
||||
<sql id="suspiciousTransactionBaseSql">
|
||||
select
|
||||
bs.bank_statement_id as bankStatementId,
|
||||
@@ -606,6 +1040,34 @@
|
||||
) hits
|
||||
</sql>
|
||||
|
||||
<sql id="externalSuspiciousTransactionSql">
|
||||
select
|
||||
bs.bank_statement_id as bankStatementId,
|
||||
bs.TRX_DATE as trxDate,
|
||||
source.person_name as relatedPersonName,
|
||||
null as relatedStaffName,
|
||||
null as relatedStaffCode,
|
||||
source.subject_type as relationType,
|
||||
bs.USER_MEMO as userMemo,
|
||||
bs.CASH_TYPE as cashType,
|
||||
case
|
||||
when ifnull(bs.AMOUNT_CR, 0) > 0 then bs.AMOUNT_CR
|
||||
when ifnull(bs.AMOUNT_DR, 0) > 0 then -bs.AMOUNT_DR
|
||||
else 0
|
||||
end as displayAmount,
|
||||
1 as hasModelRuleHit,
|
||||
0 as hasNameListHit,
|
||||
source.person_name as suspiciousPersonName,
|
||||
9 as matchPriority,
|
||||
'外部人员预警' as nameListHitType
|
||||
from (
|
||||
<bind name="externalProjectId" value="query.projectId"/>
|
||||
<include refid="externalPersonSourceSql"/>
|
||||
) source
|
||||
inner join ccdi_bank_statement bs
|
||||
on bs.bank_statement_id = source.bank_statement_id
|
||||
</sql>
|
||||
|
||||
<sql id="suspiciousTransactionMergedSql">
|
||||
select
|
||||
base.bankStatementId,
|
||||
@@ -652,6 +1114,27 @@
|
||||
inner join (
|
||||
<include refid="suspiciousTransactionNameHitSql"/>
|
||||
) name_hits on name_hits.bankStatementId = base.bankStatementId
|
||||
|
||||
union all
|
||||
|
||||
select
|
||||
external_hits.bankStatementId,
|
||||
external_hits.trxDate,
|
||||
external_hits.relatedPersonName,
|
||||
external_hits.relatedStaffName,
|
||||
external_hits.relatedStaffCode,
|
||||
external_hits.relationType,
|
||||
external_hits.userMemo,
|
||||
external_hits.cashType,
|
||||
external_hits.displayAmount,
|
||||
external_hits.hasModelRuleHit,
|
||||
external_hits.hasNameListHit,
|
||||
external_hits.suspiciousPersonName,
|
||||
external_hits.matchPriority,
|
||||
external_hits.nameListHitType
|
||||
from (
|
||||
<include refid="externalSuspiciousTransactionSql"/>
|
||||
) external_hits
|
||||
</sql>
|
||||
|
||||
<sql id="suspiciousTransactionAggregatedSql">
|
||||
@@ -706,6 +1189,9 @@
|
||||
<when test="query.suspiciousType == 'MODEL_RULE'">
|
||||
where final_result.hasModelRuleHit = 1
|
||||
</when>
|
||||
<when test="query.suspiciousType == 'EXTERNAL_PERSON'">
|
||||
where final_result.nameListHitType = '外部人员预警'
|
||||
</when>
|
||||
<otherwise>
|
||||
where final_result.hasModelRuleHit = 1 or final_result.hasNameListHit = 1
|
||||
</otherwise>
|
||||
@@ -1073,4 +1559,5 @@
|
||||
group by base.staff_id_card
|
||||
) agg
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
||||
@@ -114,32 +114,18 @@
|
||||
|
||||
<sql id="projectEmployeeScopeSql">
|
||||
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,
|
||||
statement_staff.id_card as staff_id_card,
|
||||
cast(statement_staff.staff_id as char) as staff_code,
|
||||
statement_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
|
||||
from ccdi_bank_statement bs
|
||||
inner join ccdi_base_staff statement_staff
|
||||
on statement_staff.id_card = trim(bs.cret_no)
|
||||
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
|
||||
on dept.dept_id = statement_staff.dept_id
|
||||
where bs.project_id = #{projectId}
|
||||
and bs.cret_no is not null
|
||||
and trim(bs.cret_no) != ''
|
||||
</sql>
|
||||
|
||||
<sql id="spouseRelationSql">
|
||||
|
||||
Reference in New Issue
Block a user