Merge pull request #8 from andybbc/master

规则块配置
This commit is contained in:
FiboAI
2022-08-09 11:24:52 +08:00
committed by GitHub
20 changed files with 333 additions and 205 deletions

View File

@@ -0,0 +1,16 @@
package com.fibo.ddp.common.dao.strategyx.guiderule;
import com.fibo.ddp.common.model.strategyx.guiderule.RuleBlock;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* 规则块配置表(RuleBlock)表数据库访问层
*
* @author andy.wang
* @since 2022-08-05 10:32:11
*/
@Mapper
public interface RuleBlockMapper extends BaseMapper<RuleBlock>{
}

View File

@@ -0,0 +1,5 @@
<?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.fibo.ddp.common.dao.strategyx.guiderule.RuleBlockMapper">
</mapper>

View File

@@ -12,23 +12,16 @@
<result property="author" column="author" jdbcType="INTEGER"/> <result property="author" column="author" jdbcType="INTEGER"/>
<result property="userId" column="user_id" jdbcType="INTEGER"/> <result property="userId" column="user_id" jdbcType="INTEGER"/>
<result property="organId" column="organ_id" jdbcType="INTEGER"/> <result property="organId" column="organ_id" jdbcType="INTEGER"/>
<result property="engineId" column="engine_id" jdbcType="INTEGER"/>
<result property="status" column="status" jdbcType="INTEGER"/> <result property="status" column="status" jdbcType="INTEGER"/>
<result property="type" column="type" jdbcType="INTEGER"/> <result property="type" column="type" jdbcType="INTEGER"/>
<result property="isNon" column="is_non" jdbcType="INTEGER"/>
<result property="content" column="content" jdbcType="VARCHAR"/>
<result property="created" column="created" jdbcType="TIMESTAMP"/> <result property="created" column="created" jdbcType="TIMESTAMP"/>
<result property="updated" column="updated" jdbcType="TIMESTAMP"/> <result property="updated" column="updated" jdbcType="TIMESTAMP"/>
<result property="ruleType" column="rule_type" jdbcType="INTEGER"/>
<result property="ruleAudit" column="rule_audit" jdbcType="INTEGER"/>
<result property="score" column="score" jdbcType="INTEGER"/>
<result property="difficulty" column="difficulty" jdbcType="INTEGER"/> <result property="difficulty" column="difficulty" jdbcType="INTEGER"/>
<result property="scriptType" column="script_type" jdbcType="VARCHAR"/> <result property="scriptType" column="script_type" jdbcType="VARCHAR"/>
<result property="lastLogical" column="last_logical" jdbcType="VARCHAR"/>
</resultMap> </resultMap>
<sql id="Base_column"> <sql id="Base_column">
id, name, code, description, priority, parent_id, author, user_id, organ_id, engine_id, status, type, is_non, content, created, updated, rule_type, rule_audit, score, last_logical,difficulty,script_type,result_field_en,score_field_en id, name, code, description, priority, parent_id, author, user_id, organ_id, status, type, created, updated,difficulty,script_type
</sql> </sql>
<!--查询单个--> <!--查询单个-->
<select id="queryById" resultMap="RuleMap"> <select id="queryById" resultMap="RuleMap">
@@ -76,9 +69,6 @@
<if test="organId != null"> <if test="organId != null">
and organ_id = #{organId} and organ_id = #{organId}
</if> </if>
<if test="engineId != null">
and engine_id = #{engineId}
</if>
<if test="status != null"> <if test="status != null">
and status = #{status} and status = #{status}
</if> </if>
@@ -88,30 +78,12 @@
<if test="type != null"> <if test="type != null">
and `type` = #{type} and `type` = #{type}
</if> </if>
<if test="isNon != null">
and is_non = #{isNon}
</if>
<if test="content != null and content != ''">
and content = #{content}
</if>
<if test="created != null"> <if test="created != null">
and created >= #{created} and created >= #{created}
</if> </if>
<if test="updated != null"> <if test="updated != null">
and updated >= #{updated} and updated >= #{updated}
</if> </if>
<if test="ruleType != null">
and rule_type = #{ruleType}
</if>
<if test="ruleAudit != null">
and rule_audit = #{ruleAudit}
</if>
<if test="score != null">
and score = #{score}
</if>
<if test="lastLogical != null and lastLogical != ''">
and last_logical = #{lastLogical}
</if>
<if test="difficulty != null"> <if test="difficulty != null">
and difficulty = #{difficulty} and difficulty = #{difficulty}
</if> </if>

View File

@@ -0,0 +1,59 @@
package com.fibo.ddp.common.model.strategyx.guiderule;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.io.Serializable;
/**
* 规则块配置表(RuleBlock)实体类
*
* @author andy.wang
* @since 2022-08-05 10:32:12
*/
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = false)
@TableName("t_rule_block")
public class RuleBlock implements Serializable {
private static final long serialVersionUID = 153524790651348062L;
@TableId(type = IdType.AUTO)
/**
* 主键规则块id
*/
private Long id;
/**
* 规则id
*/
private Long ruleId;
/**
* 规则版本的id
*/
private Long versionId;
/**
* 存放执行结果的变量
*/
private String resultFieldEn;
/**
* 规则分数
*/
private Integer score;
/**
* 存放得分的变量
*/
private String scoreFieldEn;
/**
* 创建时间
*/
private Date createTime;
/**
* 修改时间
*/
private Date updateTime;
}

