package com.vci.web.service.impl; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.ZipUtil; import com.alibaba.fastjson.JSONObject; import com.vci.client.ClientSession; import com.vci.client.common.oq.OQTool; import com.vci.client.common.providers.ClientServiceProvider; import com.vci.common.qt.object.*; import com.vci.constant.FrameWorkLangCodeConstant; 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.data.LinkObject; import com.vci.corba.omd.ltm.LinkType; import com.vci.corba.omd.qtm.QTD; import com.vci.corba.omd.qtm.QTInfo; import com.vci.dto.*; import com.vci.omd.constants.SystemAttribute; import com.vci.omd.objects.OtherInfo; import com.vci.po.OsLinkTypePO; import com.vci.starter.poi.bo.ReadExcelOption; import com.vci.starter.poi.bo.WriteExcelData; import com.vci.starter.poi.bo.WriteExcelOption; import com.vci.starter.poi.constant.ExcelLangCodeConstant; import com.vci.starter.poi.util.ExcelUtil; import com.vci.starter.web.exception.VciBaseException; import com.vci.starter.web.pagemodel.BaseResult; import com.vci.starter.web.pagemodel.DataGrid; import com.vci.starter.web.pagemodel.Tree; import com.vci.starter.web.util.*; import com.vci.web.other.BtmQTExportData; import com.vci.web.other.LinkQTExportData; import com.vci.web.service.*; import com.vci.web.util.DateUtil; import com.vci.web.util.Func; import com.vci.web.util.PlatformClientUtil; import com.vci.web.util.WebUtil; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.jdesktop.swingx.JXDatePicker; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import javax.swing.*; import java.awt.*; import java.io.*; import java.util.*; import java.util.List; import java.util.stream.Collectors; /** * 查询模板服务 * @author yuxc * @date 2024-8-1 */ @Service public class OsQueryTemplateImpl implements OsQuereyTemplateServiceI { /** * 平台的调用工具类 */ @Autowired private PlatformClientUtil platformClientUtil; private final String EQUAL = "="; private final String UNEQUAL = "!="; private final String CONTAINS = "包含"; private final String IN = "in"; private final String NOTIN = "not in"; private final String GT = ">"; private final String GTE = ">="; private final String LT = "<"; private final String LTE = "<="; private final String AND = "并且"; private final String OR = "或者"; /** * 查询模板的列表 * @param btmName 类型 * @param linkFlag 是否链接类型 :true 链接类型 ,false 业务类型 * @return 查询模板的列表 */ @Override public BaseResult queryTemplateList(String btmName, Boolean linkFlag) throws PLException { QTD[] qtdArray = null; if(linkFlag){ qtdArray = platformClientUtil.getQTDService().getLinkTypeQTDs(btmName); }else { qtdArray = platformClientUtil.getQTDService().getBizTypeQTDs(btmName); } return BaseResult.dataList(Arrays.asList(qtdArray)); } /** * 保存查询模板 * @param qtd 查询模板实体类 * @return 保存结果 */ @Override public BaseResult saveTemplate(QTD qtd) throws PLException { //校验参数 checkName(qtd); //设置默认值 qtd.creator = WebUtil.getCurrentUserId(); qtd.createTime = System.currentTimeMillis(); boolean addFlag = false; //进行保存 addFlag = platformClientUtil.getQTDService().addQTD(qtd); if (addFlag) { return BaseResult.success("增加业务类型查询模板成功"); } else { throw new PLException("500", new String[]{"增加业务类型查询模板失败"}); } } /** * 修改查询模板 * @param qtd 查询模板实体类 * @return 保存结果 */ @Override public BaseResult updateTemplate(QTD qtd) throws PLException { //校验参数 if (qtd.name.equals("")) { throw new PLException("500", new String[]{"请输入模板定义名"}); } if (!qtd.name.matches("[a-z A-Z]*")) { throw new PLException("500", new String[]{"模板定义名只能为英文字母"}); } qtd.createTime = System.currentTimeMillis(); boolean updateFlag = false; //进行保存 updateFlag = platformClientUtil.getQTDService().modifyQTD(qtd); if (updateFlag) { return BaseResult.success("修改业务类型查询模板成功"); } else { throw new PLException("500", new String[]{"修改业务类型查询模板失败"}); } } /** * 删除查询模板 * @param name 查询模板名 * @return 保存结果 */ @Override public BaseResult deleteTemplate(String name) throws PLException { boolean flag = false; flag = platformClientUtil.getQTDService().deleteQTD(name); if (flag) { return BaseResult.success("删除查询模板成功"); } else { return BaseResult.fail("删除查询模板失败"); } } /** * @param qtInfoDTO 传输的数据对象: * linkTypeName 链接类型、 * rdPositive 方向,true正向,false反向 * btmName 业务类型名称 * combRelaType 业务类型选择值 * versionValue 版本班次值 * isQueryIsLeaf 是否选择下级 * level 子节点层数 * @return 查询结果 */ @Override public BaseResult getCriteria(QTInfoDTO qtInfoDTO) throws PLException { QueryTemplate qt = getQT(qtInfoDTO,true); String checkInfo = OQTool.checkQT(qt); if(!checkInfo.equals("OK")){ throw new PLException("500", new String[]{checkInfo}); } qt.setId("qt1"); LinkObject[] result = platformClientUtil.getQueryService().findLTObjects(qt.getId(), OQTool.qtTOXMl(qt).asXML()); return BaseResult.dataList(Arrays.asList(result)); } /** * 查询模板列表 * @param btName 类型名称 * @return 查询结果 */ @Override public BaseResult getObjTypeQTs(String btName) throws PLException, DocumentException { VciBaseUtil.alertNotNull(btName,"类型名"); QTInfo[] objTypeQTs = platformClientUtil.getQTDService().getObjTypeQTs(btName); List dtos = new ArrayList<>(); Map allSysAttr = Arrays.stream(platformClientUtil.getBtmService().getSysAttributeDefs()).collect(Collectors.toMap(e -> e.name, e -> e)); allSysAttr.putAll(Arrays.stream(platformClientUtil.getLinkTypeService().getSysAttributeDefs()).collect(Collectors.toMap(e -> e.name, e -> e))); for (QTInfo obj : objTypeQTs) { QTInfoDTO qtInfoDTO = new QTInfoDTO(); qtInfoDTO.setCreator(obj.creator); qtInfoDTO.setBtmName(obj.btmName); qtInfoDTO.setQtName(obj.qtName); qtInfoDTO.setLevelFlag(obj.levelFlag); //qtInfoDTO.setQtText(obj.qtText); qtInfoDTO.setQtUIText(obj.qtUIText); if(StringUtils.isNotBlank(obj.qtUIText)){ //将给定的String文本解析为XML文档并返回新创建的document qtInfoDTO.setTree(analysisXml(obj, allSysAttr)); } QueryTemplate qtByDoc = OQTool.getQTByDoc(DocumentHelper.parseText(obj.qtText), obj.qtName); qtInfoDTO.setQueryTemplate(queryTemplateToDto(qtByDoc, allSysAttr)); qtInfoDTO.setCreateTimeText(DateFormatUtils.format(new Date(obj.createTime), DateUtil.PATTERN_DATETIME)); dtos.add(qtInfoDTO); } return BaseResult.dataList(dtos); } /** * 对象转换 * @param qtByDoc 模板对象 * @param allSysAttr 所有系统属性 * @return 模板传输对象 * @throws PLException */ private QueryTemplateDTO queryTemplateToDto(QueryTemplate qtByDoc, Map allSysAttr) throws PLException { QueryTemplateDTO dto = new QueryTemplateDTO(); dto.setId(qtByDoc.getId()); dto.setBtmType(qtByDoc.getBtmType()); dto.setDirection(qtByDoc.getDirection()); dto.setLevel(qtByDoc.getLevel()); dto.setQueryChildrenFlag(qtByDoc.isQueryChildren()); dto.setQueryISLeaf(qtByDoc.isQueryISLeaf()); dto.setClauseList(qtByDoc.getClauseList()); dto.setPageInfo(qtByDoc.getPageInfo()); dto.setLinkType(qtByDoc.getLinkType()); dto.setVersion(qtByDoc.getVersion()); dto.setType(qtByDoc.getType()); dto.setSecretFlag(qtByDoc.isSecretFlag()); dto.setRightFlag(qtByDoc.isRightFlag()); dto.setOrderInfoList(qtByDoc.getOrderInfoList()); dto.setRecReturnMode(qtByDoc.getRecReturnMode()); Condition con = qtByDoc.getCondition(); if(con != null){ ConditionDTO conDto = new ConditionDTO(); conDto.setRootCIName(con.getRootCIName()); Map ciMap = con.getCIMap(); Map ciMapDto = new HashMap<>(); for (String key : ciMap.keySet()) { ConditionItem item = ciMap.get(key); LeafInfo leafInfo = item.getLeafInfo(); ConditionItemDTO itemDTO = new ConditionItemDTO(); itemDTO.setChildrenInfo(item.getChildrenInfo()); itemDTO.setId(item.getId()); itemDTO.setLeafFlag(item.isLeaf()); ciMapDto.put(key, itemDTO); if(leafInfo == null){ continue; } LeafInfoDTO leafInfoDTO = new LeafInfoDTO(); itemDTO.setLeafInfo(leafInfoDTO); //处理查询字段类型 String column = leafInfo.getClause(); if(column.contains(".")){ column = StringUtils.substringAfterLast(column, "."); } if(column.contains(" ")){ column = StringUtils.substringBefore(column, " "); } AttributeDef att = platformClientUtil.getAttributeService().getAttributeDefByName(column); if(att == null || "".equals(att.oid)){ att = allSysAttr.get(column.toLowerCase()); } leafInfoDTO.setClause(leafInfo.getClause()); leafInfoDTO.setOperator(leafInfo.getOperator()); leafInfoDTO.setType(att.vtDataType); if(leafInfo.getValue() != null ){ LeafValueDto valueDto = new LeafValueDto(); valueDto.setOrdinaryValue(leafInfo.getValue().getOrdinaryValue()); valueDto.setQueryTemplate(leafInfo.getValue().getQueryTemplate() != null ? queryTemplateToDto(leafInfo.getValue().getQueryTemplate(),allSysAttr) : null); leafInfoDTO.setValue(valueDto); } } conDto.setCIMap(ciMapDto); dto.setCondition(conDto); } return dto; } /** * 将客服端界面显示的xml转为hashMap * @param obj 界面对象 * @return * @throws DocumentException */ private HashMap analysisXml(QTInfo obj, Map allSysAttr) throws DocumentException, PLException { org.dom4j.Document document = DocumentHelper.parseText(obj.qtUIText); if(document == null){ return null; } //获取根节点,在例子中就是responsedata节点 Element root = document.getRootElement(); HashMap treeMap = new HashMap<>(); treeMap.put("connector",root.getText()); List children = root.elements(); List childList = new ArrayList<>(); for(Iterator i = children.iterator(); i.hasNext();){ Element child = i.next(); if(AND.equals(child.getText()) || OR.equals(child.getText())){ childList.add(addDefaultMutableTree(child, allSysAttr)); }else { String column = StringUtils.substringBefore(child.getText().trim(), " "); if(column.contains(".")){ column = StringUtils.substringAfterLast(column, "."); } AttributeDef att = platformClientUtil.getAttributeService().getAttributeDefByName(column); if(att == null || "".equals(att.oid)){ att = allSysAttr.get(column.toLowerCase()); } HashMap data = new HashMap<>(); data.put("column",child.getText().trim()); data.put("type",att.vtDataType); childList.add(data); } } treeMap.put("child",childList); return treeMap; } /** * 将子节点转为map结构 * @param element */ public Map addDefaultMutableTree(Element element, Map allSysAttr) throws PLException { List childList = new ArrayList<>(); List children = element.elements(); HashMap treeMap = new HashMap<>(); treeMap.put("connector",element.getText()); for(Iterator i = children.iterator(); i.hasNext();){ Element child = i.next(); if(AND.equals(child.getText()) || OR.equals(child.getText())){ childList.add(addDefaultMutableTree(child, allSysAttr)); }else { String column = StringUtils.substringBefore(child.getText().trim(), " "); if(column.contains(".")){ column = StringUtils.substringAfterLast(column, "."); } AttributeDef att = platformClientUtil.getAttributeService().getAttributeDefByName(column); if(att == null || "".equals(att.oid)){ att = allSysAttr.get(column.toLowerCase()); } HashMap data = new HashMap<>(); data.put("column",child.getText().trim()); data.put("type",att.vtDataType); childList.add(data); } } treeMap.put("child",childList); return treeMap; } /** * 检查查询模板名字是否存在 * @param name 查询模板名字 * @return 查询结果 */ @Override public BaseResult isExistsQT(String name) throws PLException { VciBaseUtil.alertNotNull(name,"询模板名"); return BaseResult.success(platformClientUtil.getQTDService().isExistsQT(name)); } /** * 链接类型查询模板保存 * @param qtInfoDTO 保存传输对象 * @return 保存结果 */ @Override public BaseResult linkSave(QTInfoDTO qtInfoDTO) throws PLException { QueryTemplate qt = getQT(qtInfoDTO,true); String checkInfo = OQTool.checkQT(qt); if(!checkInfo.equals("OK")){ throw new PLException("500", new String[]{checkInfo}); } boolean saveFlag ; qt.setId(qtInfoDTO.getQtName()); qt.setOrderInfoList(qtInfoDTO.getQueryTemplate().getOrderInfoList()); QTInfo qtWrapper = new QTInfo(); qtWrapper.qtName = qt.getId(); qtWrapper.btmName = qt.getLinkType(); qtWrapper.creator = WebUtil.getCurrentUserId(); qtWrapper.createTime = System.currentTimeMillis(); if(qtInfoDTO.getTree() == null){ qtWrapper.qtUIText = ""; }else{ qtWrapper.qtUIText = getSeniorXML(qtInfoDTO); } qtWrapper.levelFlag = qtInfoDTO.getLevelFlag(); qtWrapper.qtText = OQTool.qtTOXMl(qt).asXML(); saveFlag = platformClientUtil.getQTDService().saveQT(qtWrapper); if(saveFlag){ return BaseResult.success(); }else{ return BaseResult.fail("保存查询模板失败"); } } /** * 链接类型查询模板树查询,用于界面的导出功能 * @return 查询结果 */ @Override public BaseResult getLinkTree() throws PLException { LinkType[] linkTypes= null; QTInfo[] qts = null; HashMap tree = new HashMap(); tree.put("text","业务类型"); if (linkTypes == null) { List es = new ArrayList(); linkTypes = platformClientUtil.getLinkTypeService().getLinkTypes(); for (LinkType lt : linkTypes) { QTInfo[] qtWrappers = platformClientUtil.getQTDService().getObjTypeQTs(lt.name); if (qtWrappers.length!=0) { es.add(lt); } } linkTypes = es.toArray(new LinkType[es.size()]); //TODO:需修正没有关联查询模板业务类型去掉 qts = platformClientUtil.getQTDService().getAllQTs();//获取所有查询模板 } List> childList = new ArrayList<>(); //添加业务类型根节点 for (LinkType plAction : linkTypes) { HashMap childTree = new HashMap(); childTree.put("text", plAction.tag + "/" +plAction.name); childTree.put("oid", plAction.oid); // tree.put("children", childTree); addExportTreeNode(plAction, qts, childTree); childList.add(childTree); } tree.put("children", childList); return BaseResult.success(tree); } /** * 生成导出树选择以及导入树显示 * @param linkType * @param qts * @param tree */ private void addExportTreeNode(LinkType linkType/*业务类型*/,QTInfo[] qts/*查询模板对象*/,HashMap tree) { List childList = new ArrayList<>(); // 添加查询模板对象子节点 for (QTInfo qtItem : qts) { //处理导入时无法进行类型判断 int splitLength = linkType.name.indexOf("【"); if(splitLength == -1){ splitLength = linkType.name.length(); } if (qtItem.btmName.equals(linkType.name.substring(0, splitLength))) { childList.add(qtItem.qtName); } } tree.put("children",childList); } /** * 将高级条件数据转为xml * @param qtInfoDTO 查询模板列表传输对象 * @return xml数据 */ private String getSeniorXML(QTInfoDTO qtInfoDTO){ HashMap tree = qtInfoDTO.getTree(); if(tree.isEmpty()){ return ""; } StringBuilder xmlStr = new StringBuilder(""); xmlStr.append(tree.get("connector")); List childrens = (List) tree.get("child"); Iterator children = childrens.iterator(); while (children.hasNext()) { Object obj = children.next(); if(obj instanceof JSONObject && (((JSONObject) obj).get("connector").equals(AND) || ((JSONObject) obj).get("connector").equals(OR))){ xmlStr.append(getSeniorChildXML((JSONObject) obj)); }else{ xmlStr.append("").append(obj).append(""); } } return xmlStr.append("").toString(); } /** * 将高级条件数据转为xml * @param childs 高级条件数据 * @return xml数据 */ private String getSeniorChildXML(JSONObject childs){ StringBuilder xmlStr = new StringBuilder("" + childs.get("connector")); List childrens = (List) childs.get("child"); if(childrens == null){ return ""; } Iterator child = childrens.iterator(); while (child.hasNext()) { Object obj = child.next(); if(obj instanceof JSONObject && (((JSONObject) obj).get("connector").equals(AND) || ((JSONObject) obj).get("connector").equals(OR))){ xmlStr.append(getSeniorChildXML((JSONObject) obj)); }else{ xmlStr.append("").append(obj).append(""); } } return xmlStr.append("").toString(); } /** * 组装查询模板 * @return */ public QueryTemplate getQT(QTInfoDTO qtInfoDTO,boolean isLinkType) throws PLException { QueryTemplate qt = new QueryTemplate(); if(isLinkType){ qt.setType(QTConstants.TYPE_LINK); qt.setLinkType(qtInfoDTO.getBtmName()); qt.setDirection(qtInfoDTO.getQueryTemplate().getDirection()); qt.setBtmType(qtInfoDTO.getQueryTemplate().getBtmType()); qt.setVersion(qtInfoDTO.getQueryTemplate().getVersion()); qt.setQueryISLeaf(qtInfoDTO.getQueryTemplate().isQueryISLeaf()); qt.setLevel(qtInfoDTO.getQueryTemplate().getLevel()); }else{ qt.setType(QTConstants.TYPE_BTM); qt.setBtmType(qtInfoDTO.getBtmName()); } List clauseList = new ArrayList(); //TODO 查询列 显示列 clauseList.add("*"); qt.setClauseList(clauseList); Condition con = new Condition(); qt.setCondition(con); HashMap ciMap = getCIMap(qtInfoDTO); con.setCIMap(ciMap); con.setRootCIName(con.getRootCINameByCIMap(ciMap)); return qt; } /** * 获取查询条件 * @return */ private HashMap getCIMap(QTInfoDTO qtInfoDTO) throws PLException { HashMap ciMap = new HashMap<>(); //普通查询条件 if(qtInfoDTO.getLevelFlag() == 0){ /** * 加入叶子节点 */ for(int i = 0; i < qtInfoDTO.getCondition().size(); i++){ ConditionItem ci = new ConditionItem(); String id = "ci" + (i + 1); ci.setId(id); ci.setLeafFlag(true); HashMap condition = qtInfoDTO.getCondition().get(i); String clause = condition.get("clause"); String operator = condition.get("operator"); String ordinaryValue = condition.get("ordinaryValue"); //add by zhangweiwei 2014/12/09 end 因增加选择查询模板按钮将每行组件数由4改成5 LeafInfo leafInfo = new LeafInfo(); if(clause.contains("T_OID.") || clause.contains("F_OID.")){ //去掉T_OID.或者F_OID. String clause_ = clause.substring(6); //属性为参照属性 if(clause_.contains(".")){ int fpIndex = clause_.indexOf("."); String refAbName = clause.substring(0, fpIndex + 6); clause = clause.substring(fpIndex + 6 + 1); leafInfo.setClause(refAbName); //去掉T_OID.或者F_OID. refAbName = refAbName.substring(6); leafInfo.setOperator(Operator.IN); QueryTemplate qt = getRefQT(refAbName, clause, operator, ordinaryValue); LeafValue lValue = new LeafValue(); lValue.setQueryTemplate(qt); leafInfo.setValue(lValue); //属性为非参照属性 }else{ leafInfo.setClause(clause); leafInfo.setOperator(operator); LeafValue lValue = new LeafValue(); leafInfo.setValue(lValue); //add by zhangweiwei 2014/12/09 start //如果嵌套Link if(ordinaryValue.contains(";")){ leafInfo.setOperator(Operator.IN); String[] values = ordinaryValue.split(";"); String QTname = values[0]; String attr = values[1].substring(0, values[1].length()); try { QTInfo qt = platformClientUtil.getQTDService().getQT(QTname); String qtText = qt.qtText; QueryTemplate qt_ = OQTool.getQTByQTText(qt.qtName, qtText); List clauseList = new ArrayList(); clauseList.add(attr); qt_.setClauseList(clauseList); lValue.setQueryTemplate(qt_); //lValue.setAttr(attr); } catch (PLException e) { e.printStackTrace(); } catch (DocumentException e1) { e1.printStackTrace(); } }else{ lValue.setOrdinaryValue(ordinaryValue); } //add by zhangweiwei 2014/12/09 end } }else{ //属性为参照属性 if(clause.contains(".")){ int fpIndex = clause.indexOf("."); String refAbName = clause.substring(0, fpIndex); clause = clause.substring(fpIndex + 1); leafInfo.setClause(refAbName); leafInfo.setOperator(Operator.IN); QueryTemplate qt = getRefQT(refAbName, clause, operator, ordinaryValue); LeafValue lValue = new LeafValue(); lValue.setQueryTemplate(qt); leafInfo.setValue(lValue); //属性为非参照属性 }else{ leafInfo.setClause(clause); leafInfo.setOperator(operator); LeafValue lValue = new LeafValue(); leafInfo.setValue(lValue); //add by zhangweiwei 2014/12/09 start //如果嵌套Link if(ordinaryValue.contains(";")){ leafInfo.setOperator(Operator.IN); String[] values = ordinaryValue.split(";"); String QTname = values[0]; String attr = values[1].substring(0, values[1].length()); try { QTInfo qt = platformClientUtil.getQTDService().getQT(QTname); String qtText = qt.qtText; QueryTemplate qt_ = OQTool.getQTByQTText(qt.qtName, qtText); List clauseList = new ArrayList(); clauseList.add(attr); qt_.setClauseList(clauseList); lValue.setQueryTemplate(qt_); //lValue.setAttr(attr); } catch (PLException e) { e.printStackTrace(); } catch (DocumentException e1) { e1.printStackTrace(); } }else{ lValue.setOrdinaryValue(ordinaryValue); } //add by zhangweiwei 2014/12/09 end } } ci.setLeafInfo(leafInfo); ciMap.put(ci.getId(), ci); } Iterator iterator = ciMap.keySet().iterator(); ArrayList ciList = new ArrayList(); String lCIId = null; while(iterator.hasNext()){ lCIId = iterator.next(); break; } int count = ciMap.size(); while(iterator.hasNext()){ String rCIId = iterator.next(); ConditionItem pCI = new ConditionItem(); String pId = "ci" + ++count; pCI.setId(pId); pCI.setLeafFlag(false); ChildrenInfo pChildrenInfo = new ChildrenInfo(); pChildrenInfo.setLeftCIName(lCIId); pChildrenInfo.setConnector(Connector.AND); pChildrenInfo.setRightCIName(rCIId); pCI.setChildrenInfo(pChildrenInfo); ciList.add(pCI); lCIId = pId; } for(Iterator i = ciList.iterator(); i.hasNext();){ ConditionItem ci = i.next(); ciMap.put(ci.getId(), ci); } //高级查询条件 }else if(qtInfoDTO.getLevelFlag() == 1){ ciMap = getCIMapForSeniorTree(qtInfoDTO); } return ciMap; } /** * 获取高级查询的查询条件集合 * @return */ private HashMap getCIMapForSeniorTree(QTInfoDTO qtInfoDTO) throws PLException { HashMap ciMap = new HashMap<>(); HashMap tree = qtInfoDTO.getTree(); if (tree.isEmpty()) { // 无查询条件的查询 return null; } ArrayList ciList = new ArrayList(); String connector = String.valueOf(tree.get("connector")); List childrens = (List) tree.get("child"); Iterator children = childrens.iterator(); while (children.hasNext()) { Object obj = children.next(); if(obj instanceof JSONObject && (((JSONObject) obj).get("connector").equals(AND) || ((JSONObject) obj).get("connector").equals(OR))){ List subCIList = getCIList((JSONObject) obj, ciList.size() + 1); if(subCIList == null){ continue; } if(ciList.size() > 0){ ConditionItem leftCI = ciList.get(ciList.size() - 1); ConditionItem rightCI = subCIList.get(subCIList.size() - 1); ciList.addAll(subCIList); ConditionItem pCI = new ConditionItem(); pCI.setId("ci" + (ciList.size() + 1)); ciList.add(pCI); pCI.setLeafFlag(false); ChildrenInfo cInfo = new ChildrenInfo(); pCI.setChildrenInfo(cInfo); cInfo.setLeftCIName(leftCI.getId()); cInfo.setConnector(connector); cInfo.setRightCIName(rightCI.getId()); }else{ ciList.addAll(subCIList); } }else{ String text = String.valueOf(obj); if(text == null || text.equals("")){ continue; } if(!text.contains(Operator.EQUAL) && !text.contains(Operator.UNEQUAL) && !text.contains(Operator.CONTAINS) && !text.contains(Operator.IN) && !text.contains(Operator.NOTIN) &&!text.contains(Operator.GTE) && !text.contains(Operator.GT) && !text.contains(Operator.LTE) && !text.contains(Operator.LT)){ continue; } if(ciList.size() > 0){ ConditionItem leftCI = ciList.get(ciList.size() - 1); ConditionItem rightCI = getCIByNode(text, ciList.size() + 1); ciList.add(rightCI); ConditionItem pCI = new ConditionItem(); pCI.setId("ci" + (ciList.size() + 1)); ciList.add(pCI); pCI.setLeafFlag(false); ChildrenInfo cInfo = new ChildrenInfo(); pCI.setChildrenInfo(cInfo); cInfo.setLeftCIName(leftCI.getId()); cInfo.setConnector(connector); cInfo.setRightCIName(rightCI.getId()); }else{ ConditionItem ci = getCIByNode(text, ciList.size() + 1); ciList.add(ci); } } } for(int i = 0; i < ciList.size(); i++){ ConditionItem ci = ciList.get(i); ciMap.put(ci.getId(), ci); } return ciMap; } /** * 树化一个查询条件组节点 * @param children * @param beginId * @return */ private List getCIList(JSONObject children, int beginId) throws PLException { List ciList = new ArrayList<>(); String connector = String.valueOf(children.get("connector")); List childrens = (List) children.get("child"); if(childrens == null){ return null; } Iterator child = childrens.iterator(); while (child.hasNext()) { Object obj = child.next(); if(obj instanceof JSONObject && (((JSONObject) obj).get("connector").equals(AND) || ((JSONObject) obj).get("connector").equals(OR))){ List subCIList = getCIList((JSONObject) obj, beginId); if(ciList.size() > 0){ ConditionItem leftCI = ciList.get(ciList.size() - 1); ConditionItem rightCI = subCIList.get(subCIList.size() - 1); ciList.addAll(subCIList); beginId = beginId + subCIList.size(); ConditionItem pCI = new ConditionItem(); pCI.setId("ci" + beginId); ciList.add(pCI); beginId = beginId + 1; pCI.setLeafFlag(false); ChildrenInfo cInfo = new ChildrenInfo(); pCI.setChildrenInfo(cInfo); cInfo.setLeftCIName(leftCI.getId()); cInfo.setConnector(connector); cInfo.setRightCIName(rightCI.getId()); }else{ ciList.addAll(subCIList); beginId = beginId + subCIList.size(); } }else{ String text = String.valueOf(obj); if(text == null || text.equals("")){ continue; } if(!text.contains(Operator.EQUAL) && !text.contains(Operator.UNEQUAL) && !text.contains(Operator.CONTAINS) && !text.contains(Operator.IN) && !text.contains(Operator.NOTIN) &&!text.contains(Operator.GTE) && !text.contains(Operator.GT) && !text.contains(Operator.LTE) && !text.contains(Operator.LT)){ continue; } if(ciList.size() > 0){ ConditionItem leftCI = ciList.get(ciList.size() - 1); ConditionItem rightCI = getCIByNode(text, beginId); ciList.add(rightCI); beginId = beginId + 1; ConditionItem pCI = new ConditionItem(); pCI.setId("ci" + beginId); ciList.add(pCI); beginId = beginId + 1; pCI.setLeafFlag(false); ChildrenInfo cInfo = new ChildrenInfo(); pCI.setChildrenInfo(cInfo); cInfo.setLeftCIName(leftCI.getId()); cInfo.setConnector(connector); cInfo.setRightCIName(rightCI.getId()); }else{ ConditionItem ci = getCIByNode(text, beginId); ciList.add(ci); beginId = beginId + 1; } } } return ciList; } /** * 高级查询 * 把Node内容解析成ConditionItem * @param text * @param id * @return */ private ConditionItem getCIByNode(String text, int id) throws PLException { ConditionItem ci = new ConditionItem(); ci.setId("ci" + id); ci.setLeafFlag(true); LeafInfo leafInfo = new LeafInfo(); ci.setLeafInfo(leafInfo); String operator = null; if(text.contains(Operator.EQUAL)){ operator = Operator.EQUAL; }else if(text.contains(Operator.CONTAINS)){ operator = Operator.CONTAINS; }else if(text.contains(Operator.UNEQUAL)){ operator = Operator.UNEQUAL; }else if(text.contains(Operator.IN)){ operator = Operator.IN; }else if(text.contains(Operator.NOTIN)){ operator = Operator.NOTIN; }else if(text.contains(Operator.GTE)){ operator = Operator.GTE; }else if(text.contains(Operator.GT)){ operator = Operator.GT; }else if(text.contains(Operator.LTE)){ operator = Operator.LTE; }else if(text.contains(Operator.LT)){ operator = Operator.LT; } int operatorIndex = text.indexOf(operator); String clause = text.substring(0, operatorIndex).trim(); String ordinaryValue = text.substring(operatorIndex + 2).trim(); if(clause.contains("T_OID.") || clause.contains("F_OID.")){ //去掉T_OID.或者F_OID. String clause_ = clause.substring(6); //属性为参照属性 if(clause_.contains(".")){ int fpIndex = clause_.indexOf("."); String refAbName = clause.substring(0, fpIndex + 6); clause = clause.substring(fpIndex + 6 + 1); leafInfo.setClause(refAbName); //去掉T_OID.或者F_OID. refAbName = refAbName.substring(6); leafInfo.setOperator(Operator.IN); QueryTemplate qt = getRefQT(refAbName, clause, operator, ordinaryValue); LeafValue lValue = new LeafValue(); lValue.setQueryTemplate(qt); leafInfo.setValue(lValue); //属性为非参照属性 }else{ leafInfo.setClause(clause); leafInfo.setOperator(operator); LeafValue lValue = new LeafValue(); leafInfo.setValue(lValue); lValue.setOrdinaryValue(ordinaryValue); } }else{ //属性为参照属性 if(clause.contains(".")){ int fpIndex = clause.indexOf("."); String refAbName = clause.substring(0, fpIndex); clause = clause.substring(fpIndex + 1); leafInfo.setClause(refAbName); leafInfo.setOperator(Operator.IN); QueryTemplate qt = getRefQT(refAbName, clause, operator, ordinaryValue); LeafValue lValue = new LeafValue(); lValue.setQueryTemplate(qt); leafInfo.setValue(lValue); //属性为非参照属性 }else{ leafInfo.setClause(clause); leafInfo.setOperator(operator); LeafValue lValue = new LeafValue(); leafInfo.setValue(lValue); lValue.setOrdinaryValue(ordinaryValue); } } return ci; } /** * 获取参照的查询模板 * @param refAbName: 参照属性名 * @param clause: 属性参照的业务类型中的属性 * @param operator * @param ordinaryValue * @return */ private QueryTemplate getRefQT(String refAbName, String clause, String operator, String ordinaryValue) throws PLException { QueryTemplate qt = new QueryTemplate(); List clauseList = new ArrayList(); clauseList.add("OID"); qt.setClauseList(clauseList); AttributeDef refAb = platformClientUtil.getAttributeService().getAttributeDefByName(refAbName); OtherInfo otherInfo = OtherInfo.getOtherInfoByText(refAb.other); int refFlag = otherInfo.getRefFlag(); String type = otherInfo.getRefTypeName(); if(refFlag == 0){ qt.setType(QTConstants.TYPE_BTM); qt.setBtmType(type); }else if(refFlag == 1){ qt.setType(QTConstants.TYPE_LINK); qt.setLinkType(type); } Condition condition = new Condition(); qt.setCondition(condition); condition.setRootCIName("ci1"); HashMap ciMap = new HashMap(); condition.setCIMap(ciMap); ConditionItem ci = new ConditionItem(); ci.setId("ci1"); ciMap.put(ci.getId(), ci); ci.setLeafFlag(true); LeafInfo leafInfo = new LeafInfo(); if(clause.contains(".")){ int fpIndex = clause.indexOf("."); String refAbName_ = clause.substring(0, fpIndex); clause = clause.substring(fpIndex + 1); leafInfo.setClause(refAbName_); leafInfo.setOperator(Operator.IN); QueryTemplate qt_ = getRefQT(refAbName_, clause, operator, ordinaryValue); LeafValue lValue = new LeafValue(); lValue.setQueryTemplate(qt_); leafInfo.setValue(lValue); qt.setId("qt_" + refAbName + "_" + refAbName_); }else{ leafInfo.setClause(clause); leafInfo.setOperator(operator); LeafValue lValue = new LeafValue(); lValue.setOrdinaryValue(ordinaryValue); leafInfo.setValue(lValue); qt.setId("qt_" + refAbName + "_" + clause); } ci.setLeafInfo(leafInfo); condition.setCIMap(ciMap); return qt; } /** * 返回查询的版本 * @return */ public int getVersion(String versionValue){ int version = 0; if(versionValue.equals("当前版本当前版次")){ version = 1; }else if(versionValue.equals("当前版本最新版次")){ version = 2; }else if(versionValue.equals("最新版本最新版次")){ version = 3; }else if(versionValue.equals("当前版次")){ version = 4; }else if(versionValue.equals("当前版本")){ version = 5; }else if(versionValue.equals("当前命名对象")){ version = 6; }else if(versionValue.equals("已发布的最新版本")){ version = 7; } return version; } /** * 校验参数 * @param qtd * @return */ private void checkName(QTD qtd) throws PLException { if (qtd.name.equals("")) { throw new PLException("500", new String[]{"请输入模板定义名"}); } if (!qtd.name.matches("[a-z A-Z]*")) { throw new PLException("500", new String[]{"模板定义名只能为英文字母"}); } if (platformClientUtil.getQTDService().isExistsQTD(qtd.name.toLowerCase())) { throw new PLException("500", new String[]{"该模板定义名已经被使用, 请更换"}); } } /** * 导出链接类型查询模板 * names 查询模板名 * @return */ @Override public void expLinkTemplate(String names, HttpServletResponse response) throws PLException, IOException { String defaultTempFolder = LocalFileUtil.getDefaultTempFolder(); String vciqtmfFileName = defaultTempFolder + File.separator + "LinkTemplateExp" + new Date().getTime() + ".vciqtf"; LinkQTExportData exportData = new LinkQTExportData(); String[] splits = names.split(","); for (String name : splits) { QTInfo qt = platformClientUtil.getQTDService().getQT(name); exportData.getAllQTs().put(qt.qtName,qt); LinkType linkType = platformClientUtil.getLinkTypeService().getLinkType(qt.btmName); if(linkType != null && !linkType.oid.equals("")){ exportData.getSelectedBtmItems().put(linkType.name, linkType); exportData.getSelectedBtmAttrs().put(linkType.name, linkType.attributes); exportData.getAllQTDs().put(linkType.name, platformClientUtil.getQTDService().getLinkTypeQTDs(linkType.name)); } } ObjectOutputStream vciamfFileStream = null; try { File vciqtmfFile = new File(vciqtmfFileName); vciamfFileStream = new ObjectOutputStream(new FileOutputStream(vciqtmfFile)); vciamfFileStream.writeObject(exportData); }finally { try { if (vciamfFileStream != null) { vciamfFileStream.flush(); vciamfFileStream.close(); } } catch (Exception e) { throw new PLException("500",new String[]{"导出流关闭异常!"}); } } ControllerUtil.writeFileToResponse(response,vciqtmfFileName); FileUtil.del(defaultTempFolder + File.separator); } /** * 导入链接类型查询模板 * @param file 上传的文件 * @return 导入结果 */ @Override public BaseResult impLinkTemplate(MultipartFile file) throws IOException, ClassNotFoundException { if (file == null) { return BaseResult.fail(FrameWorkLangCodeConstant.IMPORT_FAIL, new String[]{"无导入的文件"}); } if (!file.getOriginalFilename().endsWith(".vciqtf")) { throw new VciBaseException("仅能上传.vciqtf格式文件,请重新上传!"); } ObjectInputStream obj = new ObjectInputStream( file.getInputStream()); LinkQTExportData qtExportData = (LinkQTExportData) obj.readObject(); List ltsNew = new ArrayList<>(); List qTWrapperNew = new ArrayList<>(); Map norepQTDs = new HashMap(); addImportData(qtExportData, ltsNew, qTWrapperNew, norepQTDs); QTInfo[] qts = qTWrapperNew .toArray(new QTInfo[qTWrapperNew.size()]); //处理树的返回 HashMap tree = new HashMap(); tree.put("text","链接类型"); List> childList = new ArrayList<>(); //添加业务类型根节点 for (LinkType plAction : ltsNew) { HashMap childTree = new HashMap(); childTree.put("text", plAction.tag + "/" +plAction.name); childTree.put("oid", plAction.oid); addExportTreeNode(plAction, qts, childTree); childList.add(childTree); } tree.put("children", childList); return BaseResult.success(tree); } // 数据过滤 private void addImportData(LinkQTExportData qtExportData, List ltsNew, List qTWrapperNew, Map norepQTDs) { Map allQTDs = qtExportData .getAllQTDs(); Map selectedBtmItems = qtExportData .getSelectedBtmItems(); Map selectedBtmAttrs = qtExportData .getSelectedBtmAttrs(); Map allSelectedQTs = qtExportData .getAllQTs(); if (allQTDs.size() == 0 || allQTDs == null || selectedBtmItems.size() == 0 || selectedBtmItems == null || selectedBtmAttrs.size() == 0 || selectedBtmAttrs == null || allSelectedQTs.size() == 0 || allSelectedQTs == null) { throw new VciBaseException("导入的模板数据有误!!!"); } Set> pLActions = allQTDs.entrySet(); Set> pLQts = allSelectedQTs.entrySet(); Set> LinkpLQts = selectedBtmItems.entrySet(); for (Map.Entry entry : pLActions) { String string = entry.getKey(); QTD[] qtds = entry.getValue(); getPLQtIsInDB(string, qtds, norepQTDs); } for (Map.Entry entry : LinkpLQts) { String string = entry.getKey(); LinkType LinkType = entry.getValue(); getPLQtBtmItem(string, LinkType, ltsNew); } Map newNorepQTDs = getnewNorepQTDs(norepQTDs,allSelectedQTs); for (Map.Entry entry : pLQts) { String string = entry.getKey(); QTInfo qtWrapper = entry.getValue(); getPLQtWrapper(string, qtWrapper, ltsNew, qTWrapperNew, newNorepQTDs); } } /** * 查询模板定义的处理 * @param string * @param qtds */ private void getPLQtIsInDB(String string, QTD[] qtds, Map norepQTDs) { // TODO Auto-generated method stub try { QTD[] qtds2 = platformClientUtil.getQTDService().getBizTypeQTDs(string); QTD[] qtdsNewQtds = null; List es = new ArrayList<>(); for (QTD qtd : qtds) { boolean isleat = true; for (int i = 0; i < qtds2.length; i++) { if (qtd.name.equals(qtds2[i].name)) { isleat = false; break; } } if (isleat) { es.add(qtd); } } if (es.size() != 0) { qtdsNewQtds = es.toArray(new QTD[es.size()]); norepQTDs.put(string, qtdsNewQtds); } } catch (PLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void getPLQtBtmItem(String string, LinkType linkType, List ltsNew) { // TODO Auto-generated method stub try { LinkType queryLinkType = platformClientUtil.getLinkTypeService().getLinkType(string); LinkType[] btmArray = platformClientUtil.getLinkTypeService().getLinkTypes(); String[] strings = queryLinkType.attributes; String[] stringsFrom = queryLinkType.btmItemsFrom; String[] stringsTo = queryLinkType.btmItemsTo; boolean b = true; for (int i = 0; i < btmArray.length; i++) { if (btmArray[i].name.equals(string)) { b = false; if (Arrays.equals(linkType.attributes, strings) && Arrays .equals(linkType.btmItemsFrom, stringsFrom) && Arrays.equals(linkType.btmItemsTo, stringsTo)) { btmArray[i].name += "【链接类型已存在】"; /* this.btmArray[i] = btmArray[i]; */ ltsNew.add(btmArray[i]); } else { btmArray[i].name += "【链接类型存在但属性不一致】"; ltsNew.add(btmArray[i]); } } } if (b) { linkType.name += "【链接类型不存在】"; ltsNew.add(linkType); } } catch (PLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void getPLQtBtmItem2(String string, BizType bizType, List ltsNew) { // TODO Auto-generated method stub try { BizType queryBizType = platformClientUtil.getBtmService().getBizTypes(string)[0]; BizType[] btmArray = platformClientUtil.getBtmService().getBizTypes(""); String[] strings = queryBizType.apNameArray; boolean b = true; for (int i = 0; i < btmArray.length; i++) { if (btmArray[i].name.equals(string)) { b = false; if (Arrays.equals(bizType.apNameArray, strings)) { btmArray[i].name += "【业务类型已存在】"; ltsNew.add(btmArray[i]); } else { btmArray[i].name += "【业务类型存在但属性不一致】"; ltsNew.add(btmArray[i]); } } } if (b) { bizType.name += "【业务类型不存在】"; ltsNew.add(bizType); } } catch (PLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void getPLQtWrapper(String string, QTInfo qtWrapper, List ltsNew, List qTWrapperNew, Map newNorepQTDs) { try { QTInfo[] qtws = platformClientUtil.getQTDService().getAllQTs(); boolean islaet = true; for (int i = 0; i < qtws.length; i++) { if (string.equals(qtws[i].qtName)) { islaet = false; for (LinkType lt : ltsNew) { if (qtWrapper.btmName.equals(lt.name.substring(0, lt.name.indexOf("【")))) { if (lt.name.endsWith("【链接类型已存在】")) { qtWrapper.qtName += "【查询模板已存在,不导入】"; qTWrapperNew.add(qtWrapper); }else if(lt.name.endsWith("【链接类型存在但属性不一致】")){ qtWrapper.qtName += "【查询模板所属链接类型属性不一致,不导入】"; qTWrapperNew.add(qtWrapper); }else{ qtWrapper.qtName += "【查询模板所属链接类型不存在,不导入】"; qTWrapperNew.add(qtWrapper); } } } } } if (islaet) { for (LinkType btmItem : ltsNew) { if (qtWrapper.btmName.equals(btmItem.name.substring(0, btmItem.name.indexOf("【")))) { if (btmItem.name.endsWith("【链接类型已存在】")) { //判断查询模板定义是否存在,进行保存 QTD[] qtds = newNorepQTDs.get(qtWrapper.btmName); if(qtds != null){ for (QTD qtd : qtds) { QTD qtdByName = platformClientUtil.getQTDService().getQTDByName(qtd.name); if(!(qtdByName != null && StringUtils.isNotBlank(qtdByName.name))){ boolean b = platformClientUtil.getQTDService().addQTD(qtd); if(!b){ qtWrapper.qtName += qtWrapper.qtName+"导入查询模板定义【" + qtdByName.name + "】失败!"; } } } newNorepQTDs.remove(qtWrapper.btmName); } boolean success = platformClientUtil.getQTDService().saveQT(qtWrapper); if(!success){ qtWrapper.qtName += qtWrapper.qtName+"导入失败!"; }else { qtWrapper.qtName += "【查询模板导入成功!】"; } qTWrapperNew.add(qtWrapper); }else if(btmItem.name.endsWith("【链接类型存在但属性不一致】")){ qtWrapper.qtName += "【查询模板所属链接类型属性不一致,不导入】"; qTWrapperNew.add(qtWrapper); }else{ qtWrapper.qtName += "【查询模板所属链接类型不存在,不导入】"; qTWrapperNew.add(qtWrapper); } } } } } catch (PLException e) { e.printStackTrace(); } } private void getPLBtmQtWrapper(String string, QTInfo qtWrapper, List ltsNew, List qTWrapperNew, Map newNorepQTDs) { try { QTInfo[] qtws = platformClientUtil.getQTDService().getAllQTs(); boolean islaet = true; for (int i = 0; i < qtws.length; i++) { if (string.equals(qtws[i].qtName)) { islaet = false; for (BizType lt : ltsNew) { if (qtWrapper.btmName.equals(lt.name.substring(0, lt.name.indexOf("【")))) { if (lt.name.endsWith("【业务类型已存在】")) { qtWrapper.qtName += "【查询模板已存在,不导入】"; qTWrapperNew.add(qtWrapper); }else if(lt.name.endsWith("【业务类型存在但属性不一致】")){ qtWrapper.qtName += "【查询模板所属业务类型属性不一致,不导入】"; qTWrapperNew.add(qtWrapper); }else{ qtWrapper.qtName += "【查询模板所属业务类型不存在,不导入】"; qTWrapperNew.add(qtWrapper); } } } } } if (islaet) { for (BizType btmItem : ltsNew) { if (qtWrapper.btmName.equals(btmItem.name.substring(0, btmItem.name.indexOf("【")))) { if (btmItem.name.endsWith("【业务类型已存在】")) { //判断查询模板定义是否存在,进行保存 QTD[] qtds = newNorepQTDs.get(qtWrapper.btmName); if(qtds != null){ for (QTD qtd : qtds) { QTD qtdByName = platformClientUtil.getQTDService().getQTDByName(qtd.name); if(!(qtdByName != null && StringUtils.isNotBlank(qtdByName.name))){ boolean b = platformClientUtil.getQTDService().addQTD(qtd); if(!b){ qtWrapper.qtName += qtWrapper.qtName+"导入查询模板定义【" + qtdByName.name + "】失败!"; } } } newNorepQTDs.remove(qtWrapper.btmName); } boolean success = platformClientUtil.getQTDService().saveQT(qtWrapper); if(!success){ qtWrapper.qtName += qtWrapper.qtName+"导入失败!"; }else { qtWrapper.qtName += "【查询模板导入成功!】"; } qTWrapperNew.add(qtWrapper); }else if(btmItem.name.endsWith("【业务类型存在但属性不一致】")){ qtWrapper.qtName += "【查询模板所属业务类型属性不一致,不导入】"; qTWrapperNew.add(qtWrapper); }else{ qtWrapper.qtName += "【查询模板所属业务类型不存在,不导入】"; qTWrapperNew.add(qtWrapper); } } } } } catch (PLException e) { e.printStackTrace(); } } //根据选择的查询模板过滤模板定义 private Map getnewNorepQTDs(Map norepQTDs, Map allQTs) { // TODO Auto-generated method stub Map map = new HashMap(); Set> pLQts = allQTs.entrySet(); Set> pLActions = norepQTDs.entrySet(); for (Map.Entry entrys : pLActions) { for (Map.Entry entry : pLQts) { if(entry.getValue().btmName.equals(entrys.getKey())){ map.put(entrys.getKey(), entrys.getValue()); } } } return map; } /** * 查询方案删除 * @param names 查询方案名 * @return 操作结果 */ @Override public BaseResult deleteLinkTemplate(String names) throws PLException { if(StringUtils.isBlank(names)){ return BaseResult.fail("请选择查询方案!"); } String[] nameSplit = names.split(","); boolean b = platformClientUtil.getQTDService().deleteQTs(nameSplit); if(!b){ return BaseResult.fail("删除失败!!!"); } return BaseResult.success("查询模板删除成功!"); } /** * @param qtInfoDTO 传输的数据对象: * linkTypeName 链接类型、 * rdPositive 方向,true正向,false反向 * btmName 业务类型名称 * combRelaType 业务类型选择值 * versionValue 版本班次值 * isQueryIsLeaf 是否选择下级 * level 子节点层数 * @return 查询结果 */ @Override public BaseResult getCriteriaBtm(QTInfoDTO qtInfoDTO) throws PLException { QueryTemplate qt = getQT(qtInfoDTO,false); String checkInfo = OQTool.checkQT(qt); if(!checkInfo.equals("OK")){ throw new PLException("500", new String[]{checkInfo}); } qt.setId("qt1"); BusinessObject[] result = platformClientUtil.getQueryService().findBTMObjects(qt.getId(), OQTool.qtTOXMl(qt).asXML()); return BaseResult.dataList(Arrays.asList(result)); } /** * 业务类型查询模板保存 * @param qtInfoDTO 保存传输对象 * @return 保存结果 */ @Override public BaseResult btmSave(QTInfoDTO qtInfoDTO) throws PLException { VciBaseUtil.alertNotNull( qtInfoDTO,"保存的业务类型模板对象", qtInfoDTO.getBtmName(),"请选择业务类型和查询模板定义来创建查询模板" ); //add by caill start 遍历普通查询模板输入框中的值做校验 // ArrayList list = cpm_centerPanel.getList(); // for(int i=0;i tree = new HashMap(); tree.put("text","业务类型"); if (bizTypes == null) { List es = new ArrayList<>(); bizTypes = platformClientUtil.getBtmService().getBizTypes(""); for (BizType lt : bizTypes) { QTInfo[] qtWrappers = platformClientUtil.getQTDService().getObjTypeQTs(lt.name); if (qtWrappers.length!=0) { es.add(lt); } } bizTypes = es.toArray(new BizType[es.size()]); //TODO:需修正没有关联查询模板业务类型去掉 qts = platformClientUtil.getQTDService().getAllQTs();//获取所有查询模板 } List> childList = new ArrayList<>(); //添加业务类型根节点 for (BizType plAction : bizTypes) { HashMap childTree = new HashMap(); childTree.put("text", plAction.label + "/" +plAction.name); childTree.put("oid", plAction.oid); //tree.put("children", childTree); addExportTreeNode(plAction, qts, childTree); childList.add(childTree); } tree.put("children", childList); return BaseResult.success(tree); } /** * 导出业务类型查询模板 * names 查询模板名 * @return */ @Override public void expBtmQTTemplate(List names, HttpServletResponse response) throws PLException, IOException { String defaultTempFolder = LocalFileUtil.getDefaultTempFolder(); String vciqtmfFileName = defaultTempFolder + File.separator + "BtmTemplateExp" + new Date().getTime() + ".vciqtf"; BtmQTExportData exportData = new BtmQTExportData(); for (String name : names) { QTInfo qt = platformClientUtil.getQTDService().getQT(name); exportData.getAllQTs().put(qt.qtName,qt); BizType[] bizTypes = platformClientUtil.getBtmService().getBizTypes(qt.btmName); for (int i = 0; i < bizTypes.length; i++) { BizType bizType = bizTypes[i]; if(bizTypes != null && !bizType.oid.equals("")){ exportData.getSelectedBtmItems().put(bizType.name, bizType); exportData.getSelectedBtmAttrs().put(bizType.name, bizType.apNameArray); exportData.getAllQTDs().put(bizType.name, platformClientUtil.getQTDService().getBizTypeQTDs(bizType.name)); } } } ObjectOutputStream vciamfFileStream = null; try { File vciqtmfFile = new File(vciqtmfFileName); vciamfFileStream = new ObjectOutputStream(new FileOutputStream(vciqtmfFile)); vciamfFileStream.writeObject(exportData); }finally { try { if (vciamfFileStream != null) { vciamfFileStream.flush(); vciamfFileStream.close(); } } catch (Exception e) { throw new PLException("500",new String[]{"导出流关闭异常!"}); } } ControllerUtil.writeFileToResponse(response,vciqtmfFileName); FileUtil.del(defaultTempFolder + File.separator); } /** * 查询条件下的选择查询模板对话框(查询全部模板和所对应的业务类型或链接类型名) * @return */ @Override public BaseResult getAllQTs() throws PLException { QTInfo[] allQTs = platformClientUtil.getQTDService().getAllQTs(); DataGrid dataGrid = new DataGrid<>(); dataGrid.setData(Arrays.asList(allQTs)); dataGrid.setTotal(allQTs.length); return BaseResult.dataGrid(dataGrid); } /** * 导入业务类型查询模板 * @param file 上传的文件 * @return 导入结果 */ @Override public BaseResult impBtmTemplate(MultipartFile file) throws IOException, ClassNotFoundException { if (file == null) { return BaseResult.fail(FrameWorkLangCodeConstant.IMPORT_FAIL, new String[]{"无导入的文件"}); } if (!file.getOriginalFilename().endsWith(".vciqtf")) { throw new VciBaseException("仅能上传.vciqtf格式文件,请重新上传!"); } ObjectInputStream obj = new ObjectInputStream( file.getInputStream()); BtmQTExportData qtExportData = (BtmQTExportData) obj.readObject(); List ltsNew = new ArrayList<>(); List qTWrapperNew = new ArrayList<>(); Map norepQTDs = new HashMap(); addImportBtmData(qtExportData, ltsNew, qTWrapperNew, norepQTDs); QTInfo[] qts = qTWrapperNew .toArray(new QTInfo[qTWrapperNew.size()]); //处理树的返回 HashMap tree = new HashMap(); tree.put("text","业务类型"); List> childList = new ArrayList<>(); //添加业务类型根节点 for (BizType plAction : ltsNew) { HashMap childTree = new HashMap(); childTree.put("text", plAction.label + "/" +plAction.name); childTree.put("oid", plAction.oid); addExportTreeNode(plAction, qts, childTree); childList.add(childTree); } tree.put("children", childList); return BaseResult.success(tree); } /** * 查询模板的列表添加了字段的相关属性 * @param btmName 类型 * @param linkFlag 是否链接类型 :true 链接类型 ,false 业务类型 * @param direction 正反方向 * @return 查询模板的列表 */ @Override public BaseResult queryTemplateListByAttr(String btmName, Boolean linkFlag, String direction) throws PLException { //返回的界面下拉框显示树 List qtddtos = new ArrayList<>(); //将链接类型与业务类型的所有默认字段查询出来放到map里面方便后续调用 Map allSysAttr = Arrays.stream(platformClientUtil.getBtmService().getSysAttributeDefs()).collect(Collectors.toMap(e -> e.name, e -> e)); allSysAttr.putAll(Arrays.stream(platformClientUtil.getLinkTypeService().getSysAttributeDefs()).collect(Collectors.toMap(e -> e.name, e -> e))); QTD[] qtdArray = null; //查询相关类型的查询模板进行处理 if(linkFlag){ qtdArray = platformClientUtil.getQTDService().getLinkTypeQTDs(btmName); }else { qtdArray = platformClientUtil.getQTDService().getBizTypeQTDs(btmName); } for (QTD qtd : qtdArray) { QTDDTO qtddto = new QTDDTO(); qtddto.setName(qtd.name); qtddto.setCreateTime(qtd.createTime); qtddto.setLinkTypeName(qtd.linkTypeName); qtddto.setBtmName(qtd.btmName); qtddto.setCreator(qtd.creator); for (String abName : qtd.abNames) { AttributeDef att = platformClientUtil.getAttributeService().getAttributeDefByName(abName); //如果在属性接口中没有查到相关字段应该就在默认字段中 if(att == null || "".equals(att.oid)){ att = allSysAttr.get(abName.toLowerCase()); } if(direction != null) { if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { if(att == null ){ continue; // throw new PLException("500",new String[]{"属性字段:"+ abName +"未查询到,请确认!"}); } att.name = "T_OID." + abName; } else if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) { if(att == null ){ continue; // throw new PLException("500",new String[]{"属性字段:"+ abName +"未查询到,请确认!"}); } att.name = "F_OID." + abName; } }else{ att.name = abName; } AttributeDefDTO attrDto = new AttributeDefDTO(); attrDto.setDescription(att.description); attrDto.setLabel(att.label); attrDto.setOid(att.oid); attrDto.setCreator(att.creator); attrDto.setName(att.name); attrDto.setDefValue(att.defValue); attrDto.setLayersNum(1); attrDto.setRage(att.rage); attrDto.setVtDataType(att.vtDataType); attrDto.setOther(att.other); qtddto.getAttrs().add(attrDto); addNode(attrDto, allSysAttr); } qtddtos.add(qtddto); } return BaseResult.dataList(qtddtos); } /** * 子节点处理 * @param attributeDefByName 父节点的属性信息 * @param allSysAttr 所有默认字段 */ private void addNode(AttributeDefDTO attributeDefByName, Map allSysAttr){ if(attributeDefByName.getLayersNum() >= 3){ return; } String abName = attributeDefByName.name; //取node上的最后一个属性名 if(abName.contains(".")){ abName = abName.substring(abName.lastIndexOf(".") + 1); } if(SystemAttribute.sysAttList().contains(abName.toUpperCase())){ return; } AttributeDef abItem = null; try { abItem = platformClientUtil.getAttributeService().getAttributeDefByName(abName); String other = abItem.other; // String btmName = ApProvider.getInstance().getOtherValueByType(other, BTM); OtherInfo otherInfo = OtherInfo.getOtherInfoByText(other); int refFlag = otherInfo.getRefFlag(); String refTypeName = otherInfo.getRefTypeName(); if(refFlag != -1){ //参照业务类型 if(refFlag == 0){ //pName: 为参照属性名加上路径 String pName = attributeDefByName.name + "."; String[] abNames = platformClientUtil.getBtmService().getAttributeNames(refTypeName); for(int i = 0; i < abNames.length; i++){ String abName_ = abNames[i]; AttributeDef att = platformClientUtil.getAttributeService().getAttributeDefByName(abName_); if(att == null || "".equals(att.oid)){ att = allSysAttr.get(abName_.toLowerCase()); } att.name = pName + abName_ ; AttributeDefDTO attrDto = new AttributeDefDTO(); attrDto.setDescription(att.description); attrDto.setLabel(att.label); attrDto.setOid(att.oid); attrDto.setLayersNum(attributeDefByName.getLayersNum() + 1); attrDto.setCreator(att.creator); attrDto.setName(att.name); attrDto.setDefValue(att.defValue); attrDto.setRage(att.rage); attrDto.setVtDataType(att.vtDataType); attrDto.setOther(att.other); attributeDefByName.getAttrs().add(attrDto); addNode(attrDto, allSysAttr); } //系统属性ID,NAME,DESCRIPTION for (int i = 0; i < SystemAttribute.bosysAttList().size(); i++) { AttributeDef attributeDef = allSysAttr.get(SystemAttribute.bosysAttList().get(i).toLowerCase()); AttributeDefDTO attrDto = new AttributeDefDTO(); attrDto.setDescription(attributeDef.description); attrDto.setLabel(attributeDef.label); attrDto.setOid(attributeDef.oid); attrDto.setLayersNum(attributeDefByName.getLayersNum() + 1); attrDto.setCreator(attributeDef.creator); attrDto.setName(pName + SystemAttribute.bosysAttList().get(i)); attrDto.setDefValue(attributeDef.defValue); attrDto.setRage(attributeDef.rage); attrDto.setVtDataType(attributeDef.vtDataType); attrDto.setOther(attributeDef.other); attributeDefByName.getAttrs().add(attrDto); addNode(attrDto, allSysAttr); } //参照链接类型 }else if(refFlag == 1){ //pName: 为参照属性名加上路径 String pName = attributeDefByName.name + "."; LinkType link = null; try { link = platformClientUtil.getLinkTypeService().getLinkType(refTypeName); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Throwable e) { // TODO Auto-generated catch block e.printStackTrace(); } if(link != null){ String[] abNames = link.attributes; for(int i = 0; i < abNames.length; i++){ String abName_ = abNames[i]; AttributeDef att = platformClientUtil.getAttributeService().getAttributeDefByName(abName_); if(att == null || att.oid.equals("")){ att = allSysAttr.get(abName_.toLowerCase()); } AttributeDefDTO attrDto = new AttributeDefDTO(); attrDto.setDescription(att.description); attrDto.setLabel(att.label); attrDto.setOid(att.oid); attrDto.setLayersNum(attributeDefByName.getLayersNum() + 1); attrDto.setCreator(att.creator); attrDto.setName(pName + abName_); attrDto.setDefValue(att.defValue); attrDto.setRage(att.rage); attrDto.setVtDataType(att.vtDataType); attrDto.setOther(att.other); attributeDefByName.getAttrs().add(attrDto); addNode(attrDto, allSysAttr); } //系统属性ID,NAME,DESCRIPTION for (int i = 0; i < SystemAttribute.losysAttList().size(); i++) { AttributeDef sysAttributeDefs = allSysAttr.get(SystemAttribute.losysAttList().get(i).toLowerCase()); AttributeDefDTO attrDto = new AttributeDefDTO(); attrDto.setDescription(sysAttributeDefs.description); attrDto.setLabel(sysAttributeDefs.label); attrDto.setOid(sysAttributeDefs.oid); attrDto.setLayersNum(attributeDefByName.getLayersNum() + 1); attrDto.setCreator(sysAttributeDefs.creator); attrDto.setName(pName + SystemAttribute.losysAttList().get(i)); attrDto.setDefValue(sysAttributeDefs.defValue); attrDto.setRage(sysAttributeDefs.rage); attrDto.setVtDataType(sysAttributeDefs.vtDataType); attrDto.setOther(sysAttributeDefs.other); attributeDefByName.getAttrs().add(attrDto); addNode(attrDto, allSysAttr); } } } } } catch (PLException e) { e.printStackTrace(); } } // 数据过滤 private void addImportBtmData(BtmQTExportData qtExportData, List ltsNew, List qTWrapperNew, Map norepQTDs) { Map allQTDs = qtExportData .getAllQTDs(); Map selectedBtmItems = qtExportData .getSelectedBtmItems(); Map selectedBtmAttrs = qtExportData .getSelectedBtmAttrs(); Map allSelectedQTs = qtExportData .getAllQTs(); if (allQTDs.size() == 0 || allQTDs == null || selectedBtmItems.size() == 0 || selectedBtmItems == null || selectedBtmAttrs.size() == 0 || selectedBtmAttrs == null || allSelectedQTs.size() == 0 || allSelectedQTs == null) { throw new VciBaseException("导入的模板数据有误!!!"); } Set> pLActions = allQTDs.entrySet(); Set> pLQts = allSelectedQTs.entrySet(); Set> btmpLQts = selectedBtmItems.entrySet(); for (Map.Entry entry : pLActions) { String string = entry.getKey(); QTD[] qtds = entry.getValue(); getPLQtIsInDB(string, qtds, norepQTDs); } for (Map.Entry entry : btmpLQts) { String string = entry.getKey(); BizType bizType = entry.getValue(); getPLQtBtmItem2(string, bizType, ltsNew); } Map newNorepQTDs = getnewNorepQTDs(norepQTDs,allSelectedQTs); for (Map.Entry entry : pLQts) { String string = entry.getKey(); QTInfo qtWrapper = entry.getValue(); getPLBtmQtWrapper(string, qtWrapper, ltsNew, qTWrapperNew, newNorepQTDs); } } /** * 生成导出树选择以及导入树显示 * @param bizType * @param qts * @param tree */ private void addExportTreeNode(BizType bizType/*业务类型*/,QTInfo[] qts/*查询模板对象*/,HashMap tree) { List childList = new ArrayList<>(); // 添加查询模板对象子节点 for (QTInfo qtItem : qts) { //处理导入时无法进行类型判断 int splitLength = bizType.name.indexOf("【"); if(splitLength == -1){ splitLength = bizType.name.length(); } if (qtItem.btmName.equals(bizType.name.substring(0, splitLength))) { childList.add(qtItem.qtName); } } tree.put("children",childList); } }