前后端分目录

This commit is contained in:
andywang
2022-07-14 12:55:31 +08:00
parent cd72c43d62
commit bb8cf90f53
1155 changed files with 47237 additions and 14446 deletions

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ddp-strategyx</artifactId>
<groupId>com.fibo.ddp</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ddp-strategyx-data-clean</artifactId>
</project>

View File

@@ -0,0 +1,89 @@
package com.fibo.ddp.strategyx.dataclean.controller;
import com.fibo.ddp.common.model.common.ResponseEntityBuilder;
import com.fibo.ddp.common.model.common.ResponseEntityDto;
import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum;
import com.fibo.ddp.common.model.common.requestParam.QueryListParam;
import com.fibo.ddp.common.model.common.requestParam.UpdateFolderParam;
import com.fibo.ddp.common.model.common.requestParam.UpdateStatusParam;
import com.fibo.ddp.common.model.strategyx.dataclean.DataClean;
import com.fibo.ddp.common.service.strategyx.dataclean.DataCleanService;
import com.fibo.ddp.common.utils.exception.ApiException;
import com.fibo.ddp.common.utils.util.ResponseUtil;
import com.github.pagehelper.PageInfo;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Map;
@RestController
@RequestMapping("/dataClean")
public class DataCleanController {
/**
* 服务对象
*/
@Resource
private DataCleanService dataCleanService;
@ResponseBody
@RequestMapping(value = "/getDataClean/{id}", method = RequestMethod.POST)
public ResponseEntityDto<DataClean> getDataClean(@PathVariable Long id) {
if (id == null) {
throw new ApiException(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), ErrorCodeEnum.PARAMS_EXCEPTION.getMessage());
}
DataClean dataClean = dataCleanService.queryById(id);
ResponseEntityDto<DataClean> ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(dataClean);
return ruleResponseEntityDto;
}
@ResponseBody
@RequestMapping(value = "getDataCleanList", method = RequestMethod.POST)
public ResponseEntityDto<DataClean> getDataCleanList(@RequestBody QueryListParam<DataClean> listParam) {
PageInfo pageInfo = dataCleanService.queryByEntity(listParam);
Map<String, Object> responseMap = ResponseUtil.getResponseMap(pageInfo);
ResponseEntityDto ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(responseMap);
return ruleResponseEntityDto;
}
@ResponseBody
@RequestMapping(value = "addDataClean", method = RequestMethod.POST)
public ResponseEntityDto<DataClean> addDataClean(@RequestBody DataClean dataClean) {
DataClean insert = dataCleanService.insert(dataClean);
ResponseEntityDto<DataClean> ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(insert);
return ruleResponseEntityDto;
}
@ResponseBody
@RequestMapping(value = "updateDataClean", method = RequestMethod.POST)
public ResponseEntityDto<DataClean> updateDataClean(@RequestBody DataClean dataClean) {
DataClean update = dataCleanService.update(dataClean);
ResponseEntityDto<DataClean> ruleResponseEntityDto = ResponseEntityBuilder.buildNormalResponse(update);
return ruleResponseEntityDto;
}
@ResponseBody
@RequestMapping(value = "updateDataCleanStatus", method = RequestMethod.POST)
public ResponseEntityDto updateStatus(@RequestBody UpdateStatusParam param) {
UpdateStatusParam.checkParam(param);
boolean updateResult = dataCleanService.updateStatus(param.getList(), param.getStatus());
if (updateResult) {
return ResponseEntityBuilder.buildNormalResponse(updateResult);
} else {
return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.DECISION_TREE_UPDATE_ERROR);
}
}
@ResponseBody
@RequestMapping(value = "updateDataCleanFolder", method = RequestMethod.POST)
public ResponseEntityDto updateFolder(@RequestBody UpdateFolderParam param) {
UpdateFolderParam.checkNotNull(param);
boolean updateResult = dataCleanService.updateFolder(param.getIds(), param.getFolderId());
if (updateResult) {
return ResponseEntityBuilder.buildNormalResponse(updateResult);
} else {
return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.SERVER_ERROR);
}
}
}

View File