View File

@@ -49,6 +49,8 @@ public class RuleConditionInfo
private Long versionId;//规则版本的id private Long versionId;//规则版本的id
private Long blockId;//规则块的id
private Long parentId;//父节点的id private Long parentId;//父节点的id
private Integer conditionType;//规则节点的类型1-关系节点2-表达式节点 private Integer conditionType;//规则节点的类型1-关系节点2-表达式节点

View File

@@ -43,35 +43,18 @@ public class RuleInfo implements Serializable {
private Long organId;//组织id private Long organId;//组织id
private Integer engineId;
private Integer status;//状态 0 :停用 1 : 启用,-1删除 private Integer status;//状态 0 :停用 1 : 启用,-1删除
private Integer type;//规则类型 0 : 系统的规则 1组织的规则 2 引擎的规则 private Integer type;//规则类型 0 : 系统的规则 1组织的规则 2 引擎的规则
private Integer isNon;//逻辑关系“非”01
private String content;//规则具体内容
private Date created; private Date created;
private Date updated; private Date updated;
private Integer ruleType;//0硬性拒绝规则1加减分规则
private Integer ruleAudit;
private Integer score;//得分
private String lastLogical;//逻辑关系符
private Integer difficulty;//规则难度1-简单规则2复杂规则 private Integer difficulty;//规则难度1-简单规则2复杂规则
private String scriptType;//脚本类型pythonjsgroovy private String scriptType;//脚本类型pythonjsgroovy
private String resultFieldEn;//存放是否命中的字段
private String scoreFieldEn;//存放得分的字段en
@TableField(exist = false) @TableField(exist = false)
private String authorName;//创建人名称,需要去其他表查询 private String authorName;//创建人名称,需要去其他表查询
@TableField(exist = false) @TableField(exist = false)

View File

@@ -37,18 +37,6 @@ public class RuleVersion implements Serializable {
* 状态:-1 删除 0停用 1启用 * 状态:-1 删除 0停用 1启用
*/ */
private Integer status; private Integer status;
/**
* 规则结果en(命中情况)
*/
private String resultFieldEn;
/**
* 规则得分
*/
private Integer score;
/**
* 规则得分的en
*/
private String scoreFieldEn;
/** /**
* 组织id * 组织id
*/ */

View File

@@ -0,0 +1,23 @@
package com.fibo.ddp.common.model.strategyx.guiderule.vo;
import com.fibo.ddp.common.model.strategyx.guiderule.RuleBlock;
import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors
public class RuleBlockVo extends RuleBlock {
private RuleConditionVo ruleConditionVo;//规则对应的结点树
private List<StrategyOutput> strategyOutputList;//输出字段
private List<StrategyOutput> failOutputList;//失败输出字段
}

View File

@@ -12,9 +12,11 @@ import java.util.List;
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class RuleVersionVo extends RuleVersion { public class RuleVersionVo extends RuleVersion {
private RuleConditionVo ruleConditionVo;//规则对应的结点树 // private RuleConditionVo ruleConditionVo;//规则对应的结点树
//
// private List<StrategyOutput> strategyOutputList;//输出字段
//
// private List<StrategyOutput> failOutputList;//失败输出字段
private List<StrategyOutput> strategyOutputList;//输出字段 private List<RuleBlockVo> ruleBlockVoList;
private List<StrategyOutput> failOutputList;//失败输出字段
} }

View File

@@ -2,7 +2,6 @@ package com.fibo.ddp.common.model.strategyx.guiderule.vo;
import com.fibo.ddp.common.model.strategyx.guiderule.RuleInfo; import com.fibo.ddp.common.model.strategyx.guiderule.RuleInfo;
import com.fibo.ddp.common.model.strategyx.scriptrule.RuleScriptVersion; import com.fibo.ddp.common.model.strategyx.scriptrule.RuleScriptVersion;
import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@@ -16,9 +15,9 @@ import java.util.List;
@Accessors @Accessors
public class RuleVo extends RuleInfo { public class RuleVo extends RuleInfo {
private RuleConditionVo ruleConditionVo;//规则对应的结点树 // private RuleConditionVo ruleConditionVo;//规则对应的结点树
//
private List<StrategyOutput> strategyOutputList;//输出字段 // private List<StrategyOutput> strategyOutputList;//输出字段
private List<RuleVersionVo> ruleVersionList;//规则版本列表 private List<RuleVersionVo> ruleVersionList;//规则版本列表
// private List<T> ruleVersionList;//规则版本列表 // private List<T> ruleVersionList;//规则版本列表

View File

@@ -598,7 +598,6 @@ public class EngineNodeServiceImpl extends ServiceImpl<EngineNodeMapper, EngineN
case 3: case 3:
scriptRuleVersionIds.add(ruleVersionId); scriptRuleVersionIds.add(ruleVersionId);
break; break;
} }
} }
List<RuleSetNodeResultParam> ruleSetNodeResultParams = new ArrayList<>(); List<RuleSetNodeResultParam> ruleSetNodeResultParams = new ArrayList<>();
@@ -610,9 +609,9 @@ public class EngineNodeServiceImpl extends ServiceImpl<EngineNodeMapper, EngineN
for (RuleInfo rule : ruleList) { for (RuleInfo rule : ruleList) {
ruleMap.put(rule.getId(),rule); ruleMap.put(rule.getId(),rule);
if (rule.getDifficulty()==null||rule.getDifficulty()==1){ if (rule.getDifficulty()==null||rule.getDifficulty()==1){
String resultEn = rule.getResultFieldEn(); // String resultEn = rule.getResultFieldEn();
String scoreEn = rule.getScoreFieldEn(); // String scoreEn = rule.getScoreFieldEn();
ruleSetNodeResultParams.add(new RuleSetNodeResultParam(rule.getId(),1,null,resultEn,scoreEn,rule.getCode(),rule.getName())); // ruleSetNodeResultParams.add(new RuleSetNodeResultParam(rule.getId(),1,null,resultEn,scoreEn,rule.getCode(),rule.getName()));
} }
} }
} }
@@ -622,10 +621,10 @@ public class EngineNodeServiceImpl extends ServiceImpl<EngineNodeMapper, EngineN
List<RuleVersion> ruleVersionList = ruleVersionService.listByIds(complexRuleVersionIds); List<RuleVersion> ruleVersionList = ruleVersionService.listByIds(complexRuleVersionIds);
if (CollectionUtils.isNotEmpty(ruleVersionList)){ if (CollectionUtils.isNotEmpty(ruleVersionList)){
for (RuleVersion ruleVersion : ruleVersionList) { for (RuleVersion ruleVersion : ruleVersionList) {
String resultEn = ruleVersion.getResultFieldEn(); // String resultEn = ruleVersion.getResultFieldEn();
String scoreEn = ruleVersion.getScoreFieldEn(); // String scoreEn = ruleVersion.getScoreFieldEn();
RuleInfo rule = ruleMap.get(ruleVersion.getRuleId()); // RuleInfo rule = ruleMap.get(ruleVersion.getRuleId());
ruleSetNodeResultParams.add(new RuleSetNodeResultParam(ruleVersion.getRuleId(),2,ruleVersion.getId(),resultEn,scoreEn,rule.getCode(),rule.getName())); // ruleSetNodeResultParams.add(new RuleSetNodeResultParam(ruleVersion.getRuleId(),2,ruleVersion.getId(),resultEn,scoreEn,rule.getCode(),rule.getName()));
} }
} }
} }

