|
@ -0,0 +1,679 @@
|
|
|
package com.yihu.hos.central.rest.common.format;
|
|
|
|
|
|
import com.fasterxml.jackson.databind.JsonNode;
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import com.fasterxml.jackson.databind.node.ArrayNode;
|
|
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
|
import com.yihu.ehr.dbhelper.jdbc.DBHelper;
|
|
|
import com.yihu.ehr.elasticsearch.ElasticSearchUtil;
|
|
|
import com.yihu.hos.central.rest.cache.OrgAdapterCache;
|
|
|
import com.yihu.hos.central.rest.common.http.EHRHttpHelper;
|
|
|
import com.yihu.hos.central.rest.models.crawler.adapter.AdapterDataSet;
|
|
|
import com.yihu.hos.central.rest.models.crawler.adapter.AdapterDict;
|
|
|
import com.yihu.hos.central.rest.models.crawler.adapter.AdapterMetaData;
|
|
|
import com.yihu.hos.central.rest.models.crawler.adapter.StdDataSet;
|
|
|
import com.yihu.hos.central.rest.models.crawler.transform.DictDataType;
|
|
|
import com.yihu.hos.central.rest.models.crawler.transform.TransformType;
|
|
|
import com.yihu.hos.central.rest.models.standard.standard.StdMetaDataModel;
|
|
|
import com.yihu.hos.central.rest.services.qc.EsSimplePackage;
|
|
|
import com.yihu.hos.central.rest.services.qc.QcRuleCheckService;
|
|
|
import com.yihu.hos.core.datatype.DateUtil;
|
|
|
import com.yihu.hos.core.datatype.StringUtil;
|
|
|
import com.yihu.hos.core.log.Logger;
|
|
|
import com.yihu.hos.core.log.LoggerFactory;
|
|
|
import com.yihu.hos.web.framework.constant.ErrorType;
|
|
|
import com.yihu.hos.web.framework.exception.*;
|
|
|
import com.yihu.hos.web.framework.util.springutil.SpringBeanUtil;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
|
|
|
|
import java.io.Serializable;
|
|
|
import java.lang.reflect.Method;
|
|
|
import java.text.ParseException;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.CopyOnWriteArrayList;
|
|
|
|
|
|
/**
|
|
|
* 目前只处理json格式
|
|
|
* <p>
|
|
|
* json 格式
|
|
|
* {
|
|
|
* "inner_version":"xxxxx",
|
|
|
* "patient_id":"xxxx",
|
|
|
* "event_no":"xxxx",
|
|
|
* "code":"dataset_code",
|
|
|
* "org_code":"xxxx"
|
|
|
* "data":
|
|
|
* [{"metadata_code1":"5","metadata_code2":"6"},
|
|
|
* [{"metadata_code1":"1","metadata_code2":"2"}]}
|
|
|
* <p>
|
|
|
* Created by Air on 2015/6/4.
|
|
|
*/
|
|
|
public class DataSetTransformer implements IDataTransformer {
|
|
|
|
|
|
private static final String INDEX = "json_archives_qc";
|
|
|
private static final String QC_METADATA_INFO = "qc_metadata_info";
|
|
|
private ArrayNode beforeTranData;
|
|
|
private CopyOnWriteArrayList<JsonNode> afterTranData;
|
|
|
private String dataSetCode;
|
|
|
private static DBHelper db;
|
|
|
private static Logger logger = LoggerFactory.getLogger(DataSetTransformer.class);
|
|
|
private static ObjectMapper objectMapper = new ObjectMapper();
|
|
|
private String schemaVersion = EHRHttpHelper.schemaVersion;
|
|
|
private String stdVersion = EHRHttpHelper.stdVersion;
|
|
|
private String targetPlatform = EHRHttpHelper.targetPlatform;
|
|
|
static ElasticSearchUtil elasticSearchUtil = null;
|
|
|
static RedisTemplate<String, Serializable> redisTemplate = null;
|
|
|
static QcRuleCheckService qcRuleCheckService = null;
|
|
|
|
|
|
public JsonNode getBeforeTranData() {
|
|
|
return beforeTranData;
|
|
|
}
|
|
|
|
|
|
public void setBeforeTranData(ArrayNode beforeTranData) {
|
|
|
this.beforeTranData = beforeTranData;
|
|
|
}
|
|
|
|
|
|
public CopyOnWriteArrayList getAfterTranData() {
|
|
|
return afterTranData;
|
|
|
}
|
|
|
|
|
|
public void setAfterTranData(CopyOnWriteArrayList afterTranData) {
|
|
|
this.afterTranData = afterTranData;
|
|
|
}
|
|
|
|
|
|
static {
|
|
|
elasticSearchUtil = SpringBeanUtil.getService(ElasticSearchUtil.class);
|
|
|
redisTemplate = SpringBeanUtil.getService("redisTemplate");
|
|
|
qcRuleCheckService = SpringBeanUtil.getService(QcRuleCheckService.class);
|
|
|
}
|
|
|
|
|
|
public DataSetTransformer() {
|
|
|
if (db == null) {
|
|
|
db = new DBHelper();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public boolean transfer(EsSimplePackage pack, Map<String, AdapterDataSet> dataSetMap, String uploadCode) throws ParseException {
|
|
|
if (this.beforeTranData != null) {
|
|
|
//logger.info("上传的table:"+dataSetCode);
|
|
|
//logger.info("准备上传的数据:"+jsonObject.toString());
|
|
|
|
|
|
AdapterDataSet adapterDataSet = dataSetMap.get(uploadCode);
|
|
|
boolean transfer = transferJson(pack, this.beforeTranData, adapterDataSet);
|
|
|
|
|
|
return transfer;
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 转换时间格式为utc、
|
|
|
*
|
|
|
* @param dataSetMap
|
|
|
* @return
|
|
|
*/
|
|
|
public boolean transferTimeFormat(Map<String, StdDataSet> dataSetMap, String dataSetCode) {
|
|
|
if (beforeTranData != null) {
|
|
|
try {
|
|
|
ArrayNode jsonArray = (ArrayNode) beforeTranData;
|
|
|
StdDataSet stdDataSet = dataSetMap.get(dataSetCode);
|
|
|
Map<Long, Map<String, StdMetaDataModel>> stdDataSetMetasMap = stdDataSet.getStdDataSetMetasMap();
|
|
|
Map<String, StdMetaDataModel> stdMetaDataModelMap = stdDataSetMetasMap.get(stdDataSet.getStdDataSetId());
|
|
|
|
|
|
for (Object objectRow : jsonArray) {
|
|
|
if (objectRow instanceof JsonNode || objectRow instanceof ObjectNode) {
|
|
|
ObjectNode jsonObject = (ObjectNode) objectRow;
|
|
|
Iterator<Map.Entry<String, JsonNode>> fields = jsonObject.fields();
|
|
|
while (fields.hasNext()) {
|
|
|
Map.Entry<String, JsonNode> next = fields.next();
|
|
|
String key = next.getKey();
|
|
|
JsonNode jsonNode = next.getValue();
|
|
|
String value = jsonNode.asText();
|
|
|
String stdValue = transferElemTime(stdMetaDataModelMap, key, value);
|
|
|
if (stdValue == null) {
|
|
|
stdValue = "";
|
|
|
}
|
|
|
jsonObject.put(key, stdValue);
|
|
|
|
|
|
// if (jsonNode instanceof ObjectNode) {
|
|
|
// ObjectNode objectNode = (ObjectNode) next;
|
|
|
// objectNode.put(key, stdValue);
|
|
|
// }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return true;
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
|
|
|
public TransformType getTransformType() {
|
|
|
return TransformType.DATA_SET_JSON;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* json 格式
|
|
|
* {
|
|
|
* "inner_version":"xxxxx",
|
|
|
* "patient_id":"xxxx",
|
|
|
* "event_no":"xxxx",
|
|
|
* "code":"dataset_code",
|
|
|
* "data":
|
|
|
* [{"metadata_code1":"5","metadata_code2":"6"},
|
|
|
* [{"metadata_code1":"1","metadata_code2":"2"}]}
|
|
|
*
|
|
|
* @param jsonArray 原始数据
|
|
|
* @param adapterDataSet 目标标准
|
|
|
* @return
|
|
|
*/
|
|
|
public boolean transferJson(EsSimplePackage pack, ArrayNode jsonArray, AdapterDataSet adapterDataSet) throws ParseException {
|
|
|
List<Map<String, Object>> qcDataList = new ArrayList<>();
|
|
|
Set<String> existSet = new HashSet<>(); //存放已经生成了质控信息的数据元
|
|
|
for (Object objectRow : jsonArray) {
|
|
|
if (objectRow instanceof JsonNode) {
|
|
|
try {
|
|
|
List<Map<String, Object>> maps = transferJsonRow(existSet, pack, (ObjectNode) objectRow, adapterDataSet);
|
|
|
if (!maps.isEmpty()) {
|
|
|
qcDataList.addAll(maps);
|
|
|
//保存数据元质控数据
|
|
|
if (qcDataList.size() > 500) {
|
|
|
elasticSearchUtil.bulkIndex(INDEX, QC_METADATA_INFO, qcDataList);
|
|
|
qcDataList.clear();
|
|
|
}
|
|
|
|
|
|
}
|
|
|
} catch (ParseException e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
//保存数据元质控数据
|
|
|
if (!qcDataList.isEmpty()) {
|
|
|
elasticSearchUtil.bulkIndex(INDEX, QC_METADATA_INFO, qcDataList);
|
|
|
qcDataList.clear();
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param existSet 已质控的数据元
|
|
|
* @param pack 资源包索引数据
|
|
|
* @param jsonObject 资源数据
|
|
|
* @param adapterDataSet 适配方案数据
|
|
|
* @return
|
|
|
* @throws ParseException
|
|
|
*/
|
|
|
public List<Map<String, Object>> transferJsonRow(Set<String> existSet, EsSimplePackage pack, ObjectNode jsonObject, AdapterDataSet adapterDataSet) throws ParseException {
|
|
|
Map<String, Object> map = new HashMap();
|
|
|
String targetDataSet = adapterDataSet.getAdapterDataSetT().getStdDatasetCode();
|
|
|
Map<String, AdapterMetaData> adapterMetaDataMap = adapterDataSet.getAdapterMetaDataMap();
|
|
|
Iterator<String> iterator1 = adapterMetaDataMap.keySet().iterator();
|
|
|
Map<String, String> stdValueMap = new HashMap<>();
|
|
|
List<Map<String, Object>> qcDataList = new ArrayList<>();
|
|
|
|
|
|
while (iterator1.hasNext()) {
|
|
|
try {
|
|
|
stdValueMap.clear();
|
|
|
String stdKey = iterator1.next();
|
|
|
Object stdValue = "";
|
|
|
AdapterMetaData adapterMetaData = adapterMetaDataMap.get(stdKey);
|
|
|
String originKey = adapterMetaData.getAdapterMetadataModel().getAdapterMetadataCode();
|
|
|
String originValue = "";
|
|
|
if (!StringUtil.isEmpty(originKey)) {
|
|
|
//字段有适配上平台标准
|
|
|
originValue = jsonObject.get(originKey) == null ? null : jsonObject.get(originKey).asText();
|
|
|
|
|
|
if (stdKey != null) {
|
|
|
stdValueMap = transferElem(adapterDataSet, stdKey, originValue);
|
|
|
stdValue = stdValueMap.keySet().toArray()[0] == null ? "" : stdValueMap.keySet().toArray()[0].toString();//转换后的值
|
|
|
stdValue = transforFiledType(adapterDataSet, stdKey, stdValue, jsonObject);
|
|
|
map.put(stdKey.toUpperCase(), stdValue);
|
|
|
}
|
|
|
} else {
|
|
|
//字段没适配上平台标准
|
|
|
stdValue = transforFiledType(adapterDataSet, stdKey, stdValue, jsonObject);
|
|
|
stdValueMap.put(stdValue.toString(), "");
|
|
|
map.put(stdKey, stdValue);
|
|
|
}
|
|
|
|
|
|
if (existSet.contains(targetDataSet + "$" + stdKey)) { //如果该数据元已经有质控数据则跳过
|
|
|
continue;
|
|
|
} else {
|
|
|
|
|
|
String redisKey = "qc_" + adapterDataSet.getTargetVersion().getVersion() + ":" + targetDataSet + ":" + adapterMetaData.getAdapterMetadataModel().getStdMetadataCode();
|
|
|
Serializable serializable = redisTemplate.opsForValue().get(redisKey);
|
|
|
if (serializable != null) {
|
|
|
int error = -1;
|
|
|
Class clazz = qcRuleCheckService.getClass();
|
|
|
String method = serializable.toString();
|
|
|
Method _method = clazz.getMethod(method, new Class[]{String.class, String.class, String.class, String.class});
|
|
|
_method.setAccessible(true);
|
|
|
ErrorType errorType = null;
|
|
|
try {
|
|
|
String transformValue = stdValueMap.get(stdValue) == null ? "" : stdValueMap.get(stdValue);
|
|
|
errorType = (ErrorType) _method.invoke(qcRuleCheckService, adapterDataSet.getTargetVersion().getVersion(), targetDataSet, adapterMetaData.getAdapterMetadataModel().getStdMetadataCode(), transformValue);
|
|
|
} catch (Exception e) {
|
|
|
Throwable cause = e.getCause();
|
|
|
errorType = ErrorType.ExceptionError;
|
|
|
if (cause instanceof IllegalJsonFileException) {
|
|
|
error = 2;
|
|
|
} else if (cause instanceof IllegalJsonDataException) {
|
|
|
error = 3;
|
|
|
} else if (cause instanceof IllegalEmptyCheckException) {//非空
|
|
|
error = 4;
|
|
|
} else if (cause instanceof IllegalValueCheckException) {//值域超出
|
|
|
error = 5;
|
|
|
} else if (cause instanceof IllegalTypeCheckException) {//类型
|
|
|
error = 6;
|
|
|
} else if (cause instanceof IllegalFormatCheckException) {//格式
|
|
|
error = 7;
|
|
|
} else if (cause instanceof AnalyzerException) {
|
|
|
error = 21;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
if (errorType != ErrorType.Normal) {
|
|
|
Map<String, Object> qcMetadataRecord = new HashMap<>();
|
|
|
StringBuilder _id = new StringBuilder();
|
|
|
_id.append(jsonObject.get("rowkey").asText())
|
|
|
.append("$")
|
|
|
.append(targetDataSet)
|
|
|
.append("$")
|
|
|
.append(adapterMetaData.getAdapterMetadataModel().getStdMetadataCode())
|
|
|
.append("$").append(method);
|
|
|
|
|
|
qcMetadataRecord.put("_id", _id.toString());
|
|
|
JsonNode patientIdNode = jsonObject.get("JDSA00_01_001");
|
|
|
qcMetadataRecord.put("patient_id",patientIdNode==null? "" : patientIdNode.asText());
|
|
|
qcMetadataRecord.put("pack_id", pack == null ? "" : pack.get_id());
|
|
|
qcMetadataRecord.put("pack_pwd", pack == null ? "" : pack.getPwd());
|
|
|
qcMetadataRecord.put("rowkey", jsonObject.get("rowkey").asText());
|
|
|
qcMetadataRecord.put("adapter_version", schemaVersion);
|
|
|
qcMetadataRecord.put("org_code", jsonObject.get("org_code").asText());
|
|
|
qcMetadataRecord.put("org_name", pack.getOrg_name());
|
|
|
qcMetadataRecord.put("org_area", pack.getOrg_area());
|
|
|
qcMetadataRecord.put("dept", "");
|
|
|
qcMetadataRecord.put("diagnosis_name", "");
|
|
|
qcMetadataRecord.put("receive_date", DateUtil.getCurrentString(DateUtil.DEFAULT_YMDHMSDATE_FORMAT));
|
|
|
qcMetadataRecord.put("event_date", DateUtil.utcToDate(jsonObject.get("event_date").asText(), DateUtil.DEFAULT_YMDHMSDATE_FORMAT));
|
|
|
qcMetadataRecord.put("event_type", jsonObject.get("event_type").asText());
|
|
|
qcMetadataRecord.put("event_no", jsonObject.get("event_no").asText());
|
|
|
qcMetadataRecord.put("version", adapterDataSet.getTargetVersion().getVersion());
|
|
|
qcMetadataRecord.put("dataset", targetDataSet);
|
|
|
qcMetadataRecord.put("metadata", adapterMetaData.getAdapterMetadataModel().getStdMetadataCode());
|
|
|
qcMetadataRecord.put("transform_value", stdValue);
|
|
|
qcMetadataRecord.put("value", originValue);
|
|
|
qcMetadataRecord.put("qc_step", 3); //标准质控环节
|
|
|
qcMetadataRecord.put("qc_error_type", errorType.getType()); //标准质控错误类型
|
|
|
qcMetadataRecord.put("qc_error_name", errorType.getName()); //标准质控错误名称
|
|
|
qcMetadataRecord.put("qc_error_message", String.format("%s failure for meta data %s of %s in %s", method, adapterMetaData.getAdapterMetadataModel().getStdMetadataCode(), targetDataSet, adapterDataSet.getOriginVersion().getVersion()));
|
|
|
qcMetadataRecord.put("create_date", DateUtil.getCurrentString(DateUtil.DEFAULT_YMDHMSDATE_FORMAT));
|
|
|
qcMetadataRecord.put("error_type", error); //错误类型
|
|
|
existSet.add(targetDataSet + "$" + stdKey);
|
|
|
qcDataList.add(qcMetadataRecord);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
map.put("rowkey",jsonObject.get("rowkey").asText());
|
|
|
|
|
|
Iterator<String> iterator = map.keySet().iterator();
|
|
|
JsonNode afterTranTempData = objectMapper.createObjectNode();
|
|
|
while (iterator.hasNext()) {
|
|
|
String key = iterator.next();
|
|
|
Object value = map.get(key);
|
|
|
setObjectNodeValue((ObjectNode) afterTranTempData, key, value);
|
|
|
}
|
|
|
if (afterTranData == null) {
|
|
|
afterTranData = new CopyOnWriteArrayList<JsonNode>();
|
|
|
}
|
|
|
this.afterTranData.add(afterTranTempData);
|
|
|
|
|
|
return qcDataList;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param adapterDataSet 适配数据集
|
|
|
* @param code 目标-数据元编码
|
|
|
* @param originData 源- 数据
|
|
|
* @return Map<String,String> , key:转换后的标准值,value:未设置成系统默认值之前的值
|
|
|
* @modify 2015.09.16 airhead 增加值与编码转换
|
|
|
*/
|
|
|
public Map<String, String> transferElem(AdapterDataSet adapterDataSet, String code, String originData) {
|
|
|
Map<String, AdapterMetaData> adapterMetaDataMap = adapterDataSet.getAdapterMetaDataMap();
|
|
|
AdapterMetaData adapterMetaData = adapterMetaDataMap.get(code.toUpperCase());
|
|
|
AdapterDict adapterDict = adapterMetaData.getAdapterDict();
|
|
|
Map<String, String> result = new HashMap<>();
|
|
|
if (adapterDict == null) {
|
|
|
if (adapterMetaData.getAdapterMetadataModel().getStdDictId() == null) {
|
|
|
result.put(originData, originData);
|
|
|
return result;
|
|
|
} else {
|
|
|
result.put(adapterMetaData.getAdapterMetadataModel().getAdapterDefault(), originData);
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
String ehrData = "";
|
|
|
DictDataType adapterDictDataType = adapterMetaData.getAdapterDictDataType();
|
|
|
if (adapterDictDataType == DictDataType.VALUE) {
|
|
|
if (StringUtil.isBlank(originData)) {
|
|
|
//适配的数据元无值
|
|
|
ehrData = adapterMetaData.getAdapterMetadataModel().getAdapterDefault();
|
|
|
result.put(ehrData, originData);
|
|
|
} else {
|
|
|
ehrData = adapterDict.getAdapterValueToCodeMap().get(originData);
|
|
|
if (StringUtil.isEmpty(ehrData)) {
|
|
|
//没有设配到字典,获取默认字典项
|
|
|
ehrData = adapterMetaData.getAdapterMetadataModel().getAdapterDefault();
|
|
|
result.put(ehrData, "");
|
|
|
} else {
|
|
|
result.put(ehrData, ehrData);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (adapterDictDataType == DictDataType.CODE) {
|
|
|
if (StringUtil.isBlank(originData)) {
|
|
|
//适配的数据元无值
|
|
|
ehrData = adapterMetaData.getAdapterMetadataModel().getAdapterDefault();
|
|
|
result.put(ehrData, "");
|
|
|
} else {
|
|
|
ehrData = adapterDict.getAdapterCodeToCodeMap().get(originData);
|
|
|
if (StringUtil.isEmpty(ehrData)) {
|
|
|
//没有设配到字典,获取默认字典项
|
|
|
ehrData = adapterMetaData.getAdapterMetadataModel().getAdapterDefault();
|
|
|
result.put(ehrData, "");
|
|
|
} else {
|
|
|
result.put(ehrData, ehrData);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (StringUtil.isEmpty(ehrData)) {
|
|
|
//没有设配到字典,获取默认字典项
|
|
|
ehrData = adapterMetaData.getAdapterMetadataModel().getAdapterDefault();
|
|
|
result.put(ehrData, "");
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 字段名转换
|
|
|
*
|
|
|
* @param adapterDataSet
|
|
|
* @param key
|
|
|
* @return
|
|
|
*/
|
|
|
public String transferField(AdapterDataSet adapterDataSet, String key) {
|
|
|
AdapterMetaData adapterMetaData = adapterDataSet.getAdapterMetaDataMap().get(key);
|
|
|
if (adapterMetaData != null) {
|
|
|
return adapterMetaData.getAdapterMetadataModel().getStdMetadataCode();
|
|
|
} else {
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public String transferElemTime(Map<String, StdMetaDataModel> stdMetaDataModelMap, String code, String esbData) {
|
|
|
StdMetaDataModel stdMetaData = stdMetaDataModelMap.get(code);
|
|
|
|
|
|
if (stdMetaData == null || stdMetaData.getColumnType() == null) {
|
|
|
return esbData;
|
|
|
}
|
|
|
String columnType = stdMetaData.getColumnType();
|
|
|
|
|
|
try {
|
|
|
if ("DATE".equals(columnType) || "DATETIME".equals(columnType)) {
|
|
|
//时间转换
|
|
|
String utcDate = DateUtil.utcToDate(esbData, DateUtil.DEFAULT_YMDHMSDATE_FORMAT);
|
|
|
if (StringUtil.isEmpty(utcDate)) {
|
|
|
return "SYSDATE";
|
|
|
} else {
|
|
|
return "to_date('" + utcDate + "','YYYY-MM-DD HH24:MI:SS')";
|
|
|
}
|
|
|
} else {
|
|
|
return esbData;
|
|
|
}
|
|
|
|
|
|
// if ("DATE".equals(columnType) || "DATETIME".equals(columnType)) {
|
|
|
// //时间转换
|
|
|
// String utcDate = DateUtil.utcToDate(esbData, DateUtil.DEFAULT_YMDHMSDATE_FORMAT);
|
|
|
// return utcDate;
|
|
|
// } else {
|
|
|
// return esbData;
|
|
|
// }
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
return "";
|
|
|
}
|
|
|
|
|
|
|
|
|
public Object transforFiledType(AdapterDataSet adapterDataSet, String stdKey, Object stdValue, ObjectNode jsonObject) {
|
|
|
AdapterMetaData adapterMetaData = adapterDataSet.getAdapterMetaDataMap().get(stdKey);
|
|
|
Object defaultValue = adapterMetaData.getAdapterMetadataModel().getAdapterDefault();
|
|
|
|
|
|
StdMetaDataModel stdMetaDataModel = adapterDataSet.getTargetMetaDataMap().get(stdKey);
|
|
|
if (stdMetaDataModel != null) {
|
|
|
if (stdValue != null && !StringUtil.isEmpty(stdValue.toString())) {
|
|
|
//目标字段有值
|
|
|
defaultValue = stdValue;
|
|
|
}
|
|
|
} else {
|
|
|
logger.error("stdMetaDataModel获取失败!stdKey: " + stdKey);
|
|
|
}
|
|
|
|
|
|
defaultValue = transforColumType(adapterMetaData, stdMetaDataModel, defaultValue, jsonObject);
|
|
|
|
|
|
|
|
|
return defaultValue;
|
|
|
}
|
|
|
|
|
|
|
|
|
//转换字段类型 & 默认值设置
|
|
|
public Object transforColumType(AdapterMetaData adapterMetaDataModel, StdMetaDataModel stdMetaDataModel, Object stdValue, ObjectNode jsonObject) {
|
|
|
Object result = null;
|
|
|
try {
|
|
|
|
|
|
String defaultValue = adapterMetaDataModel.getAdapterMetadataModel().getAdapterDefault();
|
|
|
String columnType = stdMetaDataModel.getColumnType();
|
|
|
Long dictId = stdMetaDataModel.getDictId();
|
|
|
if (StringUtil.isEmpty(stdValue)) {
|
|
|
switch (columnType) {
|
|
|
case "DATETIME":
|
|
|
result = "SYSDATE";
|
|
|
break;
|
|
|
case "DATE":
|
|
|
result = "SYSDATE";
|
|
|
break;
|
|
|
case "INT":
|
|
|
result = StringUtil.isEmpty(defaultValue) ? 1 : Integer.parseInt(defaultValue.toString());
|
|
|
break;
|
|
|
case "DOUBLE":
|
|
|
result = StringUtil.isEmpty(defaultValue) ? 0.0 : Double.parseDouble(defaultValue.toString());
|
|
|
break;
|
|
|
default:
|
|
|
if (StringUtils.isNotBlank(defaultValue)) {
|
|
|
result = getVarcharPlaceholderValue(defaultValue, jsonObject);
|
|
|
} else {
|
|
|
result = defaultValue;
|
|
|
}
|
|
|
//默认值,判断是否超过长度等,超过则截取
|
|
|
if (result.toString().length() > Integer.parseInt(stdMetaDataModel.getColumnLength())) {
|
|
|
//截取的时候,截取前面的 (以免rowkey被截断,导致主键一致,插入不进去)
|
|
|
String s = result.toString();
|
|
|
result = StringUtils.substring(s, s.length()-Integer.parseInt(stdMetaDataModel.getColumnLength(), s.length()));
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
} else {
|
|
|
switch (columnType) {
|
|
|
case "DATETIME":
|
|
|
result = getTranferDateStr(stdMetaDataModel,stdValue,jsonObject);
|
|
|
break;
|
|
|
case "DATE":
|
|
|
result = getTranferDateStr(stdMetaDataModel,stdValue,jsonObject);
|
|
|
break;
|
|
|
case "INT":
|
|
|
String val = stdValue.toString();
|
|
|
try {
|
|
|
result = Integer.parseInt(val);
|
|
|
} catch (NumberFormatException e) {
|
|
|
// bug: 54岁--->>需要转成54
|
|
|
try {
|
|
|
String s = stdValue.toString().replaceAll("[^0-9]", "");
|
|
|
result = Integer.parseInt(s);
|
|
|
} catch (Exception ex) {
|
|
|
logger.error("转换失败,当前stdValue=" + stdValue);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case "DOUBLE":
|
|
|
try {
|
|
|
val = stdValue.toString();
|
|
|
result = Double.parseDouble(val);
|
|
|
} catch (NumberFormatException e) {
|
|
|
try {
|
|
|
String s = stdValue.toString().replaceAll("[^0-9.]", "");
|
|
|
result = Double.parseDouble(s);
|
|
|
} catch (Exception ex) {
|
|
|
logger.error("转换失败,当前stdValue=" + stdValue);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
break;
|
|
|
default:
|
|
|
if (stdValue.toString().startsWith("{") && stdValue.toString().endsWith("}")) {
|
|
|
result = getVarcharPlaceholderValue(stdValue.toString(), jsonObject);
|
|
|
//默认值,判断是否超过长度等,超过则截取
|
|
|
if (result.toString().length() > Integer.parseInt(stdMetaDataModel.getColumnLength())) {
|
|
|
result = StringUtils.substring(result.toString(), 0, Integer.parseInt(stdMetaDataModel.getColumnLength()));
|
|
|
}
|
|
|
} else if (dictId == null || StringUtil.isEmpty(dictId.toString()) || 0==dictId) { //不需要字典转换
|
|
|
if (StringUtils.isNotBlank(defaultValue) && defaultValue.equalsIgnoreCase(stdValue + "")) {
|
|
|
result = getVarcharPlaceholderValue(defaultValue, jsonObject);
|
|
|
} else {
|
|
|
if (stdValue.toString().length() > Integer.parseInt(stdMetaDataModel.getColumnLength())) {
|
|
|
result = StringUtils.substring(stdValue.toString(), 0, Integer.parseInt(stdMetaDataModel.getColumnLength()));
|
|
|
} else {
|
|
|
result = stdValue.toString();
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
result = stdValue.toString();
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
} catch (NumberFormatException e) {
|
|
|
logger.error("异常转换字段,dataSetId: " + stdMetaDataModel.getDataSetId() + " ,code:" + stdMetaDataModel.getInnerCode(), e);
|
|
|
}
|
|
|
|
|
|
if (result == null) {
|
|
|
result = new Object();
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
|
|
|
public void setObjectNodeValue(ObjectNode objectNode, String key, Object value) {
|
|
|
if (value instanceof Integer) {
|
|
|
objectNode.put(key, ((Integer) value).intValue());
|
|
|
} else if (value instanceof Double) {
|
|
|
objectNode.put(key, ((Double) value).doubleValue());
|
|
|
} else if (value instanceof Number) {
|
|
|
objectNode.put(key, ((Double) value).doubleValue());
|
|
|
} else {
|
|
|
objectNode.put(key, value.toString());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public String getDataSetCode() {
|
|
|
return dataSetCode;
|
|
|
}
|
|
|
|
|
|
public void setDataSetCode(String dataSetCode) {
|
|
|
this.dataSetCode = dataSetCode;
|
|
|
}
|
|
|
|
|
|
|
|
|
//字符串类型等的(非时间格式)
|
|
|
private String getVarcharPlaceholderValue(String placeholder, ObjectNode jsonObject) {
|
|
|
String result = "";
|
|
|
if (StringUtils.isNotBlank(placeholder) && placeholder.startsWith("{") && placeholder.endsWith("}")) {
|
|
|
String placeHolderContent = placeholder.substring(1,placeholder.length()-1).toLowerCase();
|
|
|
if ("uuid".equalsIgnoreCase(placeHolderContent)) {
|
|
|
result = UUID.randomUUID().toString().replaceAll("-", "");
|
|
|
} else if("org_code".equalsIgnoreCase(placeHolderContent)){
|
|
|
if (jsonObject == null || jsonObject.get("org_code") == null) {
|
|
|
return "";
|
|
|
} else {
|
|
|
result = jsonObject.get("org_code").asText();
|
|
|
//转换成 省平台的机构编码 (如果不存在,则保存原值)
|
|
|
String stdOrgCode = OrgAdapterCache.getProvinceOrgCode(schemaVersion, result);
|
|
|
if(!StringUtils.isEmpty(stdOrgCode)){
|
|
|
result = stdOrgCode;
|
|
|
}
|
|
|
}
|
|
|
}else {
|
|
|
if (jsonObject == null || jsonObject.get(placeHolderContent) == null) {
|
|
|
result = "";
|
|
|
} else {
|
|
|
result = jsonObject.get(placeHolderContent).asText();
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
result = placeholder;
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
public String getSchemaVersion() {
|
|
|
return schemaVersion;
|
|
|
}
|
|
|
|
|
|
public String getStdVersion() {
|
|
|
return stdVersion;
|
|
|
}
|
|
|
|
|
|
public String getTargetPlatform() {
|
|
|
return targetPlatform;
|
|
|
}
|
|
|
|
|
|
private String getTranferDateStr(StdMetaDataModel stdMetaDataModel,Object stdValue, ObjectNode jsonObject){
|
|
|
String result;
|
|
|
if ("{sysdate}".equals(stdValue.toString().trim())) {
|
|
|
result = "SYSDATE";
|
|
|
} else if("{event_date}".equals(stdValue.toString().trim())){
|
|
|
String utcDate = DateUtil.utcToDate(jsonObject.get("event_date").asText(), DateUtil.DEFAULT_YMDHMSDATE_FORMAT);
|
|
|
result = "to_date('" + utcDate + "','YYYY-MM-DD HH24:MI:SS')";
|
|
|
} else {
|
|
|
String utcDate = DateUtil.utcToDate(stdValue.toString(), DateUtil.DEFAULT_YMDHMSDATE_FORMAT);
|
|
|
if (StringUtil.isEmpty(utcDate)) {
|
|
|
logger.debug("stdDataSetId:"+stdMetaDataModel.getDataSetId() + " ,metadataCode: "+stdMetaDataModel.getInnerCode() +" , 转换时间格式异常,原值:"+stdValue);
|
|
|
result = "SYSDATE";
|
|
|
} else {
|
|
|
result = "to_date('" + utcDate + "','YYYY-MM-DD HH24:MI:SS')";
|
|
|
}
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
}
|