@@ -0,0 +1,91 @@
package com.fibo.ddp.strategyx.dataclean.controller;
import com.fibo.ddp.common.model.common.ResponseEntityBuilder;
import com.fibo.ddp.common.model.common.ResponseEntityDto;
import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum;
import com.fibo.ddp.common.model.common.requestParam.StatusParam;
import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanVersion;
import com.fibo.ddp.common.service.strategyx.dataclean.DataCleanVersionService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("/dataClean/version")
public class DataCleanVersionController {
/**
* 服务对象
*/
@Resource
private DataCleanVersionService versionService;
/**
* 查询指定版本下的内容
*
* @param versionId
* @return
*/
@PostMapping("/getVersionInfo/{versionId}")
public ResponseEntityDto getVersionInfo(@PathVariable Long versionId) {
DataCleanVersion version = versionService.queryById(versionId,false);
return ResponseEntityBuilder.buildNormalResponse(version);
}
/**
* 新增一个版本
*
* @param version
* @return
*/
@PostMapping("/addVersion")
public ResponseEntityDto addVersion(@RequestBody DataCleanVersion version) {
boolean b = versionService.addVersion(version);
if (!b) {
return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION);
}
List<DataCleanVersion> ruleVersionList = versionService.queryListByListOpId(version.getDataCleanId());
return ResponseEntityBuilder.buildNormalResponse(ruleVersionList);
}
/**
* 复制版本
*
* @param version
* @return
*/
@PostMapping("/copyVersion")
public ResponseEntityDto copyVersion(@RequestBody DataCleanVersion version) {
boolean b = versionService.copyVersion(version);
List<DataCleanVersion> ruleVersionList = versionService.queryListByListOpId(version.getDataCleanId());
return ResponseEntityBuilder.buildNormalResponse(ruleVersionList);
}
/**
* 修改版本
*
* @param version
* @return
*/
@PostMapping("/updateVersion")
public ResponseEntityDto updateVersion(@RequestBody DataCleanVersion version) {
boolean b = versionService.updateVersion(version);
List<DataCleanVersion> ruleVersionList = versionService.queryListByListOpId(version.getDataCleanId());
return ResponseEntityBuilder.buildNormalResponse(ruleVersionList);
}
/**
* 修改状态
*
* @param statusParam
* @return
*/
@RequestMapping(value = "/updateVersionStatus", method = RequestMethod.POST)
public ResponseEntityDto<Object> updateStatus(@RequestBody StatusParam statusParam) {
versionService.updateStatus(statusParam);
List<DataCleanVersion> ruleVersionList = versionService.queryListByListOpId(statusParam.getStrategyId());
return ResponseEntityBuilder.buildNormalResponse(ruleVersionList);
}
}

View File

@@ -0,0 +1,53 @@
package com.fibo.ddp.strategyx.dataclean.execute.api;
import com.alibaba.fastjson.JSONObject;
import com.fibo.ddp.common.model.common.enums.ErrorCodeEnum;
import com.fibo.ddp.common.model.strategyx.dataclean.param.RunnerDataCleanParam;
import com.fibo.ddp.common.service.common.runner.RunnerSessionManager;
import com.fibo.ddp.common.service.common.runner.SessionData;
import com.fibo.ddp.common.utils.exception.ApiException;
import com.fibo.ddp.strategyx.dataclean.execute.business.DataCleanBusiness;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/dataCleanApi")
@Slf4j
public class DataCleanApi {
@Resource
private DataCleanBusiness dataCleanBusiness;
@PostMapping("/runner")
public Object runnerListOp(@RequestBody RunnerDataCleanParam param){
long start = System.currentTimeMillis();
SessionData sessionData = new SessionData();
sessionData.setOrganId(param.getOrganId());
RunnerSessionManager.setSession(sessionData);
JSONObject result = new JSONObject();
try {
JSONObject jsonObject = dataCleanBusiness.runner(param);
result.put("status", ErrorCodeEnum.SUCCESS.getCode());
result.put("msg", ErrorCodeEnum.SUCCESS.getMessage());
result.put("data", jsonObject);
long end = System.currentTimeMillis();
log.info("=========数据清洗接口调用成功,耗时:{}ms", (end - start));
} catch (ApiException apiException) {
result.put("status", apiException.errCode);
result.put("msg", apiException.message);
result.put("data", apiException.data);
log.error("数据清洗接口发生业务异常errCode: {}, message: {}", apiException.errCode, apiException.message);
} catch (Exception e) {
result.put("status", ErrorCodeEnum.SERVER_ERROR.getCode());
result.put("msg", ErrorCodeEnum.SERVER_ERROR.getMessage());
result.put("data", null);
log.error("数据清洗接口发生运行时异常", e);
}
return result;
}
}

