@ -5,6 +5,8 @@ import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.NumberUtil ;
import cn.hutool.core.util.ObjectUtil ;
import cn.hutool.json.JSONUtil ;
import com.alibaba.druid.sql.ast.SQLStatement ;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser ;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper ;
import com.supervision.common.domain.R ;
import com.supervision.common.utils.StringUtils ;
@ -18,11 +20,13 @@ import com.supervision.police.dto.caseScore.CaseScoreDetailBuilder;
import com.supervision.police.mapper.* ;
import com.supervision.police.mybatis.RowSqlMapper ;
import com.supervision.police.service.ModelService ;
import com.supervision.utils.SqlParserUtil ;
import lombok.RequiredArgsConstructor ;
import lombok.extern.slf4j.Slf4j ;
import org.neo4j.driver.Driver ;
import org.neo4j.driver.Result ;
import org.neo4j.driver.Session ;
import org.springframework.beans.factory.annotation.Value ;
import org.springframework.stereotype.Service ;
import java.util.* ;
@ -48,6 +52,9 @@ public class ModelServiceImpl implements ModelService {
private final RowSqlMapper rowSqlMapper ;
@Value ( "${case.evidence.table}" )
private List < String > allowedTables ;
@Override
public R < ? > analyseCase ( AnalyseCaseDTO analyseCaseDTO ) {
ModelCase modelCase = modelCaseMapper . selectById ( analyseCaseDTO . getCaseId ( ) ) ;
@ -292,20 +299,49 @@ public class ModelServiceImpl implements ModelService {
params . put ( "provider" , null ) ;
params . put ( "party_a" , analyseCaseDTO . getLawActorName ( ) ) ;
params . put ( "party_b" , analyseCaseDTO . getLawParty ( ) ) ;
boolean success = false ;
if ( checkSql ( sql , allowedTables ) ) {
success = parseResult ( rowSqlMapper . selectList ( sql , params , Map . class ) ) ;
}
result . setAtomicResult ( success ? "1" : "0" ) ;
/ *
todo : 添 加 语 法 解 析 功 能 , 提 前 验 证 sql 是 否 合 法 , 并 且 限 制 sql 智 能 是 select 语 句 和 限 制 sql 语 句 中 出 现 的 表
MappedStatement mappedStatement = rowSqlMapper . selectMappedStatement ( sql , Map . class ) ;
BoundSql boundSql = mappedStatement . getBoundSql ( params ) ;
String sql1 = boundSql . getSql ( ) ;
* /
boolean b = parseResult ( rowSqlMapper . selectList ( sql , params , Map . class ) ) ;
result . setAtomicResult ( b ? "1" : "0" ) ;
}
private boolean checkSql ( String sql , List < String > allowedTables ) {
if ( StringUtils . isEmpty ( sql ) ) {
return false ;
}
if ( CollUtil . isEmpty ( allowedTables ) ) {
log . info ( "checkSql:未配置允许的表" ) ;
return false ;
}
MySqlStatementParser parser = new MySqlStatementParser ( sql ) ;
SQLStatement sqlStatement = SqlParserUtil . parseStatement ( parser ) ;
if ( Objects . isNull ( sqlStatement ) ) {
log . warn ( "checkSql sql:{}语句解析失败" , sql ) ;
return false ;
}
String sqlType = SqlParserUtil . detectSQLType ( sqlStatement ) ;
if ( ! "SELECT" . equals ( sqlType ) ) {
log . warn ( "checkSql:只支持查询类型语句" ) ;
return false ;
}
List < String > tableList = SqlParserUtil . extractTableNames ( sqlStatement ) ;
if ( CollUtil . isEmpty ( tableList ) ) {
log . warn ( "checkSql:未检测到表" ) ;
return false ;
}
long count = tableList . stream ( ) . filter ( table - > ! allowedTables . contains ( table ) ) . count ( ) ;
if ( count > 0 ) {
log . warn ( "checkSql:表{}不在允许的表列表中" , tableList ) ;
return false ;
}
return true ;
}
/ * *
* 执 行 结 果 分 析 :
* 1. 如 果 查 询 出 的 结 果 只 有 一 行 , 判 断 列 数 是 否 大 于 1 , 如 果 大 于 1 , 返 回 真 , 如 果 = 1 , 继 续 判 断 值 是 否 大 于 0 , 如 果 大 于 0 , 返 回 真 , 如 果 = 0 , 返 回 假