feat: 补齐流水标签规则分析SQL
This commit is contained in:
@@ -0,0 +1,19 @@
|
|||||||
|
package com.ruoyi.ccdi.project.domain.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对象级标签命中结果
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class BankTagObjectHitVO {
|
||||||
|
|
||||||
|
/** 对象类型 */
|
||||||
|
private String objectType;
|
||||||
|
|
||||||
|
/** 对象主键 */
|
||||||
|
private String objectKey;
|
||||||
|
|
||||||
|
/** 异常原因摘要 */
|
||||||
|
private String reasonDetail;
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.ruoyi.ccdi.project.domain.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流水级标签命中结果
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class BankTagStatementHitVO {
|
||||||
|
|
||||||
|
/** 流水ID */
|
||||||
|
private Long bankStatementId;
|
||||||
|
|
||||||
|
/** 项目分组ID */
|
||||||
|
private Integer groupId;
|
||||||
|
|
||||||
|
/** 上传日志ID */
|
||||||
|
private Integer logId;
|
||||||
|
|
||||||
|
/** 异常原因摘要 */
|
||||||
|
private String reasonDetail;
|
||||||
|
}
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
package com.ruoyi.ccdi.project.mapper;
|
||||||
|
|
||||||
|
import com.ruoyi.ccdi.project.domain.vo.BankTagStatementHitVO;
|
||||||
|
import com.ruoyi.ccdi.project.domain.vo.BankTagObjectHitVO;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流水标签分析 Mapper
|
||||||
|
*/
|
||||||
|
public interface CcdiBankTagAnalysisMapper {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 房车消费支出交易
|
||||||
|
*
|
||||||
|
* @param projectId 项目ID
|
||||||
|
* @return 流水命中结果
|
||||||
|
*/
|
||||||
|
List<BankTagStatementHitVO> selectHouseOrCarExpenseStatements(@Param("projectId") Long projectId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 税务支出交易
|
||||||
|
*
|
||||||
|
* @param projectId 项目ID
|
||||||
|
* @return 流水命中结果
|
||||||
|
*/
|
||||||
|
List<BankTagStatementHitVO> selectTaxExpenseStatements(@Param("projectId") Long projectId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 大额单笔收入
|
||||||
|
*
|
||||||
|
* @param projectId 项目ID
|
||||||
|
* @param threshold 单笔阈值
|
||||||
|
* @return 流水命中结果
|
||||||
|
*/
|
||||||
|
List<BankTagStatementHitVO> selectSingleLargeIncomeStatements(@Param("projectId") Long projectId,
|
||||||
|
@Param("threshold") BigDecimal threshold);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 累计收入超限对象
|
||||||
|
*
|
||||||
|
* @param projectId 项目ID
|
||||||
|
* @param threshold 累计阈值
|
||||||
|
* @return 对象命中结果
|
||||||
|
*/
|
||||||
|
List<BankTagObjectHitVO> selectCumulativeIncomeObjects(@Param("projectId") Long projectId,
|
||||||
|
@Param("threshold") BigDecimal threshold);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 年流水交易额超限对象
|
||||||
|
*
|
||||||
|
* @param projectId 项目ID
|
||||||
|
* @param threshold 年交易额阈值
|
||||||
|
* @return 对象命中结果
|
||||||
|
*/
|
||||||
|
List<BankTagObjectHitVO> selectAnnualTurnoverObjects(@Param("projectId") Long projectId,
|
||||||
|
@Param("threshold") BigDecimal threshold);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 大额存现交易
|
||||||
|
*
|
||||||
|
* @param projectId 项目ID
|
||||||
|
* @param threshold 存现阈值
|
||||||
|
* @return 流水命中结果
|
||||||
|
*/
|
||||||
|
List<BankTagStatementHitVO> selectLargeCashDepositStatements(@Param("projectId") Long projectId,
|
||||||
|
@Param("threshold") BigDecimal threshold);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 短时间多次存现对象
|
||||||
|
*
|
||||||
|
* @param projectId 项目ID
|
||||||
|
* @param amountThreshold 单笔存现阈值
|
||||||
|
* @param frequencyThreshold 频次阈值
|
||||||
|
* @return 对象命中结果
|
||||||
|
*/
|
||||||
|
List<BankTagObjectHitVO> selectFrequentCashDepositObjects(@Param("projectId") Long projectId,
|
||||||
|
@Param("amountThreshold") BigDecimal amountThreshold,
|
||||||
|
@Param("frequencyThreshold") Integer frequencyThreshold);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 大额转账交易
|
||||||
|
*
|
||||||
|
* @param projectId 项目ID
|
||||||
|
* @param threshold 转账阈值
|
||||||
|
* @return 流水命中结果
|
||||||
|
*/
|
||||||
|
List<BankTagStatementHitVO> selectLargeTransferStatements(@Param("projectId") Long projectId,
|
||||||
|
@Param("threshold") BigDecimal threshold);
|
||||||
|
}
|
||||||
@@ -0,0 +1,366 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!DOCTYPE mapper
|
||||||
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="com.ruoyi.ccdi.project.mapper.CcdiBankTagAnalysisMapper">
|
||||||
|
|
||||||
|
<resultMap id="BankTagStatementHitResultMap" type="com.ruoyi.ccdi.project.domain.vo.BankTagStatementHitVO">
|
||||||
|
<id property="bankStatementId" column="bankStatementId"/>
|
||||||
|
<result property="groupId" column="groupId"/>
|
||||||
|
<result property="logId" column="logId"/>
|
||||||
|
<result property="reasonDetail" column="reasonDetail"/>
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<resultMap id="BankTagObjectHitResultMap" type="com.ruoyi.ccdi.project.domain.vo.BankTagObjectHitVO">
|
||||||
|
<result property="objectType" column="objectType"/>
|
||||||
|
<result property="objectKey" column="objectKey"/>
|
||||||
|
<result property="reasonDetail" column="reasonDetail"/>
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<sql id="statementHitColumns">
|
||||||
|
NULL AS bankStatementId,
|
||||||
|
NULL AS groupId,
|
||||||
|
NULL AS logId,
|
||||||
|
NULL AS reasonDetail
|
||||||
|
</sql>
|
||||||
|
|
||||||
|
<sql id="objectHitColumns">
|
||||||
|
NULL AS objectType,
|
||||||
|
NULL AS objectKey,
|
||||||
|
NULL AS reasonDetail
|
||||||
|
</sql>
|
||||||
|
|
||||||
|
<sql id="cashDepositPredicate">
|
||||||
|
(
|
||||||
|
(
|
||||||
|
(
|
||||||
|
(
|
||||||
|
IFNULL(bs.USER_MEMO, '') LIKE '%现金%'
|
||||||
|
and IFNULL(bs.USER_MEMO, '') NOT LIKE '%金管理%'
|
||||||
|
and IFNULL(bs.USER_MEMO, '') NOT LIKE '%金添利%'
|
||||||
|
and IFNULL(bs.USER_MEMO, '') NOT LIKE '%现金利%'
|
||||||
|
and IFNULL(bs.USER_MEMO, '') NOT LIKE '%现金宝%'
|
||||||
|
and IFNULL(bs.USER_MEMO, '') NOT LIKE '%金分析%'
|
||||||
|
)
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%存现%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%现存%'
|
||||||
|
or IFNULL(bs.CASH_TYPE, '') LIKE '%现金%'
|
||||||
|
or IFNULL(bs.CASH_TYPE, '') LIKE '%存现%'
|
||||||
|
or IFNULL(bs.CASH_TYPE, '') LIKE '%现存%'
|
||||||
|
or IFNULL(bs.CASH_TYPE, '') LIKE '%金存入%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%金存入%'
|
||||||
|
or (
|
||||||
|
IFNULL(bs.USER_MEMO, '') LIKE '%ATM%'
|
||||||
|
and (
|
||||||
|
IFNULL(bs.USER_MEMO, '') LIKE '%存款%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%转入%'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
or (
|
||||||
|
IFNULL(bs.CASH_TYPE, '') LIKE '%ATM%'
|
||||||
|
and (
|
||||||
|
IFNULL(bs.CASH_TYPE, '') LIKE '%存款%'
|
||||||
|
or IFNULL(bs.CASH_TYPE, '') LIKE '%转入%'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
and (
|
||||||
|
IFNULL(bs.CUSTOMER_ACCOUNT_NAME, '') = ''
|
||||||
|
or bs.CUSTOMER_ACCOUNT_NAME = '无'
|
||||||
|
or IFNULL(bs.CUSTOMER_ACCOUNT_NAME, '') LIKE '%存现%'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%DEPOSIT%'
|
||||||
|
or (
|
||||||
|
bs.CUSTOMER_ACCOUNT_NAME = '库存现金'
|
||||||
|
or (
|
||||||
|
(
|
||||||
|
IFNULL(bs.USER_MEMO, '') LIKE '%现金存款%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%自助存款%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%CRS存款%'
|
||||||
|
or IFNULL(bs.CASH_TYPE, '') LIKE '%现金存款%'
|
||||||
|
or IFNULL(bs.CASH_TYPE, '') LIKE '%自助存款%'
|
||||||
|
or IFNULL(bs.CASH_TYPE, '') LIKE '%本行CRS存款%'
|
||||||
|
or IFNULL(bs.CASH_TYPE, '') LIKE '%柜面%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%柜面%'
|
||||||
|
)
|
||||||
|
and IFNULL(bs.CUSTOMER_ACCOUNT_NAME, '') = ''
|
||||||
|
)
|
||||||
|
or (bs.CUSTOMER_ACCOUNT_NAME = '现金' and IFNULL(bs.USER_MEMO, '') NOT LIKE '%借款%')
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%本行ATM%'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
</sql>
|
||||||
|
|
||||||
|
<sql id="salaryExclusionPredicate">
|
||||||
|
not (
|
||||||
|
bs.CUSTOMER_ACCOUNT_NAME = '浙江兰溪农村商业银行股份有限公司'
|
||||||
|
and (
|
||||||
|
IFNULL(bs.USER_MEMO, '') LIKE '%代发%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%工资%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%奖金%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%薪酬%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%薪金%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%补贴%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%薪%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%年终奖%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%年金%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%加班费%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%劳务费%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%劳务外包%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%提成%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%劳务派遣%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%绩效%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%酬劳%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%PAYROLL%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%SALA%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%CPF%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%directors%fees%'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') LIKE '%批量代付%'
|
||||||
|
or IFNULL(bs.CASH_TYPE, '') LIKE '%代发%'
|
||||||
|
or IFNULL(bs.CASH_TYPE, '') LIKE '%工资%'
|
||||||
|
or IFNULL(bs.CASH_TYPE, '') LIKE '%劳务费%'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
</sql>
|
||||||
|
|
||||||
|
<select id="selectHouseOrCarExpenseStatements" resultMap="BankTagStatementHitResultMap">
|
||||||
|
select
|
||||||
|
bs.bank_statement_id AS bankStatementId,
|
||||||
|
bs.group_id AS groupId,
|
||||||
|
bs.batch_id AS logId,
|
||||||
|
CONCAT(
|
||||||
|
'摘要命中“', IFNULL(bs.USER_MEMO, ''), '”,对手方“', IFNULL(bs.CUSTOMER_ACCOUNT_NAME, ''),
|
||||||
|
'”,支出金额 ', CAST(IFNULL(bs.AMOUNT_DR, 0) AS CHAR), ' 元'
|
||||||
|
) AS reasonDetail
|
||||||
|
from ccdi_bank_statement bs
|
||||||
|
where bs.project_id = #{projectId}
|
||||||
|
and IFNULL(bs.AMOUNT_DR, 0) > 0
|
||||||
|
and (
|
||||||
|
IFNULL(bs.USER_MEMO, '') REGEXP '(购|买).*房|(购|买).*车|车款|房款|首付|(房|车).*贷'
|
||||||
|
or IFNULL(bs.CUSTOMER_ACCOUNT_NAME, '') REGEXP '汽车销售|汽车金融|4S店|汽贸|车行|房地产|置业|置地|地产|房产|不动产|链家|贝壳|我爱我家|房管局'
|
||||||
|
)
|
||||||
|
and (
|
||||||
|
exists (
|
||||||
|
select 1
|
||||||
|
from ccdi_base_staff staff
|
||||||
|
where staff.id_card = bs.cret_no
|
||||||
|
)
|
||||||
|
or exists (
|
||||||
|
select 1
|
||||||
|
from ccdi_staff_fmy_relation relation
|
||||||
|
where relation.relation_cert_no = bs.cret_no
|
||||||
|
and relation.status = 1
|
||||||
|
)
|
||||||
|
)
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="selectTaxExpenseStatements" resultMap="BankTagStatementHitResultMap">
|
||||||
|
select
|
||||||
|
bs.bank_statement_id AS bankStatementId,
|
||||||
|
bs.group_id AS groupId,
|
||||||
|
bs.batch_id AS logId,
|
||||||
|
CONCAT(
|
||||||
|
'摘要命中税务关键词,对手方“', IFNULL(bs.CUSTOMER_ACCOUNT_NAME, ''),
|
||||||
|
'”,支出金额 ', CAST(IFNULL(bs.AMOUNT_DR, 0) AS CHAR), ' 元'
|
||||||
|
) AS reasonDetail
|
||||||
|
from ccdi_bank_statement bs
|
||||||
|
where bs.project_id = #{projectId}
|
||||||
|
and IFNULL(bs.AMOUNT_DR, 0) > 0
|
||||||
|
and (
|
||||||
|
IFNULL(bs.USER_MEMO, '') REGEXP '税务|缴税|税款'
|
||||||
|
or IFNULL(bs.CUSTOMER_ACCOUNT_NAME, '') REGEXP '税务|税务局|国库|国家金库|财政'
|
||||||
|
)
|
||||||
|
and (
|
||||||
|
exists (
|
||||||
|
select 1
|
||||||
|
from ccdi_base_staff staff
|
||||||
|
where staff.id_card = bs.cret_no
|
||||||
|
)
|
||||||
|
or exists (
|
||||||
|
select 1
|
||||||
|
from ccdi_staff_fmy_relation relation
|
||||||
|
where relation.relation_cert_no = bs.cret_no
|
||||||
|
and relation.status = 1
|
||||||
|
)
|
||||||
|
)
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="selectSingleLargeIncomeStatements" resultMap="BankTagStatementHitResultMap">
|
||||||
|
select
|
||||||
|
bs.bank_statement_id AS bankStatementId,
|
||||||
|
bs.group_id AS groupId,
|
||||||
|
bs.batch_id AS logId,
|
||||||
|
CONCAT(
|
||||||
|
'同一交易对手“', IFNULL(bs.CUSTOMER_ACCOUNT_NAME, ''),
|
||||||
|
'”单笔流入 ', CAST(IFNULL(bs.AMOUNT_CR, 0) AS CHAR),
|
||||||
|
' 元,超过阈值 ', CAST(#{threshold} AS CHAR), ' 元'
|
||||||
|
) AS reasonDetail
|
||||||
|
from ccdi_bank_statement bs
|
||||||
|
inner join ccdi_base_staff staff on staff.id_card = bs.cret_no
|
||||||
|
left join ccdi_staff_fmy_relation relation
|
||||||
|
on relation.person_id = staff.id_card
|
||||||
|
and relation.relation_name = bs.CUSTOMER_ACCOUNT_NAME
|
||||||
|
and relation.status = 1
|
||||||
|
where bs.project_id = #{projectId}
|
||||||
|
and IFNULL(bs.AMOUNT_CR, 0) > #{threshold}
|
||||||
|
and IFNULL(bs.AMOUNT_CR, 0) > 0
|
||||||
|
and IFNULL(bs.LE_ACCOUNT_NAME, '') <> IFNULL(bs.CUSTOMER_ACCOUNT_NAME, '')
|
||||||
|
and relation.person_id is null
|
||||||
|
and <include refid="salaryExclusionPredicate"/>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="selectCumulativeIncomeObjects" resultMap="BankTagObjectHitResultMap">
|
||||||
|
select
|
||||||
|
'STAFF_ID_CARD' AS objectType,
|
||||||
|
t.idCard AS objectKey,
|
||||||
|
CONCAT(
|
||||||
|
'同一交易对手累计流入 ', CAST(t.totalAmount AS CHAR),
|
||||||
|
' 元,超过阈值 ', CAST(#{threshold} AS CHAR),
|
||||||
|
' 元,对手方:', IFNULL(t.customerAccountName, '')
|
||||||
|
) AS reasonDetail
|
||||||
|
from (
|
||||||
|
select
|
||||||
|
staff.id_card AS idCard,
|
||||||
|
bs.CUSTOMER_ACCOUNT_NAME AS customerAccountName,
|
||||||
|
SUM(IFNULL(bs.AMOUNT_CR, 0)) AS totalAmount
|
||||||
|
from ccdi_bank_statement bs
|
||||||
|
inner join ccdi_base_staff staff on staff.id_card = bs.cret_no
|
||||||
|
left join ccdi_staff_fmy_relation relation
|
||||||
|
on relation.person_id = staff.id_card
|
||||||
|
and relation.relation_name = bs.CUSTOMER_ACCOUNT_NAME
|
||||||
|
and relation.status = 1
|
||||||
|
where bs.project_id = #{projectId}
|
||||||
|
and IFNULL(bs.AMOUNT_CR, 0) > 0
|
||||||
|
and IFNULL(bs.LE_ACCOUNT_NAME, '') <> IFNULL(bs.CUSTOMER_ACCOUNT_NAME, '')
|
||||||
|
and relation.person_id is null
|
||||||
|
and <include refid="salaryExclusionPredicate"/>
|
||||||
|
group by staff.id_card, bs.CUSTOMER_ACCOUNT_NAME
|
||||||
|
having SUM(IFNULL(bs.AMOUNT_CR, 0)) > #{threshold}
|
||||||
|
) t
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="selectAnnualTurnoverObjects" resultMap="BankTagObjectHitResultMap">
|
||||||
|
select
|
||||||
|
'STAFF_ID_CARD' AS objectType,
|
||||||
|
t.idCard AS objectKey,
|
||||||
|
CONCAT(
|
||||||
|
'近一年交易额 ', CAST(t.annualAmount AS CHAR),
|
||||||
|
' 元,超过阈值 ', CAST(#{threshold} AS CHAR), ' 元'
|
||||||
|
) AS reasonDetail
|
||||||
|
from (
|
||||||
|
select
|
||||||
|
staff.id_card AS idCard,
|
||||||
|
SUM(IFNULL(bs.AMOUNT_DR, 0) + IFNULL(bs.AMOUNT_CR, 0)) AS annualAmount
|
||||||
|
from ccdi_bank_statement bs
|
||||||
|
inner join ccdi_base_staff staff on staff.id_card = bs.cret_no
|
||||||
|
where bs.project_id = #{projectId}
|
||||||
|
and IFNULL(bs.LE_ACCOUNT_NAME, '') <> IFNULL(bs.CUSTOMER_ACCOUNT_NAME, '')
|
||||||
|
and STR_TO_DATE(LEFT(TRIM(bs.TRX_DATE), 10), '%Y-%m-%d') >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
|
||||||
|
group by staff.id_card
|
||||||
|
having SUM(IFNULL(bs.AMOUNT_DR, 0) + IFNULL(bs.AMOUNT_CR, 0)) > #{threshold}
|
||||||
|
) t
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="selectLargeCashDepositStatements" resultMap="BankTagStatementHitResultMap">
|
||||||
|
select
|
||||||
|
bs.bank_statement_id AS bankStatementId,
|
||||||
|
bs.group_id AS groupId,
|
||||||
|
bs.batch_id AS logId,
|
||||||
|
CONCAT(
|
||||||
|
'现金存入金额 ', CAST(IFNULL(bs.AMOUNT_CR, 0) AS CHAR),
|
||||||
|
' 元,超过阈值 ', CAST(#{threshold} AS CHAR), ' 元'
|
||||||
|
) AS reasonDetail
|
||||||
|
from ccdi_bank_statement bs
|
||||||
|
where bs.project_id = #{projectId}
|
||||||
|
and IFNULL(bs.AMOUNT_CR, 0) > #{threshold}
|
||||||
|
and <include refid="cashDepositPredicate"/>
|
||||||
|
and (
|
||||||
|
exists (
|
||||||
|
select 1
|
||||||
|
from ccdi_base_staff staff
|
||||||
|
where staff.id_card = bs.cret_no
|
||||||
|
)
|
||||||
|
or exists (
|
||||||
|
select 1
|
||||||
|
from ccdi_staff_fmy_relation relation
|
||||||
|
where relation.relation_cert_no = bs.cret_no
|
||||||
|
and relation.status = 1
|
||||||
|
)
|
||||||
|
)
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="selectFrequentCashDepositObjects" resultMap="BankTagObjectHitResultMap">
|
||||||
|
select
|
||||||
|
'STAFF_ID_CARD' AS objectType,
|
||||||
|
t.objectKey AS objectKey,
|
||||||
|
CONCAT(
|
||||||
|
'单日存现次数 ', CAST(t.cashCount AS CHAR),
|
||||||
|
' 次,超过阈值 ', CAST(#{frequencyThreshold} AS CHAR),
|
||||||
|
' 次,交易日:', t.cashDate
|
||||||
|
) AS reasonDetail
|
||||||
|
from (
|
||||||
|
select
|
||||||
|
source.object_key AS objectKey,
|
||||||
|
source.cash_date AS cashDate,
|
||||||
|
COUNT(1) AS cashCount
|
||||||
|
from (
|
||||||
|
select
|
||||||
|
staff.id_card AS object_key,
|
||||||
|
LEFT(TRIM(bs.TRX_DATE), 10) AS cash_date
|
||||||
|
from ccdi_bank_statement bs
|
||||||
|
inner join ccdi_base_staff staff on staff.id_card = bs.cret_no
|
||||||
|
where bs.project_id = #{projectId}
|
||||||
|
and IFNULL(bs.AMOUNT_CR, 0) > #{amountThreshold}
|
||||||
|
and <include refid="cashDepositPredicate"/>
|
||||||
|
union all
|
||||||
|
select
|
||||||
|
relation.person_id AS object_key,
|
||||||
|
LEFT(TRIM(bs.TRX_DATE), 10) AS cash_date
|
||||||
|
from ccdi_bank_statement bs
|
||||||
|
inner join ccdi_staff_fmy_relation relation on relation.relation_cert_no = bs.cret_no
|
||||||
|
where bs.project_id = #{projectId}
|
||||||
|
and relation.status = 1
|
||||||
|
and IFNULL(bs.AMOUNT_CR, 0) > #{amountThreshold}
|
||||||
|
and <include refid="cashDepositPredicate"/>
|
||||||
|
) source
|
||||||
|
group by source.object_key, source.cash_date
|
||||||
|
having COUNT(1) > #{frequencyThreshold}
|
||||||
|
) t
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="selectLargeTransferStatements" resultMap="BankTagStatementHitResultMap">
|
||||||
|
select
|
||||||
|
bs.bank_statement_id AS bankStatementId,
|
||||||
|
bs.group_id AS groupId,
|
||||||
|
bs.batch_id AS logId,
|
||||||
|
CONCAT(
|
||||||
|
'大额转账支出 ', CAST(IFNULL(bs.AMOUNT_DR, 0) AS CHAR),
|
||||||
|
' 元,超过阈值 ', CAST(#{threshold} AS CHAR), ' 元'
|
||||||
|
) AS reasonDetail
|
||||||
|
from ccdi_bank_statement bs
|
||||||
|
where bs.project_id = #{projectId}
|
||||||
|
and IFNULL(bs.AMOUNT_DR, 0) > #{threshold}
|
||||||
|
and (
|
||||||
|
IFNULL(bs.CUSTOMER_ACCOUNT_NAME, '') REGEXP '转账'
|
||||||
|
or IFNULL(bs.USER_MEMO, '') REGEXP '转帐|转账|汇入|转存|红包|汇款|网转|转入'
|
||||||
|
or IFNULL(bs.CASH_TYPE, '') REGEXP '转帐|转账|汇入|转存|红包|汇款|网转|转入'
|
||||||
|
)
|
||||||
|
and IFNULL(bs.USER_MEMO, '') NOT LIKE '%款%'
|
||||||
|
and IFNULL(bs.LE_ACCOUNT_NAME, '') <> IFNULL(bs.CUSTOMER_ACCOUNT_NAME, '')
|
||||||
|
and (
|
||||||
|
exists (
|
||||||
|
select 1
|
||||||
|
from ccdi_base_staff staff
|
||||||
|
where staff.id_card = bs.cret_no
|
||||||
|
)
|
||||||
|
or exists (
|
||||||
|
select 1
|
||||||
|
from ccdi_staff_fmy_relation relation
|
||||||
|
where relation.relation_cert_no = bs.cret_no
|
||||||
|
and relation.status = 1
|
||||||
|
)
|
||||||
|
)
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</mapper>
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
package com.ruoyi.ccdi.project.mapper;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
class CcdiBankTagAnalysisMapperXmlTest {
|
||||||
|
|
||||||
|
private static final String RESOURCE = "mapper/ccdi/project/CcdiBankTagAnalysisMapper.xml";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void statementRuleSql_shouldSelectGroupIdAndLogId() throws Exception {
|
||||||
|
String xml = readXml(RESOURCE);
|
||||||
|
assertTrue(xml.contains("AS groupId"));
|
||||||
|
assertTrue(xml.contains("AS logId"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void houseOrCarExpenseRule_shouldJoinBankStatementAndReturnStatementHitFields() throws Exception {
|
||||||
|
String xml = readXml(RESOURCE);
|
||||||
|
assertTrue(xml.contains("selectHouseOrCarExpenseStatements"));
|
||||||
|
assertTrue(xml.contains("bs.bank_statement_id AS bankStatementId"));
|
||||||
|
assertTrue(xml.contains("bs.group_id AS groupId"));
|
||||||
|
assertTrue(xml.contains("bs.batch_id AS logId"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void allLargeTransactionRules_shouldExistInAnalysisMapperXml() throws Exception {
|
||||||
|
String xml = readXml(RESOURCE);
|
||||||
|
assertTrue(xml.contains("selectTaxExpenseStatements"));
|
||||||
|
assertTrue(xml.contains("selectSingleLargeIncomeStatements"));
|
||||||
|
assertTrue(xml.contains("selectCumulativeIncomeObjects"));
|
||||||
|
assertTrue(xml.contains("selectAnnualTurnoverObjects"));
|
||||||
|
assertTrue(xml.contains("selectLargeCashDepositStatements"));
|
||||||
|
assertTrue(xml.contains("selectFrequentCashDepositObjects"));
|
||||||
|
assertTrue(xml.contains("selectLargeTransferStatements"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private String readXml(String resource) throws Exception {
|
||||||
|
try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(resource)) {
|
||||||
|
return new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user