View File

@@ -0,0 +1,9 @@
package com.fibo.ddp.strategyx.dataclean.execute.business;
import com.alibaba.fastjson.JSONObject;
import com.fibo.ddp.common.model.strategyx.dataclean.param.RunnerDataCleanParam;
public interface DataCleanBusiness {
JSONObject runner(RunnerDataCleanParam param);
}

View File

@@ -0,0 +1,192 @@
package com.fibo.ddp.strategyx.dataclean.execute.business.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fibo.ddp.common.model.strategyx.dataclean.*;
import com.fibo.ddp.common.model.strategyx.dataclean.param.RunnerDataCleanParam;
import com.fibo.ddp.common.service.strategyx.dataclean.DataCleanService;
import com.fibo.ddp.common.service.strategyx.dataclean.DataCleanVersionService;
import com.fibo.ddp.common.utils.util.strategyx.DataCleanUtils;
import com.fibo.ddp.strategyx.dataclean.execute.business.DataCleanBusiness;
import com.fibo.ddp.strategyx.dataclean.execute.handler.DataCleanFilterConditionHandler;
import com.fibo.ddp.strategyx.dataclean.execute.handler.DataCleanModifyElementHandler;
import com.fibo.ddp.strategyx.dataclean.execute.handler.ListOpConditionHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service("dataCleanBusiness")
@Slf4j
public class DataCleanBusinessImpl implements DataCleanBusiness {
@Resource
private DataCleanVersionService versionService;
@Resource
private DataCleanService dataCleanService;
@Resource
private DataCleanModifyElementHandler modifyElementHandler;
@Resource
private DataCleanFilterConditionHandler filterConditionHandler;
@Resource
private ListOpConditionHandler listOpConditionHandler;
@Override
public JSONObject runner(RunnerDataCleanParam param) {
// DataClean dataClean = param.getDataClean();
long startTime = System.currentTimeMillis();
JSONObject result = null;
//查出内容
DataClean dataClean = dataCleanService.queryByCode(param.getDataCleanCode(),param.getVersionCode());
if (dataClean==null){
log.debug("【规则查询】拒绝执行:未查找到规则版本信息,耗时:{}, dataCleanCode:{} versionCode:{}",
System.currentTimeMillis() - startTime, param.getDataCleanCode(), param.getVersionCode());
return result;
}
List<DataCleanVersion> versionList = dataClean.getVersionList();
DataCleanVersion version = null;
if (CollectionUtils.isNotEmpty(versionList)){
version = versionList.get(0);
}
// version = versionService.queryById(param.getVersionId());
long queryEnd = System.currentTimeMillis();
log.debug("【规则查询】查询规则详情完成,耗时:{}, ruleCode:{} versionId:{}",
queryEnd - startTime, param.getDataCleanCode(), param.getVersionCode());
if (version == null) {
log.debug("【规则查询】拒绝执行:未查找到规则版本信息,耗时:{}, dataCleanId:{} versionCode:{}",
System.currentTimeMillis() - startTime, version.getDataCleanId(), param.getVersionCode());
return result;
}
// Date date = new Date();
// //判断有效期 如果有有效期则需要判断
// if (dataClean == null
// || (dataClean.getStartTime() != null && date.compareTo(dataClean.getStartTime()) < 0)
// || (dataClean.getEndTime() != null && date.compareTo(dataClean.getEndTime()) > 0)
// || dataClean.getStatus() != 1) {
// return result;
// }
String inputFieldEn = "default";
switch (version.getInputFieldType()) {
case "map":
result = this.mapHandlerV1(inputFieldEn, param.getParam(), version, version.getVersionCode());
break;
case "list":
break;
}
long endTime = System.currentTimeMillis();
log.debug("【规则执行】执行规则完成,耗时:{}, ruleCode:{}, versionCode:{}",
(endTime - queryEnd), version.getVersionCode(), param.getVersionCode());
return result;
}
public JSONObject mapHandlerV1(String inputEn, Map<String, Object> param, DataCleanVersion version, String ruleCode) {
List<Map<String, Object>> result = new ArrayList<>();
JSONObject intputObject = null;
Object paramMap = param.get(inputEn);
if (paramMap == null) {
//未能获取到参数直接返回
return null;
}
if (paramMap instanceof Map) {
intputObject = JSONObject.parseObject(JSONObject.toJSONString(paramMap));
}
DataCleanOriginalDataOp originalDataOp = version.getOriginalDataOp();
String opField = originalDataOp.getOpField();
JSONArray forTarget = intputObject.getJSONArray(opField);
List<JSONObject> forTargetJson = new ArrayList<>();
for(Object obj : forTarget){
forTargetJson.add((JSONObject) obj);
}
// 循环对象
for(JSONObject forObject : forTargetJson){
this.listHandlerV1(intputObject, forObject, version, ruleCode);
}
intputObject.put(opField, forTargetJson);
return intputObject;
}
public List<Map<String, Object>> listHandlerV1(JSONObject intputObject, JSONObject forObject, DataCleanVersion version, String ruleCode) {
List<Map<String, Object>> result = new ArrayList<>();
List<DataCleanConditionAndOutPut> conditionAndOutPutList = version.getConditionAndOutPutList();
// 新ratePlanList 返回每个组价格最低的一个元素
List<JSONObject> newRatePlanList = new ArrayList<>();
// 多块处理
for (DataCleanConditionAndOutPut conditionAndOutPut : conditionAndOutPutList) {
DataCleanBlock dataCleanBlock = conditionAndOutPut.getDataCleanBlock();
String handleCollection = dataCleanBlock.getHandleCollection();
JSONArray targetCollection = forObject.getJSONArray(handleCollection);
if(targetCollection == null){
//未能获取到参数直接返回
return null;
}
List<JSONObject> inputArray = new ArrayList<>();
for (Object obj : targetCollection) {
inputArray.add((JSONObject) obj);
}
DataCleanFilterCondition filterCondition = conditionAndOutPut.getInputFilterCondition();
List<JSONObject> executeArray = inputArray;
if (filterCondition != null) {
//执行进入过滤条件
executeArray = filterConditionHandler.filterByCondition(executeArray, filterCondition);
}
// 执行分组
Map<String, List<JSONObject>> listMap = null;
String groupFieldsStr = conditionAndOutPut.getDataCleanBlock().getGroupFields();
List<String> groupFields = null;
if (groupFieldsStr != null && !"[]".equals(groupFieldsStr)) {
groupFields = JSON.parseArray(groupFieldsStr, String.class);
}
if (groupFields != null && !groupFields.isEmpty()) {
listMap = groupBy(groupFields, executeArray);
} else {
listMap = new HashMap<>();
listMap.put("default", executeArray);
}
// 遍历每一个组
for (Map.Entry<String, List<JSONObject>> entry : listMap.entrySet()) {
Map<String, Object> localParamMap = new HashMap<>();
Map<String, Object> localOutPutMap = new HashMap<>();
List<JSONObject> list = entry.getValue();
DataCleanCondition condition = conditionAndOutPut.getCondition();
if (condition != null || condition.getChildren() != null) {
for(JSONObject collectionObject : list){
// 执行修改元素条件
boolean conditionResult = modifyElementHandler.conditionHandler(condition, localParamMap, intputObject, forObject, collectionObject);
if (conditionResult) {
// 命中修改元素
modifyElementHandler.outputListHandler(conditionAndOutPut.getSuccessOutput(), localParamMap, localOutPutMap, collectionObject);
} else {
// 未命中修改元素
modifyElementHandler.outputListHandler(conditionAndOutPut.getFailOutput(), localParamMap, localOutPutMap, collectionObject);
}
}
}
if (!localOutPutMap.isEmpty()) {
result.add(localOutPutMap);
}
// 组内返回结果过滤
DataCleanFilterCondition resultFilterCondition = conditionAndOutPut.getResultFilterCondition();
JSONObject resultFilterJson = listOpConditionHandler.conditionHandler(resultFilterCondition, null, list);
newRatePlanList.add(resultFilterJson);
}
}
forObject.put("ratePlanList", newRatePlanList);
return result;
}
public Map<String, List<JSONObject>> groupBy(List<String> groupFields, List<JSONObject> groupArray) {
Map<String, List<JSONObject>> listMap = DataCleanUtils.recursionGroup(groupArray, groupFields);
return listMap;
}
}