View File

@@ -0,0 +1,19 @@
package com.fibo.ddp.common.service.strategyx.guiderule;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fibo.ddp.common.model.strategyx.guiderule.RuleBlock;
import java.util.List;
/**
* 规则块配置表(RuleBlock)表服务接口
*
* @author andy.wang
* @since 2022-08-05 10:32:22
*/
public interface RuleBlockService extends IService<RuleBlock> {
List<RuleBlock> listObjectsByVersionId(Long versionId);
boolean removeObjects(Long ruleId, Long versionId);
}

View File

@@ -16,9 +16,9 @@ public interface RuleConditionService extends IService<RuleConditionInfo> {
* @param ruleConditionVo 实例对象 * @param ruleConditionVo 实例对象
* @return 实例对象 * @return 实例对象
*/ */
RuleConditionVo insertRuleCondition(RuleConditionVo ruleConditionVo, Long ruleId); RuleConditionVo insertRuleCondition(RuleConditionVo ruleConditionVo, Long ruleId, Long blockId);
RuleConditionVo updateRuleCondition(Long ruleId, RuleConditionVo ruleConditionVo); RuleConditionVo updateRuleCondition(Long ruleId, Long blockId, RuleConditionVo ruleConditionVo);
boolean deleteRuleCondition(Long ruleId, Long versionId); boolean deleteRuleCondition(Long ruleId, Long versionId);
@@ -28,7 +28,7 @@ public interface RuleConditionService extends IService<RuleConditionInfo> {
List<RuleConditionInfo> disassemble(RuleConditionVo vo, Long ruleId, boolean needTempId); List<RuleConditionInfo> disassemble(RuleConditionVo vo, Long ruleId, boolean needTempId);
// runner // runner
RuleConditionVo queryByVersionId(Long versionId); RuleConditionVo queryByBlockId(Long blockId);
List<String> queryFieldEnByVersionIds(List<Long> versionIds); List<String> queryFieldEnByVersionIds(List<Long> versionIds);
} }

View File

@@ -0,0 +1,35 @@
package com.fibo.ddp.common.service.strategyx.guiderule.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fibo.ddp.common.dao.strategyx.guiderule.RuleBlockMapper;
import com.fibo.ddp.common.model.strategyx.guiderule.RuleBlock;
import com.fibo.ddp.common.service.strategyx.guiderule.RuleBlockService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 规则块配置表(RuleBlock)表服务实现类
*
* @author andy.wang
* @since 2022-08-05 10:32:25
*/
@Service
public class RuleBlockServiceImpl extends ServiceImpl<RuleBlockMapper, RuleBlock> implements RuleBlockService {
@Override
public List<RuleBlock> listObjectsByVersionId(Long versionId) {
LambdaQueryWrapper<RuleBlock> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(RuleBlock::getVersionId, versionId);
return list(queryWrapper);
}
@Override
public boolean removeObjects(Long ruleId, Long versionId) {
LambdaQueryWrapper<RuleBlock> queryWrapper = new LambdaQueryWrapper();
queryWrapper.eq(RuleBlock::getRuleId, ruleId);
queryWrapper.eq(RuleBlock::getVersionId, versionId);
return this.remove(queryWrapper);
}
}

