1.入图操作
- 根据request中的值创建对公客户,包括对公客户的点的创建以及边的创建。边的创建如对公客户-母公司,对公客户-股东,对公客户-法人等。
- 新增会触发相应的事件,如创建的对公客户的风险等级高的话就会触发对公客户风险等级高的事件并处理相应事件。具体就是根据request中的数据生成Map,对map进行赋值,如EVENT_CODE、EVENT_ID、EVENT_BIZ_ID(事件业务标识)、CUST_RISK_LEVEL等。最后赋值响应。
2.事件处理流程
- 根据eventCode获取事件的参数定义TfgpEventParam,获取之前定义的事件类
public class TfgpEventParam implements Serializable {
@ParamField(name = "事件编号", desc = "唯一标识", key = true)
private String eventCode;
@ParamField(name = "事件英文名称", desc = "事件英文名称")
private String eventEnName;
@ParamField(name = "事件中文名称", desc = "事件中文名称")
private String eventChName;
@ParamField(name = "事件描述", desc = "事件描述")
private String eventDesc;
@ParamField(name = "场景编号", desc = "所属业务场景")
private String sceneCode;
@ParamField(name = "事件类型", desc = "事件类型")
private EventTypeEnum eventType;
@ParamField(name = "事件备注", desc = "事件备注")
private String eventMemo;
@ParamField(name = "属性列表", desc = "事件预置属性列表")
private List<TfgpEventProperty> eventPropertyList = new ArrayList<>();
@ParamField(name = "指标列表", desc = "指标列表,值为QuotaCode")
private List<TfgpEventQuota> eventQuotaList = new ArrayList<>();
@ParamField(name = "模型列表", desc = "模型列表,值为ModelCode")
private List<TfgpEventModel> eventModelList = new ArrayList<>();
@ParamField(name = "策略列表", desc = "策略列表,值为StrategyCode")
private List<TfgpEventStrategy> eventStrategyList = new ArrayList<>();
/**
* 事件属性定义.
* @author Tiger
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class TfgpEventProperty implements Serializable {
@ParamField(name = "事件属性标识", desc = "事件属性标识")
private String propertyCode;
@ParamField(name = "事件属性名称", desc = "事件属性名称")
private String propertyName;
@ParamField(name = "事件属性描述", desc = "事件属性描述")
private String propertyDesc;
@ParamField(name = "事件属性类名", desc = "事件属性类名")
private Class<?> propertyClass;
}
/**
* 事件指标定义.
* @author Tiger
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class TfgpEventQuota implements Serializable {
public TfgpEventQuota(String quotaCode) {
this.quotaCode = quotaCode;
}
@ParamField(name = "指标标识", desc = "指标标识")
private String quotaCode;
@ParamField(name = "输入映射定义", desc = "输入映射定义")
private List<TfgpEventInputMapping> inputMapping = new ArrayList<>();
}
/**
* 事件模型定义.
* @author Tiger
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class TfgpEventModel implements Serializable {
public TfgpEventModel(String modelCode) {
this.modelCode = modelCode;
}
@ParamField(name = "模型标识", desc = "模型标识")
private String modelCode;
@ParamField(name = "输入映射定义", desc = "输入映射定义")
private List<TfgpEventInputMapping> inputMapping = new ArrayList<>();
}
/**
* 事件策略定义.
* @author Tiger
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class TfgpEventStrategy implements Serializable {
public TfgpEventStrategy(String strategyCode) {
this.strategyCode = strategyCode;
}
@ParamField(name = "策略标识", desc = "策略标识")
private String strategyCode;
@ParamField(name = "输入映射定义", desc = "输入映射定义")
private List<TfgpEventInputMapping> inputMapping = new ArrayList<>();
}
/**
* 事件输入映射定义.
* @author Tiger
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class TfgpEventInputMapping implements Serializable {
public TfgpEventInputMapping(String inputCode, MappingSrcTypeEnum mappingSrcType, String mappingSrcCode) {
this.inputCode = inputCode;
this.mappingSrcType = mappingSrcType;
this.mappingSrcCode = mappingSrcCode;
}
public TfgpEventInputMapping(String inputCode, Object mappingValue) {
this.inputCode = inputCode;
this.mappingSrcType = MappingSrcTypeEnum.FIXED;
this.mappingValue = mappingValue;
}
@ParamField(name = "输入标识", desc = "输入标识")
private String inputCode;
@ParamField(name = "映射源类型", desc = "映射源类型")
private MappingSrcTypeEnum mappingSrcType;
@ParamField(name = "映射源标识", desc = "映射源标识")
private String mappingSrcCode;
@ParamField(name = "映射固定值", desc = "映射固定值")
private Object mappingValue;
}
}
- 生成事件上下文
// 生成事件上下文
TfgpOnlineEventContext event = new TfgpOnlineEventContext(eventCode, eventProps);
事件上下文属性包括eventCode、当前事件涉及的属性地图(propMap,属性标号,属性值)、指标quotaMap(指标编号,指标结果)、标签labelMap(标签编号,标签结果)、模型modelMap(模型编号,模型结果)、当前事件策略结果List<
TfgpServiceStrategyResult> strategyResults
public class TfgpServiceStrategyResult implements Serializable {
/**
* 策略标识.
*/
private String strategyCode;
/**
* 指令标识.
*/
private String actionCode;
/**
* 指令属性.
*/
private Map<String, Object> actionProps = new HashMap<>();
}
注意:Spring会将符合条件的Bean注入到List中
@Autowired(required = false)
protected List<Initer> initers;
- 根据事件参数定义运算指标,赋值输入变量执行指标运算
根据指标编码获取指标参数,从指标参数中获取cypher语句并填入相应输入变量quotaInputs执行语句,将结果保存在事件上下文 - 根据事件参数定义运算模型,赋值输入变量执行模型计算
模型计算首先根据模型编码查找查找模型参数,根据其中模型模板编码获取相应模型执行器(有风险增加模型,风险消除模型),如果触发的是风险增加模型,模型的执行过程主要包括风险识别,风险传导,风险聚合,这个过程实际上实在创建应用图谱,比如创建应用图谱风险传导的事件点APP_FXCD_V_EVENT,这是上来先创建的。然后执行相应的风险识别,风险传导,风险聚合过程。风险识别过程传入的是风险时间点,首先根据风险事件点的事件主题类型判断是对公还是零售,如果是对公,依据事件主体id在图数据库中查询对公客户点,然后创建应用图谱的APP_FXCD_V_CORP点、APP_FXCD_E_EVENT_CORP_RISK边,就是在创建 事件-对公客户-风险边(自身风险),零售亦是如此,最后将创建的边添加到风险源列表,返回风险源列表,这就是风险识别过程。风险传导过程传入的参数是风险事件点,风险影响源边(List),传播层数阈值,传导层数,就是一个BFS过程。首先进来判断是否超过传导层数是否超过阈值,有的话直接返回。遍历之前风险源边,根据他的DstUserId查找Corp,判断当前corp的条件(比方说这个企业是否国有企业等)判断他是否需要传播,要的话查找该corp的childrenCorp直白的说就是和他相连接的点,然后判断和他链接这些点有没有可能性传给他,能得话继续创建APP_FXCD_V_CORP点、APP_FXCD_E_EVENT_CORP_RISK边,然后将边加入本层列表中,然后递归调用,进行风险传播下一个层级处理,最终创建出一个风险传导的应用图谱。最终得到所有风险边。风险聚合主要过程遍历所有风险边,通过查找有多少条边指向被传导主体且RISK_IMPACT为自身风险,如果大于0表示传导主题聚合风险为强反之弱;计算传导主题与被传导主题的风险复杂度,比如说传导主体与被传导主题之间为母子关系,且互相担保,风险复杂度高。在根据风险强度和风险复杂度判断风险传导可能性(高中低),创建应用图的边APP_FXCD_V_CORP``APP_FXCD_V_CORP``APP_FXCD_E_CORP_CORP_POSSIBILITY
注意:风险边的必须要的src是事件,Dst是新创建的风险点。但是边的属性中SUBJECT_ID、SRC_SUBJECT_ID确是直接影响的源和目的。 - 根据事件参数定义执行策略,赋值输入变量执行策略
根据策略编码查找策略参数,根据策略参数中的策略模板编码获取策略执行器,包括风险预警新增策略模板执行器``风险预警消除策略模板执行器。简单来说就是根据传导主题与被传导主题之间的风险传导可能性、客户影响力、业务紧密度、关系紧密度来综合判断风险事件的影响级别。在依据是否授信客户、是否有贷户、风险事件的影响级别判断判断是否预警、核查。如果需要预警就生成策略指令-风险预警新增,如果需要核查就生成策略指令-风险预警新增。