业务类型树查询接口新增UIDataTree用来专门返回key:list形式的参数,修改多处Map<String,String>为Map<String,Object>。
已修改25个文件
已添加2个文件
1193 ■■■■ 文件已修改
Bin/lib/service/MsgService.jar 补丁 | 查看 | 原始文档 | blame | 历史
Bin/properties/menuConfig.json 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/OsBtmTypeDTO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsBtmTypeVO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/ReferConfigVO.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/UITreeDefineVO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/po/OsBtmTypePO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/BaseResult.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/BaseTree.java 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/Tree.java 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/UIDataTree.java 395 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciBaseUtil.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmPwdStrategyQueryServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/controller/SmUserQueryController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/LoginController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/query/UIBaseQuery.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/query/UIDataGridQuery.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/query/UILinkTypeDataQuery.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/query/UITreeQuery.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/UIDataServiceI.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/WebBoServiceI.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/WebLoServiceI.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIDataServiceImpl.java 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBoServiceImpl.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebLoServiceImpl.java 补丁 | 查看 | 原始文档 | blame | 历史
Bin/lib/service/MsgService.jar
Binary files differ
Bin/properties/menuConfig.json
@@ -1,4 +1,5 @@
{
  "sysModuleNode": {
  "hasChildren": true,
  "children": [
    {
@@ -9,6 +10,7 @@
      "parentId": "VCIBaseTreeNode",
      "code": "systemManagmentNode",
      "alias": "system",
        "category": "0",
      "meta": {
        "keepAlive": false
      },
@@ -24,6 +26,7 @@
      "parentId": "VCIBaseTreeNode",
      "code": "modelManagmentNode",
      "alias": "model",
        "category": "0",
      "meta": {
        "keepAlive": false
      },
@@ -39,6 +42,7 @@
      "parentId": "VCIBaseTreeNode",
      "code": "operateNode",
      "alias": "operate",
        "category": "0",
      "meta": {
        "keepAlive": false
      },
@@ -54,6 +58,7 @@
      "parentId": "VCIBaseTreeNode",
      "code": "sysOptionNode",
      "alias": "sysOption",
        "category": "0",
      "meta": {
        "keepAlive": false
      },
@@ -69,6 +74,7 @@
      "parentId": "VCIBaseTreeNode",
      "code": "sysMonitorNode",
      "alias": "sysMonitor",
        "category": "0",
      "meta": {
        "keepAlive": false
      },
@@ -82,10 +88,63 @@
  "parentId": "systemManagmentNode",
  "code": "rootNode",
  "alias": "root",
    "category": "0",
  "meta": {
    "keepAlive": false
  },
  "sort": 0,
  "soruce": "",
  "path": ""
  },
  "systemManagmentNode": {
    "hasChildren": true,
    "children": [],
    "childType": -1,
    "id": "systemManagmentNode",
    "name": "管理功能模块",
    "parentId": "VCIBaseTreeNode",
    "code": "systemManagmentNode",
    "alias": "system",
    "category": "0",
    "meta": {
      "keepAlive": false
    },
    "sort": 2,
    "soruce": "",
    "path": "views/systemModel/mangeModel/index"
  },
  "modelManagmentNode": {
    "hasChildren": true,
    "children": [],
    "childType": -1,
    "id": "modelManagmentNode",
    "name": "业务功能模块",
    "parentId": "VCIBaseTreeNode",
    "code": "modelManagmentNode",
    "alias": "model",
    "category": "0",
    "meta": {
      "keepAlive": false
    },
    "sort": 3,
    "soruce": "",
    "path": "views/systemModel/businessModel/index"
  },
  "operateNode": {
    "hasChildren": true,
    "children": [],
    "childType": -1,
    "id": "operateNode",
    "name": "操作类型管理",
    "parentId": "VCIBaseTreeNode",
    "code": "operateNode",
    "alias": "operate",
    "category": "0",
    "meta": {
      "keepAlive": false
    },
    "sort": 4,
    "soruce": "",
    "path": "views/systemModel/operateType/index"
  }
}
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/OsBtmTypeDTO.java
@@ -155,6 +155,19 @@
     */
    private Date lastModifyTime;
    /**
     * å›¾ç‰‡åç§°
     */
    private String imageName;
    public void setImageName(String imageName) {
        this.imageName = imageName;
    }
    public String getImageName() {
        return imageName;
    }
    public void setApNameArray(String apNameArray) {
        this.apNameArray = apNameArray;
    }
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsBtmTypeVO.java
@@ -183,6 +183,19 @@
    private String[] apNameArray;
    /**
     * å›¾ç‰‡åç§°
     */
    private String imageName;
    public void setImageName(String imageName) {
        this.imageName = imageName;
    }
    public String getImageName() {
        return imageName;
    }
    /**
     * åŒ…含属性
     */
    private List<OsBtmTypeAttributeVO> attributes;
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/ReferConfigVO.java
@@ -92,7 +92,7 @@
    /**
     * æ›¿æ¢çš„æ˜ å°„
     */
    private Map<String,String> replaceMap = new HashMap<String, String>();
    private Map<String,Object> replaceMap = new HashMap<>();
    /**
     * æŽ’序字段
@@ -192,11 +192,11 @@
        this.conditionMap = conditionMap;
    }
    public Map<String, String> getReplaceMap() {
    public Map<String, Object> getReplaceMap() {
        return replaceMap;
    }
    public void setReplaceMap(Map<String, String> replaceMap) {
    public void setReplaceMap(Map<String, Object> replaceMap) {
        this.replaceMap = replaceMap;
    }
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/UITreeDefineVO.java
@@ -22,9 +22,9 @@
    private String loadType;
    /**
     * æ˜¯å¦åå‘
     * æ˜¯å¦åå‘,TODO:树定义上已经没有使用这个字段了
     */
    private boolean orientation = false;
    //private boolean orientation = false;
    /**
     * æ˜¾ç¤ºå›¾æ ‡
@@ -77,13 +77,13 @@
        this.loadType = loadType;
    }
    public boolean isOrientation() {
    /*public boolean isOrientation() {
        return orientation;
    }
    public void setOrientation(boolean orientation) {
        this.orientation = orientation;
    }
    }*/
    public boolean isShowImage() {
        return showImage;
@@ -146,7 +146,6 @@
        return "UITreeDefineVO{" +
                "btmType='" + btmType + '\'' +
                ", loadType='" + loadType + '\'' +
                ", orientation=" + orientation +
                ", showImage=" + showImage +
                ", rootContent='" + rootContent + '\'' +
                ", linkType='" + linkType + '\'' +
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/po/OsBtmTypePO.java
@@ -88,6 +88,11 @@
    private short verRuleName;
    /**
     * å›¾ç‰‡åç§°
     */
    private String imageName;
    /**
     * btmItemsTo
     */
    @ExcelColumn(value="生命周期")
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/BaseResult.java
@@ -90,7 +90,7 @@
    /**
     * æ ‘的数据
     */
    private Collection<Tree> treeData;
    private Collection<BaseTree> treeData;
    public Object[] getMsgObjs() {
        return msgObjs;
@@ -196,11 +196,11 @@
        this.data = data;
    }
    public Collection<Tree> getTreeData() {
    public Collection<BaseTree> getTreeData() {
        return treeData;
    }
    public void setTreeData(Collection<Tree> treeData) {
    public void setTreeData(Collection<BaseTree> treeData) {
        this.treeData = treeData;
    }
@@ -411,7 +411,7 @@
     * @param treeList æ ‘节点集合
     * @return ç»Ÿä¸€æ•°æ®å¯¹è±¡
     */
    public static BaseResult tree(Collection<Tree> treeList){
    public static BaseResult tree(Collection<? extends BaseTree> treeList){
        BaseResult baseResult = new BaseResult<>();
        baseResult.setCode(ResultCodeEnum.SUCCESS.code);
        baseResult.setSuccess(true);
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/BaseTree.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,226 @@
package com.vci.starter.web.pagemodel;
import java.util.ArrayList;
import java.util.List;
/**
 * @author ludc
 * @date 2024/11/27 16:53
 */
public class BaseTree implements java.io.Serializable{
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
     * @serial åºåˆ—化值
     */
    private static final long serialVersionUID = 6886695271635257122L;
    /**
     * ä¸»é”®
     */
    private String oid;
    /**
     * æ˜¾ç¤ºæ–‡æœ¬
     */
    private String text;
    /**
     * ç¼–号
     */
    private String id;
    /**
     * æ˜¯å¦å¶å­
     */
    private boolean leaf = false;
    /**
     * æ˜¯å¦æ˜¾ç¤ºå¤é€‰æ¡†
     */
    private boolean showCheckbox = false;
    /**
     * æ˜¯å¦é»˜è®¤é€‰ä¸­
     */
    private boolean checked = false;
    /**
     * å±‚级
     */
    private  int level;
    /**
     * å›¾æ ‡
     */
    private String icon;
    /**
     * å›¾æ ‡æ ·å¼
     */
    private String iconCls;
    /**
     * ä¸Šçº§èŠ‚ç‚¹
     */
    private String parentId;
    /**
     * ä¸Šçº§èŠ‚ç‚¹çš„åç§°
     */
    private String parentName;
    /**
     * ä¸Šçº§èŠ‚ç‚¹çš„ä¸šåŠ¡ç±»åž‹
     */
    private String parentBtmName;
    /**
     * æ˜¯å¦å±•å¼€
     */
    private boolean expanded = false;
    /**
     * é“¾æŽ¥
     */
    private String href;//layui和extjs使用href,easyui使用url,统一href
    /**
     * æŽ’序索引
     */
    private String index;
    /**
     * å½“前数据对象
     */
    private Object data;
    public void setOid(String oid) {
        this.oid = oid;
    }
    public void setText(String text) {
        this.text = text;
    }
    public void setId(String id) {
        this.id = id;
    }
    public void setLeaf(boolean leaf) {
        this.leaf = leaf;
    }
    public void setShowCheckbox(boolean showCheckbox) {
        this.showCheckbox = showCheckbox;
    }
    public void setChecked(boolean checked) {
        this.checked = checked;
    }
    public void setLevel(int level) {
        this.level = level;
    }
    public void setIcon(String icon) {
        this.icon = icon;
    }
    public void setIconCls(String iconCls) {
        this.iconCls = iconCls;
    }
    public void setParentId(String parentId) {
        this.parentId = parentId;
    }
    public void setParentName(String parentName) {
        this.parentName = parentName;
    }
    public void setParentBtmName(String parentBtmName) {
        this.parentBtmName = parentBtmName;
    }
    public void setExpanded(boolean expanded) {
        this.expanded = expanded;
    }
    public void setHref(String href) {
        this.href = href;
    }
    public void setIndex(String index) {
        this.index = index;
    }
    public void setData(Object data) {
        this.data = data;
    }
    public String getOid() {
        return oid;
    }
    public String getText() {
        return text;
    }
    public String getId() {
        return id;
    }
    public boolean isLeaf() {
        return leaf;
    }
    public boolean isShowCheckbox() {
        return showCheckbox;
    }
    public boolean isChecked() {
        return checked;
    }
    public int getLevel() {
        return level;
    }
    public String getIcon() {
        return icon;
    }
    public String getIconCls() {
        return iconCls;
    }
    public String getParentId() {
        return parentId;
    }
    public String getParentName() {
        return parentName;
    }
    public String getParentBtmName() {
        return parentBtmName;
    }
    public boolean isExpanded() {
        return expanded;
    }
    public String getHref() {
        return href;
    }
    public String getIndex() {
        return index;
    }
    public Object getData() {
        return data;
    }
}
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/Tree.java
@@ -12,7 +12,7 @@
 * @author weidy
 *
 */
public class Tree implements java.io.Serializable{
public class Tree extends BaseTree implements java.io.Serializable{
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
@@ -48,93 +48,22 @@
        setData(o);
    }
    /**
     * ä¸»é”®
     */
    private String oid;
    /**
     * æ˜¾ç¤ºæ–‡æœ¬
     */
    private String text;
    /**
     * ç¼–号
     */
    private String id;
    /**
     * æ˜¯å¦å¶å­
     */
    private boolean leaf = false;
    /**
     * æ˜¯å¦æ˜¾ç¤ºå¤é€‰æ¡†
     */
    private boolean showCheckbox = false;
    /**
     * æ˜¯å¦é»˜è®¤é€‰ä¸­
     */
    private boolean checked = false;
    /**
     * å­èŠ‚ç‚¹
     */
    private List<Tree> children = new ArrayList<Tree>();
    /**
     * å±‚级
     */
    private  int level;
    /**
     * å›¾æ ‡
     */
    private String icon;
    /**
     * å›¾æ ‡æ ·å¼
     */
    private String iconCls;
    /**
     * ä¸Šçº§èŠ‚ç‚¹
     */
    private String parentId;
    /**
     * ä¸Šçº§èŠ‚ç‚¹çš„åç§°
     */
    private String parentName;
    /**
     * ä¸Šçº§èŠ‚ç‚¹çš„ä¸šåŠ¡ç±»åž‹
     */
    private String parentBtmName;
    /**
     * æ˜¯å¦å±•å¼€
     */
    private boolean expanded = false;
    /**
     * é“¾æŽ¥
     */
    private String href;//layui和extjs使用href,easyui使用url,统一href
    /**
     * æŽ’序索引
     */
    private String index;//排序索引
    /***
     * å½“前数据对象
     */
    private Object data;
    private List<Tree> children = new ArrayList<>();
    
    /**
     * å…¶ä»–的属性
     */
    private Map<String,String> attributes = new HashMap<String, String>();//使用平台的话,所有的属性都是String的
    private Map<String,String> attributes = new HashMap<>();//使用平台的话,所有的属性都是String的
    
    /**
     * èŽ·å–ä¸»é”®
     * @return ä¸»é”®çš„值
     */
    public String getOid() {
        return oid;
        return super.getOid();
    }
    /**
@@ -142,7 +71,7 @@
     * @param oid ä¸»é”®çš„值
      */
    public void setOid(String oid) {
        this.oid = oid;
        super.setOid(oid);
    }
    /**
@@ -150,7 +79,7 @@
     * @return æ ‘节点文本
     */
    public String getText() {
        return text;
        return super.getText();
    }
    /**
@@ -158,7 +87,7 @@
     * @param text æ ‘节点文本
     */
    public void setText(String text) {
        this.text = text;
        super.setText(text);
    }
    /**
@@ -166,14 +95,14 @@
     * @param id
     */
    public void setId(String id) {
        this.id = id;
        super.setId(id);
    }
    /**
     * èŽ·å–ç¼–å·
     */
    public String getId() {
        return id;
        return super.getId();
    }
    /**
@@ -181,7 +110,7 @@
     * @return true è¡¨ç¤ºå¶å­èŠ‚ç‚¹
     */
    public boolean isLeaf() {
        return leaf;
        return super.isLeaf();
    }
    /**
@@ -189,7 +118,7 @@
     * @param leaf æ˜¯å¦å¶å­èŠ‚ç‚¹
     */
    public void setLeaf(boolean leaf) {
        this.leaf = leaf;
        super.setLeaf(leaf);
    }
    /**
@@ -197,7 +126,7 @@
     * @return true表示显示
     */
    public boolean isShowCheckbox() {
        return showCheckbox;
        return super.isShowCheckbox();
    }
    /**
@@ -205,7 +134,7 @@
     * @param showCheckbox æ˜¯å¦æ˜¾ç¤ºå¤é€‰æ¡†
     */
    public void setShowCheckbox(boolean showCheckbox) {
        this.showCheckbox = showCheckbox;
        super.setShowCheckbox(showCheckbox);
    }
    /**
@@ -213,7 +142,7 @@
     * @return true表示需要自动勾选
     */
    public boolean isChecked() {
        return checked;
        return super.isChecked();
    }
    /**
@@ -221,7 +150,7 @@
     * @param checked æ˜¯å¦è‡ªåЍ勾选
     */
    public void setChecked(boolean checked) {
        this.checked = checked;
        super.setChecked(checked);
    }
    /**
@@ -229,7 +158,7 @@
     * @return å­èŠ‚ç‚¹åˆ—è¡¨
     */
    public List<Tree> getChildren() {
        return children;
        return this.children;
    }
    /**
@@ -245,7 +174,7 @@
     * @return å›¾æ ‡
     */
    public String getIcon() {
        return icon;
        return super.getIcon();
    }
    /**
@@ -253,7 +182,7 @@
     * @param icon å›¾æ ‡
     */
    public void setIcon(String icon) {
        this.icon = icon;
        super.setIcon(icon);
    }
    /**
@@ -261,7 +190,7 @@
     * @return css类的名称
     */
    public String getIconCls() {
        return iconCls;
        return super.getIconCls();
    }
    /**
@@ -269,7 +198,7 @@
     * @param iconCls css类的名称
     */
    public void setIconCls(String iconCls) {
        this.iconCls = iconCls;
        super.setIconCls(iconCls);
    }
    /**
@@ -277,7 +206,7 @@
     * @return ä¸Šçº§èŠ‚ç‚¹çš„oid
     */
    public String getParentId() {
        return parentId;
        return super.getParentId();
    }
    /**
@@ -285,7 +214,7 @@
     * @param parentId ä¸Šçº§èŠ‚ç‚¹çš„oid
     */
    public void setParentId(String parentId) {
        this.parentId = parentId;
        super.setParentId(parentId);
    }
    /**
@@ -293,7 +222,7 @@
     * @return true表示自动展开
     */
    public boolean isExpanded() {
        return expanded;
        return super.isExpanded();
    }
    /**
@@ -301,7 +230,7 @@
     * @param expanded æ˜¯å¦è‡ªåЍ展开
     */
    public void setExpanded(boolean expanded) {
        this.expanded = expanded;
        super.setExpanded(expanded);
    }
    /**
@@ -309,7 +238,7 @@
     * @return é“¾æŽ¥åœ°å€
     */
    public String getHref() {
        return href;
        return super.getHref();
    }
    /**
@@ -317,7 +246,7 @@
     * @param href é“¾æŽ¥åœ°å€
     */
    public void setHref(String href) {
        this.href = href;
        super.setHref(href);
    }
    /**
@@ -325,7 +254,7 @@
     * @return æŽ’序号
     */
    public String getIndex() {
        return index;
        return super.getIndex();
    }
    /**
@@ -333,7 +262,7 @@
     * @param index æŽ’序号
     */
    public void setIndex(String index) {
        this.index = index;
        super.setIndex(index);
    }
    /**
@@ -357,7 +286,7 @@
     * @return ä¸Šçº§çš„名称
     */
    public String getParentName() {
        return parentName;
        return super.getParentName();
    }
    /**
@@ -365,15 +294,15 @@
     * @param parentName ä¸Šçº§çš„名称
     */
    public void setParentName(String parentName) {
        this.parentName = parentName;
        super.setParentName(parentName);
    }
    public String getParentBtmName() {
        return parentBtmName;
        return super.getParentBtmName();
    }
    public void setParentBtmName(String parentBtmName) {
        this.parentBtmName = parentBtmName;
        super.setParentBtmName(parentBtmName);
    }
    /**
@@ -406,7 +335,7 @@
                if (node.getOid().equalsIgnoreCase(childnode.getParentId())) {
                    childnode.setParentName(node.getText());
                    if(StringUtils.isBlank(childnode.getParentBtmName())){
                        childnode.setParentBtmName(node.getAttributes().getOrDefault("btmname",""));
                        childnode.setParentBtmName((String)node.getAttributes().getOrDefault("btmname",""));
                    }
                    node.getChildren().add(childnode);
                }
@@ -424,41 +353,42 @@
    public Object getData() {
        return data;
        return super.getData();
    }
    public void setData(Object data) {
        this.data = data;
        super.setData(data);
    }
    public int getLevel() {
        return level;
        return super.getLevel();
    }
    public void setLevel(int level) {
        this.level = level;
        super.setLevel(level);
    }
    @Override
    public String toString() {
        return "Tree{" +
                "oid='" + oid + '\'' +
                ", text='" + text + '\'' +
                ", leaf=" + leaf +
                ", showCheckbox=" + showCheckbox +
                ", checked=" + checked +
                ", children=" + children +
                ", level=" + level +
                ", icon='" + icon + '\'' +
                ", iconCls='" + iconCls + '\'' +
                ", parentId='" + parentId + '\'' +
                ", parentName='" + parentName + '\'' +
                ", parentBtmName='" + parentBtmName + '\'' +
                ", expanded=" + expanded +
                ", href='" + href + '\'' +
                ", index='" + index + '\'' +
                ", data=" + data +
                "oid='" + super.getOid() + '\'' +
                ", text='" + super.getText() + '\'' +
                ", leaf=" + super.isLeaf() +
                ", showCheckbox=" + super.isShowCheckbox() +
                ", checked=" + super.isChecked() +
                ", children=" + this.getChildren() +
                ", level=" + super.getLevel() +
                ", icon='" + super.getIcon() + '\'' +
                ", iconCls='" + super.getIconCls() + '\'' +
                ", parentId='" + super.getParentId() + '\'' +
                ", parentName='" + super.getParentBtmName() + '\'' +
                ", parentBtmName='" + super.getParentBtmName() + '\'' +
                ", expanded=" + super.isExpanded() +
                ", href='" + super.getHref() + '\'' +
                ", index='" + super.getIndex() + '\'' +
                ", data=" + super.getData() +
                ", attributes=" + attributes +
                '}';
    }
}
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/UIDataTree.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,395 @@
package com.vci.starter.web.pagemodel;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * @author ludc
 * @date 2024/11/27 16:34
 */
@Data
public class UIDataTree extends BaseTree implements java.io.Serializable{
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
     * @serial åºåˆ—化值
     */
    private static final long serialVersionUID = 6886695271635257212L;
    /**
     * æž„造函数
     */
    public UIDataTree(){
    }
    /**
     * æž„造函数
     * @param oid ä¸»é”®
     * @param text æ ‘节点文本
     */
    public UIDataTree(String oid, String text){
        setOid(oid);
        setText(text);
    }
    /**
     * æž„造函数
     * @param oid ä¸»é”®
     * @param text æ ‘节点文本
     */
    public UIDataTree(String oid, String text,Object o){
        setOid(oid);
        setText(text);
        setData(o);
    }
    /**
     * å…¶ä»–的属性
     */
    private Map<String,Object> attributes = new HashMap<>();
    /**
     * å­èŠ‚ç‚¹
     */
    private List<UIDataTree> children = new ArrayList<>();
    /**
     * èŽ·å–ä¸»é”®
     * @return ä¸»é”®çš„值
     */
    public String getOid() {
        return super.getOid();
    }
    /**
     * è®¾ç½®ä¸»é”®
     * @param oid ä¸»é”®çš„值
     */
    public void setOid(String oid) {
        super.setOid(oid);
    }
    /**
     * èŽ·å–æ ‘èŠ‚ç‚¹æ–‡æœ¬
     * @return æ ‘节点文本
     */
    public String getText() {
        return super.getText();
    }
    /**
     * è®¾ç½®æ ‘节点文本
     * @param text æ ‘节点文本
     */
    public void setText(String text) {
        super.setText(text);
    }
    /**
     * è®¾ç½®ç¼–号
     * @param id
     */
    public void setId(String id) {
        super.setId(id);
    }
    /**
     * èŽ·å–ç¼–å·
     */
    public String getId() {
        return super.getId();
    }
    /**
     * æ˜¯å¦å¶å­èŠ‚ç‚¹
     * @return true è¡¨ç¤ºå¶å­èŠ‚ç‚¹
     */
    public boolean isLeaf() {
        return super.isLeaf();
    }
    /**
     * è®¾ç½®å¶å­èŠ‚ç‚¹
     * @param leaf æ˜¯å¦å¶å­èŠ‚ç‚¹
     */
    public void setLeaf(boolean leaf) {
        super.setLeaf(leaf);
    }
    /**
     * æ˜¯å¦æ˜¾ç¤ºå¤é€‰æ¡†
     * @return true表示显示
     */
    public boolean isShowCheckbox() {
        return super.isShowCheckbox();
    }
    /**
     * è®¾ç½®æ˜¯å¦æ˜¾ç¤ºå¤é€‰æ¡†
     * @param showCheckbox æ˜¯å¦æ˜¾ç¤ºå¤é€‰æ¡†
     */
    public void setShowCheckbox(boolean showCheckbox) {
        super.setShowCheckbox(showCheckbox);
    }
    /**
     * æ˜¯å¦è‡ªåŠ¨å‹¾é€‰ä¸Š
     * @return true表示需要自动勾选
     */
    public boolean isChecked() {
        return super.isChecked();
    }
    /**
     * è®¾ç½®æ˜¯å¦å‹¾é€‰
     * @param checked æ˜¯å¦è‡ªåЍ勾选
     */
    public void setChecked(boolean checked) {
        super.setChecked(checked);
    }
    /**
     * èŽ·å–å­èŠ‚ç‚¹
     * @return å­èŠ‚ç‚¹åˆ—è¡¨
     */
    public List<UIDataTree> getChildren() {
        return this.children;
    }
    /**
     * è®¾ç½®å­èŠ‚ç‚¹
     * @param children å­èŠ‚ç‚¹åˆ—è¡¨
     */
    public void setChildren(List<UIDataTree> children) {
        this.children = children;
    }
    /**
     * èŽ·å–å›¾æ ‡
     * @return å›¾æ ‡
     */
    public String getIcon() {
        return super.getIcon();
    }
    /**
     * è®¾ç½®å›¾æ ‡
     * @param icon å›¾æ ‡
     */
    public void setIcon(String icon) {
        super.setIcon(icon);
    }
    /**
     * èŽ·å–å›¾æ ‡çš„æ˜¾ç¤ºcssç±»
     * @return css类的名称
     */
    public String getIconCls() {
        return super.getIconCls();
    }
    /**
     * è®¾ç½®å›¾æ ‡çš„æ˜¾ç¤ºcssç±»
     * @param iconCls css类的名称
     */
    public void setIconCls(String iconCls) {
        super.setIconCls(iconCls);
    }
    /**
     * èŽ·å–ä¸Šçº§ä¸»é”®
     * @return ä¸Šçº§èŠ‚ç‚¹çš„oid
     */
    public String getParentId() {
        return super.getParentId();
    }
    /**
     * è®¾ç½®ä¸Šçº§ä¸»é”®
     * @param parentId ä¸Šçº§èŠ‚ç‚¹çš„oid
     */
    public void setParentId(String parentId) {
        super.setParentId(parentId);
    }
    /**
     * æ˜¯å¦è‡ªåЍ展开
     * @return true表示自动展开
     */
    public boolean isExpanded() {
        return super.isExpanded();
    }
    /**
     * è®¾ç½®æ˜¯å¦è‡ªåЍ展开
     * @param expanded æ˜¯å¦è‡ªåЍ展开
     */
    public void setExpanded(boolean expanded) {
        super.setExpanded(expanded);
    }
    /**
     * èŽ·å–é“¾æŽ¥åœ°å€
     * @return é“¾æŽ¥åœ°å€
     */
    public String getHref() {
        return super.getHref();
    }
    /**
     * è®¾ç½®é“¾æŽ¥åœ°å€
     * @param href é“¾æŽ¥åœ°å€
     */
    public void setHref(String href) {
        super.setHref(href);
    }
    /**
     * èŽ·å–æŽ’åºå·
     * @return æŽ’序号
     */
    public String getIndex() {
        return super.getIndex();
    }
    /**
     * è®¾ç½®æŽ’序号
     * @param index æŽ’序号
     */
    public void setIndex(String index) {
        super.setIndex(index);
    }
    /**
     * èŽ·å–æ ‘èŠ‚ç‚¹æŒ‡ä»£çš„ä¸šåŠ¡æ•°æ®çš„æ‰€æœ‰å±žæ€§æ˜ å°„
     * @return key表示属性的名称,value表示属性的值
     */
    public Map<String, Object> getAttributes() {
        return attributes;
    }
    /**
     * è®¾ç½®æ ‘节点指代的业务数据的所有属性映射
     * @param attributes key表示属性的名称,value表示属性的值
     */
    public void setAttributes(Map<String, Object> attributes) {
        this.attributes = attributes;
    }
    /**
     * èŽ·å–ä¸Šçº§çš„èŠ‚ç‚¹çš„åç§°
     * @return ä¸Šçº§çš„名称
     */
    public String getParentName() {
        return super.getParentName();
    }
    /**
     * è®¾ç½®ä¸Šçº§èŠ‚ç‚¹çš„åç§°
     * @param parentName ä¸Šçº§çš„名称
     */
    public void setParentName(String parentName) {
        super.setParentName(parentName);
    }
    public String getParentBtmName() {
        return super.getParentBtmName();
    }
    public void setParentBtmName(String parentBtmName) {
        super.setParentBtmName(parentBtmName);
    }
    /**
     * åˆ©ç”¨é€’归将树转换为上下级关系
     * @param rootTree é¡¶å±‚节点
     * @param children å­èŠ‚ç‚¹
     * @return å«æœ‰ä¸Šä¸‹çº§å…³ç³»çš„æ ‘
     */
    public static List<UIDataTree> getChildList(List<UIDataTree> rootTree, List<UIDataTree> children){
        if(rootTree == null ||rootTree.size() == 0){
            if(children !=null && children.size()>0){
                rootTree = children.subList(0, children.size());
            }else{
                return null;
            }
        }
        UIDataTree bt = new UIDataTree();
        bt.findChild(rootTree, children);
        return rootTree;
    }
    /**
     * æŸ¥è¯¢æ ‘的下级
     * @param treenode å½“前节点
     * @param children å…¶ä»–的节点
     */
    public void findChild(List<UIDataTree> treenode, List<UIDataTree> children){
        for (UIDataTree node : treenode) {
            for (UIDataTree childnode : children) {
                if (node.getOid().equalsIgnoreCase(childnode.getParentId())) {
                    childnode.setParentName(node.getText());
                    if(StringUtils.isBlank(childnode.getParentBtmName())){
                        childnode.setParentBtmName((String)node.getAttributes().getOrDefault("btmname",""));
                    }
                    node.getChildren().add(childnode);
                }
            }
            if (node.getChildren().size()>0) {
                findChild(node.getChildren(), children);
                node.setLeaf(false);
            }else {
                node.setLeaf(true);
            }
            this.getChildren().add(node);
        }
    }
    public Object getData() {
        return super.getData();
    }
    public void setData(Object data) {
        super.setData(data);
    }
    public int getLevel() {
        return super.getLevel();
    }
    public void setLevel(int level) {
        super.setLevel(level);
    }
    @Override
    public String toString() {
        return "UIDataTree{" +
                "oid='" + this.getOid() + '\'' +
                ", text='" + this.getText() + '\'' +
                ", leaf=" + this.isLeaf() +
                ", showCheckbox=" + this.isShowCheckbox() +
                ", checked=" + this.isChecked() +
                ", children=" + this.getChildren() +
                ", level=" + this.getLevel() +
                ", icon='" + this.getIcon() + '\'' +
                ", iconCls='" + this.getIconCls() + '\'' +
                ", parentId='" + this.getParentId() + '\'' +
                ", parentName='" + this.getParentBtmName() + '\'' +
                ", parentBtmName='" + this.getParentBtmName() + '\'' +
                ", expanded=" + this.isExpanded() +
                ", href='" + this.getHref() + '\'' +
                ", index='" + this.getIndex() + '\'' +
                ", data=" + this.getData() +
                ", attributes=" + attributes +
                '}';
    }
}
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciBaseUtil.java
@@ -1814,7 +1814,6 @@
        return name;
    }
    /**
     * æ ¹æ®ä¸šåŠ¡ç±»åž‹èŽ·å–è¡¨æ ¼åç§°
     * @param btmname ä¸šåŠ¡ç±»åž‹ï¼Œå¹¶ä¸”ä¸èƒ½æ˜¯è§†å›¾
@@ -1878,7 +1877,7 @@
     * @param replaceMap ä½¿ç”¨æ›¿æ¢çš„æ•°æ®æº
     * @return æ›¿æ¢åŽçš„值
     */
    public static String replaceByFreeMarker(String freemarker,Map<String,String> replaceMap){
    public static String replaceByFreeMarker(String freemarker,Map<String,Object> replaceMap){
        if(StringUtils.isBlank(freemarker)){
            return "";
        }
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmPwdStrategyQueryServiceImpl.java
@@ -259,6 +259,9 @@
        if(strategy.getRequireCharCount() > strategy.getCombinations().split(",").length){
            throw new VciBaseException("必填种类不能大于所选择的密码组合方式的个数!");
        }
        if(strategy.getRequireCharCount() <= 0){
            throw new VciBaseException("必填种类不能小于等于0!");
        }
        if(strategy.getMaxLength() < strategy.getMinLength()){
            throw new VciBaseException("密码最大长度不能小于最小长度!");
        }
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java
@@ -388,7 +388,7 @@
        //专业
        smUserVO.setSpecialties(userInfo.specialties);
        UserLogonInfo lockObj = platformClientUtil.getFrameworkService().fetchUserLogonObj(userInfo.id);
        smUserVO.setLockFlag(lockObj.plWrongNum == 0);
        smUserVO.setLockFlag(lockObj.plWrongNum != 0);
        smUserVO.setCreator(userInfo.createUser);
        smUserVO.setCreateTime(VciDateUtil.long2Date(userInfo.createTime));
        smUserVO.setLastModifier(userInfo.updateUser);
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/controller/SmUserQueryController.java
@@ -364,5 +364,4 @@
        //BaseResult.fail("这里返回前端的错误信息");
    }
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/LoginController.java
@@ -240,8 +240,6 @@
        return doSingleLogin(request,response,"username");
    }
    /**
     * èŽ·å–å®¢æˆ·ç«¯è¯·æ±‚ä¿¡æ¯,为了隔绝在server层使用request
     * @param request è¯·æ±‚对象
@@ -342,4 +340,5 @@
        loginService.logout(userToken);
        return BaseResult.success();
    }
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/query/UIBaseQuery.java
@@ -15,18 +15,18 @@
    /**
     * æ¥æºæ•°æ®
     */
    private Map<String,String> sourceData = new HashMap<>();
    private Map<String,Object> sourceData = new HashMap<>();
    /**
     * é€‰æ‹©æ•°æ®
     */
    private List<Map<String,String>> selectData = new ArrayList<>();
    public Map<String, String> getSourceData() {
    public Map<String, Object> getSourceData() {
        return sourceData;
    }
    public void setSourceData(Map<String, String> sourceData) {
    public void setSourceData(Map<String, Object> sourceData) {
        this.sourceData = sourceData;
    }
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/query/UIDataGridQuery.java
@@ -42,7 +42,7 @@
    /**
     * æ¥æºæ•°æ®
     */
    private Map<String,String> sourceData = new HashMap<>();
    private Map<String,Object> sourceData = new HashMap<>();
    /**
     * é€‰æ‹©æ•°æ®
@@ -54,11 +54,11 @@
     */
    private boolean treeTableFlag = false;
    public Map<String, String> getSourceData() {
    public Map<String, Object> getSourceData() {
        return sourceData;
    }
    public void setSourceData(Map<String, String> sourceData) {
    public void setSourceData(Map<String, Object> sourceData) {
        this.sourceData = sourceData;
    }
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/query/UILinkTypeDataQuery.java
@@ -61,7 +61,7 @@
    /**
     * æ›¿æ¢çš„属性信息
     */
    private Map<String,String> replaceMap;
    private Map<String,Object> replaceMap;
    /**
     * æŒ‡å®šå±‚级
@@ -148,11 +148,11 @@
        this.linkType = linkType;
    }
    public Map<String, String> getReplaceMap() {
    public Map<String, Object> getReplaceMap() {
        return replaceMap;
    }
    public void setReplaceMap(Map<String, String> replaceMap) {
    public void setReplaceMap(Map<String, Object> replaceMap) {
        this.replaceMap = replaceMap;
    }
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/query/UITreeQuery.java
@@ -57,18 +57,18 @@
    /**
     * æ¥æºæ•°æ®
     */
    private Map<String,String> sourceData = new HashMap<>();
    private Map<String,Object> sourceData = new HashMap<>();
    /**
     * é€‰æ‹©æ•°æ®
     */
    private List<Map<String,String>> selectData = new ArrayList<>();
    public Map<String, String> getSourceData() {
    public Map<String, Object> getSourceData() {
        return sourceData;
    }
    public void setSourceData(Map<String, String> sourceData) {
    public void setSourceData(Map<String, Object> sourceData) {
        this.sourceData = sourceData;
    }
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/UIDataServiceI.java
@@ -50,7 +50,7 @@
     * @return æ ‘形数据
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    List<Tree> getDataForTree(UITreeQuery treeQuery) throws VciBaseException, PLException;
    List<UIDataTree> getDataForTree(UITreeQuery treeQuery) throws Exception;
    /**
     * èŽ·å–æ ‘å½¢æ•°æ®(根据查询模板查询对象)
@@ -58,7 +58,7 @@
     * @return æ ‘形数据
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    BaseResult getDataByTemp(UITreeQuery treeQuery) throws VciBaseException, PLException;
    BaseResult getDataByTemp(UITreeQuery treeQuery) throws Exception;
    /**
     * è°ƒç”¨å‰ç½®äº‹ä»¶
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/WebBoServiceI.java
@@ -105,7 +105,7 @@
     * @return
     * @throws VciBaseException
     */
     List<BusinessObject> queryCBOByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, String> replaceMap) throws VciBaseException;
     List<BusinessObject> queryCBOByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, Object> replaceMap) throws VciBaseException;
    
    /**
     * ä½¿ç”¨æŸ¥è¯¢æ–¹æ¡ˆæ¥æŸ¥è¯¢æ•°æ®ï¼Œè¿”回CBO,支持分页
@@ -116,7 +116,7 @@
     * @return
     * @throws VciBaseException
     */
     List<BusinessObject> queryCBOByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, String> replaceMap, PageHelper ph) throws VciBaseException;
     List<BusinessObject> queryCBOByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, Object> replaceMap, PageHelper ph) throws VciBaseException;
    /**
     * ä½¿ç”¨åå­—获取查询模板
@@ -125,7 +125,7 @@
     * @return æŸ¥è¯¢æ¨¡æ¿
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    QueryTemplate getQtByName(String name, Map<String, String> replaceMap) throws VciBaseException;
    QueryTemplate getQtByName(String name, Map<String, Object> replaceMap) throws VciBaseException;
    /**
     *  ä½¿ç”¨æŸ¥è¯¢æ–¹æ¡ˆæ¥æŸ¥è¯¢æ•°æ®ï¼Œè¿”回CBO,支持自定义查询字段,包括参照和枚举;参照字段使用xxx.yy;枚举字段使用xxx_enumCode
@@ -137,7 +137,7 @@
     * @return
     * @throws VciBaseException
     */
     List<BusinessObject> queryCBOByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, String> replaceMap, PageHelper ph, List<String> clauseList) throws VciBaseException;
     List<BusinessObject> queryCBOByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, Object> replaceMap, PageHelper ph, List<String> clauseList) throws VciBaseException;
    
    /**
     * æŸ¥è¯¢æ•°é‡
@@ -165,7 +165,7 @@
     * @return
     * @throws VciBaseException
     */
     int queryCountByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, String> replaceMap) throws VciBaseException;
     int queryCountByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, Object> replaceMap) throws VciBaseException;
    
    /**
     * ä½¿ç”¨å¯¹è±¡æ¥æŸ¥è¯¢æ•°é‡
@@ -269,7 +269,7 @@
     * @return
     * @throws VciBaseException
     */
     <T> List<T> queryObjectByScheme(String queryScheme, Class<T> c, Map<String, String> conditionMap, PageHelper ph, Map<String, String> replaceMap) throws VciBaseException;
     <T> List<T> queryObjectByScheme(String queryScheme, Class<T> c, Map<String, String> conditionMap, PageHelper ph, Map<String, Object> replaceMap) throws VciBaseException;
    /**
     * ä¿å­˜æ•°æ®ï¼Œå¯ä»¥åœ¨request中设置是否持久化
@@ -409,7 +409,7 @@
     * @return åˆ—表数据,数据是Map形式的,包含分页信息
     * @throws VciBaseException
     */
     DataGrid queryGridByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, String> replaceMap) throws VciBaseException;
     DataGrid queryGridByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, Object> replaceMap) throws VciBaseException;
    
    /**
     * æ ¹æ®æŸ¥è¯¢æ–¹æ¡ˆæ¥æŸ¥è¯¢åˆ—表数据;可以在pageHelper中设置是否查询总数,pageHelper的优先级最大;
@@ -420,7 +420,7 @@
     * @return åˆ—表数据,数据是Map形式的,包含分页信息
     * @throws VciBaseException
     */
     DataGrid queryGridByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, String> replaceMap, PageHelper ph) throws VciBaseException;
     DataGrid queryGridByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, Object> replaceMap, PageHelper ph) throws VciBaseException;
    
    /**
     * æ ¹æ®æŸ¥è¯¢æ–¹æ¡ˆæ¥æŸ¥è¯¢åˆ—表数据,可以自定义查询的列,包括参照和枚举
@@ -432,7 +432,7 @@
     * @return åˆ—表数据,数据是Map形式的,包含分页信息
     * @throws VciBaseException
     */
     DataGrid queryGridByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, String> replaceMap, PageHelper ph, List<String> clauseList) throws VciBaseException;
     DataGrid queryGridByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, Object> replaceMap, PageHelper ph, List<String> clauseList) throws VciBaseException;
    
    /**
     * æŸ¥è¯¢å¯¹è±¡çš„列表数据 
@@ -461,7 +461,7 @@
     * @return åˆ—表数据,数据是对象形式的,包含分页信息
     * @throws VciBaseException
     */
     DataGrid queryGridClassByScheme(String queryScheme, Class c, Map<String, String> conditionMap, Map<String, String> replaceMap) throws VciBaseException;
     DataGrid queryGridClassByScheme(String queryScheme, Class c, Map<String, String> conditionMap, Map<String, Object> replaceMap) throws VciBaseException;
    
    /**
     * é€šè¿‡æŸ¥è¯¢æ–¹æ¡ˆæŸ¥è¯¢å¯¹è±¡çš„列表数据
@@ -472,7 +472,7 @@
     * @return åˆ—表数据,数据是对象形式的,包含分页信息
     * @throws VciBaseException
     */
     DataGrid queryGridClassByScheme(String queryScheme, Class c, Map<String, String> conditionMap, Map<String, String> replaceMap, PageHelper ph) throws VciBaseException;
     DataGrid queryGridClassByScheme(String queryScheme, Class c, Map<String, String> conditionMap, Map<String, Object> replaceMap, PageHelper ph) throws VciBaseException;
    
    /**
     * BusinessObject è½¬ä¸ºHashMap
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/WebLoServiceI.java
@@ -3,6 +3,7 @@
import com.vci.corba.omd.data.AttributeValue;
import com.vci.corba.omd.data.BusinessObject;
import com.vci.corba.omd.data.LinkObject;
import com.vci.corba.query.data.BOAndLO;
import com.vci.starter.web.exception.VciBaseException;
import com.vci.starter.web.pagemodel.DataGrid;
import com.vci.starter.web.pagemodel.PageHelper;
@@ -13,8 +14,6 @@
import java.util.Map;
public interface WebLoServiceI {
    /**
     * æ ¹æ®æŸ¥è¯¢æ¡ä»¶æ¥æŸ¥è¯¢é“¾æŽ¥ç±»åž‹
@@ -224,14 +223,14 @@
     * @param linkTypeDataQuery æŸ¥è¯¢å¯¹è±¡
     * @return é“¾æŽ¥ç±»åž‹å’Œå…³è”çš„to端
     */
    List<com.vci.corba.query.data.BOAndLO> queryCLOAndBOBySchema(UILinkTypeDataQuery linkTypeDataQuery) ;
    List<BOAndLO> queryCLOAndBOBySchema(UILinkTypeDataQuery linkTypeDataQuery) ;
    /**
     * ä½¿ç”¨é“¾æŽ¥ç±»åž‹çš„名称查询 é“¾æŽ¥ç±»åž‹çš„to端的业务类型
     * @param linkTypeDataQuery æŸ¥è¯¢çš„对象
     * @return é“¾æŽ¥å¯¹è±¡å’Œto端业务对象
     */
    List<com.vci.corba.query.data.BOAndLO> queryCLOAndBoByLinkType(UILinkTypeDataQuery linkTypeDataQuery);
    List<BOAndLO> queryCLOAndBoByLinkType(UILinkTypeDataQuery linkTypeDataQuery);
    /**
     * æŸ¥è¯¢åˆ—表
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java
@@ -245,6 +245,7 @@
            vo.setTableName(VciBaseUtil.getTableName(vo.getId()));
            vo.setInputRevisionFlag(btmItem.revInput);
            vo.setDelimiter(btmItem.delimiter);
            vo.setImageName(btmItem.imageName);
            vo.setfName(btmItem.fName);
            vo.setVersionRule(String.valueOf(btmItem.verRuleName));
            if (StringUtils.isNotBlank(vo.getRevisionRuleId()) || vo.isInputRevisionFlag()) {
@@ -715,6 +716,7 @@
                tree.setParentName(null);
                tree.setParentId(null);
                tree.setLeaf(true);
                tree.setIcon(osBtmTypeVO.getImageName());
                tree.setId(osBtmTypeVO.getId());
                tree.setText(osBtmTypeVO.getDescription());
                tree.setAttributes(WebUtil.objectToMapString(osBtmTypeVO));
@@ -811,6 +813,7 @@
        bizType.label = dto.getName();
        bizType.fName = dto.getfName();
        bizType.implClass = dto.getImplClass();
        bizType.imageName = dto.getImageName();
        bizType.shape = "";
        bizType.lifeCycle = dto.getLifeCycleId();
        List<String> lcList = Arrays.asList(dto.getSubLifeCycleId().split(","));
@@ -823,14 +826,9 @@
        bizType.revLevel = dto.getRevLevel();
        bizType.revRuleName = dto.getRevisionRuleId();
        bizType.revInput = dto.isInputRevisionFlag();
        bizType.delimiter = (dto.getDelimiter() == null ? "" : dto.getDelimiter());
        bizType.verRuleName = Func.isBlank(dto.getVersionRule()) ? 0 : Short.parseShort(dto.getVersionRule());
        //bizType.imageName = dto.get;
        //List<String> attrIdList = dto.getAttributesDTOList().stream().map(OsBtmTypeLinkAttributesDTO::getId).collect(Collectors.toList());
        bizType.apNameArray = dto.getApNameArray().split(",");//attrIdList.toArray(new String[attrIdList.size()]);
        String userId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
        long timeMillis = System.currentTimeMillis();
@@ -1406,7 +1404,7 @@
        //设置列名
        List<String> columns = new ArrayList<>(
                Arrays.asList("类型名称", "标签", "继承自", "实现类", "描述", "版本规则", "版本号规则",
                        "是否手工输入", "分隔符", "版次号规则", "生命周期", "备选生命周期列表", "属性列表")
                        "是否手工输入", "分隔符", "版次号规则","图标", "生命周期", "备选生命周期列表", "属性列表")
        );
        try {
            new File(excelPath).createNewFile();
@@ -1430,9 +1428,10 @@
                excelDataList.add(new WriteExcelData(i + 1, 7, bizType.revInput));
                excelDataList.add(new WriteExcelData(i + 1, 8, bizType.delimiter));
                excelDataList.add(new WriteExcelData(i + 1, 9, bizType.verRuleName));
                excelDataList.add(new WriteExcelData(i + 1, 10, bizType.lifeCycle));
                excelDataList.add(new WriteExcelData(i + 1, 11, String.join(",", bizType.lifeCycles)));
                excelDataList.add(new WriteExcelData(i + 1, 12, String.join(",", bizType.apNameArray)));
                excelDataList.add(new WriteExcelData(i + 1, 10, bizType.imageName));
                excelDataList.add(new WriteExcelData(i + 1, 11, bizType.lifeCycle));
                excelDataList.add(new WriteExcelData(i + 1, 12, String.join(",", bizType.lifeCycles)));
                excelDataList.add(new WriteExcelData(i + 1, 13, String.join(",", bizType.apNameArray)));
                attributes.addAll(Arrays.asList(bizType.apNameArray));
                i++;
            }
@@ -1549,6 +1548,7 @@
                bizType.revInput = Boolean.parseBoolean(osBtmTypePO.getRevInput().toLowerCase(Locale.ROOT));
                bizType.delimiter = osBtmTypePO.getDelimiter();
                bizType.verRuleName = osBtmTypePO.getVerRuleName();
                bizType.imageName = osBtmTypePO.getImageName();
                bizType.lifeCycle = osBtmTypePO.getLifeCycle();
                bizType.lifeCycles = osBtmTypePO.getLifeCycles().split(",");
                bizType.apNameArray = osBtmTypePO.getApNameArray().split(",");
@@ -1622,6 +1622,7 @@
                tree.setParentName(parentBIzType.getfName());
                tree.setParentId(parentBIzType.getOid());
                tree.setLeaf(true);
                tree.setIcon(bizType.getImageName());
                tree.setText(bizType.getDescription());
                tree.setAttributes(WebUtil.objectToMapString(bizType));
                tree.setChildren(getChildren(osBtmTypeVOS, bizType));
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIDataServiceImpl.java
@@ -1,11 +1,14 @@
package com.vci.web.service.impl;
import com.vci.client.common.oq.OQTool;
import com.vci.common.qt.object.QueryTemplate;
import com.vci.corba.common.PLException;
import com.vci.corba.framework.data.UserInfo;
import com.vci.corba.omd.btm.BizType;
import com.vci.corba.omd.data.*;
import com.vci.corba.omd.lcm.LifeCycle;
import com.vci.corba.omd.ltm.LinkType;
import com.vci.corba.omd.qtm.QTInfo;
import com.vci.corba.query.data.BOAndLO;
import com.vci.dto.*;
import com.vci.frameworkcore.lcstatuspck.FrameworkDataLCStatus;
import com.vci.frameworkcore.lcstatuspck.ReleaseDataLCStatus;
@@ -35,6 +38,7 @@
import com.vci.web.util.PlatformClientUtil;
import com.vci.web.util.WebUtil;
import org.apache.commons.lang3.StringUtils;
import org.dom4j.DocumentHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -142,7 +146,7 @@
        VciBaseUtil.alertNotNull(dataGridQuery,"查询对象",dataGridQuery.getBtmname(),"业务类型",dataGridQuery.getTableDefineId());
        //先判断查询模板
        UITableDefineVO tableDefineVO = uiEngineService.getComponentByOid(dataGridQuery.getComponentOid(),null).getTableDefineVO();
        String queryTemplate = !CollectionUtils.isEmpty(dataGridQuery.getSourceData())?dataGridQuery.getSourceData().getOrDefault("querytemplate",tableDefineVO.getQueryTemplateName()):tableDefineVO.getQueryTemplateName();
        String queryTemplate = !CollectionUtils.isEmpty(dataGridQuery.getSourceData())? (String) dataGridQuery.getSourceData().getOrDefault("querytemplate",tableDefineVO.getQueryTemplateName()) :tableDefineVO.getQueryTemplateName();
        if(StringUtils.isBlank(queryTemplate)){
            //说明没有设置查询模板,需要看看在这个表格所在的组件有没有设置
            tableDefineVO = uiEngineService.getTableById(dataGridQuery.getBtmname(), dataGridQuery.getTableDefineId());
@@ -187,7 +191,7 @@
        queryFieldList.add("creator_name");
        queryFieldList.add("lastmodifier_name");
        //我们在后台查询业务数据
        Map<String, String> replaceMap = wrapperReplaceMap(dataGridQuery.getSourceData());
        Map<String, Object> replaceMap = wrapperReplaceMap(dataGridQuery.getSourceData());
        if(dataGridQuery.isLinkTypeFlag()){
            UILinkTypeDataQuery linkTypeDataQuery = new UILinkTypeDataQuery();
@@ -220,7 +224,7 @@
    public UIFormDataVO getDataForForm(UIFormQuery formQuery) throws VciBaseException, PLException {
        VciBaseUtil.alertNotNull(formQuery,"表单的查询对象",formQuery.getBtmname(),"业务类型的信息",formQuery.getOid(),"业务数据的主键",formQuery.getFormDefineId(),"表单的定义编号");
        UIFormDefineVO formDefineVO = uiEngineService.getFormById(formQuery.getBtmname(),formQuery.getFormDefineId());
        String queryTemplate = !CollectionUtils.isEmpty(formQuery.getSourceData())?formQuery.getSourceData().getOrDefault("querytemplate",formDefineVO.getQueryTemplateName()):formDefineVO.getQueryTemplateName();
        String queryTemplate = !CollectionUtils.isEmpty(formQuery.getSourceData())? (String) formQuery.getSourceData().getOrDefault("querytemplate",formDefineVO.getQueryTemplateName()) :formDefineVO.getQueryTemplateName();
        Set<String> queryFieldList = formDefineVO.getItems().stream().filter(s->!UIFieldTypeEnum.CUSTOM.getValue().equalsIgnoreCase(s.getType())).map(UIFormItemVO::getField).collect(Collectors.toSet());
        //获取参照
        List<UIFormItemVO> referFieldList = formDefineVO.getItems().stream().filter(s -> UIFieldTypeEnum.REFER.getValue().equalsIgnoreCase(s.getType())).collect(Collectors.toList());
@@ -253,7 +257,7 @@
        queryFieldList.add("creator_name");
        queryFieldList.add("lastmodifier_name");
        Map<String,String> conditionMap = WebUtil.getOidQuery(formQuery.getOid());
        Map<String, String> replaceMap = wrapperReplaceMap(formQuery.getSourceData());
        Map<String, Object> replaceMap = wrapperReplaceMap(formQuery.getSourceData());
        UIFormDataVO formDataVO = new UIFormDataVO();
        replaceMap.put("oid", formQuery.getOid().trim());
        if(!formDefineVO.isLinkTypeFlag()) {
@@ -323,13 +327,14 @@
     * @param sourceDataMap æ¥æºæ•°æ®
     * @return æ›¿æ¢åŽçš„值
     */
    private Map<String,String> wrapperReplaceMap(Map<String,String> sourceDataMap){
        Map<String,String> replaceMap =!CollectionUtils.isEmpty(sourceDataMap)? sourceDataMap:new HashMap<>();
    private Map<String,Object> wrapperReplaceMap(Map<String,Object> sourceDataMap){
        Map<String,Object> replaceMap =!CollectionUtils.isEmpty(sourceDataMap)? sourceDataMap:new HashMap<>();
        if(!replaceMap.containsKey("f_oid")){
            replaceMap.put("f_oid",replaceMap.getOrDefault("oid",""));
        }
        if(replaceMap.get("f_oid").contains(TREE_NODE_ID_SEP)){
            replaceMap.put("f_oid",replaceMap.get("f_oid").split(TREE_NODE_ID_SEP)[1]);
        String fOid = replaceMap.get("f_oid").toString();
        if(fOid.contains(TREE_NODE_ID_SEP)){
            replaceMap.put("f_oid",fOid.split(TREE_NODE_ID_SEP)[1]);
        }
        return replaceMap;
    }
@@ -347,7 +352,7 @@
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    @Override
    public List<Tree> getDataForTree(UITreeQuery treeQuery) throws VciBaseException, PLException {
    public List<UIDataTree> getDataForTree(UITreeQuery treeQuery) throws Exception {
        VciBaseUtil.alertNotNull(treeQuery,"表单的查询对象",treeQuery.getBtmname(),"业务类型的信息",treeQuery.getComponentOid(),"树所在的组件的主键");
        Map<String, OsAttributeVO> attributeVOMap = attrService.selectAllAttributeMap();
        UIComponentVO componentVO = uiEngineService.getComponentByOid(treeQuery.getComponentOid(),attributeVOMap);
@@ -362,7 +367,14 @@
        if(!treeQuery.isLinkTypeFlag() && StringUtils.isBlank(treeQuery.getParentBtmName())){
            treeQuery.setParentBtmName(treeQuery.getBtmname());
        }
        //TODO: æ›¿æ¢æ ‘定义上的正反向查询属性,因为正反向查询是由链接类型查询模板上控制的
        boolean isOrientation = false; //是否反向,使用模板上配置的
        String qtName = treeDefineVO.getQueryTemplateName();
        if(Func.isNotBlank(treeDefineVO.getLinkType()) && Func.isNotBlank(qtName)){
            QTInfo wrapper = platformClientUtil.getQTDService().getQT(qtName);
            QueryTemplate qt = OQTool.getQTByDoc(DocumentHelper.parseText(wrapper.qtText), qtName);
            isOrientation = qt.getDirection().equals("opposite");
        }
        if(treeQuery.getConditionMap() == null){
            treeQuery.setConditionMap(new HashMap<>());
        }
@@ -381,15 +393,15 @@
        if(StringUtils.isNotBlank(treeQuery.getParentOid()) && treeQuery.getParentOid().contains(TREE_NODE_ID_SEP)){
            treeQuery.setParentOid(treeQuery.getParentOid().split(TREE_NODE_ID_SEP)[1]);
        }
        String queryTemplate = StringUtils.isNotBlank(treeQuery.getQueryTemplate())?treeQuery.getQueryTemplate():(!CollectionUtils.isEmpty(treeQuery.getSourceData())?treeQuery.getSourceData().getOrDefault("querytemplate",treeDefineVO.getQueryTemplateName()):treeDefineVO.getQueryTemplateName());
        String valueField = treeQuery.isLinkTypeFlag()?(!treeDefineVO.isOrientation()?"${oid}" + TREE_NODE_ID_SEP + "${t_oid}":"${oid}" + TREE_NODE_ID_SEP + "${f_oid}"):(StringUtils.isNotBlank(treeQuery.getValueField())?treeQuery.getValueField():"oid");
        String queryTemplate = StringUtils.isNotBlank(treeQuery.getQueryTemplate())?treeQuery.getQueryTemplate():(!CollectionUtils.isEmpty(treeQuery.getSourceData())? (String) treeQuery.getSourceData().getOrDefault("querytemplate",treeDefineVO.getQueryTemplateName()) :treeDefineVO.getQueryTemplateName());
        String valueField = treeQuery.isLinkTypeFlag()?(!isOrientation?"${oid}" + TREE_NODE_ID_SEP + "${t_oid}":"${oid}" + TREE_NODE_ID_SEP + "${f_oid}"):(StringUtils.isNotBlank(treeQuery.getValueField())?treeQuery.getValueField():"oid");
        String textField = StringUtils.isNotBlank(treeDefineVO.getTreeNodeExpression())?treeDefineVO.getTreeNodeExpression():(StringUtils.isNotBlank(treeQuery.getTextField())?treeQuery.getTextField():"name");
        List<Tree> rootTreeList = new ArrayList<>();
        List<UIDataTree> rootTreeList = new ArrayList<>();
        List<String> queryFieldList = new ArrayList<>();
        queryFieldList.add("creator_name");
        queryFieldList.add("lastmodifier_name");
        String rootExpress = StringUtils.isNotBlank(treeQuery.getRootExpress())?treeQuery.getRootExpress():treeDefineVO.getRootContent();
        Map<String, String> replaceMap = wrapperReplaceMap(treeQuery.getSourceData());
        Map<String, Object> replaceMap = wrapperReplaceMap(treeQuery.getSourceData());
        if(StringUtils.isBlank(treeDefineVO.getLinkType())){
            //这个是业务类型的自参照
            //以前的平台没有对自参照这种有全部查询的
@@ -461,7 +473,7 @@
            linkTypeDataQuery.setConditionMap(treeQuery.getConditionMap());
            linkTypeDataQuery.setParentOid(treeQuery.getParentOid());
            linkTypeDataQuery.setClauseList(queryFieldList);
            linkTypeDataQuery.setDirection(treeDefineVO.isOrientation());
            linkTypeDataQuery.setDirection(isOrientation);
            linkTypeDataQuery.setToBtmType(treeDefineVO.getBtmType());
            linkTypeDataQuery.setLinkType(treeDefineVO.getLinkType());
            if(UITreeLoadTypeEnum.ALL.getValue().equalsIgnoreCase(treeDefineVO.getLoadType())){
@@ -469,7 +481,7 @@
            }
            if(treeQuery.isQueryRoot()){
                //查询根节点.我们需要判断是否设置了根节点的查询条件
                List<com.vci.corba.query.data.BOAndLO> rootCbos = null;
                List<BOAndLO> rootCbos = null;
                String parentFieldNameAndValue = treeDefineVO.getShowLinkAbs();
                if(StringUtils.isNotBlank(parentFieldNameAndValue)){
                    if(StringUtils.isNotBlank(queryTemplate)){
@@ -491,7 +503,7 @@
                    }
                    if(!CollectionUtils.isEmpty(rootCbos)){
                        if(StringUtils.isBlank(parentFieldName)){
                            if(treeDefineVO.isOrientation()){
                            if(isOrientation){
                                parentFieldName = "t_oid";
                            }else{
                                parentFieldName = "f_oid";
@@ -511,15 +523,15 @@
                    if(CollectionUtils.isEmpty(replaceMap)){
                        throw new VciBaseException("根节点没有配置查询条件,也没有来源数据");
                    }
                    Tree root = new Tree();
                    root.setOid(replaceMap.getOrDefault("oid",replaceMap.getOrDefault("t_oid","")));
                    UIDataTree root = new UIDataTree();
                    root.setOid((String) replaceMap.getOrDefault("oid",replaceMap.getOrDefault("t_oid","")));
                    root.setText(getValueByExpressForBOAndLO(new HashMap<>(),replaceMap,rootExpress));
                    root.setAttributes(replaceMap);
                    root.setIndex("0");
                    rootTreeList.add(root);
                    if(StringUtils.isBlank(parentFieldName)){
                        if(treeDefineVO.isOrientation()){
                        if(isOrientation){
                            parentFieldName = "t_oid";
                        }else{
                            parentFieldName = "f_oid";
@@ -539,7 +551,7 @@
                    if(linkTypeDataQuery.getReplaceMap() == null){
                        linkTypeDataQuery.setReplaceMap(new HashMap<>());
                    }
                    linkTypeDataQuery.getReplaceMap().put(treeDefineVO.isOrientation()?"t_oid":"f_oid",treeQuery.getParentOid());
                    linkTypeDataQuery.getReplaceMap().put(isOrientation?"t_oid":"f_oid",treeQuery.getParentOid());
                }
                return cloAndCbo2Trees(loService.queryCLOAndBoByLinkType(linkTypeDataQuery),valueField,textField,parentFieldName,treeQuery.isShowCheckBox(),treeQuery.getParentOid());
            }
@@ -553,7 +565,7 @@
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    @Override
    public BaseResult getDataByTemp(UITreeQuery treeQuery) throws VciBaseException, PLException {
    public BaseResult getDataByTemp(UITreeQuery treeQuery) throws Exception {
        VciBaseUtil.alertNotNull(treeQuery,"表单的查询对象",treeQuery.getComponentOid(),"当前组件的主键");
        //1、先查询页面定义组件
        Map<String, OsAttributeVO> attributeVOMap = attrService.selectAllAttributeMap();
@@ -563,12 +575,19 @@
        }
        // 2、根据配置的查询模板查询数据(需要考虑全面一点),
        // è¿™å„¿æ ¹æ®å½“前类型来获取是什么类型的查询模板,然后做对应的查询处理
        //TODO: æ›¿æ¢æ ‘定义上的正反向查询属性,因为正反向查询是由链接类型查询模板上控制的
        UITreeDefineVO treeDefineVO = componentVO.getTreeDefineVO();
        String queryTemplate = StringUtils.isNotBlank(treeQuery.getQueryTemplate())?treeQuery.getQueryTemplate():(!CollectionUtils.isEmpty(treeQuery.getSourceData())?treeQuery.getSourceData().getOrDefault("querytemplate",treeDefineVO.getQueryTemplateName()):treeDefineVO.getQueryTemplateName());
        Map<String, String> replaceMap = wrapperReplaceMap(treeQuery.getSourceData());
        boolean isOrientation = false; //是否反向,使用模板上配置的
        String qtName = treeDefineVO.getQueryTemplateName();
        if(Func.isNotBlank(treeDefineVO.getLinkType()) && Func.isNotBlank(qtName)){
            QTInfo wrapper = platformClientUtil.getQTDService().getQT(qtName);
            QueryTemplate qt = OQTool.getQTByDoc(DocumentHelper.parseText(wrapper.qtText), qtName);
            isOrientation = qt.getDirection().equals("opposite");
        }
        String queryTemplate = StringUtils.isNotBlank(treeQuery.getQueryTemplate())?treeQuery.getQueryTemplate():(!CollectionUtils.isEmpty(treeQuery.getSourceData())? (String) treeQuery.getSourceData().getOrDefault("querytemplate",treeDefineVO.getQueryTemplateName()) :treeDefineVO.getQueryTemplateName());
        Map<String, Object> replaceMap = wrapperReplaceMap(treeQuery.getSourceData());
        List<String> queryFieldList = new ArrayList<>();
        String valueField = treeQuery.isLinkTypeFlag()?(!treeDefineVO.isOrientation()?"${oid}" + TREE_NODE_ID_SEP + "${t_oid}":"${oid}" + TREE_NODE_ID_SEP + "${f_oid}"):(StringUtils.isNotBlank(treeQuery.getValueField())?treeQuery.getValueField():"oid");
        String valueField = treeQuery.isLinkTypeFlag()?(!isOrientation?"${oid}" + TREE_NODE_ID_SEP + "${t_oid}":"${oid}" + TREE_NODE_ID_SEP + "${f_oid}"):(StringUtils.isNotBlank(treeQuery.getValueField())?treeQuery.getValueField():"oid");
        String textField = StringUtils.isNotBlank(treeDefineVO.getTreeNodeExpression())?treeDefineVO.getTreeNodeExpression():(StringUtils.isNotBlank(treeQuery.getTextField())?treeQuery.getTextField():"name");
        String rootExpress = StringUtils.isNotBlank(treeQuery.getRootExpress())?treeQuery.getRootExpress():treeDefineVO.getRootContent();
        String parentFieldName = treeQuery.getParentFieldName();
@@ -586,7 +605,7 @@
        List<BusinessObject> rootCbos = boService.queryCBOByScheme(queryTemplate, null, replaceMap);
        //3、根据不同的组件返回不同的数据类型(树、列表、树表、自定义模板、表单等)
        List<Tree> rootTreeList = null;
        List<UIDataTree> rootTreeList = null;
        if(!CollectionUtils.isEmpty(rootCbos)){
            rootTreeList = cbo2Trees(rootCbos,valueField,StringUtils.isBlank(rootExpress)?textField:rootExpress,parentFieldName,treeQuery.isShowCheckBox(),null);
            TreeQueryObject treeQueryObject = new TreeQueryObject();
@@ -609,19 +628,19 @@
     * @param queryFieldList æŸ¥è¯¢çš„字段
     * @param treeQueryObject æ ‘形查询对象,需要valueField和textField,还有parentFieldName,和checkBox
     */
    private void queryTreeForBO(List<Tree> rootTreeList, String queryTemplate,List<String> queryFieldList,TreeQueryObject treeQueryObject) {
        for (Tree rootTree : rootTreeList) {
    private void queryTreeForBO(List<UIDataTree> rootTreeList, String queryTemplate,List<String> queryFieldList,TreeQueryObject treeQueryObject) {
        for (UIDataTree rootTree : rootTreeList) {
            List<BusinessObject> thisChildren = null;
            Map<String,String> sourceDataMap = rootTree.getAttributes();
            Map<String,Object> sourceDataMap = rootTree.getAttributes();
            sourceDataMap.put("f_oid",rootTree.getOid());
            Map<String,String> conditionMap = new HashMap<>();
            conditionMap.put(treeQueryObject.getParentFieldName(),rootTree.getOid());
            if (StringUtils.isNotBlank(queryTemplate)) {
                thisChildren = boService.queryCBOByScheme(queryTemplate, conditionMap, sourceDataMap, null, queryFieldList);
            } else {
                thisChildren = boService.queryCBO(sourceDataMap.getOrDefault("btmname",sourceDataMap.getOrDefault("btmName",treeQueryObject.getParentBtmName())), conditionMap, null, queryFieldList);
                thisChildren = boService.queryCBO((String) sourceDataMap.getOrDefault("btmname",sourceDataMap.getOrDefault("btmName",treeQueryObject.getParentBtmName())), conditionMap, null, queryFieldList);
            }
            List<Tree> childrenTree = cbo2Trees(thisChildren, treeQueryObject.getValueField(), treeQueryObject.getTextField(), treeQueryObject.getParentFieldName(), treeQueryObject.isShowCheckBox(), null);
            List<UIDataTree> childrenTree = cbo2Trees(thisChildren, treeQueryObject.getValueField(), treeQueryObject.getTextField(), treeQueryObject.getParentFieldName(), treeQueryObject.isShowCheckBox(), null);
            rootTree.setChildren(childrenTree);
            if(treeQueryObject.isQueryAllLevel() && !CollectionUtils.isEmpty(childrenTree) ) {
                queryTreeForBO(childrenTree,queryTemplate,queryFieldList,treeQueryObject);
@@ -638,8 +657,8 @@
     * @param textField æ˜¾ç¤ºè¡¨è¾¾å¼
     * @param showCheckBox æ˜¯å¦æ˜¾ç¤ºå¤é€‰æ¡†
     */
    private void queryTreeForLO(List<Tree> rootTreeList, UILinkTypeDataQuery linkTypeDataQuery,String parentFieldName,String valueField,String textField,boolean showCheckBox) {
        for (Tree rootTree : rootTreeList) {
    private void queryTreeForLO(List<UIDataTree> rootTreeList, UILinkTypeDataQuery linkTypeDataQuery,String parentFieldName,String valueField,String textField,boolean showCheckBox) {
        for (UIDataTree rootTree : rootTreeList) {
            Map<String,String> conditionMap = new HashMap<>();
            conditionMap.put(linkTypeDataQuery.isDirection()?"t_oid":"f_oid",rootTree.getOid());
            linkTypeDataQuery.setConditionMap(conditionMap);
@@ -658,12 +677,12 @@
     * @param parentOid ä¸Šçº§çš„主键
     * @return æ ‘
     */
    private List<Tree> cbo2Trees(Collection<BusinessObject> cbos,String valueField,String textField,String parentFieldName,boolean showCheckBox,String parentOid){
    private List<UIDataTree> cbo2Trees(Collection<BusinessObject> cbos,String valueField,String textField,String parentFieldName,boolean showCheckBox,String parentOid){
        final int[] i = {0};
        List<Tree> rootList = new ArrayList<>();
        List<Tree> children = new ArrayList<>();
        List<UIDataTree> rootList = new ArrayList<>();
        List<UIDataTree> children = new ArrayList<>();
        cbos.stream().forEach(cbo->{
            Tree tree = new Tree();
            UIDataTree tree = new UIDataTree();
            tree.setOid(getValueByExpress(cbo,valueField));
            tree.setText(getValueByExpress(cbo,textField));
            if(StringUtils.isNotBlank(parentFieldName)){
@@ -683,7 +702,7 @@
        if(rootList.size() == 0 && children.size() == 0){
            return rootList;
        }
        return Tree.getChildList(rootList,children);
        return UIDataTree.getChildList(rootList,children);
    }
    /**
@@ -696,42 +715,25 @@
     * @param parentOid ä¸Šçº§çš„值
     * @return æ ‘形数据
     */
    public List<Tree> cloAndCbo2Trees(Collection<com.vci.corba.query.data.BOAndLO> boAndLOS,String valueField,String textField,String parentFieldName,boolean showCheckBox,String parentOid){
    public List<UIDataTree> cloAndCbo2Trees(Collection<BOAndLO> boAndLOS, String valueField, String textField, String parentFieldName, boolean showCheckBox, String parentOid){
        final int[] i = {0};
        List<Tree> rootList = new ArrayList<>();
        List<Tree> children = new ArrayList<>();
        List<UIDataTree> rootList = new ArrayList<>();
        List<UIDataTree> children = new ArrayList<>();
        boAndLOS.stream().forEach(boAndLO->{
            Tree tree = new Tree();
            UIDataTree tree = new UIDataTree();
            BusinessObject cbo = new BusinessObject();
            cbo = boAndLO.bo;
            LinkObject clo = new LinkObject();
            clo = boAndLO.lo;
            Map<String,String> cloMap = loService.clo2Map(clo);
            Map<String,String> cbo2Map = boService.cbo2Map(cbo);
            //将链接类型的属性也放进进行返回
            String linkName = Func.isNotBlank(cloMap.get("linktypename")) ? cloMap.get("linktypename"):parentFieldName;
            Map<String, String> returnMap = new HashMap<>();
            cloMap.forEach((key,value)->{
                //过滤掉空值
                if(!returnMap.containsKey(linkName + key) && Func.isNotBlank(key) || Func.isNotBlank(value)){
                    returnMap.put(linkName + key,value);
                }
            });
            //过滤掉空值,用作返回的map
           cbo2Map.entrySet().stream().forEach(entry -> {
                String key = entry.getKey();
                String value = entry.getValue();
                if (!returnMap.containsKey(key) && Func.isNotBlank(key) && Func.isNotBlank(value)) {
                    returnMap.put(key,value);
                }
            });
            Map<String,Object> cloMap = loService.clo2Map(clo);
            Map<String,Object> cbo2Map = boService.cbo2Map(cbo);
            if(!CollectionUtils.isEmpty(cbo2Map)){
            /*if(!CollectionUtils.isEmpty(cbo2Map)){
                cbo2Map.forEach((key,value)->{
                    //TODO: è¿™å„¿ä¸ºå•¥è¦æ‹¼æŽ¥ä¸ŠparentFieldName,导致后面freemarker表达式无法正确替换
                    cloMap.put(/*parentFieldName + "." +*/ key,value);
                    cloMap.put(/*parentFieldName + "." + key,value);
                });
            }
            }*/
            tree.setOid(getValueByExpressForBOAndLO(cloMap,cbo2Map,valueField));
            tree.setText(getValueByExpressForBOAndLO(cloMap,cbo2Map,textField));
            if(StringUtils.isBlank(parentFieldName)){
@@ -743,7 +745,10 @@
                    tree.setParentId(ObjectTool.getLOAttributeValue(clo,parentFieldName));
                }
            }
            //TODO:返回的数据改成按链接类型和业务类型为key:值为对应的属性集合形式返回
            Map<String, Object> returnMap = new HashMap<>();
            returnMap.put((String) cloMap.get("linktypename"),cloMap);
            returnMap.put((String) cbo2Map.get("btmname"),cloMap);
            tree.setAttributes(returnMap);
            tree.setIndex(i[0] + "");
            i[0]++;
@@ -756,7 +761,7 @@
            }
        });
        return Tree.getChildList(rootList,children);
        return UIDataTree.getChildList(rootList,children);
    }
    /**
@@ -788,17 +793,30 @@
     * @param fieldExpress è¡¨è¾¾å¼
     * @return æ›¿æ¢åŽçš„值
     */
    private String getValueByExpressForBOAndLO(Map<String,String> valueMap,Map<String,String> boValueMap,String fieldExpress){
    private String getValueByExpressForBOAndLO(Map<String,Object> valueMap,Map<String,Object> boValueMap,String fieldExpress){
        if(fieldExpress.contains("${")){
            //使用freemarker处理
            return VciBaseUtil.replaceByFreeMarker(fieldExpress,valueMap);
            /*
            TODO:表达式存在T_OID.name这种形式时freemarker替换规则是从T_OID这个对象中招name属性,
                ä½†æ˜¯valueMap是一个String,String的Map所以需要将T_OID.或F_OID.去掉,因为不管是查询的
                form端还是to端都是平台查好放在业务属性boValueMap集合中的,所以直接替就可以
            */
            if(fieldExpress.contains(".")){
                //去除t_oid、T_OID以及f_oid、F_OID
                fieldExpress = fieldExpress
                        .replace("t_oid.","")
                        .replace("T_OID.","")
                        .replace("f_oid.","")
                        .replace("F_OID.","");
            }
            return VciBaseUtil.replaceByFreeMarker(fieldExpress,boValueMap);
        }else {
            List<String> fieldList = VciBaseUtil.str2List(fieldExpress);
            Map<String,String> valueLowMap = new HashMap<>();
            Map<String,Object> valueLowMap = new HashMap<>();
            valueMap.forEach((key,value)->{
                valueLowMap.put(key.toLowerCase(),value);
            });
            Map<String,String> boLowValueMap = new HashMap<>();
            Map<String,Object> boLowValueMap = new HashMap<>();
            if(!CollectionUtils.isEmpty(boValueMap)){
                boValueMap.forEach((key,value)->{
                    boLowValueMap.put(key.toLowerCase(),value);
@@ -806,7 +824,7 @@
            }
            StringBuilder sb = new StringBuilder();
            fieldList.stream().forEach(field->{
                sb.append(valueLowMap.getOrDefault(field,boLowValueMap.getOrDefault(field,""))).append(" ");
                sb.append(boLowValueMap.getOrDefault(field,valueLowMap.getOrDefault(field,""))).append(" ");
            });
            return sb.toString().trim();
        }
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBoServiceImpl.java
@@ -893,7 +893,7 @@
     */
    @Override
    public List<BusinessObject> queryCBOByScheme(String queryScheme,
            Map<String, String> conditionMap, Map<String, String> replaceMap)
            Map<String, String> conditionMap, Map<String, Object> replaceMap)
            throws VciBaseException {
        PageHelper ph = new PageHelper(-1);
        return queryCBOByScheme(queryScheme,conditionMap,replaceMap,ph);
@@ -911,7 +911,7 @@
     */
    @Override
    public List<BusinessObject> queryCBOByScheme(String queryScheme,
            Map<String, String> conditionMap, Map<String, String> replaceMap,
            Map<String, String> conditionMap, Map<String, Object> replaceMap,
            PageHelper ph) throws VciBaseException {
        List<String> clauseList = new ArrayList<String>();
        clauseList.add("*");
@@ -926,7 +926,7 @@
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    @Override
    public QueryTemplate getQtByName(String name, Map<String, String> replaceMap) throws VciBaseException{
    public QueryTemplate getQtByName(String name, Map<String, Object> replaceMap) throws VciBaseException{
        QueryTemplate qt = null;
        try{
            VciBaseUtil.alertNotNull(name,"查询模板的名称");
@@ -935,9 +935,10 @@
            //因为之前平台的Tool.replaceQTValues æ²¡æœ‰å¤„理 ${xxx}。, ä¸ºäº†å¿½ç•¥å¤§å°å†™ï¼Œæˆ‘们这里单独处理 weidy@2021-3-10
            //我们转换为小写
            Condition condition = qt.getCondition();
            Map<String,String> replaceLowMap = new HashMap<>();
            Map<String,Object> replaceLowMap = new HashMap<>();
            if(condition !=null && condition.getCIMap()!=null){
                // Map<String, String> systemVarValueMap = VciSystemVarConstants.getSystemVarValueMap();
                //转小写
                if(!CollectionUtils.isEmpty(replaceMap)){
                    replaceMap.forEach((key,value)->{
                        replaceLowMap.put(key.toLowerCase(),value);
@@ -985,7 +986,7 @@
     * @param qt
     * @param replaceLowMap
     */
    private void recurReplaceCiMap(QueryTemplate qt, Map<String,String> replaceLowMap){
    private void recurReplaceCiMap(QueryTemplate qt, Map<String,Object> replaceLowMap){
        //跳出递归
        if(Func.isEmpty(qt)){
            return;
@@ -1009,7 +1010,7 @@
                            }
                        }
                    }else if(replaceLowMap.containsKey(value.toLowerCase())){
                        lInfo.getValue().setOrdinaryValue(replaceLowMap.get(value.toLowerCase()));
                        lInfo.getValue().setOrdinaryValue((String) replaceLowMap.get(value.toLowerCase()));
                    }
                }else {
                    recurReplaceCiMap(lInfo.getValue().getQueryTemplate(),replaceLowMap);
@@ -1030,7 +1031,7 @@
     */
    @Override
    public List<BusinessObject> queryCBOByScheme(String queryScheme,
            Map<String, String> conditionMap, Map<String, String> replaceMap,
            Map<String, String> conditionMap, Map<String, Object> replaceMap,
            PageHelper ph, List<String> clauseList) throws VciBaseException {
        QueryTemplate qt = getQtByName(queryScheme,replaceMap);
        return baseQueryCBO(qt,conditionMap,ph,clauseList);
@@ -1134,7 +1135,7 @@
     */
    @Override
    public int queryCountByScheme(String queryScheme,
            Map<String, String> conditionMap, Map<String, String> replaceMap)
            Map<String, String> conditionMap, Map<String, Object> replaceMap)
            throws VciBaseException {
        QueryTemplate qt = getQtByName(queryScheme,replaceMap);
        return baseQueryCount(qt,conditionMap);
@@ -1482,7 +1483,7 @@
    @Override
    public <T> List<T> queryObjectByScheme(String queryScheme, Class<T> c,
            Map<String, String> conditionMap, PageHelper ph,
            Map<String, String> replaceMap) throws VciBaseException {
            Map<String, Object> replaceMap) throws VciBaseException {
        WebUtil.alertNotNull(queryScheme,"查询方案");
        //直接从对象里去查询业务类型的名称
        swapConditionMap(c,conditionMap);
@@ -2108,7 +2109,7 @@
     */
    @Override
    public DataGrid queryGridByScheme(String queryScheme,
            Map<String, String> conditionMap, Map<String, String> replaceMap)
            Map<String, String> conditionMap, Map<String, Object> replaceMap)
            throws VciBaseException {
        return queryGridByScheme(queryScheme,conditionMap,replaceMap,new PageHelper(-1,true),null);
    }
@@ -2124,7 +2125,7 @@
     */
    @Override
    public DataGrid queryGridByScheme(String queryScheme,
            Map<String, String> conditionMap, Map<String, String> replaceMap,
            Map<String, String> conditionMap, Map<String, Object> replaceMap,
            PageHelper ph) throws VciBaseException {
        return queryGridByScheme(queryScheme,conditionMap,replaceMap,ph,null);
    }
@@ -2141,7 +2142,7 @@
     */
    @Override
    public DataGrid queryGridByScheme(String queryScheme,
            Map<String, String> conditionMap, Map<String, String> replaceMap,
            Map<String, String> conditionMap, Map<String, Object> replaceMap,
            PageHelper ph, List<String> clauseList) throws VciBaseException {
        if(ph == null){
            ph = new PageHelper(-1,true);
@@ -2212,7 +2213,7 @@
     */
    @Override
    public DataGrid queryGridClassByScheme(String queryScheme, Class c,
            Map<String, String> conditionMap,Map<String,String> replaceMap) throws VciBaseException {
            Map<String, String> conditionMap,Map<String,Object> replaceMap) throws VciBaseException {
        return queryGridClassByScheme(queryScheme,c,conditionMap,replaceMap,new PageHelper(-1,true));
    }
    
@@ -2227,7 +2228,7 @@
     */
    @Override
    public DataGrid queryGridClassByScheme(String queryScheme, Class c,
            Map<String, String> conditionMap, Map<String,String> replaceMap,PageHelper ph)
            Map<String, String> conditionMap, Map<String,Object> replaceMap,PageHelper ph)
            throws VciBaseException {
        if(ph == null){
            ph = new PageHelper(-1,true);
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebLoServiceImpl.java