View File

@@ -68,22 +68,15 @@ public class RuleConditionServiceImpl extends ServiceImpl<RuleConditionInfoMappe
// } // }
@Override @Override
public RuleConditionVo queryByVersionId(Long versionId) { public RuleConditionVo queryByBlockId(Long blockId) {
if (versionId == null) { if (blockId == null) {
return null; return null;
} }
//构造查询条件,查询条件列表 //构造查询条件,查询条件列表
RuleConditionVo result = null; RuleConditionVo result = null;
List<RuleConditionInfo> ruleConditionInfoList = null;
if(Constants.switchFlag.ON.equals(cacheSwitch)){
String key = RedisUtils.getForeignKey(TableEnum.T_RULE_CONDITION, versionId);
ruleConditionInfoList = redisManager.getByForeignKey(key, RuleConditionInfo.class);
} else {
LambdaQueryWrapper<RuleConditionInfo> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<RuleConditionInfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(RuleConditionInfo::getVersionId, versionId); queryWrapper.eq(RuleConditionInfo::getBlockId, blockId);
ruleConditionInfoList = ruleConditionInfoMapper.selectList(queryWrapper); List<RuleConditionInfo> ruleConditionInfoList = this.list(queryWrapper);
}
//组装为需要的树形结构 //组装为需要的树形结构
if (ruleConditionInfoList != null) { if (ruleConditionInfoList != null) {
@@ -100,7 +93,7 @@ public class RuleConditionServiceImpl extends ServiceImpl<RuleConditionInfoMappe
*/ */
@Override @Override
@Transactional @Transactional
public RuleConditionVo insertRuleCondition(RuleConditionVo ruleConditionVo, Long ruleId) { public RuleConditionVo insertRuleCondition(RuleConditionVo ruleConditionVo, Long ruleId, Long blockId) {
if (ruleConditionVo == null || ruleId == null) { if (ruleConditionVo == null || ruleId == null) {
return null; return null;
} }
@@ -113,6 +106,7 @@ public class RuleConditionServiceImpl extends ServiceImpl<RuleConditionInfoMappe
List<RuleConditionInfo> list = this.disassemble(ruleConditionVo, ruleId, true); List<RuleConditionInfo> list = this.disassemble(ruleConditionVo, ruleId, true);
for (RuleConditionInfo info : list) { for (RuleConditionInfo info : list) {
info.setVersionId(versionId); info.setVersionId(versionId);
info.setBlockId(blockId);
} }
//找出唯一根节点 //找出唯一根节点
RuleConditionInfo root = null; RuleConditionInfo root = null;
@@ -138,19 +132,13 @@ public class RuleConditionServiceImpl extends ServiceImpl<RuleConditionInfoMappe
*/ */
@Override @Override
@Transactional @Transactional
public RuleConditionVo updateRuleCondition(Long ruleId, RuleConditionVo ruleConditionVo) { public RuleConditionVo updateRuleCondition(Long ruleId, Long blockId, RuleConditionVo ruleConditionVo) {
if (ruleId == null) { if (ruleId == null) {
return null; return null;
} }
//删除一个规则下的所有条件
boolean delete = this.deleteRuleCondition(ruleId,ruleConditionVo.getVersionId());
RuleConditionVo ruleCondition = null;
if (!delete) {
ruleCondition = this.queryByVersionId(ruleConditionVo.getVersionId());
}
//插入条件树 //插入条件树
if ((delete || ruleCondition == null) && ruleConditionVo != null) { if (ruleConditionVo != null) {
RuleConditionVo insertResult = this.insertRuleCondition(ruleConditionVo, ruleId); RuleConditionVo insertResult = this.insertRuleCondition(ruleConditionVo, ruleId, blockId);
return insertResult; return insertResult;
} }
return null; return null;

View File

@@ -119,7 +119,6 @@ public class RuleServiceImpl extends ServiceImpl<RuleInfoMapper, RuleInfo> imple
return pageInfo; return pageInfo;
} }
@Override @Override
@Transactional @Transactional
public RuleVo insertRuleInfo(RuleVo vo) { public RuleVo insertRuleInfo(RuleVo vo) {
@@ -268,21 +267,6 @@ public class RuleServiceImpl extends ServiceImpl<RuleInfoMapper, RuleInfo> imple
//加入状态信息 //加入状态信息
vo.setType(RuleConst.TYPE_ORGAN); vo.setType(RuleConst.TYPE_ORGAN);
vo.setStatus(RuleConst.STATUS_ENABLED); vo.setStatus(RuleConst.STATUS_ENABLED);
//加入规则类型
if (vo == null || vo.getRuleAudit() == null) {
throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage());
}
switch (vo.getRuleAudit()) {
case RuleConst.RULE_AUDIT_TERMINATION:
vo.setRuleType(RuleConst.RULE_TYPE_TERMINATION);
break;
case RuleConst.RULE_AUDIT_SCORING:
vo.setRuleType(RuleConst.RULE_TYPE_SCORING);
break;
default:
vo.setRuleType(RuleConst.RULE_TYPE_TERMINATION);
}
return vo; return vo;
} }

View File

@@ -9,14 +9,17 @@ import com.fibo.ddp.common.dao.datax.datamanage.FieldMapper;
import com.fibo.ddp.common.dao.strategyx.guiderule.RuleVersionMapper; import com.fibo.ddp.common.dao.strategyx.guiderule.RuleVersionMapper;
import com.fibo.ddp.common.model.authx.system.SysUser; import com.fibo.ddp.common.model.authx.system.SysUser;
import com.fibo.ddp.common.model.common.requestParam.StatusParam; import com.fibo.ddp.common.model.common.requestParam.StatusParam;
import com.fibo.ddp.common.model.strategyx.guiderule.RuleBlock;
import com.fibo.ddp.common.model.strategyx.guiderule.RuleConditionInfo; import com.fibo.ddp.common.model.strategyx.guiderule.RuleConditionInfo;
import com.fibo.ddp.common.model.strategyx.guiderule.RuleVersion; import com.fibo.ddp.common.model.strategyx.guiderule.RuleVersion;
import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleBlockVo;
import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleConditionVo; import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleConditionVo;
import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleVersionVo; import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleVersionVo;
import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput; import com.fibo.ddp.common.model.strategyx.strategyout.StrategyOutput;
import com.fibo.ddp.common.service.common.SessionManager; import com.fibo.ddp.common.service.common.SessionManager;
import com.fibo.ddp.common.service.redis.RedisManager; import com.fibo.ddp.common.service.redis.RedisManager;
import com.fibo.ddp.common.service.redis.RedisUtils; import com.fibo.ddp.common.service.redis.RedisUtils;
import com.fibo.ddp.common.service.strategyx.guiderule.RuleBlockService;
import com.fibo.ddp.common.service.strategyx.guiderule.RuleConditionService; import com.fibo.ddp.common.service.strategyx.guiderule.RuleConditionService;
import com.fibo.ddp.common.service.strategyx.guiderule.RuleVersionService; import com.fibo.ddp.common.service.strategyx.guiderule.RuleVersionService;
import com.fibo.ddp.common.service.strategyx.strategyout.StrategyOutputService; import com.fibo.ddp.common.service.strategyx.strategyout.StrategyOutputService;
@@ -43,6 +46,8 @@ public class RuleVersionServiceImpl extends ServiceImpl<RuleVersionMapper, RuleV
@Autowired @Autowired
private RuleVersionMapper versionMapper; private RuleVersionMapper versionMapper;
@Autowired @Autowired
private RuleBlockService ruleBlockService;
@Autowired
private RuleConditionService conditionService; private RuleConditionService conditionService;
@Autowired @Autowired
private StrategyOutputService outputService; private StrategyOutputService outputService;
@@ -88,13 +93,23 @@ public class RuleVersionServiceImpl extends ServiceImpl<RuleVersionMapper, RuleV
return result; return result;
} }
BeanUtils.copyProperties(ruleVersion, result); BeanUtils.copyProperties(ruleVersion, result);
List<RuleBlock> ruleBlockList = ruleBlockService.listObjectsByVersionId(id);
List<RuleBlockVo> ruleBlockVoList = new ArrayList<>();
for(RuleBlock ruleBlock : ruleBlockList){
RuleBlockVo ruleBlockVo = new RuleBlockVo();
BeanUtils.copyProperties(ruleBlock, ruleBlockVo);
//查询ruleCondition组装成树形结构 //查询ruleCondition组装成树形结构
RuleConditionVo ruleConditionVo = conditionService.queryByVersionId(id); RuleConditionVo ruleConditionVo = conditionService.queryByBlockId(ruleBlock.getId());
List<StrategyOutput> strategyOutputList = outputService.queryByTactics(new StrategyOutput(id, StrategyType.COMPLEX_RULE, StrategyType.OutType.SUCCESS_OUT)); List<StrategyOutput> strategyOutputList = outputService.queryByTactics(new StrategyOutput(ruleBlock.getId(), StrategyType.COMPLEX_RULE, StrategyType.OutType.SUCCESS_OUT));
List<StrategyOutput> failOutputList = outputService.queryByTactics(new StrategyOutput(id, StrategyType.COMPLEX_RULE, StrategyType.OutType.FAIL_OUT)); List<StrategyOutput> failOutputList = outputService.queryByTactics(new StrategyOutput(ruleBlock.getId(), StrategyType.COMPLEX_RULE, StrategyType.OutType.FAIL_OUT));
result.setRuleConditionVo(ruleConditionVo); ruleBlockVo.setRuleConditionVo(ruleConditionVo);
result.setStrategyOutputList(strategyOutputList); ruleBlockVo.setStrategyOutputList(strategyOutputList);
result.setFailOutputList(failOutputList); ruleBlockVo.setFailOutputList(failOutputList);
ruleBlockVoList.add(ruleBlockVo);
}
result.setRuleBlockVoList(ruleBlockVoList);
return result; return result;
} }
@@ -134,14 +149,15 @@ public class RuleVersionServiceImpl extends ServiceImpl<RuleVersionMapper, RuleV
public List<String> queryFieldEnByVersionId(Long versionId) { public List<String> queryFieldEnByVersionId(Long versionId) {
Set<String> fieldEns = new HashSet<>(); Set<String> fieldEns = new HashSet<>();
Set<Long> fieldIds = new HashSet<>(); Set<Long> fieldIds = new HashSet<>();
RuleConditionVo ruleConditionVo = conditionService.queryByVersionId(versionId); List<RuleBlock> ruleBlockList = ruleBlockService.listObjectsByVersionId(versionId);
List<RuleConditionInfo> ruleConditionInfoList = conditionService.disassemble(ruleConditionVo, versionId, false); for (RuleBlock ruleBlock : ruleBlockList) {
RuleConditionVo ruleConditionVo = conditionService.queryByBlockId(ruleBlock.getId());
List<RuleConditionInfo> ruleConditionInfoList = conditionService.disassemble(ruleConditionVo, ruleBlock.getRuleId(), false);
for (RuleConditionInfo info : ruleConditionInfoList) { for (RuleConditionInfo info : ruleConditionInfoList) {
if (info.getFieldEn() != null && info.getFieldType() != 1 && !info.getFieldEn().startsWith("%")) { if (info.getFieldEn() != null && info.getFieldType() != 1 && !info.getFieldEn().startsWith("%")) {
if (info.getFieldEn().contains(".")) { if (info.getFieldEn().contains(".")) {
fieldEns.add(info.getFieldEn().split("\\.")[0]); fieldEns.add(info.getFieldEn().split("\\.")[0]);
} } else {
else {
fieldEns.add(info.getFieldEn()); fieldEns.add(info.getFieldEn());
} }
} else if (info.getFieldId() != null) { } else if (info.getFieldId() != null) {
@@ -155,6 +171,7 @@ public class RuleVersionServiceImpl extends ServiceImpl<RuleVersionMapper, RuleV
} }
} }
} }
}
for (Long fieldId : fieldIds) { for (Long fieldId : fieldIds) {
String fieldName = fieldMapper.findFieldNameById(fieldId); String fieldName = fieldMapper.findFieldNameById(fieldId);
fieldEns.add(fieldName); fieldEns.add(fieldName);
@@ -201,21 +218,33 @@ public class RuleVersionServiceImpl extends ServiceImpl<RuleVersionMapper, RuleV
} }
return false; return false;
} }
@Transactional @Transactional
public boolean addVersionDetail(RuleVersionVo version){ public boolean addVersionDetail(RuleVersionVo version){
RuleConditionVo ruleConditionVo = version.getRuleConditionVo(); List<RuleBlockVo> ruleBlockVoList = version.getRuleBlockVoList();
for (RuleBlockVo ruleBlockVo : ruleBlockVoList){
RuleBlock ruleBlock = new RuleBlock();
BeanUtils.copyProperties(ruleBlockVo, ruleBlock);
ruleBlock.setRuleId(version.getRuleId());
ruleBlock.setVersionId(version.getId());
ruleBlockService.save(ruleBlock);
RuleConditionVo ruleConditionVo = ruleBlockVo.getRuleConditionVo();
ruleConditionVo.setVersionId(version.getId()); ruleConditionVo.setVersionId(version.getId());
ruleConditionVo.setBlockId(ruleBlock.getId());
//添加条件信息 //添加条件信息
conditionService.insertRuleCondition(ruleConditionVo,version.getRuleId()); conditionService.insertRuleCondition(ruleConditionVo,version.getRuleId(), ruleBlock.getId());
//添加输出字段 //添加输出字段
List<StrategyOutput> strategyOutputList = version.getStrategyOutputList(); List<StrategyOutput> strategyOutputList = ruleBlockVo.getStrategyOutputList();
if (strategyOutputList !=null&& strategyOutputList.size()>0){ if (strategyOutputList !=null&& strategyOutputList.size()>0){
outputService.insertTacticsOutput(version.getId(), strategyOutputList); outputService.insertTacticsOutput(ruleBlock.getId(), strategyOutputList);
} }
List<StrategyOutput> failOutputList = version.getFailOutputList(); List<StrategyOutput> failOutputList = ruleBlockVo.getFailOutputList();
if (failOutputList!=null&&failOutputList.size()>0){ if (failOutputList!=null&&failOutputList.size()>0){
outputService.insertTacticsOutput(version.getId(),failOutputList ); outputService.insertTacticsOutput(ruleBlock.getId(),failOutputList );
} }
}
return true; return true;
} }
@@ -232,23 +261,46 @@ public class RuleVersionServiceImpl extends ServiceImpl<RuleVersionMapper, RuleV
@Override @Override
@Transactional @Transactional
public boolean updateVersion(RuleVersionVo version) { public boolean updateVersion(RuleVersionVo version) {
Long ruleId = version.getRuleId();
Long versionId = version.getId(); Long versionId = version.getId();
if (versionId==null){ if (versionId==null){
return false; return false;
} }
SysUser loginSysUser = SessionManager.getLoginAccount(); SysUser loginSysUser = SessionManager.getLoginAccount();
version.setUpdateUserId(loginSysUser.getUserId()); version.setUpdateUserId(loginSysUser.getUserId());
//修改版本主表 // 1. 修改版本主表
versionMapper.updateById(version); versionMapper.updateById(version);
// 2. 删除原版本下所有子表数据
// 删除所有规则块
ruleBlockService.removeObjects(ruleId, versionId);
// 删除所有条件
conditionService.deleteRuleCondition(ruleId, versionId);
// 删除所有策略输出(需找出原来的所有块,然后逐一删除)
List<RuleBlock> oldRuleBlockList = ruleBlockService.listObjectsByVersionId(versionId);
for(RuleBlock ruleBlock : oldRuleBlockList){
StrategyOutput strategyOutput = new StrategyOutput(ruleBlock.getId(), StrategyType.COMPLEX_RULE);
outputService.deleteByTactics(strategyOutput);
}
// 3. 插入新版本下子表数据
List<RuleBlockVo> ruleBlockVoList = version.getRuleBlockVoList();
for(RuleBlockVo ruleBlockVo : ruleBlockVoList){
// 修改规则块配置表
ruleBlockVo.setRuleId(ruleId);
ruleBlockVo.setVersionId(versionId);
ruleBlockService.save(ruleBlockVo);
Long blockId = ruleBlockVo.getId();
//修改条件表 //修改条件表
conditionService.updateRuleCondition(version.getRuleId(),version.getRuleConditionVo()); conditionService.updateRuleCondition(ruleId, blockId, ruleBlockVo.getRuleConditionVo());
//修改策略输出 //修改策略输出
outputService.updateTacticsOutput(versionId,version.getStrategyOutputList(),version.getFailOutputList(), StrategyType.COMPLEX_RULE); outputService.updateTacticsOutput(blockId,ruleBlockVo.getStrategyOutputList(),ruleBlockVo.getFailOutputList(), StrategyType.COMPLEX_RULE);
}
this.saveSnapshot(versionId); this.saveSnapshot(versionId);
return true; return true;
} }
@Override @Override
@Transactional @Transactional
public boolean updateStatus(StatusParam statusParam) { public boolean updateStatus(StatusParam statusParam) {

View File

@@ -107,11 +107,6 @@ public class StrategyOutputServiceImpl extends ServiceImpl<StrategyOutputMapper,
@Transactional @Transactional
@Override @Override
public boolean updateTacticsOutput(Long tacticsId, List<StrategyOutput> successList, List<StrategyOutput> failList, String tacticsType) { public boolean updateTacticsOutput(Long tacticsId, List<StrategyOutput> successList, List<StrategyOutput> failList, String tacticsType) {
StrategyOutput strategyOutput = new StrategyOutput(tacticsId, tacticsType);
boolean delete = this.deleteByTactics(strategyOutput);
if (!delete && this.queryByTactics(strategyOutput).size() != 0) {
return false;
}
if (successList != null && !successList.isEmpty()) { if (successList != null && !successList.isEmpty()) {
this.insertTacticsOutput(tacticsId, successList, StrategyType.OutType.SUCCESS_OUT); this.insertTacticsOutput(tacticsId, successList, StrategyType.OutType.SUCCESS_OUT);
} }

View File

@@ -8,6 +8,7 @@ import com.fibo.ddp.common.model.enginex.risk.EngineNode;
import com.fibo.ddp.common.model.enginex.runner.ExpressionParam; import com.fibo.ddp.common.model.enginex.runner.ExpressionParam;
import com.fibo.ddp.common.model.strategyx.guiderule.RuleInfo; import com.fibo.ddp.common.model.strategyx.guiderule.RuleInfo;
import com.fibo.ddp.common.model.strategyx.guiderule.RuleLoopGroupAction; import com.fibo.ddp.common.model.strategyx.guiderule.RuleLoopGroupAction;
import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleBlockVo;
import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleConditionVo; import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleConditionVo;
import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleVersionVo; import com.fibo.ddp.common.model.strategyx.guiderule.vo.RuleVersionVo;
import com.fibo.ddp.common.model.strategyx.scriptrule.RuleScriptVersion; import com.fibo.ddp.common.model.strategyx.scriptrule.RuleScriptVersion;
@@ -328,18 +329,29 @@ public class RuleSetNode implements EngineRunnerNode {
ruleMap.put("desc", rule.getDescription()); ruleMap.put("desc", rule.getDescription());
ruleMap.put("ruleResult", "未命中"); ruleMap.put("ruleResult", "未命中");
//获取规则需要执行的condition逻辑。 // 循环执行规则块,按顺序命中第一个块就结束
RuleConditionVo ruleCondition = ruleVersion.getRuleConditionVo(); boolean result = false;
//传入输入参数、中间变量、输出参数和需要执行的condition逻辑获取执行结果
Map<String, Object> temp = JSON.parseObject(JSON.toJSONString(input), Map.class); Map<String, Object> temp = JSON.parseObject(JSON.toJSONString(input), Map.class);
boolean result = this.executeRuleCondition(temp, output, ruleCondition); List<RuleBlockVo> ruleBlockVoList = ruleVersion.getRuleBlockVoList();
String resultFieldEn = ruleVersion.getResultFieldEn(); RuleBlockVo hitRuleBlock = ruleBlockVoList.get(0); // 规则的输出项默认用第一个块的配置
if (resultFieldEn == null || "".equals(resultFieldEn)) { for (RuleBlockVo ruleBlockVo : ruleBlockVoList) {
resultFieldEn = "rule_2_"+rule.getId()+"_"+ruleVersion.getId()+"_hitResult"; //获取规则需要执行的condition逻辑。
RuleConditionVo ruleCondition = ruleBlockVo.getRuleConditionVo();
//传入输入参数、中间变量、输出参数和需要执行的condition逻辑获取执行结果
result = this.executeRuleCondition(temp, output, ruleCondition);
if (result) {
hitRuleBlock = ruleBlockVo;
break;
} }
String scoreFieldEn = ruleVersion.getScoreFieldEn(); }
String resultFieldEn = hitRuleBlock.getResultFieldEn();
if (resultFieldEn == null || "".equals(resultFieldEn)) {
resultFieldEn = "rule_" + rule.getId() + "_" + ruleVersion.getId() + "_" + hitRuleBlock.getId() + "_hitResult";
}
String scoreFieldEn = hitRuleBlock.getScoreFieldEn();
if (StringUtils.isBlank(scoreFieldEn)) { if (StringUtils.isBlank(scoreFieldEn)) {
scoreFieldEn = "rule_2_"+rule.getId()+"_"+ruleVersion.getId()+"_score"; scoreFieldEn = "rule_" + rule.getId() + "_" + ruleVersion.getId() + "_" + hitRuleBlock.getId() + "_score";
} }
input.put(resultFieldEn, "未命中"); input.put(resultFieldEn, "未命中");
//根据执行的最终结果处理此规则输出内容 //根据执行的最终结果处理此规则输出内容
@@ -347,14 +359,14 @@ public class RuleSetNode implements EngineRunnerNode {
JSONObject resultJson = new JSONObject(); JSONObject resultJson = new JSONObject();
if (result) { if (result) {
ruleMap.put("ruleResult", "命中"); ruleMap.put("ruleResult", "命中");
ruleMap.put("ruleScore", rule.getScore()); ruleMap.put("ruleScore", hitRuleBlock.getScore());
JSONObject scoreJson = new JSONObject(); JSONObject scoreJson = new JSONObject();
resultJson.put(resultFieldEn, "命中"); resultJson.put(resultFieldEn, "命中");
fieldList.add(resultJson); fieldList.add(resultJson);
// if (StringUtils.isNotBlank(ruleVersion.getScoreFieldEn())) { // if (StringUtils.isNotBlank(ruleVersion.getScoreFieldEn())) {
scoreJson.put(scoreFieldEn, ruleVersion.getScore()); scoreJson.put(scoreFieldEn, hitRuleBlock.getScore());
fieldList.add(scoreJson); fieldList.add(scoreJson);
input.put(scoreFieldEn, ruleVersion.getScore()); input.put(scoreFieldEn, hitRuleBlock.getScore());
// } // }
input.put(resultFieldEn, "命中"); input.put(resultFieldEn, "命中");
//处理此规则需要输出的内容 //处理此规则需要输出的内容
@@ -597,13 +609,13 @@ public class RuleSetNode implements EngineRunnerNode {
} }
} }
int totalSize = selectedHitRules.size(); // 规则命个数 int totalSize = selectedHitRules.size(); // 规则命个数
double totalScore = selectedHitRules.stream().mapToDouble(RuleInfo::getScore).sum(); // 规则总得分 // double totalScore = selectedHitRules.stream().mapToDouble(RuleInfo::getScore).sum(); // 规则总得分
String sizeKey = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_terminal_size"; String sizeKey = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_terminal_size";
String scoreKey = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_terminal_score"; String scoreKey = engineNode.getNodeType() + "_" + engineNode.getNodeId() + "_terminal_score";
Map<String, Object> variablesMap = new HashMap<>(); Map<String, Object> variablesMap = new HashMap<>();
variablesMap.put(sizeKey, totalSize); variablesMap.put(sizeKey, totalSize);
variablesMap.put(scoreKey, totalScore); // variablesMap.put(scoreKey, totalScore);
ExecuteUtils.terminalCondition(engineNode, inputParam, outMap, variablesMap); ExecuteUtils.terminalCondition(engineNode, inputParam, outMap, variablesMap);
} }
@@ -635,17 +647,13 @@ public class RuleSetNode implements EngineRunnerNode {
case 2: case 2:
RuleVersionVo ruleVersionVo = versionService.queryById(versionId); RuleVersionVo ruleVersionVo = versionService.queryById(versionId);
ruleInfo.setVersion(ruleVersionVo); ruleInfo.setVersion(ruleVersionVo);
ruleInfo.setScore(ruleVersionVo.getScore());
break; break;
case 3: case 3:
RuleScriptVersion ruleScriptVersion = ruleScriptVersionService.queryById(versionId); RuleScriptVersion ruleScriptVersion = ruleScriptVersionService.queryById(versionId);
ruleInfo.setScriptVersion(ruleScriptVersion); ruleInfo.setScriptVersion(ruleScriptVersion);
ruleInfo.setVersion(JSON.parseObject(JSON.toJSONString(ruleScriptVersion), RuleVersionVo.class)); ruleInfo.setVersion(JSON.parseObject(JSON.toJSONString(ruleScriptVersion), RuleVersionVo.class));
ruleInfo.setScore(0);
break; break;
} }
} else {
ruleInfo.setScore(0);
} }
} }
} }

View File

@@ -47,7 +47,6 @@ public class RuleInfoController {
return ruleResponseEntityDto; return ruleResponseEntityDto;
} }
/** /**
* @api {POST} /v3/rule/getRuleList 3.20. V3规则 列表 list * @api {POST} /v3/rule/getRuleList 3.20. V3规则 列表 list
* @apiGroup knowledge * @apiGroup knowledge