View File

@@ -0,0 +1,21 @@
package com.fibo.ddp.strategyx.dataclean.execute.consts;
public class ListOpConst {
public static class OpType{
//计数
public static final String COUNT = "count";
//去重计数
public static final String DISTINCT_COUNT = "distinct_count";
//最大值
public static final String MAX = "max";
//最小值
public static final String MIN = "min";
//平均
public static final String AVG = "avg";
//元素
public static final String LIST_ELEMENT = "list_element";
//自定义
public static final String CUSTOM = "custom";
}
}

View File

@@ -0,0 +1,100 @@
package com.fibo.ddp.strategyx.dataclean.execute.handler;
import com.alibaba.fastjson.JSONObject;
import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanFilterCondition;
import com.fibo.ddp.common.service.datax.runner.ExecuteUtils;
import com.fibo.ddp.common.utils.constant.strategyx.RuleConst;
import com.fibo.ddp.common.utils.util.strategyx.DataCleanUtils;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.stream.Collectors;
@Component
public class DataCleanFilterConditionHandler {
public List<JSONObject> filterByCondition(List<JSONObject> list, DataCleanFilterCondition filterCondition){
if (filterCondition==null||filterCondition.getChildren()==null||filterCondition.getChildren().isEmpty()) {
return list;
}
//过滤框架
List<JSONObject> result = list.stream().filter(item->{
return executeCondition(item,filterCondition);
}).collect(Collectors.toList());
return result;
}
public boolean executeCondition(JSONObject json,DataCleanFilterCondition filterCondition){
Integer conditionType = filterCondition.getConditionType();
boolean result = false;
switch (conditionType) {
//关系条件节点 &&和||
case RuleConst.RELATION_CONDITION:
result = executeRelation(filterCondition, json);
break;
//表达式条件节点
case RuleConst.EXPRESSION_CONDITION:
result = executeExpression(filterCondition, json);
break;
}
return result;
}
private boolean executeRelation(DataCleanFilterCondition condition, JSONObject json) {
//获取关系逻辑
String logical = condition.getLogical();
//处理子逻辑
List<DataCleanFilterCondition> children = condition.getChildren();
boolean result = false;
switch (logical) {
case "||":
result = false;
for (DataCleanFilterCondition child : children) {
boolean childResult = executeCondition(json,child);
if (childResult) {
return true;
}
}
break;
case "&&":
result = true;
for (DataCleanFilterCondition child : children) {
boolean childResult = executeCondition(json,child);
if (!childResult) {
return false;
}
}
break;
}
return result;
}
private boolean executeExpression(DataCleanFilterCondition condition, JSONObject json) {
Object condKey = DataCleanUtils.getObjByKeyAndJson(json, condition.getOpKey());
Object condValue = null;
String condValueStr = condition.getVariableValue();
String operator = condition.getOperator();
switch (operator){
case "in":
case "not in":
condValue = new ArrayList<>();
Collections.addAll((List)condValue,condValueStr.split(","));
break;
case "black_list":
condKey = 1;
operator= "==";
condValue = ExecuteUtils.getValueByKey(condition.getVariableType(),new HashMap<>(),condition.getVariableValue(), Arrays.asList(json));
break;
case "not_black_list":
condKey = 0;
operator= "==";
condValue = ExecuteUtils.getValueByKey(condition.getVariableType(),new HashMap<>(),condition.getVariableValue(), Arrays.asList(json));
break;
default:
condValue = condValueStr;
}
return ExecuteUtils.getCondResult(operator, condKey, condValue);
}
}

