diff --git a/src/main/java/neatlogic/module/cmdb/api/synccientity/SyncCiEntityDataForBalantFlowApi.java b/src/main/java/neatlogic/module/cmdb/api/synccientity/SyncCiEntityDataForBalantFlowApi.java
new file mode 100644
index 0000000000000000000000000000000000000000..9c75f613880274fb8033ee1f399eafc1ff1dcda1
--- /dev/null
+++ b/src/main/java/neatlogic/module/cmdb/api/synccientity/SyncCiEntityDataForBalantFlowApi.java
@@ -0,0 +1,1344 @@
+/*
+ * Copyright (C) 2025 深圳极向量科技有限公司 All Rights Reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package neatlogic.module.cmdb.api.synccientity;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import neatlogic.framework.asynchronization.threadlocal.InputFromContext;
+import neatlogic.framework.auth.core.AuthAction;
+import neatlogic.framework.auth.label.ADMIN;
+import neatlogic.framework.cmdb.attrvaluehandler.core.AttrValueHandlerFactory;
+import neatlogic.framework.cmdb.attrvaluehandler.core.IAttrValueHandler;
+import neatlogic.framework.cmdb.crossover.*;
+import neatlogic.framework.cmdb.dto.ci.AttrVo;
+import neatlogic.framework.cmdb.dto.ci.CiVo;
+import neatlogic.framework.cmdb.dto.ci.RelVo;
+import neatlogic.framework.cmdb.dto.cientity.AttrFilterVo;
+import neatlogic.framework.cmdb.dto.cientity.CiEntityVo;
+import neatlogic.framework.cmdb.dto.globalattr.GlobalAttrItemVo;
+import neatlogic.framework.cmdb.dto.globalattr.GlobalAttrVo;
+import neatlogic.framework.cmdb.dto.transaction.AttrEntityTransactionVo;
+import neatlogic.framework.cmdb.dto.transaction.CiEntityTransactionVo;
+import neatlogic.framework.cmdb.dto.transaction.TransactionGroupVo;
+import neatlogic.framework.cmdb.enums.*;
+import neatlogic.framework.cmdb.exception.attr.AttrNotFoundException;
+import neatlogic.framework.cmdb.exception.attr.AttrValueIrregularException;
+import neatlogic.framework.cmdb.exception.attrtype.AttrTypeNotFoundException;
+import neatlogic.framework.cmdb.exception.ci.CiNotFoundException;
+import neatlogic.framework.cmdb.exception.ci.CiUniqueAttrNotFoundException;
+import neatlogic.framework.cmdb.exception.globalattr.GlobalAttrNotFoundException;
+import neatlogic.framework.cmdb.exception.globalattr.GlobalAttrValueIrregularException;
+import neatlogic.framework.cmdb.exception.rel.RelNotFoundException;
+import neatlogic.framework.cmdb.utils.RelUtil;
+import neatlogic.framework.common.constvalue.ApiParamType;
+import neatlogic.framework.common.constvalue.InputFrom;
+import neatlogic.framework.crossover.CrossoverServiceFactory;
+import neatlogic.framework.exception.core.ApiRuntimeException;
+import neatlogic.framework.exception.integration.IntegrationHandlerNotFoundException;
+import neatlogic.framework.exception.type.ParamNotExistsException;
+import neatlogic.framework.integration.core.IIntegrationHandler;
+import neatlogic.framework.integration.core.IntegrationHandlerFactory;
+import neatlogic.framework.integration.dao.mapper.IntegrationMapper;
+import neatlogic.framework.integration.dto.IntegrationResultVo;
+import neatlogic.framework.integration.dto.IntegrationVo;
+import neatlogic.framework.matrix.exception.MatrixExternalAccessException;
+import neatlogic.framework.restful.annotation.*;
+import neatlogic.framework.restful.constvalue.OperationTypeEnum;
+import neatlogic.framework.restful.core.privateapi.PrivateApiComponentBase;
+import neatlogic.framework.util.UuidUtil;
+import neatlogic.module.cmdb.dao.mapper.ci.AttrMapper;
+import neatlogic.module.cmdb.dao.mapper.ci.CiMapper;
+import neatlogic.module.cmdb.dao.mapper.ci.RelMapper;
+import neatlogic.module.cmdb.dao.mapper.globalattr.GlobalAttrMapper;
+import neatlogic.module.cmdb.service.cientity.CiEntityService;
+import neatlogic.module.framework.integration.handler.FrameworkRequestFrom;
+import neatlogic.module.framework.scheduler.IntegrationJob;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@AuthAction(action = ADMIN.class)
+@OperationType(type = OperationTypeEnum.OPERATE)
+//@Transactional
+public class SyncCiEntityDataForBalantFlowApi extends PrivateApiComponentBase {
+
+ private final static Logger logger = LoggerFactory.getLogger(IntegrationJob.class);
+
+ @Resource
+ private IntegrationMapper integrationMapper;
+ @Resource
+ private CiEntityService ciEntityService;
+ @Resource
+ private CiMapper ciMapper;
+ @Resource
+ private AttrMapper attrMapper;
+ @Resource
+ private GlobalAttrMapper globalAttrMapper;
+ @Resource
+ private RelMapper relMapper;
+
+ @Override
+ public String getName() {
+ return "同步CMDB配置项数据";
+ }
+
+ @Input({
+ @Param(name = "syncCiList", type = ApiParamType.JSONARRAY, isRequired = true, minSize = 1, desc = "同步模型列表"),
+ @Param(name = "integrationName", type = ApiParamType.STRING, isRequired = true, desc = "集成名称"),
+ @Param(name = "integrationParam", type = ApiParamType.STRING, desc = "集成输入参数"),
+ @Param(name = "listeningNameList", type = ApiParamType.JSONARRAY, desc = "监听列表", help = "配置项名称"),
+ @Param(name = "integrationRequestMaxCount", type = ApiParamType.INTEGER, defaultValue = "10000", desc = "集成请求最大次数,默认是10000"),
+
+ })
+ @Output({
+
+ })
+ @Description(desc = "同步CMDB配置项数据,获取数据接口是balantflow/restservices/cmdb/glasnostViewQueryRestComponentApi?currentPage=1&tPageSize=20&id=65")
+ @Override
+ public Object myDoService(JSONObject paramObj) throws Exception {
+ JSONObject resultObj = new JSONObject();
+ List listeningNameList = new ArrayList<>();
+ JSONArray listeningNameArray = paramObj.getJSONArray("listeningNameList");
+ if (CollectionUtils.isNotEmpty(listeningNameArray)) {
+ listeningNameList = listeningNameArray.toJavaList(String.class);
+ }
+ JSONArray syncCiList = paramObj.getJSONArray("syncCiList");
+ List ciMappingList = checkSyncCiList(syncCiList);
+ resultObj.put("ciMappingList", ciMappingList);
+ String integrationName = paramObj.getString("integrationName");
+ if (integrationName != null) {
+ IntegrationVo supplierIntegrationVo = integrationMapper.getIntegrationByName(integrationName);
+ if (supplierIntegrationVo != null) {
+ Map label2CiIdMap = new HashMap<>();
+ IIntegrationHandler handler = IntegrationHandlerFactory.getHandler(supplierIntegrationVo.getHandler());
+ if (handler == null) {
+ throw new IntegrationHandlerNotFoundException(supplierIntegrationVo.getHandler());
+ }
+ JSONArray insertList = new JSONArray();
+ JSONArray updateList = new JSONArray();
+ JSONArray listeningList = new JSONArray();
+ JSONObject integrationParam = paramObj.getJSONObject("integrationParam");
+ if (MapUtils.isNotEmpty(integrationParam)) {
+ supplierIntegrationVo.getParamObj().putAll(integrationParam);
+ }
+ int integrationRequestMaxCount = paramObj.getInteger("integrationRequestMaxCount");
+ for (int currentPage = 1; currentPage <= integrationRequestMaxCount; currentPage++) {
+ supplierIntegrationVo.getParamObj().put("currentPage", currentPage);
+ IntegrationResultVo resultVo = handler.sendRequest(supplierIntegrationVo, FrameworkRequestFrom.API);
+ if (StringUtils.isNotBlank(resultVo.getError())) {
+ logger.error(resultVo.getError());
+ throw new MatrixExternalAccessException(supplierIntegrationVo.getName());
+ }
+ handler.validate(resultVo);
+ JSONObject dataObj = JSONObject.parseObject(resultVo.getTransformedResult());
+ if (MapUtils.isNotEmpty(dataObj)) {
+ JSONObject returnObj = dataObj.getJSONObject("Return");
+ if (MapUtils.isNotEmpty(returnObj)) {
+ Long id = returnObj.getLong("id");
+ String name = returnObj.getString("name");
+ JSONArray columnList = returnObj.getJSONArray("columnList");
+ if (MapUtils.isEmpty(label2CiIdMap)) {
+ if (CollectionUtils.isNotEmpty(columnList)) {
+ for (int i = 0; i < columnList.size(); i++) {
+ JSONObject columnObj = columnList.getJSONObject(i);
+ if (MapUtils.isNotEmpty(columnObj)) {
+ Long ciId = columnObj.getLong("ciId");
+ Long attrId = columnObj.getLong("attrId");
+ String label = columnObj.getString("label");
+ label2CiIdMap.put(label, ciId);
+ }
+ }
+ }
+ }
+ JSONArray resultList = returnObj.getJSONArray("resultList");
+ if (CollectionUtils.isNotEmpty(resultList)) {
+ List transactionGroupIdList = savePageCiEntityList(label2CiIdMap, resultList, ciMappingList, listeningNameList, insertList, updateList, listeningList);
+ resultObj.put("transactionGroupIdList", transactionGroupIdList);
+ }
+ } else {
+ break;
+ }
+ }
+ }
+ resultObj.put("insertList", insertList);
+ resultObj.put("updateList", updateList);
+ if (CollectionUtils.isNotEmpty(listeningList)) {
+ resultObj.put("listeningList", listeningList);
+ }
+ }
+ }
+ return resultObj;
+ }
+ private List savePageCiEntityList(
+ Map label2CiIdMap,
+ JSONArray resultList,
+ List ciMappingList,
+ List listeningNameList,
+ JSONArray insertList,
+ JSONArray updateList,
+ JSONArray listeningList
+ ) {
+ List transactionGroupIdList = new ArrayList<>();
+ for (int i = 0; i < resultList.size(); i++) {
+ JSONObject row = resultList.getJSONObject(i);
+ Long ciEntityId = row.getLong("ciEntityId");
+ JSONArray attrList = row.getJSONArray("attrList");
+ if (CollectionUtils.isNotEmpty(attrList)) {
+ for (int j = 0; j < attrList.size(); j++) {
+ JSONObject attrObj = attrList.getJSONObject(i);
+ if (MapUtils.isNotEmpty(attrObj)) {
+ Long attrId = attrObj.getLong("attrId");
+ String label = attrObj.getString("label");
+ Object value = attrObj.get("value");
+ Long ciId = label2CiIdMap.get(label);
+ attrObj.put("ciId", ciId);
+ }
+ }
+ for (CiMappingVo ciMappingVo : ciMappingList) {
+ JSONObject positioningError = new JSONObject();
+ List ciEntityTransactionList = new ArrayList<>();
+ CiEntityTransactionVo ciEntityTransactionVo = generateCiEntityTransactionVo(attrList, ciMappingVo, ciEntityTransactionList, positioningError);
+ Long transactionGroupId = saveRowCiEntityList(ciEntityTransactionList, listeningNameList, insertList, updateList, listeningList);
+ transactionGroupIdList.add(transactionGroupId);
+ }
+ }
+ }
+ return transactionGroupIdList;
+ }
+
+ private CiEntityTransactionVo generateCiEntityTransactionVo(JSONArray attrList, CiMappingVo ciMappingVo, List ciEntityTransactionList, JSONObject positioningError) {
+ CiEntityTransactionVo ciEntityTransactionVo = new CiEntityTransactionVo();
+ ciEntityTransactionVo.setCiId(ciMappingVo.getCiId());
+ ciEntityTransactionVo.setAllowCommit(true);
+ ciEntityTransactionVo.setEditMode(EditModeType.PARTIAL.getValue());
+ ciEntityTransactionVo.setDescription(ciMappingVo.getDescription());
+ /* 属性 */
+ JSONObject attrEntityData = buildAttrEntityData(attrList, ciMappingVo.getAttrList(), ciMappingVo, ciEntityTransactionList, positioningError);
+ ciEntityTransactionVo.setAttrEntityData(attrEntityData);
+ Long ciEntityId = getCiEntityIdByUniqueAttrIdList(ciMappingVo, ciEntityTransactionVo, positioningError);
+ if (ciEntityId != null) {
+ ciEntityTransactionVo.setCiEntityId(ciEntityId);
+ ciEntityTransactionVo.setAction(TransactionActionType.UPDATE.getValue());
+ } else {
+ ciEntityTransactionVo.getCiEntityId();
+ ciEntityTransactionVo.setCiEntityUuid(UuidUtil.randomUuid());
+ JSONObject nameAttrEntityData = ciEntityTransactionVo.getAttrEntityDataByAttrId(ciMappingVo.getNameAttrId());
+ if (MapUtils.isNotEmpty(nameAttrEntityData)) {
+ JSONArray valueArray = nameAttrEntityData.getJSONArray("valueList");
+ if (CollectionUtils.isNotEmpty(valueArray)) {
+ List valueList = valueArray.toJavaList(String.class);
+ ciEntityTransactionVo.setName(String.join(",", valueList));
+ }
+ }
+ ciEntityTransactionVo.setAction(TransactionActionType.INSERT.getValue());
+ }
+ /* 关系 */
+ if (CollectionUtils.isNotEmpty(ciMappingVo.getRelList())) {
+ JSONObject relEntityData = buildRelEntityData(attrList, ciMappingVo.getRelList(), ciEntityTransactionVo, ciEntityTransactionList, positioningError);
+ ciEntityTransactionVo.setRelEntityData(relEntityData);
+ }
+ /* 全局属性 */
+ if (CollectionUtils.isNotEmpty(ciMappingVo.getGlobalAttrList())) {
+ JSONObject globalAttrEntityData = buildGlobalAttrEntityData(attrList, ciMappingVo.getGlobalAttrList(), ciMappingVo, positioningError);
+ ciEntityTransactionVo.setGlobalAttrEntityData(globalAttrEntityData);
+ }
+ ciEntityTransactionList.add(ciEntityTransactionVo);
+ return ciEntityTransactionVo;
+ }
+
+ /**
+ * 组装关系
+ * @param attrList
+ * @param relMappingList
+ * @param upperCiEntityTransactionVo
+ * @param ciEntityTransactionList
+ * @param positioningError
+ * @return
+ */
+ private JSONObject buildRelEntityData(
+ JSONArray attrList,
+ List relMappingList,
+ CiEntityTransactionVo upperCiEntityTransactionVo,
+ List ciEntityTransactionList,
+ JSONObject positioningError
+ ) {
+ JSONObject relEntityData = new JSONObject();
+ for (RelMappingVo relMappingVo : relMappingList) {
+ CiMappingVo valueMapping = relMappingVo.getValueMapping();
+ CiEntityTransactionVo ciEntityTransactionVo = generateCiEntityTransactionVo(attrList, valueMapping, ciEntityTransactionList, positioningError);
+ {
+ String key = "rel" + relMappingVo.getDirection() + "_" + relMappingVo.getId();
+ JSONArray valueList = new JSONArray();
+ JSONObject valueObj = new JSONObject();
+// if (Objects.equals(relMappingVo.getDirection(), RelDirectionType.FROM.getValue())) {
+// if (Objects.equals(relMappingVo.getFromRule(), RelRuleType.N.getValue())) {
+// valueObj.put("action", RelActionType.INSERT.getValue());
+// } else {
+// valueObj.put("action", RelActionType.REPLACE.getValue());
+// }
+// } else if (Objects.equals(relMappingVo.getDirection(), RelDirectionType.TO.getValue())) {
+// if (Objects.equals(relMappingVo.getToRule(), RelRuleType.N.getValue())) {
+// valueObj.put("action", RelActionType.INSERT.getValue());
+// } else {
+// valueObj.put("action", RelActionType.REPLACE.getValue());
+// }
+// }
+ if (Objects.equals(ciEntityTransactionVo.getAction(), TransactionActionType.INSERT.getValue())) {
+ valueObj.put("_relId", relMappingVo.getId());
+ valueObj.put("ciEntityId", ciEntityTransactionVo.getCiEntityId());
+ valueObj.put("ciEntityUuid", ciEntityTransactionVo.getCiEntityUuid());
+ valueObj.put("ciEntityName", "新的配置项");
+ valueObj.put("ciId", valueMapping.getCiId());
+ valueObj.put("type", "new");
+ } else {
+ valueObj.put("ciEntityId", ciEntityTransactionVo.getCiEntityId());
+ valueObj.put("ciEntityName", ciEntityTransactionVo.getName());
+ valueObj.put("ciId", valueMapping.getCiId());
+ }
+ valueList.add(valueObj);
+ if (CollectionUtils.isNotEmpty(valueList)) {
+ JSONObject relEntity = new JSONObject();
+ relEntity.put("valueList", valueList);
+ relEntityData.put(key, relEntity);
+ }
+ }
+ {
+ JSONArray valueList = new JSONArray();
+ JSONObject valueObj = new JSONObject();
+ String key = "rel";
+ if (Objects.equals(relMappingVo.getDirection(), RelDirectionType.FROM.getValue())) {
+ key += RelDirectionType.TO.getValue() + "_" + relMappingVo.getId();
+// if (Objects.equals(relMappingVo.getToRule(), RelRuleType.N.getValue())) {
+// valueObj.put("action", RelActionType.INSERT.getValue());
+// } else {
+// valueObj.put("action", RelActionType.REPLACE.getValue());
+// }
+ } else if (Objects.equals(relMappingVo.getDirection(), RelDirectionType.TO.getValue())) {
+ key += RelDirectionType.FROM.getValue() + "_" + relMappingVo.getId();
+// if (Objects.equals(relMappingVo.getFromRule(), RelRuleType.N.getValue())) {
+// valueObj.put("action", RelActionType.INSERT.getValue());
+// } else {
+// valueObj.put("action", RelActionType.REPLACE.getValue());
+// }
+ }
+ if (Objects.equals(ciEntityTransactionVo.getAction(), TransactionActionType.INSERT.getValue())) {
+ valueObj.put("_relId", relMappingVo.getId());
+ valueObj.put("ciEntityId", upperCiEntityTransactionVo.getCiEntityId());
+ valueObj.put("ciEntityUuid", upperCiEntityTransactionVo.getCiEntityUuid());
+ valueObj.put("ciEntityName", "来源配置项");
+ valueObj.put("ciId", upperCiEntityTransactionVo.getCiId());
+ valueObj.put("type", "from");
+ } else {
+ valueObj.put("ciEntityId", upperCiEntityTransactionVo.getCiEntityId());
+ valueObj.put("ciEntityName", upperCiEntityTransactionVo.getName());
+ valueObj.put("ciId", upperCiEntityTransactionVo.getCiId());
+ }
+ valueList.add(valueObj);
+ JSONObject relEntity = new JSONObject();
+ relEntity.put("valueList", valueList);
+ JSONObject relEntityData1 = ciEntityTransactionVo.getRelEntityData();
+ if (relEntityData1 == null) {
+ relEntityData1 = new JSONObject();
+ ciEntityTransactionVo.setRelEntityData(relEntityData1);
+ }
+ relEntityData1.put(key, relEntity);
+ }
+ }
+ return relEntityData;
+ }
+
+ /**
+ * 组装属性
+ * @param attrList
+ * @param attrMappingList
+ * @param ciMappingVo
+ * @param ciEntityTransactionList
+ * @param positioningError
+ * @return
+ */
+ private JSONObject buildAttrEntityData(
+ JSONArray attrList,
+ List attrMappingList,
+ CiMappingVo ciMappingVo,
+ List ciEntityTransactionList,
+ JSONObject positioningError
+ ) {
+ JSONObject attrEntityData = new JSONObject();
+ for (AttrMappingVo attrMappingVo : attrMappingList) {
+ JSONArray valueList = new JSONArray();
+ AttrValueMappingVo valueMapping = attrMappingVo.getValueMapping();
+ if (valueMapping != null) {
+ for (int i = 0; i < attrList.size(); i++) {
+ JSONObject attrObj = attrList.getJSONObject(i);
+ if (MapUtils.isNotEmpty(attrObj)) {
+ Long ciId = attrObj.getLong("ciId");
+ Long attrId = attrObj.getLong("attrId");
+ String label = attrObj.getString("label");
+ if (Objects.equals(valueMapping.getLabel(), label) || Objects.equals(valueMapping.getAttrId(), attrId)) {
+ Object value = attrObj.get("value");
+ if (value instanceof List) {
+ valueList.addAll((List) value);
+ } else {
+ valueList.add(value);
+ }
+ }
+ }
+ }
+ }
+ if (CollectionUtils.isEmpty(valueList)) {
+ if (CollectionUtils.isNotEmpty(attrMappingVo.getValueList())) {
+ valueList.addAll(attrMappingVo.getValueList());
+ }
+ }
+ if (CollectionUtils.isNotEmpty(valueList)) {
+ String key = "attr_" + attrMappingVo.getId();
+ JSONObject attrEntity = new JSONObject();
+ attrEntity.put("type", attrMappingVo.getType());
+ attrEntity.put("config", attrMappingVo.getConfig());
+ if (Objects.equals(attrMappingVo.getType(), PropHandlerType.SELECT.getValue()) || Objects.equals(attrMappingVo.getType(), PropHandlerType.TABLE.getValue())) {
+ IAttrCrossoverMapper attrCrossoverMapper = CrossoverServiceFactory.getApi(IAttrCrossoverMapper.class);
+ AttrVo attrVo = attrCrossoverMapper.getAttrById(attrMappingVo.getId());
+ JSONArray newValueList = validSelectAndTableAttrValueList(ciMappingVo.getCiId(), ciMappingVo.getCiName(), ciMappingVo.getCiLabel(), ciEntityTransactionList, attrVo, valueList, positioningError);
+ attrEntity.put("valueList", newValueList);
+ } else {
+ attrEntity.put("valueList", valueList);
+ }
+ attrEntityData.put(key, attrEntity);
+ }
+ }
+ return attrEntityData;
+ }
+
+ /**
+ * 处理和校验下拉框类型和表格类型属性的值
+ *
+ * @param attrVo
+ * @param valueList
+ */
+ private JSONArray validSelectAndTableAttrValueList(
+ Long ciId,
+ String ciName,
+ String ciLabel,
+ List ciEntityTransactionList,
+ AttrVo attrVo,
+ JSONArray valueList,
+ JSONObject positioningError
+ ) {
+ ICiCrossoverMapper ciCrossoverMapper = CrossoverServiceFactory.getApi(ICiCrossoverMapper.class);
+ ICiEntityCrossoverMapper ciEntityCrossoverMapper = CrossoverServiceFactory.getApi(ICiEntityCrossoverMapper.class);
+ IAttrValueHandler attrHandler = AttrValueHandlerFactory.getHandler(attrVo.getType());
+ if (attrHandler == null) {
+ positioningError.put("ciId", ciId);
+ positioningError.put("ciName", ciName);
+ positioningError.put("ciLabel", ciLabel);
+ throw new AttrTypeNotFoundException(attrVo.getType());
+ }
+ if (CollectionUtils.isEmpty(valueList)) {
+ return valueList;
+ }
+ List longValueList = new ArrayList<>();
+ List stringValueList = new ArrayList<>();
+ JSONArray tempList = new JSONArray();
+ tempList.addAll(valueList);
+ for (int i = 0; i < tempList.size(); i++) {
+ Object valueObj = tempList.get(i);
+ if (valueObj instanceof Long) {
+ longValueList.add((Long) valueObj);
+ } else if (valueObj instanceof String) {
+ String valueStr = valueObj.toString();
+ try {
+ Integer.valueOf(valueStr);
+ stringValueList.add(valueStr);
+ } catch (NumberFormatException e1) {
+ try {
+ longValueList.add(Long.valueOf(valueStr));
+ } catch (NumberFormatException e2) {
+ stringValueList.add(valueStr);
+ }
+ }
+ }
+ }
+ JSONArray newValueList = new JSONArray();
+ if (CollectionUtils.isNotEmpty(longValueList)) {
+ JSONArray array = new JSONArray();
+ array.addAll(longValueList);
+ attrHandler.valid(attrVo, array);
+ newValueList.addAll(longValueList);
+ }
+ if (CollectionUtils.isNotEmpty(stringValueList)) {
+ CiVo ciVo = ciCrossoverMapper.getCiById(attrVo.getTargetCiId());
+ if (ciVo == null) {
+ positioningError.put("ciId", ciId);
+ positioningError.put("ciName", ciName);
+ positioningError.put("ciLabel", ciLabel);
+ throw new CiNotFoundException(attrVo.getTargetCiId().toString());
+ }
+ for (String valueStr : stringValueList) {
+ CiEntityVo search = new CiEntityVo();
+ search.setName(valueStr);
+ if (ciVo.getIsVirtual().equals(0)) {
+ // 非虚拟模型
+ List downwardCiList = ciCrossoverMapper.getDownwardCiListByLR(ciVo.getLft(), ciVo.getRht());
+ Map downwardCiMap = downwardCiList.stream().collect(Collectors.toMap(e -> e.getId(), e -> e));
+ boolean isFind = false;
+ for (CiEntityTransactionVo ciEntityTransactionVo : ciEntityTransactionList) {
+ // 如果action为空,说明该ciEntityTransactionVo对象没有在createCiEntityTransactionVo方法中完成初始化,不能调用它的getCiEntityId()方法
+ if (ciEntityTransactionVo.getAction() == null) {
+ continue;
+ }
+ CiVo downwardCi = downwardCiMap.get(ciEntityTransactionVo.getCiId());
+ if (downwardCi == null) {
+ continue;
+ }
+ if (downwardCi.getNameAttrId() == null) {
+ continue;
+ }
+ AttrEntityTransactionVo attrEntityTransaction = ciEntityTransactionVo.getAttrEntityTransactionByAttrId(downwardCi.getNameAttrId());
+ if (attrEntityTransaction == null) {
+ continue;
+ }
+ if (CollectionUtils.isEmpty(attrEntityTransaction.getValueList())) {
+ continue;
+ }
+ for (Object value : attrEntityTransaction.getValueList()) {
+ if (Objects.equals(value, valueStr)) {
+ newValueList.add(ciEntityTransactionVo.getCiEntityId());
+ isFind = true;
+ break;
+ }
+ }
+ }
+ if (!isFind) {
+ search.setIdList(new ArrayList<>(downwardCiMap.keySet()));
+ List ciEntityList = ciEntityCrossoverMapper.getCiEntityListByCiIdListAndName(search);
+ if (CollectionUtils.isEmpty(ciEntityList)) {
+ attrVo.setCiName(ciName);
+ attrVo.setCiLabel(ciLabel);
+ positioningError.put("ciId", ciId);
+ positioningError.put("ciName", ciName);
+ positioningError.put("ciLabel", ciLabel);
+ throw new AttrValueIrregularException(attrVo, valueStr);
+ }
+ for (CiEntityVo ciEntity : ciEntityList) {
+ newValueList.add(ciEntity.getId());
+ }
+ }
+ } else {
+ // 虚拟模型
+ search.setCiId(ciVo.getId());
+ List ciEntityList = ciEntityCrossoverMapper.getVirtualCiEntityBaseInfoByName(search);
+ if (CollectionUtils.isEmpty(ciEntityList)) {
+ attrVo.setCiName(ciName);
+ attrVo.setCiLabel(ciLabel);
+ positioningError.put("ciId", ciId);
+ positioningError.put("ciName", ciName);
+ positioningError.put("ciLabel", ciLabel);
+ throw new AttrValueIrregularException(attrVo, valueStr);
+ }
+ for (CiEntityVo ciEntity : ciEntityList) {
+ newValueList.add(ciEntity.getId());
+ }
+ }
+ }
+ }
+ return newValueList;
+ }
+
+ /**
+ * 根据唯一属性列表查询配置项id
+ * @param ciEntityTransactionVo
+ * @return
+ */
+ private Long getCiEntityIdByUniqueAttrIdList(
+ CiMappingVo ciMappingVo,
+ CiEntityTransactionVo ciEntityTransactionVo,
+ JSONObject positioningError
+ ) {
+// ICiCrossoverMapper ciCrossoverMapper = CrossoverServiceFactory.getApi(ICiCrossoverMapper.class);
+ IAttrCrossoverMapper attrCrossoverMapper = CrossoverServiceFactory.getApi(IAttrCrossoverMapper.class);
+ ICiEntityCrossoverService ciEntityCrossoverService = CrossoverServiceFactory.getApi(ICiEntityCrossoverService.class);
+// CiVo ciVo = ciCrossoverMapper.getCiById(ciMappingVo.getCiId());
+ List uniqueAttrIdList = ciMappingVo.getUniqueAttrIdList();
+ if (CollectionUtils.isEmpty(uniqueAttrIdList)) {
+ return null;
+ }
+ //校验唯一规则
+ CiEntityVo ciEntityConditionVo = new CiEntityVo();
+ ciEntityConditionVo.setCiId(ciMappingVo.getCiId());
+ ciEntityConditionVo.setAttrIdList(new ArrayList() {{
+ this.add(0L);
+ }});
+ ciEntityConditionVo.setRelIdList(new ArrayList() {{
+ this.add(0L);
+ }});
+ for (Long attrId : uniqueAttrIdList) {
+ List valueList = new ArrayList<>();
+ AttrEntityTransactionVo attrEntityTransaction = ciEntityTransactionVo.getAttrEntityTransactionByAttrId(attrId);
+ if (attrEntityTransaction != null) {
+ JSONArray valueArray = attrEntityTransaction.getValueList();
+ if (CollectionUtils.isNotEmpty(valueArray)) {
+ valueList = valueArray.toJavaList(String.class);
+ }
+ }
+ if (CollectionUtils.isEmpty(valueList)) {
+ positioningError.put("ciId", ciMappingVo.getCiId());
+ positioningError.put("ciName", ciMappingVo.getCiName());
+ positioningError.put("ciLabel", ciMappingVo.getCiLabel());
+ AttrVo attr = attrCrossoverMapper.getAttrById(attrId);
+ if (attr == null) {
+ throw new AttrNotFoundException(ciMappingVo.getCiName(), attrId.toString());
+ }
+ attr.setCiName(ciMappingVo.getCiName());
+ attr.setCiLabel(ciMappingVo.getCiLabel());
+ throw new CiUniqueAttrNotFoundException(attr);
+ }
+ AttrFilterVo filterVo = new AttrFilterVo();
+ filterVo.setAttrId(attrId);
+ filterVo.setExpression(SearchExpression.EQ.getExpression());
+ filterVo.setValueList(valueList);
+ ciEntityConditionVo.addAttrFilter(filterVo);
+ }
+ if (CollectionUtils.isNotEmpty(ciEntityConditionVo.getAttrFilterList())) {
+ List checkList = ciEntityCrossoverService.searchCiEntity(ciEntityConditionVo);
+ if (CollectionUtils.isNotEmpty(checkList)) {
+ CiEntityVo ciEntityVo = checkList.get(0);
+ ciEntityTransactionVo.setCiEntityUuid(ciEntityVo.getUuid());
+ ciEntityTransactionVo.setName(ciEntityVo.getName());
+ return ciEntityVo.getId();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 组装全局属性
+ * @param attrList
+ * @param globalAttrMappingList
+ * @param ciMappingVo
+ * @param positioningError
+ * @return
+ */
+ private JSONObject buildGlobalAttrEntityData(JSONArray attrList, List globalAttrMappingList, CiMappingVo ciMappingVo, JSONObject positioningError) {
+ IGlobalAttrCrossoverMapper globalAttrCrossoverMapper = CrossoverServiceFactory.getApi(IGlobalAttrCrossoverMapper.class);
+ JSONObject globalAttrEntityData = new JSONObject();
+ for (GlobalAttrMappingVo globalAttrMappingVo : globalAttrMappingList) {
+ JSONArray valueArray = new JSONArray();
+ AttrValueMappingVo valueMapping = globalAttrMappingVo.getValueMapping();
+ if (valueMapping != null) {
+ for (int i = 0; i < attrList.size(); i++) {
+ JSONObject attrObj = attrList.getJSONObject(i);
+ if (MapUtils.isNotEmpty(attrObj)) {
+ Long ciId = attrObj.getLong("ciId");
+ Long attrId = attrObj.getLong("attrId");
+ String label = attrObj.getString("label");
+ if (Objects.equals(valueMapping.getCiId(), ciId)
+ && (Objects.equals(valueMapping.getLabel(), label) || Objects.equals(valueMapping.getAttrId(), attrId))
+ ) {
+ Object value = attrObj.get("value");
+ if (value instanceof List) {
+ valueArray.addAll((List) value);
+ } else {
+ valueArray.add(value);
+ }
+ }
+ }
+ }
+ }
+ if (CollectionUtils.isEmpty(valueArray)) {
+ if (CollectionUtils.isNotEmpty(globalAttrMappingVo.getValueList())) {
+ valueArray.addAll(globalAttrMappingVo.getValueList());
+ }
+ }
+ if (CollectionUtils.isNotEmpty(valueArray)) {
+ String key = "global_" + globalAttrMappingVo.getId();
+ List valueArrayStrList = new ArrayList<>();
+ JSONArray valueList = new JSONArray();
+ for (int i = 0; i < valueArray.size(); i++) {
+ Object valueObj = valueArray.get(i);
+ if (valueObj instanceof JSONObject) {
+ // 映射模式为常量
+ valueList.add(JSONObject.parse(JSONObject.toJSONString(valueObj)));
+ } else {
+ valueArrayStrList.add(valueObj.toString());
+ List itemList = globalAttrCrossoverMapper.getAllGlobalAttrItemByAttrId(globalAttrMappingVo.getId());
+ for (GlobalAttrItemVo item : itemList) {
+ if (Objects.equals(item.getValue(), valueObj)
+ || Objects.equals(item.getId().toString(), valueObj.toString())) {
+ JSONObject jsonObj = new JSONObject();
+ jsonObj.put("id", item.getId());
+ jsonObj.put("value", item.getValue());
+ jsonObj.put("sort", item.getSort());
+ jsonObj.put("attrId", globalAttrMappingVo.getId());
+ valueList.add(jsonObj);
+ }
+ }
+ }
+ }
+ if (CollectionUtils.isEmpty(valueList)) {
+ positioningError.put("ciId", ciMappingVo.getCiId());
+ positioningError.put("ciName", ciMappingVo.getCiName());
+ positioningError.put("ciLabel", ciMappingVo.getCiLabel());
+ GlobalAttrVo globalAttrVo = new GlobalAttrVo();
+ globalAttrVo.setId(globalAttrMappingVo.getId());
+ globalAttrVo.setName(globalAttrMappingVo.getName());
+ globalAttrVo.setLabel(globalAttrMappingVo.getLabel());
+ throw new GlobalAttrValueIrregularException(globalAttrVo, String.join(",", valueArrayStrList));
+ }
+ JSONObject globalAttrEntity = new JSONObject();
+ globalAttrEntity.put("valueList", valueList);
+ globalAttrEntityData.put(key, globalAttrEntity);
+ }
+ }
+ return globalAttrEntityData;
+ }
+
+ private Long saveRowCiEntityList(
+ List ciEntityTransactionList,
+ List listeningNameList,
+ JSONArray insertList,
+ JSONArray updateList,
+ JSONArray listeningList
+ ) {
+ for (CiEntityTransactionVo ciEntityTransaction : ciEntityTransactionList) {
+ CiEntityTransactionVo ciEntityTransactionVo = new CiEntityTransactionVo();
+ ciEntityTransactionVo.setCiEntityUuid(ciEntityTransaction.getCiEntityUuid());
+ ciEntityTransactionVo.setName(ciEntityTransaction.getName());
+ ciEntityTransactionVo.setCiId(ciEntityTransaction.getCiId());
+ ciEntityTransactionVo.setAllowCommit(ciEntityTransaction.isAllowCommit());
+ ciEntityTransactionVo.setEditMode(ciEntityTransaction.getEditMode());
+ ciEntityTransactionVo.setDescription(ciEntityTransaction.getDescription());
+ ciEntityTransactionVo.setCiEntityId(ciEntityTransaction.getCiEntityId());
+ ciEntityTransactionVo.setAction(ciEntityTransaction.getAction());
+ ciEntityTransactionVo.setAttrEntityData(JSON.parseObject(JSON.toJSONString(ciEntityTransaction.getAttrEntityData())));
+ ciEntityTransactionVo.setRelEntityData(JSON.parseObject(JSON.toJSONString(ciEntityTransaction.getRelEntityData())));
+ ciEntityTransactionVo.setGlobalAttrEntityData(JSON.parseObject(JSON.toJSONString(ciEntityTransaction.getGlobalAttrEntityData())));
+ boolean flag = ciEntityService.validateCiEntityTransaction(ciEntityTransactionVo);
+ if (flag) {
+ if (Objects.equals(ciEntityTransaction.getAction(), TransactionActionType.INSERT.getValue())) {
+ JSONObject jsonObj = new JSONObject();
+ jsonObj.put("ciId", ciEntityTransaction.getCiId());
+ jsonObj.put("ciEntityId", ciEntityTransaction.getCiEntityId());
+ jsonObj.put("ciEntityUuid", ciEntityTransaction.getCiEntityUuid());
+ jsonObj.put("ciEntityName", ciEntityTransaction.getName());
+ insertList.add(jsonObj);
+ } else if (Objects.equals(ciEntityTransaction.getAction(), TransactionActionType.UPDATE.getValue())) {
+ JSONObject jsonObj = new JSONObject();
+ jsonObj.put("ciId", ciEntityTransaction.getCiId());
+ jsonObj.put("ciEntityId", ciEntityTransaction.getCiEntityId());
+ jsonObj.put("ciEntityUuid", ciEntityTransaction.getCiEntityUuid());
+ jsonObj.put("ciEntityName", ciEntityTransaction.getName());
+ updateList.add(jsonObj);
+ }
+ } else {
+ if (listeningNameList.contains(ciEntityTransaction.getName())) {
+ JSONObject jsonObj = new JSONObject();
+ jsonObj.put("ciId", ciEntityTransaction.getCiId());
+ jsonObj.put("ciEntityId", ciEntityTransaction.getCiEntityId());
+ jsonObj.put("ciEntityUuid", ciEntityTransaction.getCiEntityUuid());
+ jsonObj.put("ciEntityName", ciEntityTransaction.getName());
+ JSONObject newData = new JSONObject();
+ newData.put("attrEntityData", JSON.parseObject(JSON.toJSONString(ciEntityTransaction.getAttrEntityData())));
+ newData.put("relEntityData", JSON.parseObject(JSON.toJSONString(ciEntityTransaction.getRelEntityData())));
+ newData.put("globalAttrEntityData", JSON.parseObject(JSON.toJSONString(ciEntityTransaction.getGlobalAttrEntityData())));
+ jsonObj.put("newData", newData);
+ CiEntityVo pCiEntityVo = new CiEntityVo();
+ pCiEntityVo.setId(ciEntityTransaction.getCiEntityId());
+ pCiEntityVo.setCiId(ciEntityTransaction.getCiId());
+ pCiEntityVo.setLimitRelEntity(true);
+ pCiEntityVo.setLimitAttrEntity(true);
+ CiEntityVo ciEntityVo = ciEntityService.getCiEntityById(pCiEntityVo);
+ if (ciEntityVo != null) {
+ JSONObject oldData = new JSONObject();
+ oldData.put("attrEntityData", ciEntityVo.getAttrEntityData());
+ oldData.put("relEntityData", ciEntityVo.getRelEntityData());
+ oldData.put("globalAttrEntityData", ciEntityVo.getGlobalAttrEntityData());
+ jsonObj.put("oldData", oldData);
+ }
+ listeningList.add(jsonObj);
+ }
+ }
+ }
+ InputFromContext.init(InputFrom.RESTFUL);
+ TransactionGroupVo transactionGroupVo = new TransactionGroupVo();
+// transactionGroupVo.setNeedLock(false);
+ ciEntityTransactionList.sort((o1, o2) -> {
+ if (o1.getCiId() < o2.getCiId()) {
+ return -1;
+ } else if (o1.getCiId() > o2.getCiId()) {
+ return 1;
+ } else {
+ return o1.getCiEntityId().compareTo(o2.getCiEntityId());
+ }
+ });
+// System.out.println("ciEntityTransactionList = " + JSONObject.toJSONString(ciEntityTransactionList));
+ Long transactionGroupId = ciEntityService.saveCiEntity(ciEntityTransactionList, transactionGroupVo);
+ return transactionGroupId;
+ }
+
+ @Override
+ public String getToken() {
+ return "cmdb/data/sync";
+ }
+
+ private List checkSyncCiList(JSONArray syncCiList) {
+ List ciMappingList = new ArrayList<>();
+ for (int i = 0; i < syncCiList.size(); i++) {
+ JSONObject syncCiObj = syncCiList.getJSONObject(i);
+ if (MapUtils.isNotEmpty(syncCiObj)) {
+ CiMappingVo ciMappingVo = checkSyncCi(syncCiObj, "syncCiList[" + i + "].");
+ ciMappingList.add(ciMappingVo);
+ }
+ }
+ return ciMappingList;
+ }
+
+ private CiMappingVo checkSyncCi(JSONObject syncCiObj, String pathPrefix) {
+ String ciName = syncCiObj.getString("ciName");
+ if (StringUtils.isBlank(ciName)) {
+ throw new ParamNotExistsException(pathPrefix + "ciName");
+ }
+ CiVo ciVo = ciMapper.getCiByName(ciName);
+ if (ciVo == null) {
+ throw new CiNotFoundException(ciName);
+ }
+ CiMappingVo ciMappingVo = new CiMappingVo();
+ ciMappingVo.setCiId(ciVo.getId());
+ ciMappingVo.setCiName(ciVo.getName());
+ ciMappingVo.setCiLabel(ciVo.getLabel());
+ ciMappingVo.setUniqueAttrIdList(ciVo.getUniqueAttrIdList());
+ ciMappingVo.setNameAttrId(ciVo.getNameAttrId());
+ String description = syncCiObj.getString("description");
+ ciMappingVo.setDescription(description);
+ JSONArray attrArray = syncCiObj.getJSONArray("attrList");
+ if (CollectionUtils.isNotEmpty(attrArray)) {
+ List attrList = new ArrayList<>();
+ Map id2AttrMap = new HashMap<>();
+ Map> name2AttrListMap = new HashMap<>();
+ List attrVoList = attrMapper.getAttrByCiId(ciVo.getId());
+ for (AttrVo attrVo : attrVoList) {
+ id2AttrMap.put(attrVo.getId(), attrVo);
+ name2AttrListMap.computeIfAbsent(attrVo.getName(), key -> new ArrayList<>()).add(attrVo);
+ }
+ for (int j = 0; j < attrArray.size(); j++) {
+ JSONObject attrObj = attrArray.getJSONObject(j);
+ if (MapUtils.isNotEmpty(attrObj)) {
+ String path = "attrList[" + j + "].";
+ AttrVo attrVo = null;
+ Long id = attrObj.getLong("id");
+ String name = attrObj.getString("name");
+ if (id == null && StringUtils.isBlank(name)) {
+ throw new ParamNotExistsException(path + "id", path + "name");
+ } else if (id != null) {
+ attrVo = id2AttrMap.get(id);
+ if (attrVo == null) {
+ throw new AttrNotFoundException(ciVo.getName(), id.toString());
+ }
+ } else if (StringUtils.isNotBlank(name)) {
+ List list = name2AttrListMap.get(name);
+ if (CollectionUtils.isEmpty(list)) {
+ throw new AttrNotFoundException(ciVo.getName(), name);
+ }
+ if (list.size() > 1) {
+ throw new ApiRuntimeException(ciVo.getName() + "模型中存在两个名称为" + name + "的属性");
+ }
+ attrVo = list.get(0);
+ }
+ if (attrVo != null) {
+ AttrMappingVo attrMappingVo = new AttrMappingVo();
+ attrMappingVo.setId(attrVo.getId());
+ attrMappingVo.setName(attrVo.getName());
+ attrMappingVo.setLabel(attrVo.getLabel());
+ attrMappingVo.setType(attrVo.getType());
+ attrMappingVo.setConfig(attrVo.getConfig());
+ JSONArray valueList = attrObj.getJSONArray("valueList");
+ JSONObject valueMapping = attrObj.getJSONObject("valueMapping");
+ if (CollectionUtils.isEmpty(valueList) && MapUtils.isEmpty(valueMapping)) {
+ throw new ParamNotExistsException(path + "valueList", path + "valueMapping");
+ }
+ if (CollectionUtils.isNotEmpty(valueList)) {
+ attrMappingVo.setValueList(valueList);
+ }
+ if (MapUtils.isNotEmpty(valueMapping)) {
+ String label = valueMapping.getString("label");
+ if (StringUtils.isBlank(label)) {
+ throw new ParamNotExistsException(path + "valueMapping.label");
+ }
+ Long attrId = valueMapping.getLong("attrId");
+ Long ciId = valueMapping.getLong("ciId");
+ AttrValueMappingVo attrValueMappingVo = new AttrValueMappingVo();
+ attrValueMappingVo.setCiId(ciId);
+ attrValueMappingVo.setAttrId(attrId);
+ attrValueMappingVo.setLabel(label);
+ attrMappingVo.setValueMapping(attrValueMappingVo);
+ }
+ attrList.add(attrMappingVo);
+ }
+ }
+ }
+ ciMappingVo.setAttrList(attrList);
+ }
+ JSONArray globalAttrArray = syncCiObj.getJSONArray("globalAttrList");
+ if (CollectionUtils.isNotEmpty(globalAttrArray)) {
+ GlobalAttrVo search = new GlobalAttrVo();
+ search.setIsActive(1);
+ List globalAttrVoList = globalAttrMapper.searchGlobalAttr(search);
+ Map globalAttrVoMap = globalAttrVoList.stream().filter(Objects::nonNull).filter(e -> e.getName() != null).collect(Collectors.toMap(GlobalAttrVo::getName, e -> e));
+ List globalAttrMappingList = new ArrayList<>();
+ for (int i = 0; i < globalAttrArray.size(); i++) {
+ JSONObject globalAttrObj = globalAttrArray.getJSONObject(i);
+ if (MapUtils.isNotEmpty(globalAttrObj)) {
+ String path = pathPrefix + "globalAttrList[" + i + "].";
+ String name = globalAttrObj.getString("name");
+ if (StringUtils.isBlank(name)) {
+ throw new ParamNotExistsException(path + "name");
+ }
+ GlobalAttrVo globalAttrVo = globalAttrVoMap.get(name);
+ if (globalAttrVo == null) {
+ throw new GlobalAttrNotFoundException(name);
+ }
+ JSONArray valueList = globalAttrObj.getJSONArray("valueList");
+ JSONObject valueMapping = globalAttrObj.getJSONObject("valueMapping");
+ if (CollectionUtils.isEmpty(valueList) && MapUtils.isEmpty(valueMapping)) {
+ throw new ParamNotExistsException(path + "valueList", path + "valueMapping");
+ }
+ GlobalAttrMappingVo globalAttrMappingVo = new GlobalAttrMappingVo();
+ globalAttrMappingVo.setId(globalAttrVo.getId());
+ globalAttrMappingVo.setName(globalAttrVo.getName());
+ globalAttrMappingVo.setLabel(globalAttrVo.getLabel());
+ if (CollectionUtils.isNotEmpty(valueList)) {
+ JSONArray newValueList = new JSONArray();
+ List allGlobalAttrItemList = globalAttrMapper.getAllGlobalAttrItemByAttrId(globalAttrVo.getId());
+ if (CollectionUtils.isNotEmpty(allGlobalAttrItemList)) {
+ for (int j = 0; j < valueList.size(); j++) {
+ String value = valueList.getString(j);
+ if (StringUtils.isNotBlank(value)) {
+ for (GlobalAttrItemVo globalAttrItemVo : allGlobalAttrItemList) {
+ if (value.equalsIgnoreCase(globalAttrItemVo.getValue())) {
+ JSONObject newValueObj = new JSONObject();
+ newValueObj.put("attrId", globalAttrItemVo.getAttrId());
+ newValueObj.put("id", globalAttrItemVo.getId());
+ newValueObj.put("value", globalAttrItemVo.getValue());
+ newValueObj.put("sort", globalAttrItemVo.getSort());
+ newValueList.add(newValueObj);
+ break;
+ }
+ }
+ }
+ }
+ }
+ globalAttrMappingVo.setValueList(newValueList);
+ }
+ if (MapUtils.isNotEmpty(valueMapping)) {
+ String label = valueMapping.getString("label");
+ if (StringUtils.isBlank(label)) {
+ throw new ParamNotExistsException(path + "valueMapping.label");
+ }
+ Long attrId = valueMapping.getLong("attrId");
+ Long ciId = valueMapping.getLong("ciId");
+ AttrValueMappingVo attrValueMappingVo = new AttrValueMappingVo();
+ attrValueMappingVo.setCiId(ciId);
+ attrValueMappingVo.setAttrId(attrId);
+ attrValueMappingVo.setLabel(label);
+ globalAttrMappingVo.setValueMapping(attrValueMappingVo);
+ }
+ globalAttrMappingList.add(globalAttrMappingVo);
+ }
+ }
+ ciMappingVo.setGlobalAttrList(globalAttrMappingList);
+ }
+ JSONArray relArray = syncCiObj.getJSONArray("relList");
+ if (CollectionUtils.isNotEmpty(relArray)) {
+ List relMappingList = new ArrayList<>();
+ Map id2RelMap = new HashMap<>();
+ Map name2RelMap = new HashMap<>();
+ List relList = RelUtil.ClearRepeatRel(relMapper.getRelByCiId(ciVo.getId()));
+ for (RelVo relVo : relList) {
+ id2RelMap.put(relVo.getId(), relVo);
+ name2RelMap.put(relVo.getFromName() + "#" + relVo.getToName(), relVo);
+ }
+ for (int j = 0; j < relArray.size(); j++) {
+ JSONObject relObj = relArray.getJSONObject(j);
+ if (MapUtils.isNotEmpty(relObj)) {
+ String path = pathPrefix + "relList[" + j + "].";
+ RelVo relVo = null;
+ Long id = relObj.getLong("id");
+ String fromName = relObj.getString("fromName");
+ String toName = relObj.getString("toName");
+ if (id == null && (StringUtils.isBlank(fromName) || StringUtils.isBlank(toName)) ) {
+ if (StringUtils.isBlank(fromName)) {
+ throw new ParamNotExistsException(path + "id", path + "fromName");
+ } else {
+ throw new ParamNotExistsException(path + "id", path + "toName");
+ }
+ } else if (id != null) {
+ relVo = id2RelMap.get(id);
+ if (relVo == null) {
+ throw new RelNotFoundException(id);
+ }
+ } else {
+ relVo = name2RelMap.get(fromName + "#" + toName);
+ if (relVo == null) {
+ throw new ApiRuntimeException(ciVo.getName() + "模型中不存在fromName为" + fromName + ",toName为" + toName + "的关系");
+ }
+ }
+ RelMappingVo relMappingVo = new RelMappingVo();
+ relMappingVo.setId(relVo.getId());
+ relMappingVo.setFromName(relVo.getFromName());
+ relMappingVo.setFromLabel(relVo.getFromLabel());
+ relMappingVo.setToName(relVo.getToName());
+ relMappingVo.setToLabel(relVo.getToLabel());
+ relMappingVo.setDirection(relVo.getDirection());
+ relMappingVo.setFromRule(relVo.getFromRule());
+ relMappingVo.setToRule(relVo.getToRule());
+ JSONObject valueMapping = relObj.getJSONObject("valueMapping");
+ if (valueMapping == null) {
+ throw new ParamNotExistsException("valueMapping");
+ }
+ CiMappingVo relCiMappingVo = checkSyncCi(valueMapping, path + "valueMapping.");
+ relMappingVo.setValueMapping(relCiMappingVo);
+ relMappingList.add(relMappingVo);
+ }
+ }
+ ciMappingVo.setRelList(relMappingList);
+ }
+ return ciMappingVo;
+ }
+
+ private static class CiMappingVo {
+ private Long ciId;
+ private String ciName;
+ private String ciLabel;
+ private List attrList;
+ private List relList;
+ private List globalAttrList;
+ private String description;
+ private List uniqueAttrIdList;
+ private Long nameAttrId;
+
+ public Long getCiId() {
+ return ciId;
+ }
+
+ public void setCiId(Long ciId) {
+ this.ciId = ciId;
+ }
+
+ public String getCiName() {
+ return ciName;
+ }
+
+ public void setCiName(String ciName) {
+ this.ciName = ciName;
+ }
+
+ public String getCiLabel() {
+ return ciLabel;
+ }
+
+ public void setCiLabel(String ciLabel) {
+ this.ciLabel = ciLabel;
+ }
+
+ public List getAttrList() {
+ return attrList;
+ }
+
+ public void setAttrList(List attrList) {
+ this.attrList = attrList;
+ }
+
+ public List getRelList() {
+ return relList;
+ }
+
+ public void setRelList(List relList) {
+ this.relList = relList;
+ }
+
+ public List getGlobalAttrList() {
+ return globalAttrList;
+ }
+
+ public void setGlobalAttrList(List globalAttrList) {
+ this.globalAttrList = globalAttrList;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public List getUniqueAttrIdList() {
+ return uniqueAttrIdList;
+ }
+
+ public void setUniqueAttrIdList(List uniqueAttrIdList) {
+ this.uniqueAttrIdList = uniqueAttrIdList;
+ }
+
+ public Long getNameAttrId() {
+ return nameAttrId;
+ }
+
+ public void setNameAttrId(Long nameAttrId) {
+ this.nameAttrId = nameAttrId;
+ }
+ }
+
+ private static class AttrMappingVo {
+ private Long id;
+ private String name;
+ private String label;
+ private JSONArray valueList;
+ private AttrValueMappingVo valueMapping;
+
+ private String type;
+ private JSONObject config;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public void setLabel(String label) {
+ this.label = label;
+ }
+
+ public JSONArray getValueList() {
+ return valueList;
+ }
+
+ public void setValueList(JSONArray valueList) {
+ this.valueList = valueList;
+ }
+
+ public AttrValueMappingVo getValueMapping() {
+ return valueMapping;
+ }
+
+ public void setValueMapping(AttrValueMappingVo valueMapping) {
+ this.valueMapping = valueMapping;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public JSONObject getConfig() {
+ return config;
+ }
+
+ public void setConfig(JSONObject config) {
+ this.config = config;
+ }
+ }
+
+ private static class RelMappingVo {
+ private Long id;
+ private String fromName;
+ private String fromLabel;
+ private String fromRule;
+ private String toName;
+ private String toLabel;
+ private String toRule;
+ private CiMappingVo valueMapping;
+
+ private String direction;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getFromName() {
+ return fromName;
+ }
+
+ public void setFromName(String fromName) {
+ this.fromName = fromName;
+ }
+
+ public String getFromLabel() {
+ return fromLabel;
+ }
+
+ public void setFromLabel(String fromLabel) {
+ this.fromLabel = fromLabel;
+ }
+
+ public String getToName() {
+ return toName;
+ }
+
+ public void setToName(String toName) {
+ this.toName = toName;
+ }
+
+ public String getToLabel() {
+ return toLabel;
+ }
+
+ public void setToLabel(String toLabel) {
+ this.toLabel = toLabel;
+ }
+
+ public CiMappingVo getValueMapping() {
+ return valueMapping;
+ }
+
+ public void setValueMapping(CiMappingVo valueMapping) {
+ this.valueMapping = valueMapping;
+ }
+
+ public String getDirection() {
+ return direction;
+ }
+
+ public void setDirection(String direction) {
+ this.direction = direction;
+ }
+
+ public String getFromRule() {
+ return fromRule;
+ }
+
+ public void setFromRule(String fromRule) {
+ this.fromRule = fromRule;
+ }
+
+ public String getToRule() {
+ return toRule;
+ }
+
+ public void setToRule(String toRule) {
+ this.toRule = toRule;
+ }
+ }
+
+ private static class GlobalAttrMappingVo {
+ private Long id;
+ private String name;
+ private String label;
+ private JSONArray valueList;
+ private AttrValueMappingVo valueMapping;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public void setLabel(String label) {
+ this.label = label;
+ }
+
+ public JSONArray getValueList() {
+ return valueList;
+ }
+
+ public void setValueList(JSONArray valueList) {
+ this.valueList = valueList;
+ }
+
+ public AttrValueMappingVo getValueMapping() {
+ return valueMapping;
+ }
+
+ public void setValueMapping(AttrValueMappingVo valueMapping) {
+ this.valueMapping = valueMapping;
+ }
+ }
+
+ private static class AttrValueMappingVo {
+ private Long ciId;
+ private Long attrId;
+ private String label;
+
+ public Long getCiId() {
+ return ciId;
+ }
+
+ public void setCiId(Long ciId) {
+ this.ciId = ciId;
+ }
+
+ public Long getAttrId() {
+ return attrId;
+ }
+
+ public void setAttrId(Long attrId) {
+ this.attrId = attrId;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public void setLabel(String label) {
+ this.label = label;
+ }
+ }
+}