|
@@ -32,364 +32,395 @@ import java.util.*;
|
|
|
@Component
|
|
|
public class RwdTransUtils {
|
|
|
|
|
|
- @Autowired
|
|
|
- private HttpUtils httpUtils;
|
|
|
-
|
|
|
- @Value("${persagy.dmp.server}")
|
|
|
- private String dmpServer;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private StringRedisTemplate redis;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private InfoCodeParserFactory infoCodeParserFactory;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private TransObjectInfoRepository objectInfoRepository;
|
|
|
-
|
|
|
- // 初始化类型
|
|
|
- public void initClass(TransObjectContext ctx) {
|
|
|
- ArrayNode classes = queryClass(ctx);
|
|
|
- ctx.getObjTypeMapping().put("Bd", "building");
|
|
|
- ctx.getObjTypeMapping().put("Fl", "floor");
|
|
|
- ctx.getObjTypeMapping().put("Sp", "space");
|
|
|
- ctx.getObjTypeMapping().put("Eq", "equipment");
|
|
|
- ctx.getObjTypeMapping().put("Ec", "component");
|
|
|
- ctx.getObjTypeMapping().put("Sh", "shaft");
|
|
|
-
|
|
|
- ctx.getClassCodeMapping().put("Pj", "project");
|
|
|
- ctx.getClassCodeMapping().put("Bd", "building");
|
|
|
- ctx.getClassCodeMapping().put("Fl", "floor");
|
|
|
- ctx.getClassCodeMapping().put("Sy", "system");
|
|
|
- ctx.getClassCodeMapping().put("Sh", "shaft");
|
|
|
-
|
|
|
- for (JsonNode cla : classes) {
|
|
|
- ObjectNode obj = (ObjectNode) cla;
|
|
|
- String parentCode = JacksonMapper.getString(obj, "parentCode", "");
|
|
|
- String code = JacksonMapper.getString(obj, "code");
|
|
|
- if ("equipment".equals(parentCode) || "system".equals(parentCode) || "component".equals(parentCode)) {
|
|
|
- ctx.getClassCodeMapping().put(code.substring(2), code);
|
|
|
- } else if ("space".equals(parentCode)) {
|
|
|
- ctx.getClassCodeMapping().put(code, code);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private ArrayNode queryClass(TransObjectContext ctx) {
|
|
|
- String url = dmpServer + "/rwd/def/class?" + getQueryString(ctx);
|
|
|
- JacksonCriteria criteria = JacksonCriteria.newInstance();
|
|
|
- HttpUtils.HttpResult result = httpUtils.post(url, JacksonMapper.toSimpleJson(criteria), 30000);
|
|
|
- if (result.success()) {
|
|
|
- String content = result.getContent();
|
|
|
- ObjectNode object = JacksonMapper.toObject(content, ObjectNode.class);
|
|
|
- ArrayNode data = JacksonMapper.getArray(object, "data");
|
|
|
- return data;
|
|
|
- } else {
|
|
|
- log.error("query class error: {}", result.getContent());
|
|
|
- }
|
|
|
- return JsonNodeFactory.instance.arrayNode();
|
|
|
- }
|
|
|
-
|
|
|
- // 初始化信息点
|
|
|
- public void initFuncidCache(TransObjectContext ctx, String classCode) {
|
|
|
- if (!ctx.getFuncidModelCache().containsKey(classCode)) {
|
|
|
- Map<String, FuncidDefModel> funcidCache = new HashMap<>();
|
|
|
- String url = dmpServer + "/rwd/def/funcid?" + getQueryString(ctx);
|
|
|
- JacksonCriteria criteria = JacksonCriteria.newInstance();
|
|
|
- criteria.add("classCode", classCode);
|
|
|
- HttpUtils.HttpResult result = httpUtils.post(url, JacksonMapper.toSimpleJson(criteria), 300000);
|
|
|
- if (result.success()) {
|
|
|
- String content = result.getContent();
|
|
|
- ObjectNode object = JacksonMapper.toObject(content, ObjectNode.class);
|
|
|
- ArrayNode data = JacksonMapper.getArray(object, "data", JsonNodeFactory.instance.arrayNode());
|
|
|
-
|
|
|
- for (JsonNode datum : data) {
|
|
|
- ObjectNode funcJson = (ObjectNode) datum;
|
|
|
- FuncidDefModel funcidDefModel = JacksonMapper.toObject(funcJson.toString(), FuncidDefModel.class);
|
|
|
- funcidCache.put(funcidDefModel.getOrigCode(), funcidDefModel);
|
|
|
- }
|
|
|
- }
|
|
|
- ctx.getFuncidModelCache().put(classCode, funcidCache);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 查询数据平台数据
|
|
|
- public List<ObjectNode> queryObject(TransObjectContext context, String types) {
|
|
|
- String url = context.getServer() + "/data-platform-3/object/subset_query?debug&projectId=" + context.getProjectId() + "&secret=" + context.getSecret();
|
|
|
- String param = "{\"customInfo\": true, \"valid\": null, \"linkInfos\": false, \"criteria\":{\"type\": [ \"" + types + "\"]}}";
|
|
|
- HttpUtils.HttpResult post = httpUtils.post(url, param, 3600 * 1000);
|
|
|
- if (!post.success()) {
|
|
|
- writeInfo(context, "error", "查询对象" + JacksonMapper.toSimpleJson(types) + "失败");
|
|
|
- return null;
|
|
|
- }
|
|
|
- String content = post.getContent();
|
|
|
- ObjectNode objectNode = JacksonMapper.toObject(content, ObjectNode.class);
|
|
|
- String result = JacksonMapper.getString(objectNode, "Result");
|
|
|
- if (!"success".equalsIgnoreCase(result)) {
|
|
|
- writeInfo(context, "error", "查询对象" + JacksonMapper.toSimpleJson(types) + "失败:" + JacksonMapper.getString(objectNode, "ResultMsg"));
|
|
|
- return null;
|
|
|
- }
|
|
|
- ArrayNode array = JacksonMapper.getArray(objectNode, "Content", JsonNodeFactory.instance.arrayNode());
|
|
|
-
|
|
|
- List<ObjectNode> objects = new LinkedList<>();
|
|
|
- for (JsonNode jsonNode : array) {
|
|
|
- ObjectNode obj = (ObjectNode) jsonNode;
|
|
|
- ObjectNode infos = JacksonMapper.getObject(obj, "infos");
|
|
|
- infos.put("id", JacksonMapper.getString(obj, "id"));
|
|
|
+ @Autowired
|
|
|
+ private HttpUtils httpUtils;
|
|
|
+
|
|
|
+ @Value("${persagy.dmp.server}")
|
|
|
+ private String dmpServer;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private StringRedisTemplate redis;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private InfoCodeParserFactory infoCodeParserFactory;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private TransObjectInfoRepository objectInfoRepository;
|
|
|
+
|
|
|
+ // 初始化类型
|
|
|
+ public void initClass(TransObjectContext ctx) {
|
|
|
+ ArrayNode classes = queryClass(ctx);
|
|
|
+ ctx.getObjTypeMapping().put("Bd", "building");
|
|
|
+ ctx.getObjTypeMapping().put("Fl", "floor");
|
|
|
+ ctx.getObjTypeMapping().put("Sp", "space");
|
|
|
+ ctx.getObjTypeMapping().put("Eq", "equipment");
|
|
|
+ ctx.getObjTypeMapping().put("Ec", "component");
|
|
|
+ ctx.getObjTypeMapping().put("Sh", "shaft");
|
|
|
+
|
|
|
+ ctx.getClassCodeMapping().put("Pj", "project");
|
|
|
+ ctx.getClassCodeMapping().put("Bd", "building");
|
|
|
+ ctx.getClassCodeMapping().put("Fl", "floor");
|
|
|
+ ctx.getClassCodeMapping().put("Sy", "system");
|
|
|
+ ctx.getClassCodeMapping().put("Sh", "shaft");
|
|
|
+
|
|
|
+ for (JsonNode cla : classes) {
|
|
|
+ ObjectNode obj = (ObjectNode) cla;
|
|
|
+ String parentCode = JacksonMapper.getString(obj, "parentCode", "");
|
|
|
+ String code = JacksonMapper.getString(obj, "code");
|
|
|
+ if ("equipment".equals(parentCode) || "system".equals(parentCode) || "component".equals(parentCode)) {
|
|
|
+ ctx.getClassCodeMapping().put(code.substring(2), code);
|
|
|
+ } else if ("space".equals(parentCode)) {
|
|
|
+ ctx.getClassCodeMapping().put(code, code);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private ArrayNode queryClass(TransObjectContext ctx) {
|
|
|
+ String url = dmpServer + "/rwd/def/class?" + getQueryString(ctx);
|
|
|
+ JacksonCriteria criteria = JacksonCriteria.newInstance();
|
|
|
+ HttpUtils.HttpResult result = httpUtils.post(url, JacksonMapper.toSimpleJson(criteria), 30000);
|
|
|
+ if (result.success()) {
|
|
|
+ String content = result.getContent();
|
|
|
+ ObjectNode object = JacksonMapper.toObject(content, ObjectNode.class);
|
|
|
+ ArrayNode data = JacksonMapper.getArray(object, "data");
|
|
|
+ return data;
|
|
|
+ } else {
|
|
|
+ log.error("query class error: {}", result.getContent());
|
|
|
+ }
|
|
|
+ return JsonNodeFactory.instance.arrayNode();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void updateObject(TransObjectContext ctx, Map<String, List<TransObjectInfo>> infoMap) {
|
|
|
+ List<Map<String, Object>> data = new ArrayList<>();
|
|
|
+ for (Map.Entry<String, List<TransObjectInfo>> entry : infoMap.entrySet()) {
|
|
|
+ Map<String, Object> obj = new HashMap<>();
|
|
|
+ String id = entry.getKey();
|
|
|
+ obj.put("id", id);
|
|
|
+ for (TransObjectInfo transObjectInfo : entry.getValue()) {
|
|
|
+ String infoCode = transObjectInfo.getInfoCode();
|
|
|
+ String infoCodeValue = transObjectInfo.getInfoCodeValue();
|
|
|
+ obj.put(infoCode, infoCodeValue);
|
|
|
+ }
|
|
|
+ data.add(obj);
|
|
|
+ }
|
|
|
+ String url = dmpServer + "/rwd/instance/object/update?" + getQueryString(ctx);
|
|
|
+ HttpUtils.HttpResult httpResult = httpUtils.post(url, JacksonMapper.toSimpleJson(data), 30000);
|
|
|
+ if (httpResult.success()) {
|
|
|
+ String content = httpResult.getContent();
|
|
|
+ ObjectNode objectNode = JacksonMapper.toObject(content, ObjectNode.class);
|
|
|
+ String result = JacksonMapper.getString(objectNode, "Result");
|
|
|
+ if ("success".equals(result)) {
|
|
|
+ writeInfo(ctx, "success", "更新对象信息点到中台: " + data.size() + ", " + httpResult.getContent());
|
|
|
+ } else {
|
|
|
+ log.error("query class error: {}", httpResult.getContent());
|
|
|
+ objectInfoRepository.saveAll(ctx.getLogs());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ log.error("query class error: {}", httpResult.getContent());
|
|
|
+ objectInfoRepository.saveAll(ctx.getLogs());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 初始化信息点
|
|
|
+ public void initFuncidCache(TransObjectContext ctx, String classCode) {
|
|
|
+ if (!ctx.getFuncidModelCache().containsKey(classCode)) {
|
|
|
+ Map<String, FuncidDefModel> funcidCache = new HashMap<>();
|
|
|
+ String url = dmpServer + "/rwd/def/funcid?" + getQueryString(ctx);
|
|
|
+ JacksonCriteria criteria = JacksonCriteria.newInstance();
|
|
|
+ criteria.add("classCode", classCode);
|
|
|
+ HttpUtils.HttpResult result = httpUtils.post(url, JacksonMapper.toSimpleJson(criteria), 300000);
|
|
|
+ if (result.success()) {
|
|
|
+ String content = result.getContent();
|
|
|
+ ObjectNode object = JacksonMapper.toObject(content, ObjectNode.class);
|
|
|
+ ArrayNode data = JacksonMapper.getArray(object, "data", JsonNodeFactory.instance.arrayNode());
|
|
|
+
|
|
|
+ for (JsonNode datum : data) {
|
|
|
+ ObjectNode funcJson = (ObjectNode) datum;
|
|
|
+ FuncidDefModel funcidDefModel = JacksonMapper.toObject(funcJson.toString(), FuncidDefModel.class);
|
|
|
+ funcidCache.put(funcidDefModel.getOrigCode(), funcidDefModel);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ctx.getFuncidModelCache().put(classCode, funcidCache);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询数据平台数据
|
|
|
+ public List<ObjectNode> queryObject(TransObjectContext context, String types) {
|
|
|
+ String url = context.getServer() + "/data-platform-3/object/subset_query?debug&projectId=" + context.getProjectId() + "&secret=" + context.getSecret();
|
|
|
+ String param = "{\"customInfo\": true, \"valid\": null, \"linkInfos\": false, \"criteria\":{\"type\": [ \"" + types + "\"]}}";
|
|
|
+ HttpUtils.HttpResult post = httpUtils.post(url, param, 3600 * 1000);
|
|
|
+ if (!post.success()) {
|
|
|
+ writeInfo(context, "error", "查询对象" + JacksonMapper.toSimpleJson(types) + "失败");
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ String content = post.getContent();
|
|
|
+ ObjectNode objectNode = JacksonMapper.toObject(content, ObjectNode.class);
|
|
|
+ String result = JacksonMapper.getString(objectNode, "Result");
|
|
|
+ if (!"success".equalsIgnoreCase(result)) {
|
|
|
+ writeInfo(context, "error", "查询对象" + JacksonMapper.toSimpleJson(types) + "失败:" + JacksonMapper.getString(objectNode, "ResultMsg"));
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ ArrayNode array = JacksonMapper.getArray(objectNode, "Content", JsonNodeFactory.instance.arrayNode());
|
|
|
+
|
|
|
+ List<ObjectNode> objects = new LinkedList<>();
|
|
|
+ for (JsonNode jsonNode : array) {
|
|
|
+ ObjectNode obj = (ObjectNode) jsonNode;
|
|
|
+ ObjectNode infos = JacksonMapper.getObject(obj, "infos");
|
|
|
+ infos.put("id", JacksonMapper.getString(obj, "id"));
|
|
|
// infos.put("category", JacksonMapper.getString(obj, "category"));
|
|
|
- if (obj.has("businessType")) {
|
|
|
- infos.put("businessType", JacksonMapper.getString(obj, "businessType"));
|
|
|
- }
|
|
|
- infos.put("create_time", JacksonMapper.getString(obj, "create_time"));
|
|
|
- objects.add(infos);
|
|
|
- }
|
|
|
- return objects;
|
|
|
- }
|
|
|
-
|
|
|
- private Set<String> baseInfoCodes = new HashSet<>(Arrays.asList("id", "classCode", "create_time"));
|
|
|
-
|
|
|
- // 转换为数据中台数据格式
|
|
|
- public List<ObjectNode> toDmpObject(TransObjectContext ctx, List<ObjectNode> list, String objType, String classCode) {
|
|
|
- List<ObjectNode> objects = new ArrayList<>(list.size());
|
|
|
- for (ObjectNode objectNode : list) {
|
|
|
- String id = JacksonMapper.getString(objectNode, "id");
|
|
|
- String createTime = JacksonMapper.getString(objectNode, "create_time");
|
|
|
- ObjectNode obj = JsonNodeFactory.instance.objectNode();
|
|
|
- objects.add(obj);
|
|
|
-
|
|
|
- obj.put("id", id);
|
|
|
- obj.put("objType", objType);
|
|
|
- obj.put("classCode", objectNode.has("classCode") ? JacksonMapper.getString(objectNode, "classCode") : classCode);
|
|
|
- obj.put("createTime", createTime);
|
|
|
- Iterator<String> iterator = objectNode.fieldNames();
|
|
|
- while (iterator.hasNext()) {
|
|
|
- String origInfoCode = iterator.next();
|
|
|
- if (baseInfoCodes.contains(origInfoCode)) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- JsonNode infoValue = objectNode.get(origInfoCode);
|
|
|
- // 基本字段
|
|
|
- if (TransUtils.baseColumnMapping.containsKey(origInfoCode)) {
|
|
|
- obj.put(TransUtils.baseColumnMapping.get(origInfoCode), infoValue.asText());
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- Map<String, FuncidDefModel> funcidCache = ctx.getFuncidModelCache().get(classCode);
|
|
|
- FuncidDefModel funcidDefModel = funcidCache.get(origInfoCode);
|
|
|
- if (funcidDefModel == null) {
|
|
|
- writeInfo(ctx, "error", classCode, "信息点不存在", id, origInfoCode, infoValue.isTextual() ? infoValue.asText() : infoValue.toString());
|
|
|
- continue;
|
|
|
- }
|
|
|
- if (funcidDefModel.getCategory() == FuncidCategory.STATIC) {
|
|
|
- Boolean isMultiple = funcidDefModel.getIsMultiple();
|
|
|
- Boolean isRegion = funcidDefModel.getIsRegion();
|
|
|
- InfoCodeParser parser = infoCodeParserFactory.getParser(funcidDefModel.getDataType());
|
|
|
- ParserContext parserContext = new ParserContext(funcidDefModel, objectNode.get(origInfoCode));
|
|
|
- parser.checkValue(parserContext);
|
|
|
- if (parserContext.isHasError()) {
|
|
|
- writeInfo(ctx, "error", classCode, parserContext.getError().toString(), id, origInfoCode, infoValue.isTextual() ? infoValue.asText() : infoValue.toString());
|
|
|
- } else {
|
|
|
- if (isRegion) {
|
|
|
- if (isMultiple) {
|
|
|
- obj.putPOJO(funcidDefModel.getCode(), parserContext.getRegionArray());
|
|
|
- } else {
|
|
|
- obj.putPOJO(funcidDefModel.getCode(), parserContext.getRegionValue());
|
|
|
- }
|
|
|
- } else {
|
|
|
- if (isMultiple) {
|
|
|
- obj.putPOJO(funcidDefModel.getCode(), parserContext.getArrayValue());
|
|
|
- } else {
|
|
|
- obj.putPOJO(funcidDefModel.getCode(), parserContext.getValue());
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- // 动态信息点
|
|
|
- obj.put(funcidDefModel.getCode(), infoValue.asText());
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return objects;
|
|
|
- }
|
|
|
-
|
|
|
- // 保存到数据中台
|
|
|
- public void save(TransObjectContext ctx, List<ObjectNode> objects, String type) {
|
|
|
- int begin = 0;
|
|
|
- while (begin < objects.size()) {
|
|
|
- int end = begin + 10000;
|
|
|
- if (end > objects.size()) {
|
|
|
- end = objects.size();
|
|
|
- }
|
|
|
- List<ObjectNode> objectNodes = objects.subList(begin, end);
|
|
|
- String url = dmpServer + "/rwd/instance/object/create?" + getQueryString(ctx);
|
|
|
- HttpUtils.HttpResult response = httpUtils.post(url, JacksonMapper.toSimpleJson(objectNodes), 3600000);
|
|
|
- if (response.success()) {
|
|
|
- writeInfo(ctx, "success", "对象保存到中台: 类型: " + type + ", 数量: " + objectNodes.size());
|
|
|
- } else {
|
|
|
- writeInfo(ctx, "error", "保存到中台时出错: 类型: " + type + ", 信息: " + response.getContent());
|
|
|
- }
|
|
|
- begin = end;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 迁移关系数据
|
|
|
- public void transRelation(TransObjectContext ctx) {
|
|
|
-
|
|
|
- writeInfo(ctx, "success", "迁移关系数据开始");
|
|
|
- // 查询图实例
|
|
|
- String url = ctx.getServer() + "/data-platform-3/relation/graph_instance/query?projectId=" + ctx.getProjectId() + "&secret" + ctx.getSecret();
|
|
|
- String requestBody = "{\"criteria\":{}}";
|
|
|
- HttpUtils.HttpResult post = httpUtils.post(url, requestBody, 300 * 1000);
|
|
|
- if (!post.success()) {
|
|
|
- writeInfo(ctx, "error", "查询图实例失败: " + post.getContent());
|
|
|
- return;
|
|
|
- }
|
|
|
- String content = post.getContent();
|
|
|
- ObjectNode objectNode = JacksonMapper.toObject(content, ObjectNode.class);
|
|
|
- String result = JacksonMapper.getString(objectNode, "Result");
|
|
|
- if (!"success".equalsIgnoreCase(result)) {
|
|
|
- writeInfo(ctx, "error", "查询图实例失败: " + JacksonMapper.getString(objectNode, "ResultMsg"));
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- // 遍历图实例,查询关系,迁移关系
|
|
|
- ArrayNode array = JacksonMapper.getArray(objectNode, "Content", JsonNodeFactory.instance.arrayNode());
|
|
|
- Set<String> sets = new HashSet<>();
|
|
|
- for (JsonNode jsonNode : array) {
|
|
|
- ObjectNode item = (ObjectNode) jsonNode;
|
|
|
- String graphId = JacksonMapper.getString(item, "graph_id");
|
|
|
- if (graphId == null) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- sets.add(graphId);
|
|
|
- }
|
|
|
- for (String graphId : sets) {
|
|
|
- transRelationByGraphId(ctx, graphId);
|
|
|
- }
|
|
|
- writeInfo(ctx, "success", "迁移关系数据完成");
|
|
|
- }
|
|
|
-
|
|
|
- private void transRelationByGraphId(TransObjectContext ctx, String graphId) {
|
|
|
- String url = ctx.getServer() + "/data-platform-3/relation/query?projectId=" + ctx.getProjectId() + "&secret" + ctx.getSecret();
|
|
|
- String requestBody = "{\"criteria\":{\"graph_id\":\"" + graphId + "\"}}";
|
|
|
- HttpUtils.HttpResult post = httpUtils.post(url, requestBody, 300 * 1000);
|
|
|
- if (!post.success()) {
|
|
|
- writeInfo(ctx, "error", "查询关系数据失败: " + graphId + ":" + post.getContent());
|
|
|
- return;
|
|
|
- }
|
|
|
- String content = post.getContent();
|
|
|
- ObjectNode objectNode = JacksonMapper.toObject(content, ObjectNode.class);
|
|
|
- String result = JacksonMapper.getString(objectNode, "Result");
|
|
|
- if (!"success".equalsIgnoreCase(result)) {
|
|
|
- writeInfo(ctx, "error", "查询关系数据失败: " + graphId + ":" + JacksonMapper.getString(objectNode, "ResultMsg"));
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- ArrayNode array = JacksonMapper.getArray(objectNode, "Content", JsonNodeFactory.instance.arrayNode());
|
|
|
- List<RelationInstanceModel> relationInstanceModelList = new ArrayList<>();
|
|
|
- for (JsonNode jsonNode : array) {
|
|
|
- ObjectNode item = (ObjectNode) jsonNode;
|
|
|
- String relType = JacksonMapper.getString(item, "rel_type");
|
|
|
- String objFrom = JacksonMapper.getString(item, "from_id");
|
|
|
- String objTo = JacksonMapper.getString(item, "to_id");
|
|
|
-
|
|
|
- String graphCode = graphId.substring(2, graphId.length() - 3);
|
|
|
- GraphMapping.Item mapping = GraphMapping.getMapping(graphCode, relType);
|
|
|
- if (mapping != null) {
|
|
|
- RelationInstanceModel relation = new RelationInstanceModel();
|
|
|
- relation.setGraphCode(mapping.getNewGraph());
|
|
|
- relation.setRelCode(mapping.getNewRelcode());
|
|
|
- if (mapping.getSame()) {
|
|
|
- relation.setObjFrom(objFrom);
|
|
|
- relation.setObjTo(objTo);
|
|
|
- } else {
|
|
|
- relation.setObjFrom(objTo);
|
|
|
- relation.setObjTo(objFrom);
|
|
|
- }
|
|
|
- relationInstanceModelList.add(relation);
|
|
|
- } else {
|
|
|
- item.put("error", "图类型或边类型错误");
|
|
|
- writeInfo(ctx, "error", item.toString());
|
|
|
- }
|
|
|
- }
|
|
|
- url = dmpServer + "/rwd/instance/relation/create?" + getQueryString(ctx);
|
|
|
- HttpUtils.HttpResult response = httpUtils.post(url, JacksonMapper.toSimpleJson(relationInstanceModelList), 3600000);
|
|
|
- if (response.success()) {
|
|
|
- writeInfo(ctx, "success", "迁移关系数据到中台成功: 图实例: " + graphId + ", 数量: " + relationInstanceModelList.size());
|
|
|
- } else {
|
|
|
- writeInfo(ctx, "error", "迁移关系数据到中台失败: 图实例: " + graphId + ", 信息: " + response.getContent());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 迁移失效数据
|
|
|
- public void transInvalidObject(TransObjectContext context) {
|
|
|
- writeInfo(context, "success", "处理失效对象开始");
|
|
|
- transInvalidObject(context, "Bd");// 建筑
|
|
|
- transInvalidObject(context, "Fl");//楼层
|
|
|
- transInvalidObject(context, "Sp");// 空间
|
|
|
- transInvalidObject(context, "Sy");// 系统
|
|
|
- transInvalidObject(context, "Eq");// 设备
|
|
|
- transInvalidObject(context, "Ec");// 部件
|
|
|
- transInvalidObject(context, "Sh");// 竖井
|
|
|
- writeInfo(context, "success", "处理失效对象完成");
|
|
|
- }
|
|
|
-
|
|
|
- // 迁移失效数据
|
|
|
- private void transInvalidObject(TransObjectContext context, String type) {
|
|
|
- String url = context.getServer() + "/data-platform-3/object/subset_query?debug&projectId=" + context.getProjectId() + "&secret=" + context.getSecret();
|
|
|
- String requestBody = "{\"customInfo\":true,\"valid\":false,\"criteria\":{\"type\":[\"" + type + "\"]},\"returnInfos\":[]}";
|
|
|
- HttpUtils.HttpResult post = httpUtils.post(url, requestBody, 3600 * 1000);
|
|
|
- if (!post.success()) {
|
|
|
- writeInfo(context, "error", "查询失效对象失败: " + type);
|
|
|
- return;
|
|
|
- }
|
|
|
- String content = post.getContent();
|
|
|
- ObjectNode objectNode = JacksonMapper.toObject(content, ObjectNode.class);
|
|
|
- String result = JacksonMapper.getString(objectNode, "Result");
|
|
|
- if (!"success".equalsIgnoreCase(result)) {
|
|
|
- writeInfo(context, "error", "查询失效对象失败: " + type + ", " + JacksonMapper.getString(objectNode, "ResultMsg"));
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- ArrayNode array = JacksonMapper.getArray(objectNode, "Content", JsonNodeFactory.instance.arrayNode());
|
|
|
- List<String> ids = new LinkedList<>();
|
|
|
- for (JsonNode jsonNode : array) {
|
|
|
- ObjectNode item = (ObjectNode) jsonNode;
|
|
|
- String id = JacksonMapper.getString(item, "id");
|
|
|
- if (id != null) {
|
|
|
- ids.add(id);
|
|
|
- }
|
|
|
- }
|
|
|
- if (ids.size() > 0) {
|
|
|
- url = dmpServer + "/rwd/instance/object/delete?" + getQueryString(context);
|
|
|
- HttpUtils.HttpResult resp = httpUtils.post(url, JacksonMapper.toSimpleJson(ids), 3600 * 1000);
|
|
|
- writeInfo(context, "success", "处理失效对象成功: " + type + ", " + ids.size() + ", " + resp.getContent());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private String getQueryString(TransObjectContext context) {
|
|
|
- return "groupCode=" + context.getGroupCode() + "&projectId=" + context.getProjectId() + "&appId=" + context.getAppId() + "&userId=" + context.getUserId();
|
|
|
- }
|
|
|
-
|
|
|
- public void writeInfo(TransObjectContext ctx, String type, String msg) {
|
|
|
- writeInfo(ctx, type, null, msg, null, null, null);
|
|
|
- }
|
|
|
-
|
|
|
- public void writeInfo(TransObjectContext ctx, String type, String classCode, String msg, String objectId, String infoCode, String value) {
|
|
|
- TransObjectInfo info = new TransObjectInfo();
|
|
|
- info.setProjectId(ctx.getProjectId());
|
|
|
- info.setType(type);
|
|
|
- info.setClassCode(classCode);
|
|
|
- info.setObjectId(objectId);
|
|
|
- info.setInfoCode(infoCode);
|
|
|
- info.setInfoCodeValue(value);
|
|
|
- info.setMessage(msg);
|
|
|
- ctx.getLogs().add(info);
|
|
|
-
|
|
|
- if (!"error".equalsIgnoreCase(type) || ctx.getLogs().size() == TransObjectContext.LOGS_CACHE_SIZE) {
|
|
|
- objectInfoRepository.saveAll(ctx.getLogs());
|
|
|
- ctx.getLogs().clear();
|
|
|
- }
|
|
|
- }
|
|
|
+ if (obj.has("businessType")) {
|
|
|
+ infos.put("businessType", JacksonMapper.getString(obj, "businessType"));
|
|
|
+ }
|
|
|
+ infos.put("create_time", JacksonMapper.getString(obj, "create_time"));
|
|
|
+ objects.add(infos);
|
|
|
+ }
|
|
|
+ return objects;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Set<String> baseInfoCodes = new HashSet<>(Arrays.asList("id", "classCode", "create_time"));
|
|
|
+
|
|
|
+ // 转换为数据中台数据格式
|
|
|
+ public List<ObjectNode> toDmpObject(TransObjectContext ctx, List<ObjectNode> list, String objType, String classCode) {
|
|
|
+ List<ObjectNode> objects = new ArrayList<>(list.size());
|
|
|
+ for (ObjectNode objectNode : list) {
|
|
|
+ String id = JacksonMapper.getString(objectNode, "id");
|
|
|
+ String createTime = JacksonMapper.getString(objectNode, "create_time");
|
|
|
+ ObjectNode obj = JsonNodeFactory.instance.objectNode();
|
|
|
+ objects.add(obj);
|
|
|
+
|
|
|
+ obj.put("id", id);
|
|
|
+ obj.put("objType", objType);
|
|
|
+ obj.put("classCode", objectNode.has("classCode") ? JacksonMapper.getString(objectNode, "classCode") : classCode);
|
|
|
+ obj.put("createTime", createTime);
|
|
|
+ Iterator<String> iterator = objectNode.fieldNames();
|
|
|
+ while (iterator.hasNext()) {
|
|
|
+ String origInfoCode = iterator.next();
|
|
|
+ if (baseInfoCodes.contains(origInfoCode)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ JsonNode infoValue = objectNode.get(origInfoCode);
|
|
|
+ // 基本字段
|
|
|
+ if (TransUtils.baseColumnMapping.containsKey(origInfoCode)) {
|
|
|
+ obj.put(TransUtils.baseColumnMapping.get(origInfoCode), infoValue.asText());
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, FuncidDefModel> funcidCache = ctx.getFuncidModelCache().get(classCode);
|
|
|
+ FuncidDefModel funcidDefModel = funcidCache.get(origInfoCode);
|
|
|
+ if (funcidDefModel == null) {
|
|
|
+ writeInfo(ctx, "error", classCode, "信息点不存在", id, origInfoCode, infoValue.isTextual() ? infoValue.asText() : infoValue.toString());
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (funcidDefModel.getCategory() == FuncidCategory.STATIC) {
|
|
|
+ Boolean isMultiple = funcidDefModel.getIsMultiple();
|
|
|
+ Boolean isRegion = funcidDefModel.getIsRegion();
|
|
|
+ InfoCodeParser parser = infoCodeParserFactory.getParser(funcidDefModel.getDataType());
|
|
|
+ ParserContext parserContext = new ParserContext(funcidDefModel, objectNode.get(origInfoCode));
|
|
|
+ parser.checkValue(parserContext);
|
|
|
+ if (parserContext.isHasError()) {
|
|
|
+ writeInfo(ctx, "error", classCode, parserContext.getError().toString(), id, origInfoCode, infoValue.isTextual() ? infoValue.asText() : infoValue.toString());
|
|
|
+ } else {
|
|
|
+ if (isRegion) {
|
|
|
+ if (isMultiple) {
|
|
|
+ obj.putPOJO(funcidDefModel.getCode(), parserContext.getRegionArray());
|
|
|
+ } else {
|
|
|
+ obj.putPOJO(funcidDefModel.getCode(), parserContext.getRegionValue());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (isMultiple) {
|
|
|
+ obj.putPOJO(funcidDefModel.getCode(), parserContext.getArrayValue());
|
|
|
+ } else {
|
|
|
+ obj.putPOJO(funcidDefModel.getCode(), parserContext.getValue());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 动态信息点
|
|
|
+ obj.put(funcidDefModel.getCode(), infoValue.asText());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return objects;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 保存到数据中台
|
|
|
+ public void save(TransObjectContext ctx, List<ObjectNode> objects, String type) {
|
|
|
+ int begin = 0;
|
|
|
+ while (begin < objects.size()) {
|
|
|
+ int end = begin + 10000;
|
|
|
+ if (end > objects.size()) {
|
|
|
+ end = objects.size();
|
|
|
+ }
|
|
|
+ List<ObjectNode> objectNodes = objects.subList(begin, end);
|
|
|
+ String url = dmpServer + "/rwd/instance/object/create?" + getQueryString(ctx);
|
|
|
+ HttpUtils.HttpResult response = httpUtils.post(url, JacksonMapper.toSimpleJson(objectNodes), 3600000);
|
|
|
+ if (response.success()) {
|
|
|
+ writeInfo(ctx, "success", "对象保存到中台: 类型: " + type + ", 数量: " + objectNodes.size());
|
|
|
+ } else {
|
|
|
+ writeInfo(ctx, "error", "保存到中台时出错: 类型: " + type + ", 信息: " + response.getContent());
|
|
|
+ }
|
|
|
+ begin = end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 迁移关系数据
|
|
|
+ public void transRelation(TransObjectContext ctx) {
|
|
|
+
|
|
|
+ writeInfo(ctx, "success", "迁移关系数据开始");
|
|
|
+ // 查询图实例
|
|
|
+ String url = ctx.getServer() + "/data-platform-3/relation/graph_instance/query?projectId=" + ctx.getProjectId() + "&secret" + ctx.getSecret();
|
|
|
+ String requestBody = "{\"criteria\":{}}";
|
|
|
+ HttpUtils.HttpResult post = httpUtils.post(url, requestBody, 300 * 1000);
|
|
|
+ if (!post.success()) {
|
|
|
+ writeInfo(ctx, "error", "查询图实例失败: " + post.getContent());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ String content = post.getContent();
|
|
|
+ ObjectNode objectNode = JacksonMapper.toObject(content, ObjectNode.class);
|
|
|
+ String result = JacksonMapper.getString(objectNode, "Result");
|
|
|
+ if (!"success".equalsIgnoreCase(result)) {
|
|
|
+ writeInfo(ctx, "error", "查询图实例失败: " + JacksonMapper.getString(objectNode, "ResultMsg"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 遍历图实例,查询关系,迁移关系
|
|
|
+ ArrayNode array = JacksonMapper.getArray(objectNode, "Content", JsonNodeFactory.instance.arrayNode());
|
|
|
+ Set<String> sets = new HashSet<>();
|
|
|
+ for (JsonNode jsonNode : array) {
|
|
|
+ ObjectNode item = (ObjectNode) jsonNode;
|
|
|
+ String graphId = JacksonMapper.getString(item, "graph_id");
|
|
|
+ if (graphId == null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ sets.add(graphId);
|
|
|
+ }
|
|
|
+ for (String graphId : sets) {
|
|
|
+ transRelationByGraphId(ctx, graphId);
|
|
|
+ }
|
|
|
+ writeInfo(ctx, "success", "迁移关系数据完成");
|
|
|
+ }
|
|
|
+
|
|
|
+ private void transRelationByGraphId(TransObjectContext ctx, String graphId) {
|
|
|
+ String url = ctx.getServer() + "/data-platform-3/relation/query?projectId=" + ctx.getProjectId() + "&secret" + ctx.getSecret();
|
|
|
+ String requestBody = "{\"criteria\":{\"graph_id\":\"" + graphId + "\"}}";
|
|
|
+ HttpUtils.HttpResult post = httpUtils.post(url, requestBody, 300 * 1000);
|
|
|
+ if (!post.success()) {
|
|
|
+ writeInfo(ctx, "error", "查询关系数据失败: " + graphId + ":" + post.getContent());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ String content = post.getContent();
|
|
|
+ ObjectNode objectNode = JacksonMapper.toObject(content, ObjectNode.class);
|
|
|
+ String result = JacksonMapper.getString(objectNode, "Result");
|
|
|
+ if (!"success".equalsIgnoreCase(result)) {
|
|
|
+ writeInfo(ctx, "error", "查询关系数据失败: " + graphId + ":" + JacksonMapper.getString(objectNode, "ResultMsg"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ ArrayNode array = JacksonMapper.getArray(objectNode, "Content", JsonNodeFactory.instance.arrayNode());
|
|
|
+ List<RelationInstanceModel> relationInstanceModelList = new ArrayList<>();
|
|
|
+ for (JsonNode jsonNode : array) {
|
|
|
+ ObjectNode item = (ObjectNode) jsonNode;
|
|
|
+ String relType = JacksonMapper.getString(item, "rel_type");
|
|
|
+ String objFrom = JacksonMapper.getString(item, "from_id");
|
|
|
+ String objTo = JacksonMapper.getString(item, "to_id");
|
|
|
+
|
|
|
+ String graphCode = graphId.substring(2, graphId.length() - 3);
|
|
|
+ GraphMapping.Item mapping = GraphMapping.getMapping(graphCode, relType);
|
|
|
+ if (mapping != null) {
|
|
|
+ RelationInstanceModel relation = new RelationInstanceModel();
|
|
|
+ relation.setGraphCode(mapping.getNewGraph());
|
|
|
+ relation.setRelCode(mapping.getNewRelcode());
|
|
|
+ if (mapping.getSame()) {
|
|
|
+ relation.setObjFrom(objFrom);
|
|
|
+ relation.setObjTo(objTo);
|
|
|
+ } else {
|
|
|
+ relation.setObjFrom(objTo);
|
|
|
+ relation.setObjTo(objFrom);
|
|
|
+ }
|
|
|
+ relationInstanceModelList.add(relation);
|
|
|
+ } else {
|
|
|
+ item.put("error", "图类型或边类型错误");
|
|
|
+ writeInfo(ctx, "error", item.toString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ url = dmpServer + "/rwd/instance/relation/create?" + getQueryString(ctx);
|
|
|
+ HttpUtils.HttpResult response = httpUtils.post(url, JacksonMapper.toSimpleJson(relationInstanceModelList), 3600000);
|
|
|
+ if (response.success()) {
|
|
|
+ writeInfo(ctx, "success", "迁移关系数据到中台成功: 图实例: " + graphId + ", 数量: " + relationInstanceModelList.size());
|
|
|
+ } else {
|
|
|
+ writeInfo(ctx, "error", "迁移关系数据到中台失败: 图实例: " + graphId + ", 信息: " + response.getContent());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 迁移失效数据
|
|
|
+ public void transInvalidObject(TransObjectContext context) {
|
|
|
+ writeInfo(context, "success", "处理失效对象开始");
|
|
|
+ transInvalidObject(context, "Bd");// 建筑
|
|
|
+ transInvalidObject(context, "Fl");//楼层
|
|
|
+ transInvalidObject(context, "Sp");// 空间
|
|
|
+ transInvalidObject(context, "Sy");// 系统
|
|
|
+ transInvalidObject(context, "Eq");// 设备
|
|
|
+ transInvalidObject(context, "Ec");// 部件
|
|
|
+ transInvalidObject(context, "Sh");// 竖井
|
|
|
+ writeInfo(context, "success", "处理失效对象完成");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 迁移失效数据
|
|
|
+ private void transInvalidObject(TransObjectContext context, String type) {
|
|
|
+ String url = context.getServer() + "/data-platform-3/object/subset_query?debug&projectId=" + context.getProjectId() + "&secret=" + context.getSecret();
|
|
|
+ String requestBody = "{\"customInfo\":true,\"valid\":false,\"criteria\":{\"type\":[\"" + type + "\"]},\"returnInfos\":[]}";
|
|
|
+ HttpUtils.HttpResult post = httpUtils.post(url, requestBody, 3600 * 1000);
|
|
|
+ if (!post.success()) {
|
|
|
+ writeInfo(context, "error", "查询失效对象失败: " + type);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ String content = post.getContent();
|
|
|
+ ObjectNode objectNode = JacksonMapper.toObject(content, ObjectNode.class);
|
|
|
+ String result = JacksonMapper.getString(objectNode, "Result");
|
|
|
+ if (!"success".equalsIgnoreCase(result)) {
|
|
|
+ writeInfo(context, "error", "查询失效对象失败: " + type + ", " + JacksonMapper.getString(objectNode, "ResultMsg"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ ArrayNode array = JacksonMapper.getArray(objectNode, "Content", JsonNodeFactory.instance.arrayNode());
|
|
|
+ List<String> ids = new LinkedList<>();
|
|
|
+ for (JsonNode jsonNode : array) {
|
|
|
+ ObjectNode item = (ObjectNode) jsonNode;
|
|
|
+ String id = JacksonMapper.getString(item, "id");
|
|
|
+ if (id != null) {
|
|
|
+ ids.add(id);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (ids.size() > 0) {
|
|
|
+ url = dmpServer + "/rwd/instance/object/delete?" + getQueryString(context);
|
|
|
+ HttpUtils.HttpResult resp = httpUtils.post(url, JacksonMapper.toSimpleJson(ids), 3600 * 1000);
|
|
|
+ writeInfo(context, "success", "处理失效对象成功: " + type + ", " + ids.size() + ", " + resp.getContent());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private String getQueryString(TransObjectContext context) {
|
|
|
+ return "groupCode=" + context.getGroupCode() + "&projectId=" + context.getProjectId() + "&appId=" + context.getAppId() + "&userId=" + context.getUserId();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void writeInfo(TransObjectContext ctx, String type, String msg) {
|
|
|
+ writeInfo(ctx, type, null, msg, null, null, null);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void writeInfo(TransObjectContext ctx, String type, String classCode, String msg, String objectId, String infoCode, String value) {
|
|
|
+ TransObjectInfo info = new TransObjectInfo();
|
|
|
+ info.setProjectId(ctx.getProjectId());
|
|
|
+ info.setType(type);
|
|
|
+ info.setClassCode(classCode);
|
|
|
+ info.setObjectId(objectId);
|
|
|
+ info.setInfoCode(infoCode);
|
|
|
+ info.setInfoCodeValue(value);
|
|
|
+ info.setMessage(msg);
|
|
|
+ ctx.getLogs().add(info);
|
|
|
+
|
|
|
+ if (!"error".equalsIgnoreCase(type) || ctx.getLogs().size() == TransObjectContext.LOGS_CACHE_SIZE) {
|
|
|
+ objectInfoRepository.saveAll(ctx.getLogs());
|
|
|
+ ctx.getLogs().clear();
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
}
|