View File

@@ -0,0 +1,120 @@
package com.fibo.ddp.strategyx.dataclean.execute.handler;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanCondition;
import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanOutput;
import com.fibo.ddp.common.service.datax.runner.ExecuteUtils;
import com.fibo.ddp.common.utils.constant.strategyx.RuleConst;
import com.fibo.ddp.common.utils.util.strategyx.DataCleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Component
public class DataCleanModifyElementHandler {
public boolean conditionHandler(DataCleanCondition condition, Map<String, Object> input, JSONObject intputObject, JSONObject forObject, JSONObject collectionObject) {
boolean result = executeListCondition(condition, input, intputObject, forObject, collectionObject);
return result;
}
private boolean executeListCondition(DataCleanCondition condition, Map<String, Object> input, JSONObject intputObject, JSONObject forObject, JSONObject collectionObject) {
Integer conditionType = condition.getConditionType();
boolean result = false;
switch (conditionType) {
//关系条件节点 &&和||
case RuleConst.RELATION_CONDITION:
result = executeRelation(condition, input, intputObject, forObject, collectionObject);
break;
//表达式条件节点
case RuleConst.EXPRESSION_CONDITION:
result = executeExpression(condition, input, intputObject, forObject, collectionObject);
break;
}
return result;
}
private boolean executeExpression(DataCleanCondition condition, Map<String, Object> input, JSONObject intputObject, JSONObject forObject, JSONObject collectionObject) {
Object opValue = null;
String opType = condition.getOpType();
switch (opType) {
case "original": // 源数据
opValue = DataCleanUtils.getObjByKeyAndJson(intputObject, condition.getOpKey());
break;
case "data_op": // 循环对象元素
opValue = DataCleanUtils.getObjByKeyAndJson(forObject, condition.getOpKey());
break;
case "handle_collection": // 集合元素
opValue = DataCleanUtils.getObjByKeyAndJson(collectionObject, condition.getOpKey());
break;
}
//条件判断输入的值
List<JSONObject> list = new ArrayList<>();
list.add(collectionObject);
Object variableValue = ExecuteUtils.getValueByKey(condition.getVariableType(), input, condition.getVariableValue(), list);
//操作符
String operator = condition.getOperator();
return ExecuteUtils.getCondResult(operator, opValue, variableValue);
}
private boolean executeRelation(DataCleanCondition condition, Map<String, Object> input, JSONObject intputObject, JSONObject forObject, JSONObject collectionObject) {
//获取关系逻辑
String logical = condition.getLogical();
//处理子逻辑
List<DataCleanCondition> children = condition.getChildren();
boolean result = false;
switch (logical) {
case "||":
result = false;
for (DataCleanCondition child : children) {
boolean childResult = executeListCondition(child, input, intputObject, forObject, collectionObject);
if (childResult) {
return true;
}
}
break;
case "&&":
result = true;
for (DataCleanCondition child : children) {
boolean childResult = executeListCondition(child, input, intputObject, forObject, collectionObject);
if (!childResult) {
return false;
}
}
break;
}
return result;
}
public boolean outputListHandler(List<DataCleanOutput> outputList, Map<String, Object> localParamMap, Map<String, Object> outMap, JSONObject collectionObject) {
if (outputList == null || outputList.isEmpty()) {
return true;
}
for (DataCleanOutput outputField : outputList) {
outputHandler(outputField,localParamMap, outMap, collectionObject);
}
return true;
}
public boolean outputHandler(DataCleanOutput output, Map<String, Object> localParamMap, Map<String, Object> outMap, JSONObject collectionObject) {
String outputKey = output.getOutputKey();
Object result = null;
//处理自定义内容
if (StringUtils.isNotBlank(output.getOutputValue())) {
result = ExecuteUtils.getValueByKeyYiHao(output.getVariableType(), localParamMap, output.getOutputValue(), collectionObject);
}
outMap.put(outputKey, result);
// todo price修改
JSONArray channels = collectionObject.getJSONArray("channels");
JSONArray nightlyRates = channels.getJSONObject(0).getJSONArray("nightlyRates");
nightlyRates.getJSONObject(0).put("price", result);
return true;
}
}

