前后端分目录
This commit is contained in:
15
ddp/ddp-strategyx/data-clean/pom.xml
Normal file
15
ddp/ddp-strategyx/data-clean/pom.xml
Normal 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>
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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";
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user