| | |
| | | package com.vci.web.service.impl; |
| | | |
| | | import com.fasterxml.jackson.core.type.TypeReference; |
| | | import com.fasterxml.jackson.databind.ObjectMapper; |
| | | import com.vci.corba.common.PLException; |
| | | import com.vci.corba.omd.atm.AttributeDef; |
| | | import com.vci.corba.omd.btm.BizType; |
| | | import com.vci.corba.omd.data.BusinessObject; |
| | | import com.vci.corba.omd.ltm.LinkType; |
| | | import com.vci.omd.utils.ObjectTool; |
| | |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.util.CollectionUtils; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | |
| | | platformClientUtil.getLinkTypeService().modifyLinkType(linkType); |
| | | return BaseResult.success(null,"保存成功!"); |
| | | } |
| | | /** |
| | | * 链接类型删除 |
| | | * linkType 链接类型对象 |
| | | * @return 删除结果 |
| | | */ |
| | | @Override |
| | | public BaseResult deleteLink(LinkType linkType) throws PLException { |
| | | if(platformClientUtil.getLinkTypeService().hasData(linkType.name)){ |
| | | throw new PLException("500",new String[] {"类型已有实例, 不进行删除操作"}); |
| | | } |
| | | boolean flag = platformClientUtil.getLinkTypeService().deleteLinkType(linkType); |
| | | if(!flag){ |
| | | throw new PLException("500",new String[] {"删除失败"}); |
| | | }else{ |
| | | return BaseResult.success(); |
| | | } |
| | | } |
| | | /** |
| | | * 一致性检查 |
| | | * @return 删除结果 |
| | | */ |
| | | @Override |
| | | public BaseResult checkLinkType() throws PLException { |
| | | String[] result = platformClientUtil.getLinkTypeService().linkTypeConsistencyCheck(); |
| | | Map<String, String> dbCheckMap = new HashMap<String, String>(); |
| | | for(int i = 0; i < result.length; i++){ |
| | | String info = result[i]; |
| | | if(info.equals("")){ |
| | | continue; |
| | | } |
| | | String[] infos = info.split("/DML"); |
| | | String typeName = infos[0]; |
| | | String dml = infos[1]; |
| | | dbCheckMap.put(typeName, dml); |
| | | } |
| | | Map<String, List<String>> btmCheckMap = usedBtmCheck(); |
| | | if(dbCheckMap.size() < 1 && (btmCheckMap == null || btmCheckMap.size() < 1)){ |
| | | return BaseResult.successMsg("数据库中的表结构与类型一致, 链接类型引用的业务类型全部正确存在,无需修复!!"); |
| | | }else{ |
| | | Map<String,Object> returnData = new HashMap<>(); |
| | | returnData.put("dbCheckMap",dbCheckMap); |
| | | returnData.put("btmCheckMap",btmCheckMap); |
| | | List<Map> list = new ArrayList<>(); |
| | | list.add(returnData); |
| | | return BaseResult.dataList(500,list,"需要进行列的修复!!"); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 一致性检查修复数据库表 |
| | | * repairData 需要修复的数据 |
| | | * @return 修复结果 |
| | | */ |
| | | @Override |
| | | public BaseResult repairTable(String repairData) throws PLException, IOException { |
| | | Map<String, Object> map = new ObjectMapper().readValue(repairData, new TypeReference<Map<String,Object>>(){}); |
| | | HashMap<String,Object> dbCheckMap = (HashMap<String, Object>) map.get("dbCheckMap"); |
| | | HashMap<String,List<String>> btmCheckMap = (HashMap<String, List<String>>) map.get("btmCheckMap"); |
| | | List returnList = new ArrayList<>(); |
| | | Map returnMap = new HashMap(); |
| | | if(dbCheckMap.size() > 0){ |
| | | List<String> list = getRepairDML(dbCheckMap); |
| | | if(list.size() < 1){ |
| | | return BaseResult.success(); |
| | | } |
| | | String[] result = platformClientUtil.getLinkTypeService().executeRepair(list.toArray(new String[0])); |
| | | List<String> resultList = Arrays.asList(result); |
| | | for (String typeName : resultList) { |
| | | if(dbCheckMap.containsKey(typeName)){ |
| | | dbCheckMap.remove(typeName); |
| | | }else if(dbCheckMap.containsKey(typeName + "_ADD")){ |
| | | String sql = String.valueOf(dbCheckMap.get(typeName)); |
| | | sql = sql.substring(sql.indexOf(";") + 1, sql.length()); |
| | | dbCheckMap.put(typeName, sql); |
| | | }else if(dbCheckMap.containsKey(typeName + "_DROP")){ |
| | | String sql = String.valueOf(dbCheckMap.get(typeName)); |
| | | sql = sql.substring(0, sql.indexOf(";")); |
| | | dbCheckMap.put(typeName, sql); |
| | | } |
| | | } |
| | | if(!dbCheckMap.isEmpty()){ |
| | | returnMap.put("dbCheckMap",dbCheckMap); |
| | | } |
| | | } |
| | | |
| | | if(btmCheckMap.size() > 0){ |
| | | List<String> result = repairXml(btmCheckMap); |
| | | for(int i = 0; i < result.size(); i++){ |
| | | String typeName = result.get(i); |
| | | if(btmCheckMap.containsKey(typeName)){ |
| | | btmCheckMap.remove(typeName); |
| | | } |
| | | } |
| | | if(!btmCheckMap.isEmpty()){ |
| | | returnMap.put("btmCheckMap",btmCheckMap); |
| | | } |
| | | } |
| | | returnList.add(returnMap); |
| | | return BaseResult.success(returnList); |
| | | } |
| | | /** |
| | | * 创建视图 |
| | | * @return 创建结果 |
| | | */ |
| | | @Override |
| | | public BaseResult createView() throws PLException { |
| | | boolean f = platformClientUtil.getLinkTypeService().createView(); |
| | | if(f){ |
| | | return BaseResult.success("创建视图成功"); |
| | | }else{ |
| | | return BaseResult.success("创建视图失败"); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 修复链接类型的xml文件 |
| | | * @return |
| | | */ |
| | | private List<String> repairXml(HashMap<String, List<String>> btmCheckMap){ |
| | | List<String> result = new ArrayList<String>(); |
| | | for(Iterator<String> ite = btmCheckMap.keySet().iterator(); ite.hasNext();){ |
| | | String linkName = ite.next(); |
| | | List<String> list = btmCheckMap.get(linkName); |
| | | LinkType link = null; |
| | | try { |
| | | link = platformClientUtil.getLinkTypeService().getLinkType(linkName); |
| | | } catch (PLException e1) { |
| | | // TODO Auto-generated catch block |
| | | e1.printStackTrace(); |
| | | continue; |
| | | } |
| | | //将list中包含的F_btm移除, 重新设置btmItemsFrom |
| | | String[] btms_ = link.btmItemsFrom; |
| | | List<String> btms = new ArrayList<String>(); |
| | | for(int i = 0; i < btms_.length; i++){ |
| | | if(!list.contains("F_" + btms_[i])){ |
| | | btms.add(btms_[i]); |
| | | }else{ |
| | | if(link.primitivesFrom.equals(btms_[i])){ |
| | | link.primitivesFrom = ""; |
| | | } |
| | | } |
| | | } |
| | | link.btmItemsFrom = btms.toArray(new String[0]); |
| | | |
| | | //将list中包含的T_btm移除, 重新设置btmItemsTo |
| | | btms_ = link.btmItemsTo; |
| | | btms = new ArrayList<String>(); |
| | | for(int i = 0; i < btms_.length; i++){ |
| | | if(!list.contains("T_" + btms_[i])){ |
| | | btms.add(btms_[i]); |
| | | }else{ |
| | | if(link.primitivesTo.equals(btms_[i])){ |
| | | link.primitivesTo = ""; |
| | | } |
| | | } |
| | | } |
| | | link.btmItemsTo = btms.toArray(new String[0]); |
| | | link.id = link.name; |
| | | try { |
| | | if(platformClientUtil.getLinkTypeService().modifyLinkType(link)){ |
| | | result.add(linkName); |
| | | } |
| | | } catch (PLException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | return result; |
| | | } |
| | | /** |
| | | * 获取需要修复的伪sql |
| | | * @return |
| | | */ |
| | | private List<String> getRepairDML(HashMap<String, Object> dbCheckMap) { |
| | | List<String> list = new ArrayList<String>(); |
| | | for(Iterator<String> ite = dbCheckMap.keySet().iterator(); ite.hasNext();){ |
| | | String type = ite.next(); |
| | | String dml = String.valueOf(dbCheckMap.get(type)); |
| | | list.add(type + "/DML" + dml); |
| | | } |
| | | return list; |
| | | } |
| | | /** |
| | | * 检查所有的链接类型, 当链接类型中引用的业务类型已经不存在时, 删除该链接类型中对业务类型的引用 |
| | | * @return |
| | | */ |
| | | private Map<String, List<String>> usedBtmCheck(){ |
| | | try { |
| | | Map<String, List<String>> map = new HashMap<String, List<String>>(); |
| | | LinkType[] links = platformClientUtil.getLinkTypeService().getLinkTypes(); |
| | | for(int i = 0; i < links.length; i++){ |
| | | LinkType link = links[i]; |
| | | String[] btms = link.btmItemsFrom; |
| | | for(int k = 0; k < btms.length; k++){ |
| | | String btmName = btms[k]; |
| | | BizType btm = platformClientUtil.getBtmService().getBizTypeByName(btmName); |
| | | if(btm == null || btm.name.equals("")){ |
| | | List<String> list = map.get(link.name); |
| | | if(list == null){ |
| | | list = new ArrayList<String>(); |
| | | list.add("F_" + btmName); |
| | | }else{ |
| | | list.add("F_" + btmName); |
| | | } |
| | | map.put(link.name, list); |
| | | } |
| | | } |
| | | btms = link.btmItemsTo; |
| | | for(int k = 0; k < btms.length; k++){ |
| | | String btmName = btms[k]; |
| | | BizType btm = platformClientUtil.getBtmService().getBizTypeByName(btmName); |
| | | if(btm == null || btm.name.equals("")){ |
| | | List<String> list = map.get(link.name); |
| | | if(list == null){ |
| | | list = new ArrayList<String>(); |
| | | list.add("T_" + btmName); |
| | | }else{ |
| | | list.add("T_" + btmName); |
| | | } |
| | | map.put(link.name, list); |
| | | } |
| | | } |
| | | } |
| | | return map; |
| | | } catch (PLException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | |
| | | /** |