View File

@@ -0,0 +1,123 @@
package com.fibo.ddp.strategyx.dataclean.execute.handler;
import com.alibaba.fastjson.JSONObject;
import com.fibo.ddp.common.model.strategyx.dataclean.DataCleanFilterCondition;
import com.fibo.ddp.common.utils.constant.strategyx.RuleConst;
import com.fibo.ddp.common.utils.util.runner.NumUtils;
import com.fibo.ddp.common.utils.util.strategyx.DataCleanUtils;
import com.fibo.ddp.strategyx.dataclean.execute.consts.ListOpConst;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.stream.Collectors;
@Component
public class ListOpConditionHandler {
public JSONObject conditionHandler(DataCleanFilterCondition condition, Map<String, Object> input, List<JSONObject> list) {
JSONObject result = executeListCondition(condition, input, list);
return result;
}
private JSONObject executeListCondition(DataCleanFilterCondition condition, Map<String, Object> input, List<JSONObject> list) {
Integer conditionType = condition.getConditionType();
JSONObject result = null;
switch (conditionType) {
//关系条件节点 &&和||
case RuleConst.RELATION_CONDITION:
result = executeRelation(condition, input, list);
break;
//表达式条件节点
case RuleConst.EXPRESSION_CONDITION:
result = executeExpression(condition, input, list);
break;
}
return result;
}
private JSONObject executeExpression(DataCleanFilterCondition condition, Map<String, Object> input, List<JSONObject> list) {
Object opValue = getOpValueByKey(condition.getOpKey(), condition.getOperator(), list);
return (JSONObject) opValue;
}
private JSONObject executeRelation(DataCleanFilterCondition condition, Map<String, Object> input, List<JSONObject> list) {
//获取关系逻辑
String logical = condition.getLogical();
//处理子逻辑
List<DataCleanFilterCondition> children = condition.getChildren();
switch (logical) {
case "||":
for (DataCleanFilterCondition child : children) {
if("min".equals(child.getOperator())){
JSONObject childResult = executeListCondition(child, input, list);
return childResult;
}
}
break;
case "&&":
for (DataCleanFilterCondition child : children) {
if("min".equals(child.getOperator())){
JSONObject childResult = executeListCondition(child, input, list);
return childResult;
}
}
break;
}
return null;
}
private Object getOpValueByKey(String opKey, String opType, List<JSONObject> list) {
//确定操作是根据哪个字段的
Comparator<JSONObject> comparator = Comparator.comparing(item -> {
return DataCleanUtils.getObjByKeyAndJson(item, opKey).toString();
});
Object result = null;
switch (opType) {
case ListOpConst
.OpType.COUNT:
int count = list.size();
result = count;
break;
case ListOpConst
.OpType.DISTINCT_COUNT:
int distinctCount = list.stream().collect(Collectors.collectingAndThen(Collectors.
toCollection(() -> new TreeSet<>(comparator)), ArrayList::new)).size();
result = distinctCount;
break;
case ListOpConst
.OpType.MAX:
Optional<JSONObject> maxOptional = list.stream().max(comparator);
if (maxOptional.isPresent()) {
Object max = DataCleanUtils.getObjByKeyAndJson(maxOptional.get(), opKey);
result = max;
}
break;
case ListOpConst
.OpType.MIN:
Optional<JSONObject> minOptional = list.stream().min(comparator);
if (minOptional.isPresent()) {
// Object min = DataCleanUtils.getObjByKeyAndJson(minOptional.get(), opKey);
// result = min;
result = minOptional.get();
}
break;
case ListOpConst
.OpType.AVG:
double avg = list.stream().mapToDouble(item -> {
return NumUtils.toDouble(DataCleanUtils.getObjByKeyAndJson(item, opKey));
}).average().getAsDouble();
result = avg;
break;
case ListOpConst
.OpType.LIST_ELEMENT:
result = list.stream().map(item -> {
return DataCleanUtils.getObjByKeyAndJson(item, opKey);
}).collect(Collectors.toList());
break;
case ListOpConst
.OpType.CUSTOM:
break;
}
return result;
}
}