diff --git a/src/main/java/neatlogic/module/cmdb/api/transaction/GetCiEntityTransactionApi.java b/src/main/java/neatlogic/module/cmdb/api/transaction/GetCiEntityTransactionApi.java index ab439351ad30be94e29d9c027caf0998ac1a32b7..fd5ef7cfaef9953d6304f2140b89d607c62eed22 100644 --- a/src/main/java/neatlogic/module/cmdb/api/transaction/GetCiEntityTransactionApi.java +++ b/src/main/java/neatlogic/module/cmdb/api/transaction/GetCiEntityTransactionApi.java @@ -15,35 +15,23 @@ along with this program. If not, see .*/ package neatlogic.module.cmdb.api.transaction; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import neatlogic.framework.auth.core.AuthAction; -import neatlogic.framework.cmdb.attrvaluehandler.core.AttrValueHandlerFactory; import neatlogic.framework.cmdb.auth.label.CMDB_BASE; -import neatlogic.framework.cmdb.dto.ci.AttrVo; -import neatlogic.framework.cmdb.dto.cientity.CiEntityVo; -import neatlogic.framework.cmdb.dto.cientity.GlobalAttrEntityVo; -import neatlogic.framework.cmdb.dto.globalattr.GlobalAttrVo; import neatlogic.framework.cmdb.dto.transaction.CiEntityTransactionVo; import neatlogic.framework.cmdb.dto.transaction.RelEntityTransactionVo; +import neatlogic.framework.cmdb.dto.transaction.TransactionDetailVo; import neatlogic.framework.cmdb.dto.transaction.TransactionVo; import neatlogic.framework.cmdb.enums.RelDirectionType; -import neatlogic.framework.cmdb.enums.TransactionActionType; import neatlogic.framework.common.constvalue.ApiParamType; import neatlogic.framework.restful.annotation.*; import neatlogic.framework.restful.constvalue.OperationTypeEnum; import neatlogic.framework.restful.core.privateapi.PrivateApiComponentBase; -import neatlogic.module.cmdb.dao.mapper.ci.AttrMapper; -import neatlogic.module.cmdb.dao.mapper.cientity.CiEntityMapper; -import neatlogic.module.cmdb.dao.mapper.globalattr.GlobalAttrMapper; import neatlogic.module.cmdb.dao.mapper.transaction.TransactionMapper; -import org.apache.commons.collections4.MapUtils; -import org.apache.commons.lang3.StringUtils; +import neatlogic.module.cmdb.service.transaction.TransactionService; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.List; -import java.util.Optional; @Service @AuthAction(action = CMDB_BASE.class) @@ -54,13 +42,7 @@ public class GetCiEntityTransactionApi extends PrivateApiComponentBase { private TransactionMapper transactionMapper; @Resource - private AttrMapper attrMapper; - - @Resource - private CiEntityMapper ciEntityMapper; - - @Resource - private GlobalAttrMapper globalAttrMapper; + private TransactionService transactionService; @Override @@ -82,8 +64,7 @@ public class GetCiEntityTransactionApi extends PrivateApiComponentBase { @Param(name = "ciId", isRequired = true, type = ApiParamType.LONG, desc = "模型id"), @Param(name = "ciEntityId", isRequired = true, type = ApiParamType.LONG, desc = "配置项id"), @Param(name = "transactionId", isRequired = true, type = ApiParamType.LONG, desc = "事务id")}) - @Output({@Param(name = "transaction", explode = TransactionVo.class, desc = "事务信息"), - @Param(name = "detail", type = ApiParamType.JSONARRAY, desc = "详细修改信息")}) + @Output({@Param(explode = TransactionDetailVo.class, desc = "事务信息及详细修改信息")}) @Description(desc = "获取配置项事务详细信息接口") @Override public Object myDoService(JSONObject jsonObj) throws Exception { @@ -93,202 +74,7 @@ public class GetCiEntityTransactionApi extends PrivateApiComponentBase { TransactionVo transactionVo = transactionMapper.getTransactionById(transactionId); CiEntityTransactionVo ciEntityTransactionVo = transactionMapper.getCiEntityTransactionByTransactionIdAndCiEntityId(transactionId, ciEntityId); - JSONArray dataList = new JSONArray(); - JSONObject oldCiEntityObj = null; - if (StringUtils.isNotBlank(ciEntityTransactionVo.getSnapshot())) { - oldCiEntityObj = JSONObject.parseObject(ciEntityTransactionVo.getSnapshot()); - } - if (!ciEntityTransactionVo.getAction().equals(TransactionActionType.DELETE.getValue())) { - if (MapUtils.isNotEmpty(ciEntityTransactionVo.getAttrEntityData())) { - List attrList = attrMapper.getAttrByCiId(ciId); - - JSONObject oldAttrEntityData = null; - if (MapUtils.isNotEmpty(oldCiEntityObj)) { - oldAttrEntityData = oldCiEntityObj.getJSONObject("attrEntityData"); - } - - for (String key : ciEntityTransactionVo.getAttrEntityData().keySet()) { - JSONObject dataObj = new JSONObject(); - JSONObject attrObj = ciEntityTransactionVo.getAttrEntityData().getJSONObject(key); - Long attrId = Long.parseLong(key.replace("attr_", "")); - - Optional filterAttr = attrList.stream().filter(attr -> attr.getId().equals(attrId)).findFirst(); - if (filterAttr.isPresent()) { - AttrVo attrVo = filterAttr.get(); - dataObj.put("newValue", buildAttrObj(attrVo, attrObj.getJSONArray("valueList"))); - if (MapUtils.isNotEmpty(oldAttrEntityData) && oldAttrEntityData.containsKey(key)) { - dataObj.put("oldValue", buildAttrObj(attrVo, oldAttrEntityData.getJSONObject(key).getJSONArray("valueList"))); - } - //如果整个newValueList都不存在表示原来使用的属性已经删除,这时候就不需要再显示新旧值了 - } else { - //如果属性已删除,尝试使用snapshot数据还原原来的值 - if (MapUtils.isNotEmpty(oldAttrEntityData) && oldAttrEntityData.containsKey(key)) { - AttrVo attrVo = JSONObject.toJavaObject(oldAttrEntityData.getJSONObject(key), AttrVo.class); - dataObj.put("oldValue", buildAttrObj(attrVo, oldAttrEntityData.getJSONObject(key).getJSONArray("valueList"))); - } - dataObj.put("action", "delattr"); - } - dataObj.put("id", attrId); - dataObj.put("name", attrObj.getString("name")); - dataObj.put("label", attrObj.getString("label")); - dataObj.put("type", "attr"); - dataList.add(dataObj); - } - } - //处理全局属性 - if (MapUtils.isNotEmpty(ciEntityTransactionVo.getGlobalAttrEntityData())) { - List globalAttrList = globalAttrMapper.searchGlobalAttr(new GlobalAttrVo()); - JSONObject oldGlobalAttrEntityData = null; - if (MapUtils.isNotEmpty(oldCiEntityObj)) { - oldGlobalAttrEntityData = oldCiEntityObj.getJSONObject("globalAttrEntityData"); - } - - for (String key : ciEntityTransactionVo.getGlobalAttrEntityData().keySet()) { - JSONObject dataObj = new JSONObject(); - JSONObject attrObj = ciEntityTransactionVo.getGlobalAttrEntityData().getJSONObject(key); - Long attrId = Long.parseLong(key.replace("global_", "")); - - Optional filterAttr = globalAttrList.stream().filter(attr -> attr.getId().equals(attrId)).findFirst(); - if (filterAttr.isPresent()) { - GlobalAttrVo attr = filterAttr.get(); - dataObj.put("name", attr.getName()); - dataObj.put("label", attr.getLabel()); - dataObj.put("newValue", attrObj.getJSONArray("valueList")); - if (MapUtils.isNotEmpty(oldGlobalAttrEntityData) && oldGlobalAttrEntityData.containsKey(key)) { - dataObj.put("oldValue", oldGlobalAttrEntityData.getJSONObject(key).getJSONArray("valueList")); - } - } else { - if (MapUtils.isNotEmpty(oldGlobalAttrEntityData) && oldGlobalAttrEntityData.containsKey(key)) { - JSONObject globalAttrObj = oldGlobalAttrEntityData.getJSONObject(key); - dataObj.put("name", globalAttrObj.getString("name")); - dataObj.put("label", globalAttrObj.getString("label")); - dataObj.put("oldValue", globalAttrObj.getJSONArray("valueList")); - } - dataObj.put("action", "delglobalattr"); - } - dataObj.put("id", attrId); - dataObj.put("type", "globalattr"); - dataList.add(dataObj); - } - } - - if (MapUtils.isNotEmpty(ciEntityTransactionVo.getRelEntityData())) { - JSONObject oldRelEntityData = null; - if (MapUtils.isNotEmpty(oldCiEntityObj)) { - oldRelEntityData = oldCiEntityObj.getJSONObject("relEntityData"); - } - for (String key : ciEntityTransactionVo.getRelEntityData().keySet()) { - JSONObject dataObj = new JSONObject(); - JSONObject relObj = ciEntityTransactionVo.getRelEntityData().getJSONObject(key); - Long relId = Long.parseLong(key.split("_")[1]); - dataObj.put("id", relId); - dataObj.put("name", relObj.getString("name")); - dataObj.put("label", relObj.getString("label")); - dataObj.put("direction", relObj.getString("direction")); - dataObj.put("type", "rel"); - JSONArray newValueList = new JSONArray(); - //因为关系的修改只有insert和delete两种,显示对比时需要去掉删除的目标 - for (int i = 0; i < relObj.getJSONArray("valueList").size(); i++) { - JSONObject valueObj = relObj.getJSONArray("valueList").getJSONObject(i); - if (!valueObj.containsKey("action") || !valueObj.getString("action").equals("delete")) { - //补充ciEntityName - CiEntityVo ciEntityVo = ciEntityMapper.getCiEntityBaseInfoById(valueObj.getLong("ciEntityId")); - if (ciEntityVo != null) { - valueObj.put("ciEntityName", ciEntityVo.getName()); - } - valueObj.put("action", "insert"); - } - newValueList.add(valueObj); - } - - if (MapUtils.isNotEmpty(oldRelEntityData) && oldRelEntityData.containsKey(key)) { - //补充ciEntityName - JSONArray oldValueList = oldRelEntityData.getJSONObject(key).getJSONArray("valueList"); - for (int i = 0; i < oldValueList.size(); i++) { - JSONObject valueObj = oldValueList.getJSONObject(i); - /*CiEntityVo ciEntityVo = ciEntityMapper.getCiEntityBaseInfoById(valueObj.getLong("ciEntityId")); - if (ciEntityVo != null) { - valueObj.put("ciEntityName", ciEntityVo.getName()); - }*/ - //补充原来的值 - boolean isExists = false; - for (int j = 0; j < newValueList.size(); j++) { - JSONObject newV = newValueList.getJSONObject(j); - if (newV.getLong("ciEntityId").equals(valueObj.getLong("ciEntityId"))) { - isExists = true; - break; - } - } - if (!isExists) { - newValueList.add(valueObj); - } - } - dataObj.put("oldValue", oldValueList); - } - //清除删除信息 - for (int j = newValueList.size() - 1; j >= 0; j--) { - JSONObject newV = newValueList.getJSONObject(j); - if (newV.containsKey("action") && newV.getString("action").equals("delete")) { - newValueList.remove(j); - } - } - dataObj.put("newValue", newValueList); - dataList.add(dataObj); - } - } - } else { - if (MapUtils.isNotEmpty(oldCiEntityObj)) { - JSONObject attrData = oldCiEntityObj.getJSONObject("attrEntityData"); - if (MapUtils.isNotEmpty(attrData)) { - for (String key : attrData.keySet()) { - JSONObject dataObj = new JSONObject(); - //如果属性已删除,尝试使用snapshot数据还原原来的值 - //JSONObject oldAttrEntityData = attrData.getJSONObject(key); - AttrVo attrVo = JSONObject.toJavaObject(attrData.getJSONObject(key), AttrVo.class); - dataObj.put("oldValue", buildAttrObj(attrVo, attrData.getJSONObject(key).getJSONArray("valueList"))); - dataObj.put("action", "delattr"); - dataObj.put("id", attrVo.getId()); - dataObj.put("name", attrVo.getName()); - dataObj.put("label", attrVo.getLabel()); - dataObj.put("type", "attr"); - dataList.add(dataObj); - } - } - JSONObject globalAttrData = oldCiEntityObj.getJSONObject("globalAttrEntityData"); - if (MapUtils.isNotEmpty(globalAttrData)) { - for (String key : globalAttrData.keySet()) { - JSONObject dataObj = new JSONObject(); - GlobalAttrEntityVo attrVo = JSONObject.toJavaObject(globalAttrData.getJSONObject(key), GlobalAttrEntityVo.class); - dataObj.put("oldValue", attrVo.getValueObjList()); - dataObj.put("action", "delglobalattr"); - dataObj.put("id", attrVo.getAttrId()); - dataObj.put("name", attrVo.getAttrName()); - dataObj.put("label", attrVo.getAttrLabel()); - dataObj.put("type", "globalattr"); - dataList.add(dataObj); - } - } - JSONObject relData = oldCiEntityObj.getJSONObject("relEntityData"); - if (MapUtils.isNotEmpty(relData)) { - for (String key : relData.keySet()) { - JSONObject dataObj = new JSONObject(); - JSONObject oldRelEntityData = relData.getJSONObject(key); - dataObj.put("oldValue", oldRelEntityData.getJSONArray("valueList")); - dataObj.put("id", oldRelEntityData.getLong("relId")); - dataObj.put("name", oldRelEntityData.getString("name")); - dataObj.put("label", oldRelEntityData.getString("label")); - dataObj.put("direction", oldRelEntityData.getString("direction")); - dataObj.put("type", "rel"); - dataList.add(dataObj); - } - } - } - - } - JSONObject returnObj = new JSONObject(); - returnObj.put("transaction", transactionVo); - returnObj.put("detail", dataList); - return returnObj; + return transactionService.getTransactionDetail(transactionVo, ciEntityTransactionVo, ciId); } @Override @@ -296,20 +82,6 @@ public class GetCiEntityTransactionApi extends PrivateApiComponentBase { return true; } - - private JSONObject buildAttrObj(AttrVo attrVo, JSONArray valueList) { - JSONObject attrObj = new JSONObject(); - attrObj.put("type", attrVo.getType()); - attrObj.put("name", attrVo.getName()); - attrObj.put("label", attrVo.getLabel()); - attrObj.put("config", attrVo.getConfig(true));//克隆一个config对象,避免json序列化出错 - attrObj.put("targetCiId", attrVo.getTargetCiId()); - attrObj.put("valueList", valueList); - attrObj.put("attrId", attrVo.getId()); - attrObj.put("actualValueList", AttrValueHandlerFactory.getHandler(attrVo.getType()).getActualValueList(attrVo, valueList)); - return attrObj; - } - private static String getRelGroupKey(RelEntityTransactionVo relEntityTransactionVo) { //如果值为空则使用空格作占位符 if (relEntityTransactionVo.getDirection().equals(RelDirectionType.FROM.getValue())) { diff --git a/src/main/java/neatlogic/module/cmdb/service/transaction/TransactionService.java b/src/main/java/neatlogic/module/cmdb/service/transaction/TransactionService.java index 18b5079876629f2996b7a65873c175f34485e3dc..92d60194cae7fdd9aa01af221c0edb6a269d143c 100644 --- a/src/main/java/neatlogic/module/cmdb/service/transaction/TransactionService.java +++ b/src/main/java/neatlogic/module/cmdb/service/transaction/TransactionService.java @@ -15,10 +15,21 @@ along with this program. If not, see .*/ package neatlogic.module.cmdb.service.transaction; +import neatlogic.framework.cmdb.dto.transaction.CiEntityTransactionVo; +import neatlogic.framework.cmdb.dto.transaction.TransactionDetailVo; import neatlogic.framework.cmdb.dto.transaction.TransactionVo; import java.util.List; public interface TransactionService { List searchTransaction(TransactionVo transactionVo); + + /** + * 获取配置项事务详细信息 + * @param transactionVo + * @param ciEntityTransactionVo + * @param ciId + * @return + */ + TransactionDetailVo getTransactionDetail(TransactionVo transactionVo, CiEntityTransactionVo ciEntityTransactionVo, Long ciId); } diff --git a/src/main/java/neatlogic/module/cmdb/service/transaction/TransactionServiceImpl.java b/src/main/java/neatlogic/module/cmdb/service/transaction/TransactionServiceImpl.java index e5c4b292a6aef4c909d536ecd5f3f866fe253ff4..3ed944e50a5751691e23dd1262c78db76df6e22a 100644 --- a/src/main/java/neatlogic/module/cmdb/service/transaction/TransactionServiceImpl.java +++ b/src/main/java/neatlogic/module/cmdb/service/transaction/TransactionServiceImpl.java @@ -15,20 +15,46 @@ along with this program. If not, see .*/ package neatlogic.module.cmdb.service.transaction; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import neatlogic.framework.cmdb.attrvaluehandler.core.AttrValueHandlerFactory; +import neatlogic.framework.cmdb.crossover.ITransactionCrossoverService; +import neatlogic.framework.cmdb.dto.ci.AttrVo; +import neatlogic.framework.cmdb.dto.cientity.CiEntityVo; +import neatlogic.framework.cmdb.dto.cientity.GlobalAttrEntityVo; +import neatlogic.framework.cmdb.dto.globalattr.GlobalAttrVo; +import neatlogic.framework.cmdb.dto.transaction.CiEntityTransactionVo; +import neatlogic.framework.cmdb.dto.transaction.TransactionDetailVo; import neatlogic.framework.cmdb.dto.transaction.TransactionVo; +import neatlogic.framework.cmdb.enums.TransactionActionType; +import neatlogic.module.cmdb.dao.mapper.ci.AttrMapper; +import neatlogic.module.cmdb.dao.mapper.cientity.CiEntityMapper; +import neatlogic.module.cmdb.dao.mapper.globalattr.GlobalAttrMapper; import neatlogic.module.cmdb.dao.mapper.transaction.TransactionMapper; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; +import java.util.Optional; @Service -public class TransactionServiceImpl implements TransactionService { +public class TransactionServiceImpl implements TransactionService, ITransactionCrossoverService { @Resource private TransactionMapper transactionMapper; + @Resource + private AttrMapper attrMapper; + + @Resource + private CiEntityMapper ciEntityMapper; + + @Resource + private GlobalAttrMapper globalAttrMapper; + public List searchTransaction(TransactionVo transactionVo) { int rowNum = transactionMapper.searchTransactionCount(transactionVo); if (rowNum > 0) { @@ -40,4 +66,213 @@ public class TransactionServiceImpl implements TransactionService { } return new ArrayList<>(); } + + public TransactionDetailVo getTransactionDetail(TransactionVo transactionVo, CiEntityTransactionVo ciEntityTransactionVo, Long ciId) { + JSONArray dataList = new JSONArray(); + JSONObject oldCiEntityObj = null; + if (StringUtils.isNotBlank(ciEntityTransactionVo.getSnapshot())) { + oldCiEntityObj = JSONObject.parseObject(ciEntityTransactionVo.getSnapshot()); + } + if (!ciEntityTransactionVo.getAction().equals(TransactionActionType.DELETE.getValue())) { + if (MapUtils.isNotEmpty(ciEntityTransactionVo.getAttrEntityData())) { + List attrList = attrMapper.getAttrByCiId(ciId); + + JSONObject oldAttrEntityData = null; + if (MapUtils.isNotEmpty(oldCiEntityObj)) { + oldAttrEntityData = oldCiEntityObj.getJSONObject("attrEntityData"); + } + + for (String key : ciEntityTransactionVo.getAttrEntityData().keySet()) { + JSONObject dataObj = new JSONObject(); + JSONObject attrObj = ciEntityTransactionVo.getAttrEntityData().getJSONObject(key); + Long attrId = Long.parseLong(key.replace("attr_", "")); + + Optional filterAttr = attrList.stream().filter(attr -> attr.getId().equals(attrId)).findFirst(); + if (filterAttr.isPresent()) { + AttrVo attrVo = filterAttr.get(); + dataObj.put("newValue", buildAttrObj(attrVo, attrObj.getJSONArray("valueList"))); + if (MapUtils.isNotEmpty(oldAttrEntityData) && oldAttrEntityData.containsKey(key)) { + dataObj.put("oldValue", buildAttrObj(attrVo, oldAttrEntityData.getJSONObject(key).getJSONArray("valueList"))); + } + //如果整个newValueList都不存在表示原来使用的属性已经删除,这时候就不需要再显示新旧值了 + } else { + //如果属性已删除,尝试使用snapshot数据还原原来的值 + if (MapUtils.isNotEmpty(oldAttrEntityData) && oldAttrEntityData.containsKey(key)) { + AttrVo attrVo = JSONObject.toJavaObject(oldAttrEntityData.getJSONObject(key), AttrVo.class); + dataObj.put("oldValue", buildAttrObj(attrVo, oldAttrEntityData.getJSONObject(key).getJSONArray("valueList"))); + } + dataObj.put("action", "delattr"); + } + dataObj.put("id", attrId); + dataObj.put("name", attrObj.getString("name")); + dataObj.put("label", attrObj.getString("label")); + dataObj.put("type", "attr"); + dataList.add(dataObj); + } + } + //处理全局属性 + if (MapUtils.isNotEmpty(ciEntityTransactionVo.getGlobalAttrEntityData())) { + List globalAttrList = globalAttrMapper.searchGlobalAttr(new GlobalAttrVo()); + JSONObject oldGlobalAttrEntityData = null; + if (MapUtils.isNotEmpty(oldCiEntityObj)) { + oldGlobalAttrEntityData = oldCiEntityObj.getJSONObject("globalAttrEntityData"); + } + + for (String key : ciEntityTransactionVo.getGlobalAttrEntityData().keySet()) { + JSONObject dataObj = new JSONObject(); + JSONObject attrObj = ciEntityTransactionVo.getGlobalAttrEntityData().getJSONObject(key); + Long attrId = Long.parseLong(key.replace("global_", "")); + + Optional filterAttr = globalAttrList.stream().filter(attr -> attr.getId().equals(attrId)).findFirst(); + if (filterAttr.isPresent()) { + GlobalAttrVo attr = filterAttr.get(); + dataObj.put("name", attr.getName()); + dataObj.put("label", attr.getLabel()); + dataObj.put("newValue", attrObj.getJSONArray("valueList")); + if (MapUtils.isNotEmpty(oldGlobalAttrEntityData) && oldGlobalAttrEntityData.containsKey(key)) { + dataObj.put("oldValue", oldGlobalAttrEntityData.getJSONObject(key).getJSONArray("valueList")); + } + } else { + if (MapUtils.isNotEmpty(oldGlobalAttrEntityData) && oldGlobalAttrEntityData.containsKey(key)) { + JSONObject globalAttrObj = oldGlobalAttrEntityData.getJSONObject(key); + dataObj.put("name", globalAttrObj.getString("name")); + dataObj.put("label", globalAttrObj.getString("label")); + dataObj.put("oldValue", globalAttrObj.getJSONArray("valueList")); + } + dataObj.put("action", "delglobalattr"); + } + dataObj.put("id", attrId); + dataObj.put("type", "globalattr"); + dataList.add(dataObj); + } + } + + if (MapUtils.isNotEmpty(ciEntityTransactionVo.getRelEntityData())) { + JSONObject oldRelEntityData = null; + if (MapUtils.isNotEmpty(oldCiEntityObj)) { + oldRelEntityData = oldCiEntityObj.getJSONObject("relEntityData"); + } + for (String key : ciEntityTransactionVo.getRelEntityData().keySet()) { + JSONObject dataObj = new JSONObject(); + JSONObject relObj = ciEntityTransactionVo.getRelEntityData().getJSONObject(key); + Long relId = Long.parseLong(key.split("_")[1]); + dataObj.put("id", relId); + dataObj.put("name", relObj.getString("name")); + dataObj.put("label", relObj.getString("label")); + dataObj.put("direction", relObj.getString("direction")); + dataObj.put("type", "rel"); + JSONArray newValueList = new JSONArray(); + //因为关系的修改只有insert和delete两种,显示对比时需要去掉删除的目标 + for (int i = 0; i < relObj.getJSONArray("valueList").size(); i++) { + JSONObject valueObj = relObj.getJSONArray("valueList").getJSONObject(i); + if (!valueObj.containsKey("action") || !valueObj.getString("action").equals("delete")) { + //补充ciEntityName + CiEntityVo ciEntityVo = ciEntityMapper.getCiEntityBaseInfoById(valueObj.getLong("ciEntityId")); + if (ciEntityVo != null) { + valueObj.put("ciEntityName", ciEntityVo.getName()); + } + valueObj.put("action", "insert"); + } + newValueList.add(valueObj); + } + + if (MapUtils.isNotEmpty(oldRelEntityData) && oldRelEntityData.containsKey(key)) { + //补充ciEntityName + JSONArray oldValueList = oldRelEntityData.getJSONObject(key).getJSONArray("valueList"); + for (int i = 0; i < oldValueList.size(); i++) { + JSONObject valueObj = oldValueList.getJSONObject(i); + /*CiEntityVo ciEntityVo = ciEntityMapper.getCiEntityBaseInfoById(valueObj.getLong("ciEntityId")); + if (ciEntityVo != null) { + valueObj.put("ciEntityName", ciEntityVo.getName()); + }*/ + //补充原来的值 + boolean isExists = false; + for (int j = 0; j < newValueList.size(); j++) { + JSONObject newV = newValueList.getJSONObject(j); + if (newV.getLong("ciEntityId").equals(valueObj.getLong("ciEntityId"))) { + isExists = true; + break; + } + } + if (!isExists) { + newValueList.add(valueObj); + } + } + dataObj.put("oldValue", oldValueList); + } + //清除删除信息 + for (int j = newValueList.size() - 1; j >= 0; j--) { + JSONObject newV = newValueList.getJSONObject(j); + if (newV.containsKey("action") && newV.getString("action").equals("delete")) { + newValueList.remove(j); + } + } + dataObj.put("newValue", newValueList); + dataList.add(dataObj); + } + } + } else { + if (MapUtils.isNotEmpty(oldCiEntityObj)) { + JSONObject attrData = oldCiEntityObj.getJSONObject("attrEntityData"); + if (MapUtils.isNotEmpty(attrData)) { + for (String key : attrData.keySet()) { + JSONObject dataObj = new JSONObject(); + //如果属性已删除,尝试使用snapshot数据还原原来的值 + //JSONObject oldAttrEntityData = attrData.getJSONObject(key); + AttrVo attrVo = JSONObject.toJavaObject(attrData.getJSONObject(key), AttrVo.class); + dataObj.put("oldValue", buildAttrObj(attrVo, attrData.getJSONObject(key).getJSONArray("valueList"))); + dataObj.put("action", "delattr"); + dataObj.put("id", attrVo.getId()); + dataObj.put("name", attrVo.getName()); + dataObj.put("label", attrVo.getLabel()); + dataObj.put("type", "attr"); + dataList.add(dataObj); + } + } + JSONObject globalAttrData = oldCiEntityObj.getJSONObject("globalAttrEntityData"); + if (MapUtils.isNotEmpty(globalAttrData)) { + for (String key : globalAttrData.keySet()) { + JSONObject dataObj = new JSONObject(); + GlobalAttrEntityVo attrVo = JSONObject.toJavaObject(globalAttrData.getJSONObject(key), GlobalAttrEntityVo.class); + dataObj.put("oldValue", attrVo.getValueObjList()); + dataObj.put("action", "delglobalattr"); + dataObj.put("id", attrVo.getAttrId()); + dataObj.put("name", attrVo.getAttrName()); + dataObj.put("label", attrVo.getAttrLabel()); + dataObj.put("type", "globalattr"); + dataList.add(dataObj); + } + } + JSONObject relData = oldCiEntityObj.getJSONObject("relEntityData"); + if (MapUtils.isNotEmpty(relData)) { + for (String key : relData.keySet()) { + JSONObject dataObj = new JSONObject(); + JSONObject oldRelEntityData = relData.getJSONObject(key); + dataObj.put("oldValue", oldRelEntityData.getJSONArray("valueList")); + dataObj.put("id", oldRelEntityData.getLong("relId")); + dataObj.put("name", oldRelEntityData.getString("name")); + dataObj.put("label", oldRelEntityData.getString("label")); + dataObj.put("direction", oldRelEntityData.getString("direction")); + dataObj.put("type", "rel"); + dataList.add(dataObj); + } + } + } + + } + return new TransactionDetailVo(transactionVo, dataList); + } + + private JSONObject buildAttrObj(AttrVo attrVo, JSONArray valueList) { + JSONObject attrObj = new JSONObject(); + attrObj.put("type", attrVo.getType()); + attrObj.put("name", attrVo.getName()); + attrObj.put("label", attrVo.getLabel()); + attrObj.put("config", attrVo.getConfig(true));//克隆一个config对象,避免json序列化出错 + attrObj.put("targetCiId", attrVo.getTargetCiId()); + attrObj.put("valueList", valueList); + attrObj.put("attrId", attrVo.getId()); + attrObj.put("actualValueList", AttrValueHandlerFactory.getHandler(attrVo.getType()).getActualValueList(attrVo, valueList)); + return attrObj; + } }