新增涉疑交易明细查询导出并补充对手方证件信息
This commit is contained in:
@@ -2,23 +2,31 @@ package com.ruoyi.ccdi.project.controller;
|
||||
|
||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectPersonAnalysisDetailQueryDTO;
|
||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
|
||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectSuspiciousTransactionQueryDTO;
|
||||
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectSuspiciousTransactionExcel;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectPersonAnalysisDetailVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectOverviewDashboardVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelCardsVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelPeopleVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskPeopleOverviewVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectSuspiciousTransactionPageVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectTopRiskPeopleVO;
|
||||
import com.ruoyi.ccdi.project.service.ICcdiProjectOverviewService;
|
||||
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||
import com.ruoyi.common.core.controller.BaseController;
|
||||
import com.ruoyi.common.core.domain.AjaxResult;
|
||||
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 org.springframework.security.access.prepost.PreAuthorize;
|
||||
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;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 结果总览控制器
|
||||
*/
|
||||
@@ -95,4 +103,31 @@ public class CcdiProjectOverviewController extends BaseController {
|
||||
CcdiProjectPersonAnalysisDetailVO detail = overviewService.getPersonAnalysisDetail(queryDTO);
|
||||
return AjaxResult.success(detail);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询涉疑交易明细
|
||||
*/
|
||||
@GetMapping("/suspicious-transactions")
|
||||
@Operation(summary = "查询涉疑交易明细")
|
||||
@PreAuthorize("@ss.hasPermi('ccdi:project:query')")
|
||||
public AjaxResult getSuspiciousTransactions(CcdiProjectSuspiciousTransactionQueryDTO queryDTO) {
|
||||
CcdiProjectSuspiciousTransactionPageVO pageVO = overviewService.getSuspiciousTransactions(queryDTO);
|
||||
return AjaxResult.success(pageVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出涉疑交易明细
|
||||
*/
|
||||
@PostMapping("/suspicious-transactions/export")
|
||||
@Operation(summary = "导出涉疑交易明细")
|
||||
@PreAuthorize("@ss.hasPermi('ccdi:project:query')")
|
||||
public void exportSuspiciousTransactions(
|
||||
HttpServletResponse response,
|
||||
CcdiProjectSuspiciousTransactionQueryDTO queryDTO
|
||||
) {
|
||||
List<CcdiProjectSuspiciousTransactionExcel> rows = overviewService.exportSuspiciousTransactions(queryDTO);
|
||||
ExcelUtil<CcdiProjectSuspiciousTransactionExcel> util =
|
||||
new ExcelUtil<>(CcdiProjectSuspiciousTransactionExcel.class);
|
||||
util.exportExcel(response, rows, "涉疑交易明细");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.ruoyi.ccdi.project.domain.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 涉疑交易明细查询DTO
|
||||
*/
|
||||
@Data
|
||||
public class CcdiProjectSuspiciousTransactionQueryDTO {
|
||||
|
||||
/** 项目ID */
|
||||
private Long projectId;
|
||||
|
||||
/** 涉疑类型 */
|
||||
private String suspiciousType;
|
||||
|
||||
/** 页码 */
|
||||
private Integer pageNum;
|
||||
|
||||
/** 每页数量 */
|
||||
private Integer pageSize;
|
||||
}
|
||||
@@ -112,6 +112,12 @@ public class CcdiBankStatement implements Serializable {
|
||||
/** 对手方备注 */
|
||||
private String customerReference;
|
||||
|
||||
/** 交易对手方证件号 */
|
||||
private String customerCertNo;
|
||||
|
||||
/** 交易对手方统一社会信用代码 */
|
||||
private String customerSocialCreditCode;
|
||||
|
||||
// ===== 摘要和备注 =====
|
||||
|
||||
/** 用户交易摘要 */
|
||||
@@ -199,6 +205,8 @@ public class CcdiBankStatement implements Serializable {
|
||||
entity.setCustomerLeId(item.getCustomerId());
|
||||
entity.setCustomerAccountName(item.getCustomerName());
|
||||
entity.setBatchSequence(item.getUploadSequnceNumber());
|
||||
entity.setCustomerCertNo(item.getCustomerCertNo());
|
||||
entity.setCustomerSocialCreditCode(item.getCustomerSocialCreditCode());
|
||||
|
||||
// 5. 特殊字段处理
|
||||
entity.setMetaJson(null); // 根据文档要求强制设为 null
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
package com.ruoyi.ccdi.project.domain.excel;
|
||||
|
||||
import com.ruoyi.common.annotation.Excel;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* 涉疑交易导出对象
|
||||
*/
|
||||
@Data
|
||||
public class CcdiProjectSuspiciousTransactionExcel {
|
||||
|
||||
@Excel(name = "交易时间")
|
||||
private String trxDate;
|
||||
|
||||
@Excel(name = "可疑人员")
|
||||
private String suspiciousPersonName;
|
||||
|
||||
@Excel(name = "关联人")
|
||||
private String relatedPersonName;
|
||||
|
||||
@Excel(name = "关联员工")
|
||||
private String relatedStaffDisplay;
|
||||
|
||||
@Excel(name = "关系")
|
||||
private String relationType;
|
||||
|
||||
@Excel(name = "摘要/交易类型")
|
||||
private String summaryAndCashType;
|
||||
|
||||
@Excel(name = "交易金额")
|
||||
private BigDecimal displayAmount;
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package com.ruoyi.ccdi.project.domain.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* 涉疑交易明细行
|
||||
*/
|
||||
@Data
|
||||
public class CcdiProjectSuspiciousTransactionItemVO {
|
||||
|
||||
private Long bankStatementId;
|
||||
|
||||
private String trxDate;
|
||||
|
||||
private String suspiciousPersonName;
|
||||
|
||||
private String relatedPersonName;
|
||||
|
||||
private String relatedStaffName;
|
||||
|
||||
private String relatedStaffCode;
|
||||
|
||||
private String relationType;
|
||||
|
||||
private String userMemo;
|
||||
|
||||
private String cashType;
|
||||
|
||||
private BigDecimal displayAmount;
|
||||
|
||||
private Boolean hasModelRuleHit;
|
||||
|
||||
private Boolean hasNameListHit;
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.ruoyi.ccdi.project.domain.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 涉疑交易分页结果
|
||||
*/
|
||||
@Data
|
||||
public class CcdiProjectSuspiciousTransactionPageVO {
|
||||
|
||||
private List<CcdiProjectSuspiciousTransactionItemVO> rows;
|
||||
|
||||
private Long total;
|
||||
}
|
||||
@@ -3,6 +3,7 @@ package com.ruoyi.ccdi.project.mapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.ruoyi.ccdi.project.domain.CcdiProject;
|
||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
|
||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectSuspiciousTransactionQueryDTO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementListVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeRiskAggregateVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectPersonAnalysisBasicInfoVO;
|
||||
@@ -10,6 +11,7 @@ import com.ruoyi.ccdi.project.domain.vo.CcdiProjectPersonAnalysisObjectRecordVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskHitTagVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelCardVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelPeopleItemVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectSuspiciousTransactionItemVO;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
@@ -65,6 +67,28 @@ public interface CcdiProjectOverviewMapper {
|
||||
@Param("query") CcdiProjectRiskModelPeopleQueryDTO query
|
||||
);
|
||||
|
||||
/**
|
||||
* 分页查询涉疑交易明细
|
||||
*
|
||||
* @param page 分页参数
|
||||
* @param query 查询条件
|
||||
* @return 分页结果
|
||||
*/
|
||||
Page<CcdiProjectSuspiciousTransactionItemVO> selectSuspiciousTransactionPage(
|
||||
Page<CcdiProjectSuspiciousTransactionItemVO> page,
|
||||
@Param("query") CcdiProjectSuspiciousTransactionQueryDTO query
|
||||
);
|
||||
|
||||
/**
|
||||
* 查询涉疑交易导出列表
|
||||
*
|
||||
* @param query 查询条件
|
||||
* @return 导出列表
|
||||
*/
|
||||
List<CcdiProjectSuspiciousTransactionItemVO> selectSuspiciousTransactionList(
|
||||
@Param("query") CcdiProjectSuspiciousTransactionQueryDTO query
|
||||
);
|
||||
|
||||
/**
|
||||
* 按员工范围查询命中标签
|
||||
*
|
||||
|
||||
@@ -2,13 +2,18 @@ package com.ruoyi.ccdi.project.service;
|
||||
|
||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectPersonAnalysisDetailQueryDTO;
|
||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
|
||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectSuspiciousTransactionQueryDTO;
|
||||
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectSuspiciousTransactionExcel;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectPersonAnalysisDetailVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectOverviewDashboardVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelCardsVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelPeopleVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskPeopleOverviewVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectSuspiciousTransactionPageVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectTopRiskPeopleVO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 结果总览服务接口
|
||||
*/
|
||||
@@ -68,6 +73,30 @@ public interface ICcdiProjectOverviewService {
|
||||
return new CcdiProjectRiskModelPeopleVO();
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询涉疑交易明细
|
||||
*
|
||||
* @param queryDTO 查询条件
|
||||
* @return 分页结果
|
||||
*/
|
||||
default CcdiProjectSuspiciousTransactionPageVO getSuspiciousTransactions(
|
||||
CcdiProjectSuspiciousTransactionQueryDTO queryDTO
|
||||
) {
|
||||
return new CcdiProjectSuspiciousTransactionPageVO();
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出涉疑交易明细
|
||||
*
|
||||
* @param queryDTO 查询条件
|
||||
* @return 导出列表
|
||||
*/
|
||||
default List<CcdiProjectSuspiciousTransactionExcel> exportSuspiciousTransactions(
|
||||
CcdiProjectSuspiciousTransactionQueryDTO queryDTO
|
||||
) {
|
||||
return List.of();
|
||||
}
|
||||
|
||||
/**
|
||||
* 重算结果总览员工结果并同步项目风险人数
|
||||
*
|
||||
|
||||
@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.ruoyi.ccdi.project.domain.CcdiProject;
|
||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectPersonAnalysisDetailQueryDTO;
|
||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
|
||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectSuspiciousTransactionQueryDTO;
|
||||
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectSuspiciousTransactionExcel;
|
||||
import com.ruoyi.ccdi.project.domain.entity.CcdiProjectOverviewEmployeeResult;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementListVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementHitTagVO;
|
||||
@@ -21,6 +23,8 @@ import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelPeopleItemVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelPeopleVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskPeopleOverviewItemVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskPeopleOverviewVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectSuspiciousTransactionItemVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectSuspiciousTransactionPageVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectTopRiskPeopleItemVO;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectTopRiskPeopleVO;
|
||||
import com.ruoyi.ccdi.project.mapper.CcdiProjectMapper;
|
||||
@@ -172,6 +176,38 @@ public class CcdiProjectOverviewServiceImpl implements ICcdiProjectOverviewServi
|
||||
return people;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CcdiProjectSuspiciousTransactionPageVO getSuspiciousTransactions(
|
||||
CcdiProjectSuspiciousTransactionQueryDTO queryDTO
|
||||
) {
|
||||
ensureProjectExists(queryDTO.getProjectId());
|
||||
normalizeSuspiciousTransactionQuery(queryDTO);
|
||||
|
||||
Page<CcdiProjectSuspiciousTransactionItemVO> page = new Page<>(
|
||||
defaultPageNum(queryDTO.getPageNum()),
|
||||
defaultPageSize(queryDTO.getPageSize())
|
||||
);
|
||||
Page<CcdiProjectSuspiciousTransactionItemVO> resultPage =
|
||||
overviewMapper.selectSuspiciousTransactionPage(page, queryDTO);
|
||||
|
||||
CcdiProjectSuspiciousTransactionPageVO result = new CcdiProjectSuspiciousTransactionPageVO();
|
||||
result.setRows(defaultList(resultPage == null ? null : resultPage.getRecords()));
|
||||
result.setTotal(resultPage == null ? 0L : resultPage.getTotal());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<CcdiProjectSuspiciousTransactionExcel> exportSuspiciousTransactions(
|
||||
CcdiProjectSuspiciousTransactionQueryDTO queryDTO
|
||||
) {
|
||||
ensureProjectExists(queryDTO.getProjectId());
|
||||
normalizeSuspiciousTransactionQuery(queryDTO);
|
||||
|
||||
return defaultList(overviewMapper.selectSuspiciousTransactionList(queryDTO)).stream()
|
||||
.map(this::buildSuspiciousTransactionExcelRow)
|
||||
.toList();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void refreshOverviewEmployeeResults(Long projectId, String operator) {
|
||||
@@ -250,6 +286,14 @@ public class CcdiProjectOverviewServiceImpl implements ICcdiProjectOverviewServi
|
||||
queryDTO.setMatchMode(queryDTO.getMatchMode().trim().toUpperCase());
|
||||
}
|
||||
|
||||
private void normalizeSuspiciousTransactionQuery(CcdiProjectSuspiciousTransactionQueryDTO queryDTO) {
|
||||
if (queryDTO.getSuspiciousType() == null || queryDTO.getSuspiciousType().isBlank()) {
|
||||
queryDTO.setSuspiciousType("ALL");
|
||||
return;
|
||||
}
|
||||
queryDTO.setSuspiciousType(queryDTO.getSuspiciousType().trim().toUpperCase());
|
||||
}
|
||||
|
||||
private CcdiProjectOverviewStatVO buildStat(String key, String label, Integer value) {
|
||||
CcdiProjectOverviewStatVO stat = new CcdiProjectOverviewStatVO();
|
||||
stat.setKey(key);
|
||||
@@ -294,6 +338,36 @@ public class CcdiProjectOverviewServiceImpl implements ICcdiProjectOverviewServi
|
||||
return value == null ? List.of() : value;
|
||||
}
|
||||
|
||||
private CcdiProjectSuspiciousTransactionExcel buildSuspiciousTransactionExcelRow(
|
||||
CcdiProjectSuspiciousTransactionItemVO item
|
||||
) {
|
||||
CcdiProjectSuspiciousTransactionExcel row = new CcdiProjectSuspiciousTransactionExcel();
|
||||
row.setTrxDate(item.getTrxDate());
|
||||
row.setSuspiciousPersonName(item.getSuspiciousPersonName());
|
||||
row.setRelatedPersonName(item.getRelatedPersonName());
|
||||
row.setRelatedStaffDisplay(formatRelatedStaff(item.getRelatedStaffName(), item.getRelatedStaffCode()));
|
||||
row.setRelationType(item.getRelationType());
|
||||
row.setSummaryAndCashType(formatSummaryAndCashType(item.getUserMemo(), item.getCashType()));
|
||||
row.setDisplayAmount(item.getDisplayAmount());
|
||||
return row;
|
||||
}
|
||||
|
||||
private String formatRelatedStaff(String relatedStaffName, String relatedStaffCode) {
|
||||
if (relatedStaffName == null || relatedStaffName.isBlank()) {
|
||||
return null;
|
||||
}
|
||||
if (relatedStaffCode == null || relatedStaffCode.isBlank()) {
|
||||
return relatedStaffName;
|
||||
}
|
||||
return relatedStaffName + "(" + relatedStaffCode + ")";
|
||||
}
|
||||
|
||||
private String formatSummaryAndCashType(String userMemo, String cashType) {
|
||||
String safeMemo = userMemo == null ? "" : userMemo;
|
||||
String safeCashType = cashType == null ? "" : cashType;
|
||||
return safeMemo + "/" + safeCashType;
|
||||
}
|
||||
|
||||
private CcdiProjectPersonAnalysisAbnormalDetailVO buildAbnormalDetail(
|
||||
List<CcdiBankStatementListVO> statementRows,
|
||||
List<CcdiProjectPersonAnalysisObjectRecordVO> objectRows
|
||||
|
||||
@@ -25,6 +25,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<result property="customerAccountNo" column="CUSTOMER_ACCOUNT_NO" />
|
||||
<result property="customerBank" column="customer_bank" />
|
||||
<result property="customerReference" column="customer_reference" />
|
||||
<result property="customerCertNo" column="customer_cert_no" />
|
||||
<result property="customerSocialCreditCode" column="customer_social_credit_code" />
|
||||
<result property="userMemo" column="USER_MEMO" />
|
||||
<result property="bankComments" column="BANK_COMMENTS" />
|
||||
<result property="bankTrxNumber" column="BANK_TRX_NUMBER" />
|
||||
@@ -51,7 +53,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
LE_ACCOUNT_NAME, LE_ACCOUNT_NO, ACCOUNTING_DATE_ID, ACCOUNTING_DATE,
|
||||
TRX_DATE, CURRENCY, AMOUNT_DR, AMOUNT_CR, AMOUNT_BALANCE,
|
||||
CASH_TYPE, CUSTOMER_LE_ID, CUSTOMER_ACCOUNT_NAME, CUSTOMER_ACCOUNT_NO,
|
||||
customer_bank, customer_reference, USER_MEMO, BANK_COMMENTS,
|
||||
customer_bank, customer_reference, customer_cert_no, customer_social_credit_code, USER_MEMO, BANK_COMMENTS,
|
||||
BANK_TRX_NUMBER, BANK, TRX_FLAG, TRX_TYPE, EXCEPTION_TYPE,
|
||||
internal_flag, batch_id, batch_sequence, CREATE_DATE, created_by,
|
||||
meta_json, no_balance, begin_balance, end_balance,
|
||||
@@ -383,7 +385,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
LE_ACCOUNT_NAME, LE_ACCOUNT_NO, ACCOUNTING_DATE_ID, ACCOUNTING_DATE,
|
||||
TRX_DATE, CURRENCY, AMOUNT_DR, AMOUNT_CR, AMOUNT_BALANCE,
|
||||
CASH_TYPE, CUSTOMER_LE_ID, CUSTOMER_ACCOUNT_NAME, CUSTOMER_ACCOUNT_NO,
|
||||
customer_bank, customer_reference, USER_MEMO, BANK_COMMENTS,
|
||||
customer_bank, customer_reference, customer_cert_no, customer_social_credit_code, USER_MEMO, BANK_COMMENTS,
|
||||
BANK_TRX_NUMBER, BANK, TRX_FLAG, TRX_TYPE, EXCEPTION_TYPE,
|
||||
internal_flag, batch_id, batch_sequence, CREATE_DATE, created_by,
|
||||
meta_json, no_balance, begin_balance, end_balance,
|
||||
@@ -395,7 +397,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
#{item.leAccountName}, #{item.leAccountNo}, #{item.accountingDateId}, #{item.accountingDate},
|
||||
#{item.trxDate}, #{item.currency}, #{item.amountDr}, #{item.amountCr}, #{item.amountBalance},
|
||||
#{item.cashType}, #{item.customerLeId}, #{item.customerAccountName}, #{item.customerAccountNo},
|
||||
#{item.customerBank}, #{item.customerReference}, #{item.userMemo}, #{item.bankComments},
|
||||
#{item.customerBank}, #{item.customerReference}, #{item.customerCertNo}, #{item.customerSocialCreditCode}, #{item.userMemo}, #{item.bankComments},
|
||||
#{item.bankTrxNumber}, #{item.bank}, #{item.trxFlag}, #{item.trxType}, #{item.exceptionType},
|
||||
#{item.internalFlag}, #{item.batchId}, #{item.batchSequence}, #{item.createDate}, #{item.createdBy},
|
||||
#{item.metaJson}, #{item.noBalance}, #{item.beginBalance}, #{item.endBalance},
|
||||
|
||||
@@ -33,6 +33,21 @@
|
||||
select="selectRiskHitTagsByScope"/>
|
||||
</resultMap>
|
||||
|
||||
<resultMap id="SuspiciousTransactionItemResultMap" type="com.ruoyi.ccdi.project.domain.vo.CcdiProjectSuspiciousTransactionItemVO">
|
||||
<id property="bankStatementId" column="bankStatementId"/>
|
||||
<result property="trxDate" column="trxDate"/>
|
||||
<result property="suspiciousPersonName" column="suspiciousPersonName"/>
|
||||
<result property="relatedPersonName" column="relatedPersonName"/>
|
||||
<result property="relatedStaffName" column="relatedStaffName"/>
|
||||
<result property="relatedStaffCode" column="relatedStaffCode"/>
|
||||
<result property="relationType" column="relationType"/>
|
||||
<result property="userMemo" column="userMemo"/>
|
||||
<result property="cashType" column="cashType"/>
|
||||
<result property="displayAmount" column="displayAmount"/>
|
||||
<result property="hasModelRuleHit" column="hasModelRuleHit"/>
|
||||
<result property="hasNameListHit" column="hasNameListHit"/>
|
||||
</resultMap>
|
||||
|
||||
<sql id="digitTableSql">
|
||||
select 0 as digit
|
||||
union all select 1
|
||||
@@ -338,6 +353,243 @@
|
||||
order by result.staff_name asc, result.staff_id_card asc
|
||||
</select>
|
||||
|
||||
<sql id="suspiciousTransactionBaseSql">
|
||||
select
|
||||
bs.bank_statement_id as bankStatementId,
|
||||
bs.TRX_DATE as trxDate,
|
||||
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,
|
||||
coalesce(relation.relation_name, direct_staff.name, bs.CUSTOMER_ACCOUNT_NAME) as relatedPersonName,
|
||||
coalesce(family_staff.name, direct_staff.name) as relatedStaffName,
|
||||
cast(coalesce(family_staff.staff_id, direct_staff.staff_id) as char) as relatedStaffCode,
|
||||
case
|
||||
when direct_staff.id_card is not null then '本人'
|
||||
when relation.relation_type is not null and trim(relation.relation_type) != '' then relation.relation_type
|
||||
else '关联人'
|
||||
end as relationType
|
||||
from ccdi_bank_statement bs
|
||||
left join ccdi_base_staff direct_staff
|
||||
on bs.cret_no = direct_staff.id_card
|
||||
left join ccdi_staff_fmy_relation relation
|
||||
on relation.status = 1
|
||||
and relation.relation_cert_no = bs.cret_no
|
||||
left join ccdi_base_staff family_staff
|
||||
on relation.person_id = family_staff.id_card
|
||||
where bs.project_id = #{query.projectId}
|
||||
and (direct_staff.id_card is not null or relation.person_id is not null)
|
||||
</sql>
|
||||
|
||||
<sql id="suspiciousTransactionModelHitSql">
|
||||
select distinct
|
||||
tr.bank_statement_id as bankStatementId
|
||||
from ccdi_bank_statement_tag_result tr
|
||||
where tr.project_id = #{query.projectId}
|
||||
and tr.bank_statement_id is not null
|
||||
and tr.rule_name like '%可疑%'
|
||||
</sql>
|
||||
|
||||
<sql id="suspiciousTransactionNameHitSql">
|
||||
select
|
||||
hits.bankStatementId,
|
||||
hits.suspiciousPersonName,
|
||||
hits.matchPriority
|
||||
from (
|
||||
select
|
||||
bs.bank_statement_id as bankStatementId,
|
||||
intermediary.name as suspiciousPersonName,
|
||||
1 as matchPriority
|
||||
from ccdi_bank_statement bs
|
||||
inner join ccdi_biz_intermediary intermediary
|
||||
on trim(bs.customer_cert_no) != ''
|
||||
and intermediary.person_id = bs.customer_cert_no
|
||||
where bs.project_id = #{query.projectId}
|
||||
|
||||
union all
|
||||
|
||||
select
|
||||
bs.bank_statement_id as bankStatementId,
|
||||
enterprise.enterprise_name as suspiciousPersonName,
|
||||
2 as matchPriority
|
||||
from ccdi_bank_statement bs
|
||||
inner join ccdi_enterprise_base_info enterprise
|
||||
on trim(bs.customer_social_credit_code) != ''
|
||||
and enterprise.social_credit_code = bs.customer_social_credit_code
|
||||
and enterprise.risk_level = '1'
|
||||
and enterprise.ent_source = 'INTERMEDIARY'
|
||||
where bs.project_id = #{query.projectId}
|
||||
|
||||
union all
|
||||
|
||||
select
|
||||
bs.bank_statement_id as bankStatementId,
|
||||
intermediary.name as suspiciousPersonName,
|
||||
3 as matchPriority
|
||||
from ccdi_bank_statement bs
|
||||
inner join ccdi_biz_intermediary intermediary
|
||||
on trim(bs.CUSTOMER_ACCOUNT_NAME) != ''
|
||||
and intermediary.name = bs.CUSTOMER_ACCOUNT_NAME
|
||||
where bs.project_id = #{query.projectId}
|
||||
|
||||
union all
|
||||
|
||||
select
|
||||
bs.bank_statement_id as bankStatementId,
|
||||
enterprise.enterprise_name as suspiciousPersonName,
|
||||
3 as matchPriority
|
||||
from ccdi_bank_statement bs
|
||||
inner join ccdi_enterprise_base_info enterprise
|
||||
on trim(bs.CUSTOMER_ACCOUNT_NAME) != ''
|
||||
and enterprise.enterprise_name = bs.CUSTOMER_ACCOUNT_NAME
|
||||
and enterprise.risk_level = '1'
|
||||
and enterprise.ent_source = 'INTERMEDIARY'
|
||||
where bs.project_id = #{query.projectId}
|
||||
) hits
|
||||
</sql>
|
||||
|
||||
<sql id="suspiciousTransactionMergedSql">
|
||||
select
|
||||
base.bankStatementId,
|
||||
base.trxDate,
|
||||
base.relatedPersonName,
|
||||
base.relatedStaffName,
|
||||
base.relatedStaffCode,
|
||||
base.relationType,
|
||||
base.userMemo,
|
||||
base.cashType,
|
||||
base.displayAmount,
|
||||
1 as hasModelRuleHit,
|
||||
0 as hasNameListHit,
|
||||
null as suspiciousPersonName,
|
||||
null as matchPriority
|
||||
from (
|
||||
<include refid="suspiciousTransactionBaseSql"/>
|
||||
) base
|
||||
inner join (
|
||||
<include refid="suspiciousTransactionModelHitSql"/>
|
||||
) model_hits on model_hits.bankStatementId = base.bankStatementId
|
||||
|
||||
union all
|
||||
|
||||
select
|
||||
base.bankStatementId,
|
||||
base.trxDate,
|
||||
base.relatedPersonName,
|
||||
base.relatedStaffName,
|
||||
base.relatedStaffCode,
|
||||
base.relationType,
|
||||
base.userMemo,
|
||||
base.cashType,
|
||||
base.displayAmount,
|
||||
0 as hasModelRuleHit,
|
||||
1 as hasNameListHit,
|
||||
name_hits.suspiciousPersonName,
|
||||
name_hits.matchPriority
|
||||
from (
|
||||
<include refid="suspiciousTransactionBaseSql"/>
|
||||
) base
|
||||
inner join (
|
||||
<include refid="suspiciousTransactionNameHitSql"/>
|
||||
) name_hits on name_hits.bankStatementId = base.bankStatementId
|
||||
</sql>
|
||||
|
||||
<sql id="suspiciousTransactionAggregatedSql">
|
||||
select
|
||||
merged.bankStatementId,
|
||||
max(merged.trxDate) as trxDate,
|
||||
coalesce(
|
||||
substring_index(
|
||||
min(
|
||||
case
|
||||
when merged.suspiciousPersonName is not null and merged.suspiciousPersonName != ''
|
||||
then concat(lpad(merged.matchPriority, 2, '0'), '|', merged.suspiciousPersonName)
|
||||
else null
|
||||
end
|
||||
),
|
||||
'|',
|
||||
-1
|
||||
),
|
||||
max(merged.relatedPersonName)
|
||||
) as suspiciousPersonName,
|
||||
max(merged.relatedPersonName) as relatedPersonName,
|
||||
max(merged.relatedStaffName) as relatedStaffName,
|
||||
max(merged.relatedStaffCode) as relatedStaffCode,
|
||||
max(merged.relationType) as relationType,
|
||||
max(merged.userMemo) as userMemo,
|
||||
max(merged.cashType) as cashType,
|
||||
max(merged.displayAmount) as displayAmount,
|
||||
max(merged.hasModelRuleHit) as hasModelRuleHit,
|
||||
max(merged.hasNameListHit) as hasNameListHit
|
||||
from (
|
||||
<include refid="suspiciousTransactionMergedSql"/>
|
||||
) merged
|
||||
group by merged.bankStatementId
|
||||
</sql>
|
||||
|
||||
<sql id="suspiciousTransactionFilterSql">
|
||||
<choose>
|
||||
<when test="query.suspiciousType == 'NAME_LIST'">
|
||||
where final_result.hasNameListHit = 1
|
||||
</when>
|
||||
<when test="query.suspiciousType == 'MODEL_RULE'">
|
||||
where final_result.hasModelRuleHit = 1
|
||||
</when>
|
||||
<otherwise>
|
||||
where final_result.hasModelRuleHit = 1 or final_result.hasNameListHit = 1
|
||||
</otherwise>
|
||||
</choose>
|
||||
</sql>
|
||||
|
||||
<select id="selectSuspiciousTransactionPage" resultMap="SuspiciousTransactionItemResultMap">
|
||||
<!-- rule_name like '%可疑%' -->
|
||||
<!-- ccdi_biz_intermediary -->
|
||||
<!-- ccdi_enterprise_base_info -->
|
||||
<!-- group by merged.bankStatementId -->
|
||||
select
|
||||
final_result.bankStatementId,
|
||||
final_result.trxDate,
|
||||
final_result.suspiciousPersonName,
|
||||
final_result.relatedPersonName,
|
||||
final_result.relatedStaffName,
|
||||
final_result.relatedStaffCode,
|
||||
final_result.relationType,
|
||||
final_result.userMemo,
|
||||
final_result.cashType,
|
||||
final_result.displayAmount,
|
||||
final_result.hasModelRuleHit,
|
||||
final_result.hasNameListHit
|
||||
from (
|
||||
<include refid="suspiciousTransactionAggregatedSql"/>
|
||||
) final_result
|
||||
<include refid="suspiciousTransactionFilterSql"/>
|
||||
order by final_result.trxDate desc, final_result.bankStatementId desc
|
||||
</select>
|
||||
|
||||
<select id="selectSuspiciousTransactionList" resultMap="SuspiciousTransactionItemResultMap">
|
||||
select
|
||||
final_result.bankStatementId,
|
||||
final_result.trxDate,
|
||||
final_result.suspiciousPersonName,
|
||||
final_result.relatedPersonName,
|
||||
final_result.relatedStaffName,
|
||||
final_result.relatedStaffCode,
|
||||
final_result.relationType,
|
||||
final_result.userMemo,
|
||||
final_result.cashType,
|
||||
final_result.displayAmount,
|
||||
final_result.hasModelRuleHit,
|
||||
final_result.hasNameListHit
|
||||
from (
|
||||
<include refid="suspiciousTransactionAggregatedSql"/>
|
||||
) final_result
|
||||
<include refid="suspiciousTransactionFilterSql"/>
|
||||
order by final_result.trxDate desc, final_result.bankStatementId desc
|
||||
</select>
|
||||
|
||||
<select id="selectRiskModelNamesByScope" resultType="java.lang.String">
|
||||
select
|
||||
json_unquote(json_extract(result.model_hit_summary_json, concat('$[', idx.idx, '].modelName'))) as model_name
|
||||
|
||||
Reference in New Issue
Block a user