|
|
|
|
@ -17,7 +17,6 @@ import org.apache.commons.logging.LogFactory;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
|
|
@Service
|
|
|
|
|
@ -43,7 +42,10 @@ public class FXXDataProcessServiceImpl implements IFXXDataProcessService {
|
|
|
|
|
private RedisCache redisCache;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private EmsDevicesSettingMapper emsDevicesSettingMapper;;
|
|
|
|
|
private EmsDevicesSettingMapper emsDevicesSettingMapper;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private EmsAmmeterDataMapper emsAmmeterDataMapper;;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void handleFxData(String message) {
|
|
|
|
|
@ -61,15 +63,20 @@ public class FXXDataProcessServiceImpl implements IFXXDataProcessService {
|
|
|
|
|
|
|
|
|
|
} else if (deviceId.contains("BMSC")) {
|
|
|
|
|
log.info("BMSC data:"+ jsonData);
|
|
|
|
|
batteryCluserDataProcess(deviceId, jsonData);
|
|
|
|
|
batteryClusterDataProcess(deviceId, jsonData);
|
|
|
|
|
batteryDataProcess(deviceId, jsonData);
|
|
|
|
|
|
|
|
|
|
} else if (deviceId.contains("PCS")) {
|
|
|
|
|
pcsDataProcess(deviceId, jsonData);
|
|
|
|
|
pcsBranchDataProcess(deviceId, jsonData);
|
|
|
|
|
} else if (deviceId.contains("LOAD")) {
|
|
|
|
|
loadDataProcess(deviceId, jsonData);
|
|
|
|
|
} else if (deviceId.contains("METE")) {
|
|
|
|
|
meteDataProcess(deviceId, jsonData);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void batteryStackDataProcess(String deviceId, String dataJson) {
|
|
|
|
|
|
|
|
|
|
//电池堆
|
|
|
|
|
@ -151,7 +158,7 @@ public class FXXDataProcessServiceImpl implements IFXXDataProcessService {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void batteryCluserDataProcess(String deviceId, String dataJson) {
|
|
|
|
|
private void batteryClusterDataProcess(String deviceId, String dataJson) {
|
|
|
|
|
|
|
|
|
|
Map<String, Object> obj = JSON.parseObject(dataJson, new TypeReference<Map<String, Object>>() {
|
|
|
|
|
});
|
|
|
|
|
@ -161,7 +168,7 @@ public class FXXDataProcessServiceImpl implements IFXXDataProcessService {
|
|
|
|
|
String stackDeviceId = "";
|
|
|
|
|
if (up != null && up.size() >0) {
|
|
|
|
|
stackDeviceId = up.get(0).getParentId();
|
|
|
|
|
if (stackDeviceId != null || stackDeviceId.isEmpty()) {
|
|
|
|
|
if (stackDeviceId == null || stackDeviceId.isEmpty()) {
|
|
|
|
|
stackDeviceId = "1";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -239,7 +246,7 @@ public class FXXDataProcessServiceImpl implements IFXXDataProcessService {
|
|
|
|
|
String stackDeviceId = "";
|
|
|
|
|
if (up != null && up.size() >0) {
|
|
|
|
|
stackDeviceId = up.get(0).getParentId();
|
|
|
|
|
if (stackDeviceId != null || stackDeviceId.isEmpty()) {
|
|
|
|
|
if (stackDeviceId == null || stackDeviceId.isEmpty()) {
|
|
|
|
|
stackDeviceId = "1";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -346,7 +353,6 @@ public class FXXDataProcessServiceImpl implements IFXXDataProcessService {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void pcsBranchDataProcess(String deviceId, String dataJson) {
|
|
|
|
|
|
|
|
|
|
Map<String, Map<String, Object>> records = processDataPrefix(JSON.parseObject(dataJson, new TypeReference<Map<String, Object>>() {}));
|
|
|
|
|
@ -394,7 +400,192 @@ public class FXXDataProcessServiceImpl implements IFXXDataProcessService {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void loadDataProcess(String deviceId, String dataJson) {
|
|
|
|
|
|
|
|
|
|
//总表
|
|
|
|
|
Map<String, Object> obj = JSON.parseObject(dataJson, new TypeReference<Map<String, Object>>() {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
EmsAmmeterData dataLoad = new EmsAmmeterData();
|
|
|
|
|
// 更新时间
|
|
|
|
|
dataLoad.setDataUpdateTime(new Date());
|
|
|
|
|
|
|
|
|
|
// 电能设置-组合有功
|
|
|
|
|
dataLoad.setCurrentCombActiveTotal(StringUtils.getBigDecimal(obj.get("DQZHYGZDN")));
|
|
|
|
|
dataLoad.setCurrentCombActivePeak(StringUtils.getBigDecimal(obj.get("DQZHYGJDN")));
|
|
|
|
|
dataLoad.setCurrentCombActiveHigh(StringUtils.getBigDecimal(obj.get("DQZHYGFDN")));
|
|
|
|
|
dataLoad.setCurrentCombActiveFlat(StringUtils.getBigDecimal(obj.get("DQZHYGPDN")));
|
|
|
|
|
dataLoad.setCurrentCombActiveValley(StringUtils.getBigDecimal(obj.get("DQZHYGGDN")));
|
|
|
|
|
// 电能设置-正向有功
|
|
|
|
|
dataLoad.setCurrentForwardActiveTotal(StringUtils.getBigDecimal(obj.get("DQZXYGZDN")));
|
|
|
|
|
dataLoad.setCurrentForwardActivePeak(StringUtils.getBigDecimal(obj.get("DQZXYGJDN")));
|
|
|
|
|
dataLoad.setCurrentForwardActiveHigh(StringUtils.getBigDecimal(obj.get("DQZXYGFDN")));
|
|
|
|
|
dataLoad.setCurrentForwardActiveFlat(StringUtils.getBigDecimal(obj.get("DQZXYGPDN")));
|
|
|
|
|
dataLoad.setCurrentForwardActiveValley(StringUtils.getBigDecimal(obj.get("DQZXYGGDN")));
|
|
|
|
|
// 电能设置-反向有功
|
|
|
|
|
dataLoad.setCurrentReverseActiveTotal(StringUtils.getBigDecimal(obj.get("DQFXYGZDN")));
|
|
|
|
|
dataLoad.setCurrentReverseActivePeak(StringUtils.getBigDecimal(obj.get("DQFXYGJDN")));
|
|
|
|
|
dataLoad.setCurrentReverseActiveHigh(StringUtils.getBigDecimal(obj.get("DQFXYGFDN")));
|
|
|
|
|
dataLoad.setCurrentReverseActiveFlat(StringUtils.getBigDecimal(obj.get("DQFXYGPDN")));
|
|
|
|
|
dataLoad.setCurrentReverseActiveValley(StringUtils.getBigDecimal(obj.get("DQFXYGGDN")));
|
|
|
|
|
// 电能设置-组合无功
|
|
|
|
|
dataLoad.setCurrentCombReactiveTotal(StringUtils.getBigDecimal(obj.get("DQZHWGZDN")));
|
|
|
|
|
dataLoad.setCurrentCombReactivePeak(StringUtils.getBigDecimal(obj.get("DQZHWGJDN")));
|
|
|
|
|
dataLoad.setCurrentCombReactiveHigh(StringUtils.getBigDecimal(obj.get("DQZHWGFDN")));
|
|
|
|
|
dataLoad.setCurrentCombReactiveFlat(StringUtils.getBigDecimal(obj.get("DQZHWGPDN")));
|
|
|
|
|
dataLoad.setCurrentCombReactiveValley(StringUtils.getBigDecimal(obj.get("DQZHWGGDN")));
|
|
|
|
|
// 电能设置-正向无功
|
|
|
|
|
dataLoad.setCurrentForwardReactiveTotal(StringUtils.getBigDecimal(obj.get("DQZXWGZDN")));
|
|
|
|
|
dataLoad.setCurrentForwardReactivePeak(StringUtils.getBigDecimal(obj.get("DQZXWGJDN")));
|
|
|
|
|
dataLoad.setCurrentForwardReactiveHigh(StringUtils.getBigDecimal(obj.get("DQZXWGFDN")));
|
|
|
|
|
dataLoad.setCurrentForwardReactiveFlat(StringUtils.getBigDecimal(obj.get("DQZXWGPDN")));
|
|
|
|
|
dataLoad.setCurrentForwardReactiveValley(StringUtils.getBigDecimal(obj.get("DQZXWGGDN")));
|
|
|
|
|
// 电能设置-反向无功
|
|
|
|
|
dataLoad.setCurrentReverseReactiveTotal(StringUtils.getBigDecimal(obj.get("DQFXWGZDN")));
|
|
|
|
|
dataLoad.setCurrentReverseReactivePeak(StringUtils.getBigDecimal(obj.get("DQFXWGJDN")));
|
|
|
|
|
dataLoad.setCurrentReverseReactiveHigh(StringUtils.getBigDecimal(obj.get("DQFXWGFDN")));
|
|
|
|
|
dataLoad.setCurrentReverseReactiveFlat(StringUtils.getBigDecimal(obj.get("DQFXWGPDN")));
|
|
|
|
|
dataLoad.setCurrentReverseReactiveValley(StringUtils.getBigDecimal(obj.get("DQFXWGGDN")));
|
|
|
|
|
|
|
|
|
|
// 电压+电流
|
|
|
|
|
dataLoad.setPhaseAVoltage(StringUtils.getBigDecimal(obj.get("AXDY")));
|
|
|
|
|
dataLoad.setPhaseBVoltage(StringUtils.getBigDecimal(obj.get("BXDY")));
|
|
|
|
|
dataLoad.setPhaseCVoltage(StringUtils.getBigDecimal(obj.get("CXDY")));
|
|
|
|
|
dataLoad.setPhaseACurrent(StringUtils.getBigDecimal(obj.get("AXDL")));
|
|
|
|
|
dataLoad.setPhaseBCurrent(StringUtils.getBigDecimal(obj.get("BXDL")));
|
|
|
|
|
dataLoad.setPhaseCCurrent(StringUtils.getBigDecimal(obj.get("CXDL")));
|
|
|
|
|
|
|
|
|
|
dataLoad.setAbLineVoltage(StringUtils.getBigDecimal(obj.get("ABXDY")));
|
|
|
|
|
dataLoad.setCbLineVoltage(StringUtils.getBigDecimal(obj.get("CBXDY")));
|
|
|
|
|
dataLoad.setAcLineVoltage(StringUtils.getBigDecimal(obj.get("ACXDY")));
|
|
|
|
|
|
|
|
|
|
// 频率
|
|
|
|
|
dataLoad.setFrequency(StringUtils.getBigDecimal(obj.get("PL")));
|
|
|
|
|
|
|
|
|
|
// 功率 有功+总+无功+无总+视在
|
|
|
|
|
dataLoad.setPhaseAActivePower(StringUtils.getBigDecimal(obj.get("AXYGGL")));
|
|
|
|
|
dataLoad.setPhaseBActivePower(StringUtils.getBigDecimal(obj.get("BXYGGL")));
|
|
|
|
|
dataLoad.setPhaseCActivePower(StringUtils.getBigDecimal(obj.get("CXYGGL")));
|
|
|
|
|
dataLoad.setTotalActivePower(StringUtils.getBigDecimal(obj.get("ZYGGL")));
|
|
|
|
|
dataLoad.setPhaseAReactivePower(StringUtils.getBigDecimal(obj.get("AXWGGL")));
|
|
|
|
|
dataLoad.setPhaseBReactivePower(StringUtils.getBigDecimal(obj.get("BXWGGL")));
|
|
|
|
|
dataLoad.setPhaseCReactivePower(StringUtils.getBigDecimal(obj.get("CXWGGL")));
|
|
|
|
|
dataLoad.setTotalReactivePower(StringUtils.getBigDecimal(obj.get("ZWGGL")));
|
|
|
|
|
dataLoad.setPhaseAApparentPower(StringUtils.getBigDecimal(obj.get("AXSZGL")));
|
|
|
|
|
dataLoad.setPhaseBApparentPower(StringUtils.getBigDecimal(obj.get("BXSZGL")));
|
|
|
|
|
dataLoad.setPhaseCApparentPower(StringUtils.getBigDecimal(obj.get("CXSZGL")));
|
|
|
|
|
dataLoad.setTotalApparentPower(StringUtils.getBigDecimal(obj.get("ZSZGL")));
|
|
|
|
|
|
|
|
|
|
// 功率因数
|
|
|
|
|
dataLoad.setPhaseAPowerFactor(StringUtils.getBigDecimal(obj.get("AXGLYS")));
|
|
|
|
|
dataLoad.setPhaseBPowerFactor(StringUtils.getBigDecimal(obj.get("BXGLYS")));
|
|
|
|
|
dataLoad.setPhaseCPowerFactor(StringUtils.getBigDecimal(obj.get("CXGLYS")));
|
|
|
|
|
dataLoad.setTotalPowerFactor(StringUtils.getBigDecimal(obj.get("ZGLYS")));
|
|
|
|
|
|
|
|
|
|
// 需量
|
|
|
|
|
dataLoad.setForwardAcMaxDemand(StringUtils.getBigDecimal(obj.get("ZXYGZDXL")));
|
|
|
|
|
dataLoad.setReverseAcMaxDemand(StringUtils.getBigDecimal(obj.get("FXYGZDXL")));
|
|
|
|
|
dataLoad.setDailyForwardMaxDemand(StringUtils.getBigDecimal(obj.get("DRZXYGZDXL")));
|
|
|
|
|
|
|
|
|
|
dataLoad.setCreateBy("system");
|
|
|
|
|
dataLoad.setCreateTime(DateUtils.getNowDate());
|
|
|
|
|
dataLoad.setUpdateBy("system");
|
|
|
|
|
dataLoad.setUpdateTime(DateUtils.getNowDate());
|
|
|
|
|
dataLoad.setSiteId(SITE_ID);
|
|
|
|
|
dataLoad.setDeviceId(deviceId);
|
|
|
|
|
|
|
|
|
|
emsAmmeterDataMapper.insertEmsAmmeterData(dataLoad);
|
|
|
|
|
|
|
|
|
|
redisCache.setCacheObject(RedisKeyConstants.AMMETER + SITE_ID + "_" +deviceId, dataLoad);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void meteDataProcess(String deviceId, String dataJson) {
|
|
|
|
|
|
|
|
|
|
//总表
|
|
|
|
|
Map<String, Object> obj = JSON.parseObject(dataJson, new TypeReference<Map<String, Object>>() {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
EmsAmmeterData dataLoad = new EmsAmmeterData();
|
|
|
|
|
// 更新时间
|
|
|
|
|
dataLoad.setDataUpdateTime(new Date());
|
|
|
|
|
|
|
|
|
|
// 电压+电流
|
|
|
|
|
dataLoad.setPhaseAVoltage(StringUtils.getBigDecimal(obj.get("AXDY")));
|
|
|
|
|
dataLoad.setPhaseBVoltage(StringUtils.getBigDecimal(obj.get("BXDY")));
|
|
|
|
|
dataLoad.setPhaseCVoltage(StringUtils.getBigDecimal(obj.get("CXDY")));
|
|
|
|
|
dataLoad.setPhaseACurrent(StringUtils.getBigDecimal(obj.get("AXDL")));
|
|
|
|
|
dataLoad.setPhaseBCurrent(StringUtils.getBigDecimal(obj.get("BXDL")));
|
|
|
|
|
dataLoad.setPhaseCCurrent(StringUtils.getBigDecimal(obj.get("CXDL")));
|
|
|
|
|
|
|
|
|
|
dataLoad.setAbLineVoltage(StringUtils.getBigDecimal(obj.get("ABXDY")));
|
|
|
|
|
dataLoad.setCbLineVoltage(StringUtils.getBigDecimal(obj.get("BCXDY")));
|
|
|
|
|
dataLoad.setAcLineVoltage(StringUtils.getBigDecimal(obj.get("CAXDY")));
|
|
|
|
|
|
|
|
|
|
// 频率
|
|
|
|
|
dataLoad.setFrequency(StringUtils.getBigDecimal(obj.get("DWPL")));
|
|
|
|
|
|
|
|
|
|
// 功率
|
|
|
|
|
dataLoad.setPhaseAActivePower(StringUtils.getBigDecimal(obj.get("AXYGGL")));
|
|
|
|
|
dataLoad.setPhaseBActivePower(StringUtils.getBigDecimal(obj.get("BXYGGL")));
|
|
|
|
|
dataLoad.setPhaseCActivePower(StringUtils.getBigDecimal(obj.get("CXYGGL")));
|
|
|
|
|
dataLoad.setTotalActivePower(StringUtils.getBigDecimal(obj.get("ZYGGL")));
|
|
|
|
|
dataLoad.setPhaseAReactivePower(StringUtils.getBigDecimal(obj.get("AXWGGL")));
|
|
|
|
|
dataLoad.setPhaseBReactivePower(StringUtils.getBigDecimal(obj.get("BXWGGL")));
|
|
|
|
|
dataLoad.setPhaseCReactivePower(StringUtils.getBigDecimal(obj.get("CXWGGL")));
|
|
|
|
|
dataLoad.setTotalReactivePower(StringUtils.getBigDecimal(obj.get("ZWGGL")));
|
|
|
|
|
|
|
|
|
|
dataLoad.setTotalApparentPower(StringUtils.getBigDecimal(obj.get("ZSZGL")));
|
|
|
|
|
dataLoad.setTotalPowerFactor(StringUtils.getBigDecimal(obj.get("ZGLYS")));
|
|
|
|
|
|
|
|
|
|
// 二次相关数据
|
|
|
|
|
dataLoad.setSecondaryAbLineVoltage(StringUtils.getBigDecimal(obj.get("ECABXDY")));
|
|
|
|
|
dataLoad.setSecondaryAPhaseCurrent(StringUtils.getBigDecimal(obj.get("ECAXDL")));
|
|
|
|
|
dataLoad.setSecondaryAPhaseVoltage(StringUtils.getBigDecimal(obj.get("ECAXDY")));
|
|
|
|
|
dataLoad.setSecondaryAPowerFactor(StringUtils.getBigDecimal(obj.get("ECAXGLYS")));
|
|
|
|
|
dataLoad.setSecondaryAApparentPower(StringUtils.getBigDecimal(obj.get("ECAXSZGL")));
|
|
|
|
|
dataLoad.setSecondaryAReactivePower(StringUtils.getBigDecimal(obj.get("ECAXWGGL")));
|
|
|
|
|
dataLoad.setSecondaryAActivePower(StringUtils.getBigDecimal(obj.get("ECAXYGGL")));
|
|
|
|
|
dataLoad.setSecondaryBcLineVoltage(StringUtils.getBigDecimal(obj.get("ECBCXDY")));
|
|
|
|
|
dataLoad.setSecondaryBPhaseCurrent(StringUtils.getBigDecimal(obj.get("ECBXDL")));
|
|
|
|
|
dataLoad.setSecondaryBPhaseVoltage(StringUtils.getBigDecimal(obj.get("ECBXDY")));
|
|
|
|
|
dataLoad.setSecondaryBPowerFactor(StringUtils.getBigDecimal(obj.get("ECBXGLYS")));
|
|
|
|
|
dataLoad.setSecondaryBApparentPower(StringUtils.getBigDecimal(obj.get("ECBXSZGL")));
|
|
|
|
|
dataLoad.setSecondaryBReactivePower(StringUtils.getBigDecimal(obj.get("ECBXWGGL")));
|
|
|
|
|
dataLoad.setSecondaryBActivePower(StringUtils.getBigDecimal(obj.get("ECBXYGGL")));
|
|
|
|
|
dataLoad.setSecondaryCaLineVoltage(StringUtils.getBigDecimal(obj.get("ECCAXDY")));
|
|
|
|
|
dataLoad.setSecondaryCPhaseCurrent(StringUtils.getBigDecimal(obj.get("ECCXDL")));
|
|
|
|
|
dataLoad.setSecondaryCPhaseVoltage(StringUtils.getBigDecimal(obj.get("ECCXDY")));
|
|
|
|
|
dataLoad.setSecondaryCPowerFactor(StringUtils.getBigDecimal(obj.get("ECCXGLYS")));
|
|
|
|
|
dataLoad.setSecondaryCApparentPower(StringUtils.getBigDecimal(obj.get("ECCXSZGL")));
|
|
|
|
|
dataLoad.setSecondaryCReactivePower(StringUtils.getBigDecimal(obj.get("ECCXWGGL")));
|
|
|
|
|
dataLoad.setSecondaryCActivePower(StringUtils.getBigDecimal(obj.get("ECCXYGGL")));
|
|
|
|
|
dataLoad.setSecondaryGridFrequency(StringUtils.getBigDecimal(obj.get("ECDWPL")));
|
|
|
|
|
dataLoad.setSecondaryReverseReactiveEnergy(StringUtils.getBigDecimal(obj.get("ECFXWGDN")));
|
|
|
|
|
dataLoad.setSecondaryNegativeActiveEnergy(StringUtils.getBigDecimal(obj.get("ECFXYGDN")));
|
|
|
|
|
dataLoad.setSecondaryTotalPowerFactor(StringUtils.getBigDecimal(obj.get("ECZGLYS")));
|
|
|
|
|
dataLoad.setSecondaryTotalApparentPower(StringUtils.getBigDecimal(obj.get("ECZSZFL")));
|
|
|
|
|
dataLoad.setSecondaryTotalReactivePower(StringUtils.getBigDecimal(obj.get("ECZWGGL")));
|
|
|
|
|
dataLoad.setSecondaryPositiveReactiveEnergy(StringUtils.getBigDecimal(obj.get("ECZXWGDN")));
|
|
|
|
|
dataLoad.setSecondaryPositiveActiveEnergy(StringUtils.getBigDecimal(obj.get("ECZXYGDN")));
|
|
|
|
|
dataLoad.setSecondaryTotalActivePower(StringUtils.getBigDecimal(obj.get("ECZYGGL")));
|
|
|
|
|
|
|
|
|
|
// 需量
|
|
|
|
|
dataLoad.setReverseReactiveEnergyEqMinus(StringUtils.getBigDecimal(obj.get("FXWGDN")));
|
|
|
|
|
dataLoad.setReverseActiveEnergyEpMinus(StringUtils.getBigDecimal(obj.get("FXYGDN")));
|
|
|
|
|
dataLoad.setPositiveReactiveEnergyEqPlus(StringUtils.getBigDecimal(obj.get("ZXWGDN")));
|
|
|
|
|
dataLoad.setPositiveActiveEnergyEpPlus(StringUtils.getBigDecimal(obj.get("ZXYGDN")));
|
|
|
|
|
|
|
|
|
|
dataLoad.setCreateBy("system");
|
|
|
|
|
dataLoad.setCreateTime(DateUtils.getNowDate());
|
|
|
|
|
dataLoad.setUpdateBy("system");
|
|
|
|
|
dataLoad.setUpdateTime(DateUtils.getNowDate());
|
|
|
|
|
dataLoad.setSiteId(SITE_ID);
|
|
|
|
|
dataLoad.setDeviceId(deviceId);
|
|
|
|
|
|
|
|
|
|
emsAmmeterDataMapper.insertEmsAmmeterData(dataLoad);
|
|
|
|
|
|
|
|
|
|
redisCache.setCacheObject(RedisKeyConstants.AMMETER + SITE_ID + "_" +deviceId, dataLoad);
|
|
|
|
|
}
|
|
|
|
|
// 数据分组处理
|
|
|
|
|
private static Map<String, Map<String, Object>> processData(Map<String, Object> rawData) {
|
|
|
|
|
Map<String, Map<String, Object>> records = new HashMap<>();
|
|
|
|
|
|