ludc
2024-12-05 a485f4494787001a2695863e239910c019a52246
表单\表格定义保存对象转换逻辑修改。UI数据查询接口修改
已修改11个文件
已添加1个文件
528 ■■■■■ 文件已修改
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/UIComponentVO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/UITableDefineVO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/UITreeTableDefineVO.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/query/UIDataGridQuery.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/query/UIFormQuery.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-permission/src/main/java/com/vci/web/service/impl/SmUserQueryServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsPortalVIServiceImpl.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIEngineServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/uidataservice/UIDataBaseServiceI.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/uidataservice/impl/UIDataCommonServiceImpl.java 348 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/uidataservice/impl/UIDataTestQueryServiceImpl.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/xmlmodel/UIComponentDefineXO.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/UIComponentVO.java
@@ -27,6 +27,11 @@
    private String name;
    /**
     * bs端使用的自定义查询类名或URL
     */
    private String bsCustQueryCLsOrUrl;
    /**
     * æ‰€å±žåŒºåŸŸ
     */
    private String pkLayout;
@@ -86,6 +91,14 @@
     */
    private List<UIButtonDefineVO> buttons;
    public void setBsCustQueryCLsOrUrl(String bsCustQueryCLsOrUrl) {
        this.bsCustQueryCLsOrUrl = bsCustQueryCLsOrUrl;
    }
    public String getBsCustQueryCLsOrUrl() {
        return bsCustQueryCLsOrUrl;
    }
    @Override
    public String getId() {
        return id;
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/UITableDefineVO.java
@@ -85,6 +85,7 @@
     * æŸ¥è¯¢çš„列
     */
    private List<UITableFieldVO> queryColumns;
    /**
     * freeMarker的表达式的值
     */
@@ -154,6 +155,14 @@
        this.queryTemplateName = queryTemplateName;
    }
    public void setFreeMarkerEls(List<String> freeMarkerEls) {
        this.freeMarkerEls = freeMarkerEls;
    }
    public List<String> getFreeMarkerEls() {
        return freeMarkerEls;
    }
    public List<List<UITableFieldVO>> getCols() {
        return cols;
    }
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/UITreeTableDefineVO.java
@@ -11,6 +11,7 @@
     * åºåˆ—化
     */
    private static final long serialVersionUID = -4334171123988489424L;
    /**
     * æ ‘形结构展开列
     */
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/query/UIDataGridQuery.java
@@ -1,8 +1,6 @@
package com.vci.query;
import com.alibaba.fastjson.JSON;
import com.vci.starter.web.pagemodel.BaseQueryObject;
import com.vci.starter.web.util.Lcm.Func;
import java.util.ArrayList;
import java.util.HashMap;
@@ -32,7 +30,7 @@
    private String uiDefineId;
    /**
     * ç»„件的主键
     * ç»„件的主键(页面定义的主键)
     */
    private String componentOid;
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/query/UIFormQuery.java
@@ -13,6 +13,11 @@
    private String btmName;
    /**
     * ç»„件的主键(页面定义的主键)
     */
    private String componentOid;
    /**
     * è¡¨å•定义的主键
     */
    private String formDefineOid;
@@ -32,6 +37,14 @@
     */
    private String sourceOid;
    public void setComponentOid(String componentOid) {
        this.componentOid = componentOid;
    }
    public String getComponentOid() {
        return componentOid;
    }
    public void setSourceOid(String sourceOid) {
        this.sourceOid = sourceOid;
    }
Source/plt-web/plt-web-parent/plt-web-permission/src/main/java/com/vci/web/service/impl/SmUserQueryServiceImpl.java
@@ -1456,7 +1456,7 @@
        userInfo.updateUser = user.getLastModifier() == null ? "" : user.getLastModifier();
        userInfo.pwdUpdateTime = user.getPwdUpdateTime().getTime();
        userInfo.grantor = user.getGrantor() == null ? "" : user.getGrantor();
        userInfo.secretGrade = user.getSecretGrade() == null ? 2 : Integer.valueOf(user.getGrantor());
        userInfo.secretGrade = user.getSecretGrade() == null ? 2 : Integer.valueOf(user.getSecretGrade());
        userInfo.isDeptLeader = user.getIsDeptLeader() == null ? "0" : user.getIsDeptLeader();
        return userInfo;
    }
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsPortalVIServiceImpl.java
@@ -1225,16 +1225,17 @@
     * @param prmItemDO
     */
    private void initTableConfigDTOO2DOData(PRMItemDO prmItemDO,PRMItemDTO prmItemDTO){
        prmItemDO.setItemOutFields(VciBaseUtil.array2String(prmItemDTO.getItemOutFieldList().toArray(new String[]{})));//需要使用的字段
        prmItemDO.setItemKeyFields(CollectionUtils.isEmpty(prmItemDTO.getItemKeyFieldList())?"":VciBaseUtil.array2String(prmItemDTO.getItemKeyFieldList().toArray(new String[]{})));//需要搜索的字段
       List<String> newItemFieldWidthList = prmItemDTO.getItemFieldWidthList().stream().map(KeyValue::getValue).distinct().collect(Collectors.toList());
       prmItemDO.setItemFieldWidth(VciBaseUtil.array2String(newItemFieldWidthList.toArray(new String[]{}),":"));//字段宽度
       List<ItemSeniorQueryBO> itemSeniorQueryBOS = prmItemDTO.getItemSeniorQueryBOS();
       List<String> itemSeniorQueryColsList = new ArrayList<>();
       List<String> itemSeniorQueryColsCountsList=new ArrayList<>();
       List<String> itemQuerySqlList = new ArrayList<>();
       itemSeniorQueryBOS.stream().forEach(itemSeniorQueryBO -> {
        prmItemDO.setItemOutFields(VciBaseUtil.array2String(prmItemDTO.getItemOutFieldList().toArray(new String[]{})));
        //需要使用的字段prmItemDO.setItemKeyFields(CollectionUtils.isEmpty(prmItemDTO.getItemKeyFieldList())?"":VciBaseUtil.array2String(prmItemDTO.getItemKeyFieldList().toArray(new String[]{})));//需要搜索的字段
        // TODO: 2024/12/5 Ludc è¿™å„¿åŽ»é‡ç”¨çš„ä¸å¯¹ï¼ŒKeyValue::getValue是对宽度去重了
        List<String> newItemFieldWidthList = prmItemDTO.getItemFieldWidthList().stream().distinct().map(KeyValue::getValue).collect(Collectors.toList());
        // TODO: 2024/12/5 Ludc åˆ†éš”符要和平台统一用,而不是用:
        prmItemDO.setItemFieldWidth(VciBaseUtil.array2String(newItemFieldWidthList.toArray(new String[]{}),","));//字段宽度
        List<ItemSeniorQueryBO> itemSeniorQueryBOS = prmItemDTO.getItemSeniorQueryBOS();
        List<String> itemSeniorQueryColsList = new ArrayList<>();
        List<String> itemSeniorQueryColsCountsList=new ArrayList<>();
        List<String> itemQuerySqlList = new ArrayList<>();
        itemSeniorQueryBOS.stream().forEach(itemSeniorQueryBO -> {
           String itemSeniorQueryCols = itemSeniorQueryBO.getItemSeniorQueryCols();
           String itemSeniorQueryColsCounts = itemSeniorQueryBO.getItemSeniorQueryColsCounts();
           String itemQuerySql = itemSeniorQueryBO.getItemQuerySql();
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIEngineServiceImpl.java
@@ -1246,6 +1246,7 @@
            componentVO.setName(page.name);
            componentVO.setDescription(page.desc);
            componentVO.setOrderNum((int) page.seq);
            UIComponentDefineXO componentDefineXO = null;
            try {
                componentDefineXO = readInfoFromXML(page.plDefination, UIComponentDefineXO.class);
@@ -1253,6 +1254,8 @@
                logger.error("读取xml出错",e);
                return  null;
            }
            //自定义查询方式
            componentVO.setBsCustQueryCLsOrUrl(componentDefineXO.getBsCustQueryCLsOrUrl());
            //之前的类型的值是1,2,3等看着不直观
            UIComponentTypeEnum componentTypeEnum = null;
            if("1".equals(componentDefineXO.getTemplateType())){
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/uidataservice/UIDataBaseServiceI.java
@@ -1,6 +1,7 @@
package com.vci.web.service.uidataservice;
import com.alibaba.fastjson.JSON;
import com.vci.corba.query.data.KV;
import com.vci.pagemodel.UIFormDataVO;
import com.vci.query.UIDataGridQuery;
import com.vci.query.UIFormQuery;
@@ -11,9 +12,7 @@
import com.vci.starter.web.pagemodel.UIDataTree;
import com.vci.starter.web.util.Lcm.Func;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
 * ui数据查询基础服务(该接口定义了一些公共的数据查询方法和一些默认方法以供继承和使用)
@@ -45,6 +44,41 @@
    }
    /**
     * åˆ¤æ–­æ˜¯å¦ä½¿ç”¨è‡ªå®šä¹‰ç±»æ–¹å¼æŸ¥è¯¢ï¼šï¼ˆåŽç»­å¦‚果判断是自定义类还是自定义URL的逻辑有更改,也尽量统一在一个地方进行更改)
     * @param
     */
    default boolean isCustomClass(String bsCustomClassOrUrl){
        if(bsCustomClassOrUrl.indexOf("@") == 0){
            return true;
        }
        return false;
    }
    /**
     * å°†KV转成Map
     * @param kvs
     * @return
     */
    default  List<Map<String, Object>> convertKV2ListMap(KV[][] kvs) {
        // å°† KV[][] è½¬æ¢ä¸º Map
        List<Map<String, Object>> resulListMap = new ArrayList<>();
        if(Func.isEmpty(kvs)){
            return resulListMap;
        }
        for (KV[] kvArray : kvs) {
            Map<String, Object> map = new HashMap<>();
            for (KV kv : kvArray) {
                if (kv.key != null && kv.value != null) {
                    //返回全小写的
                    map.put(kv.key.toLowerCase(Locale.ROOT), kv.value);
                }
            }
            resulListMap.add(map);
        }
        return resulListMap;
    }
    /**
     * èŽ·å–è¡¨æ ¼çš„æ•°æ®
     * @param dataGridQuery è¡¨æ ¼æŸ¥è¯¢ï¼Œå¿…须有业务类型名称和 è¡¨æ ¼çš„编号
     * @return DataGrid中data为Map<String,String>格式
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/uidataservice/impl/UIDataCommonServiceImpl.java
@@ -57,7 +57,6 @@
import static com.vci.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST;
/**
 * UI上的数据查询(通用查询服务)
 * @author Ludc
@@ -155,73 +154,92 @@
        if(Func.isNotEmpty(dataGridQuery.getSourceData())){
            dataGridQuery.setSourceData(this.convertMapValueJson2Map(dataGridQuery.getSourceData()));
        }
        //先判断查询模板
        UITableDefineVO tableDefineVO = uiEngineService.getComponentByOid(dataGridQuery.getComponentOid(),null).getTableDefineVO();
        String queryTemplate = Func.isNotEmpty(dataGridQuery.getSourceData())? (String) dataGridQuery.getSourceData().getOrDefault("querytemplate",tableDefineVO.getQueryTemplateName()) :tableDefineVO.getQueryTemplateName();
        if(StringUtils.isBlank(queryTemplate)){
            //说明没有设置查询模板,需要看看在这个表格所在的组件有没有设置
            tableDefineVO = uiEngineService.getTableById(dataGridQuery.getBtmName(), dataGridQuery.getTableDefineId());
            queryTemplate = tableDefineVO.getQueryTemplateName();
        }
        //看看有没有自定义的SQL
        Set<String> queryFieldList = new HashSet<>();
        tableDefineVO.getCols().forEach(cols->{
            //获取参照
            List<UITableFieldVO> referFieldList = cols.stream().filter(s -> UIFieldTypeEnum.REFER.getValue().equalsIgnoreCase(s.getFieldType())).collect(Collectors.toList());
            if(!CollectionUtils.isEmpty(referFieldList)){
                referFieldList.stream().forEach(field->{
                    queryFieldList.add(field.getField());
                    if(StringUtils.isNotBlank(field.getShowField())) {
                        queryFieldList.add(field.getShowField());
                    }
                });
        //先判断查询模板是否配置了自定义查询类
        UIComponentVO componentVO = uiEngineService.getComponentByOid(dataGridQuery.getComponentOid(), null);
        UITableDefineVO tableDefineVO = componentVO.getTableDefineVO();
        String bsCustQueryCLsOrUrl = componentVO.getBsCustQueryCLsOrUrl();
        // TODO: 2024/12/5 Ludc æ ¹æ®UI配置的进行判断是否使用自定义类进行查询(自定义类查询方式优先级高于查询模板)
        if(Func.isNotBlank(bsCustQueryCLsOrUrl) && isCustomClass(bsCustQueryCLsOrUrl)){
            //通过反射调用bsCustQueryCLsOrUrl中定义的服务类中的查询方法
            try {
                // èŽ·å–ç±»çš„ Class å¯¹è±¡
                Class<?> clazz = Class.forName(bsCustQueryCLsOrUrl.replace("@",""));
                // åˆ›å»ºç±»çš„实例
                Object instance = clazz.getDeclaredConstructor().newInstance();
                // èŽ·å–æ–¹æ³•getDataForGrid(该方法是接口中统一定义的方法)
                Method method = clazz.getMethod("getDataForGrid", UIDataGridQuery.class);
                // è°ƒç”¨æ–¹æ³•
                DataGrid dataGrid = (DataGrid) method.invoke(instance, dataGridQuery);
                return dataGrid;
            }catch (Exception e){
                e.printStackTrace();
                throw new VciBaseException("获取表格数据时出现错误,原因:"+e.getMessage());
            }
            Map<String, String> comboxMap = cols.stream().filter(s -> UIFieldTypeEnum.COMBOX.getValue().equalsIgnoreCase(s.getFieldType()) && StringUtils.isNotBlank(s.getComboxKey())).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getField(), t -> t.getComboxKey()));
            if(!CollectionUtils.isEmpty(comboxMap)) {
                comboxMap.forEach((field,comboxKey)->{
                    queryFieldList.add(comboxKey+"_" + field.substring(0,field.length()-4) + "#" + field);
                });
            }
            queryFieldList.addAll(cols.stream().filter(s -> !UIFieldTypeEnum.REFER.getValue().equalsIgnoreCase(s.getFieldType()) && !UIFieldTypeEnum.COMBOX.getValue().equalsIgnoreCase(s.getFieldType())).map(s -> s.getField()).collect(Collectors.toList()));
        });
        //针对参照的,我们需要添加对应的
        //这个业务类型包含的属性
        OsBtmTypeVO btmTypeVO = null;
        OsLinkTypeVO linkTypeVO = null;
        if(dataGridQuery.isLinkTypeFlag()){
            linkTypeVO = linkTypeService.getLinkTypeById(dataGridQuery.getBtmName());
            queryFieldList.addAll(linkTypeVO.getAttributes().stream().map(OsLinkTypeAttributeVO::getId).collect(Collectors.toList()));
            queryFieldList.addAll(WebLoServiceImpl.LO_BASE_FIELD_MAP.values());
        }else{
            //btmTypeVO = btmService.getBtmById(dataGridQuery.getBtmname());
            btmTypeVO = btmService.getBtmByName(dataGridQuery.getBtmName());
            queryFieldList.addAll(btmTypeVO.getAttributes().stream().map(OsBtmTypeAttributeVO::getId).collect(Collectors.toList()));
            queryFieldList.addAll(WebBoServiceImpl.BO_BASE_FIELD_MAP.values());
        }
        queryFieldList.add("creator_name");
        queryFieldList.add("lastmodifier_name");
        //我们在后台查询业务数据
        Map<String, Object> replaceMap = wrapperReplaceMap(dataGridQuery.getSourceData());
        if(dataGridQuery.isLinkTypeFlag()){
            UILinkTypeDataQuery linkTypeDataQuery = new UILinkTypeDataQuery();
            linkTypeDataQuery.setQueryTemplateName(queryTemplate);
            linkTypeDataQuery.setReplaceMap(replaceMap);
            linkTypeDataQuery.setConditionMap(dataGridQuery.getConditionMap());
            linkTypeDataQuery.setClauseList(queryFieldList);
            linkTypeDataQuery.setLinkType(dataGridQuery.getBtmName());
            if(dataGridQuery.isTreeTableFlag()){
                linkTypeDataQuery.setLevel(-1);
            String queryTemplate = Func.isNotEmpty(dataGridQuery.getSourceData())? (String) dataGridQuery.getSourceData().getOrDefault("querytemplate",tableDefineVO.getQueryTemplateName()) :tableDefineVO.getQueryTemplateName();
            if(StringUtils.isBlank(queryTemplate)){
                //说明没有设置查询模板,需要看看在这个表格所在的组件有没有设置
                tableDefineVO = uiEngineService.getTableById(dataGridQuery.getBtmName(), dataGridQuery.getTableDefineId());
                queryTemplate = tableDefineVO.getQueryTemplateName();
            }
            return loService.queryGridByScheme(linkTypeDataQuery);
        }else {
            DataGrid dataGrid = boService.queryGridByScheme(queryTemplate,
                    dataGridQuery.getConditionMap(), replaceMap, dataGridQuery.getPageHelper(), queryFieldList.stream().collect(Collectors.toList()));
            return dataGrid;
            //看看有没有自定义的SQL
            Set<String> queryFieldList = new HashSet<>();
            tableDefineVO.getCols().forEach(cols->{
                //获取参照
                List<UITableFieldVO> referFieldList = cols.stream().filter(s -> UIFieldTypeEnum.REFER.getValue().equalsIgnoreCase(s.getFieldType())).collect(Collectors.toList());
                if(!CollectionUtils.isEmpty(referFieldList)){
                    referFieldList.stream().forEach(field->{
                        queryFieldList.add(field.getField());
                        if(StringUtils.isNotBlank(field.getShowField())) {
                            queryFieldList.add(field.getShowField());
                        }
                    });
                }
                Map<String, String> comboxMap = cols.stream().filter(s -> UIFieldTypeEnum.COMBOX.getValue().equalsIgnoreCase(s.getFieldType()) && StringUtils.isNotBlank(s.getComboxKey())).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getField(), t -> t.getComboxKey()));
                if(!CollectionUtils.isEmpty(comboxMap)) {
                    comboxMap.forEach((field,comboxKey)->{
                        queryFieldList.add(comboxKey+"_" + field.substring(0,field.length()-4) + "#" + field);
                    });
                }
                queryFieldList.addAll(cols.stream().filter(s -> !UIFieldTypeEnum.REFER.getValue().equalsIgnoreCase(s.getFieldType()) && !UIFieldTypeEnum.COMBOX.getValue().equalsIgnoreCase(s.getFieldType())).map(s -> s.getField()).collect(Collectors.toList()));
            });
            //针对参照的,我们需要添加对应的
            //这个业务类型包含的属性
            OsBtmTypeVO btmTypeVO = null;
            OsLinkTypeVO linkTypeVO = null;
            if(dataGridQuery.isLinkTypeFlag()){
                linkTypeVO = linkTypeService.getLinkTypeById(dataGridQuery.getBtmName());
                queryFieldList.addAll(linkTypeVO.getAttributes().stream().map(OsLinkTypeAttributeVO::getId).collect(Collectors.toList()));
                queryFieldList.addAll(WebLoServiceImpl.LO_BASE_FIELD_MAP.values());
            }else{
                //btmTypeVO = btmService.getBtmById(dataGridQuery.getBtmname());
                btmTypeVO = btmService.getBtmByName(dataGridQuery.getBtmName());
                queryFieldList.addAll(btmTypeVO.getAttributes().stream().map(OsBtmTypeAttributeVO::getId).collect(Collectors.toList()));
                queryFieldList.addAll(WebBoServiceImpl.BO_BASE_FIELD_MAP.values());
            }
            queryFieldList.add("creator_name");
            queryFieldList.add("lastmodifier_name");
            //我们在后台查询业务数据
            Map<String, Object> replaceMap = wrapperReplaceMap(dataGridQuery.getSourceData());
            if(dataGridQuery.isLinkTypeFlag()){
                UILinkTypeDataQuery linkTypeDataQuery = new UILinkTypeDataQuery();
                linkTypeDataQuery.setQueryTemplateName(queryTemplate);
                linkTypeDataQuery.setReplaceMap(replaceMap);
                linkTypeDataQuery.setConditionMap(dataGridQuery.getConditionMap());
                linkTypeDataQuery.setClauseList(queryFieldList);
                linkTypeDataQuery.setLinkType(dataGridQuery.getBtmName());
                if(dataGridQuery.isTreeTableFlag()){
                    linkTypeDataQuery.setLevel(-1);
                }
                return loService.queryGridByScheme(linkTypeDataQuery);
            }else {
                DataGrid dataGrid = boService.queryGridByScheme(queryTemplate,
                        dataGridQuery.getConditionMap(), replaceMap, dataGridQuery.getPageHelper(), queryFieldList.stream().collect(Collectors.toList()));
                return dataGrid;
            }
        }
        //生命周期在其中查询后就会处理
        //枚举也会被处理了
    }
    /**
@@ -238,102 +256,124 @@
        if(Func.isNotEmpty(formQuery.getSourceData())){
            formQuery.setSourceData(this.convertMapValueJson2Map(formQuery.getSourceData()));
        }
        UIFormDefineVO formDefineVO = uiEngineService.getFormById(formQuery.getBtmName(),formQuery.getFormDefineId());
        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());
        if(!CollectionUtils.isEmpty(referFieldList)){
            referFieldList.stream().forEach(field->{
                queryFieldList.add(field.getField());
                if(StringUtils.isNotBlank(field.getShowField())) {
                    queryFieldList.add(field.getShowField());
                }
            });
        }
        Map<String, String> comboxMap = formDefineVO.getItems().stream().filter(s -> UIFieldTypeEnum.COMBOX.getValue().equalsIgnoreCase(s.getType()) && StringUtils.isNotBlank(s.getComboxKey())).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getField(), t -> t.getComboxKey()));
        if(!CollectionUtils.isEmpty(comboxMap)) {
            comboxMap.forEach((field,comboxKey)->{
                //要把枚举的属性查询出来,和表格额地方不一样,因为那边会把field直接加了text
                queryFieldList.add(comboxKey+"_" + field + "#" + field +"text");
            });
        }
        //这个业务类型包含的属性
        OsBtmTypeVO btmTypeVO = null;
        OsLinkTypeVO linkTypeVO = null;
        if(formDefineVO.isLinkTypeFlag()){
            linkTypeVO = linkTypeService.getLinkTypeById(formQuery.getBtmName());
            queryFieldList.addAll(linkTypeVO.getAttributes().stream().map(OsLinkTypeAttributeVO::getId).collect(Collectors.toList()));
            queryFieldList.addAll(WebLoServiceImpl.LO_BASE_FIELD_MAP.values());
        }else{
            btmTypeVO = btmService.getBtmByName(formQuery.getBtmName());
            queryFieldList.addAll(btmTypeVO.getAttributes().stream().map(OsBtmTypeAttributeVO::getId).collect(Collectors.toList()));
        }
        queryFieldList.add("creator_name");
        queryFieldList.add("lastmodifier_name");
        Map<String,String> conditionMap = WebUtil.getOidQuery(formQuery.getSourceOid());
        Map<String, Object> replaceMap = wrapperReplaceMap(formQuery.getSourceData());
        UIFormDataVO formDataVO = new UIFormDataVO();
        replaceMap.put("oid", formQuery.getSourceOid().trim());
        if(!formDefineVO.isLinkTypeFlag()) {
            List<BusinessObject> cbos = null;
            if (StringUtils.isNotBlank(queryTemplate)) {
                // replaceMap.put("oid", formQuery.getOid().trim());
                cbos = boService.queryCBOByScheme(queryTemplate, conditionMap, replaceMap, null, queryFieldList.stream().collect(Collectors.toList()));
            } else {
                //没有查询模板,那我们就直接主键和业务类型去查询
                cbos = boService.queryCBO(formQuery.getBtmName(), conditionMap, null, queryFieldList.stream().collect(Collectors.toList()));
            }
            if (!CollectionUtils.isEmpty(cbos)) {
                BusinessObject cbo = cbos.get(0);
                formDataVO.setData(boService.cbo2Map(cbo));
            } else {
                throw new VciBaseException(DATA_OID_NOT_EXIST);
        //先判断查询模板是否配置了自定义查询类
        UIComponentVO componentVO = uiEngineService.getComponentByOid(formQuery.getComponentOid(), null);
        UIFormDefineVO formDefineVO = componentVO.getFormDefineVO();
        //UIFormDefineVO formDefineVO = uiEngineService.getFormById(formQuery.getBtmName(),formQuery.getFormDefineId());
        String bsCustQueryCLsOrUrl = componentVO.getBsCustQueryCLsOrUrl();
        if(Func.isNotBlank(bsCustQueryCLsOrUrl) && isCustomClass(bsCustQueryCLsOrUrl)){
            //通过反射调用bsCustQueryCLsOrUrl中定义的服务类中的查询方法
            try {
                // èŽ·å–ç±»çš„ Class å¯¹è±¡
                Class<?> clazz = Class.forName(bsCustQueryCLsOrUrl.replace("@",""));
                // åˆ›å»ºç±»çš„实例
                Object instance = clazz.getDeclaredConstructor().newInstance();
                // èŽ·å–æ–¹æ³•getDataForGrid(该方法是接口中统一定义的方法)
                Method method = clazz.getMethod("getDataForForm", UIDataGridQuery.class);
                // è°ƒç”¨æ–¹æ³•
                UIFormDataVO uiFormDataVO = (UIFormDataVO) method.invoke(instance, formQuery);
                return uiFormDataVO;
            }catch (Exception e){
                e.printStackTrace();
                throw new VciBaseException("获取表格数据时出现错误,原因:"+e.getMessage());
            }
        }else{
            UILinkTypeDataQuery linkTypeDataQuery = new UILinkTypeDataQuery();
            linkTypeDataQuery.setQueryTemplateName(queryTemplate);
            linkTypeDataQuery.setReplaceMap(replaceMap);
            linkTypeDataQuery.setConditionMap(conditionMap);
            linkTypeDataQuery.setClauseList(queryFieldList);
            linkTypeDataQuery.setLinkType(formQuery.getBtmName());
            //linkTypeDataQuery.setDirection(formQuery.isOrientation());
            //linkTypeDataQuery.setToBtmType(treeDefineVO.getBtmType());
            DataGrid dataGrid = loService.queryGridByScheme(linkTypeDataQuery);
            if (dataGrid != null && !CollectionUtils.isEmpty(dataGrid.getData())) {
                formDataVO.setData((Map<String, Object>) dataGrid.getData().get(0));
            }
        }
        //查询附件
        formDataVO.setAttachmentFileVOs(fileObjectService.listFilesByOwnbiz(formQuery.getSourceOid(), formQuery.getBtmName(), "attachment"));
        List<UIFormItemVO> fileItems = formDefineVO.getItems().stream().filter(s -> UIFieldTypeEnum.FILE.getValue().equalsIgnoreCase(s.getType())).collect(Collectors.toList());
        if(!CollectionUtils.isEmpty(fileItems)){
            //字段的属性肯定不会超过1000个
            //查询这些的值
            List<String> filePathList = new ArrayList<>();
            fileItems.stream().forEach(field->{
                Object value = formDataVO.getData().getOrDefault(field.getField(),null);
                if(value!=null && StringUtils.isNotBlank(value.toString())){
                    filePathList.add(value.toString());
                }
            });
            List<VciFileObjectVO> fileObjectVOS = fileObjectService.listFileObjectByPath(filePathList, "filePathField");
            if(!CollectionUtils.isEmpty(fileObjectVOS)){
                Map<String,VciFileObjectVO> fileObjectVOMap = fileObjectVOS.stream().collect(Collectors.toMap(s->s.getFilePath(),t->t,(o1,o2)->o2));
                Map<String,VciFileObjectVO> fieldFileVOMap = new HashMap<>();
                fileItems.stream().forEach(field->{
                    Object value = formDataVO.getData().getOrDefault(field.getField(),null);
                    if(value!=null){
                        VciFileObjectVO fileObjectVO = fileObjectVOMap.getOrDefault(value.toString(),null);
                        if(fileObjectVO!=null){
                            fieldFileVOMap.put(field.getField(),fileObjectVO);
                        }
            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());
            if(!CollectionUtils.isEmpty(referFieldList)){
                referFieldList.stream().forEach(field->{
                    queryFieldList.add(field.getField());
                    if(StringUtils.isNotBlank(field.getShowField())) {
                        queryFieldList.add(field.getShowField());
                    }
                });
                formDataVO.setFilePathFieldMap(fieldFileVOMap);
            }
            Map<String, String> comboxMap = formDefineVO.getItems().stream().filter(s -> UIFieldTypeEnum.COMBOX.getValue().equalsIgnoreCase(s.getType()) && StringUtils.isNotBlank(s.getComboxKey())).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getField(), t -> t.getComboxKey()));
            if(!CollectionUtils.isEmpty(comboxMap)) {
                comboxMap.forEach((field,comboxKey)->{
                    //要把枚举的属性查询出来,和表格额地方不一样,因为那边会把field直接加了text
                    queryFieldList.add(comboxKey+"_" + field + "#" + field +"text");
                });
            }
            //这个业务类型包含的属性
            OsBtmTypeVO btmTypeVO = null;
            OsLinkTypeVO linkTypeVO = null;
            if(formDefineVO.isLinkTypeFlag()){
                linkTypeVO = linkTypeService.getLinkTypeById(formQuery.getBtmName());
                queryFieldList.addAll(linkTypeVO.getAttributes().stream().map(OsLinkTypeAttributeVO::getId).collect(Collectors.toList()));
                queryFieldList.addAll(WebLoServiceImpl.LO_BASE_FIELD_MAP.values());
            }else{
                btmTypeVO = btmService.getBtmByName(formQuery.getBtmName());
                queryFieldList.addAll(btmTypeVO.getAttributes().stream().map(OsBtmTypeAttributeVO::getId).collect(Collectors.toList()));
            }
            queryFieldList.add("creator_name");
            queryFieldList.add("lastmodifier_name");
            Map<String,String> conditionMap = WebUtil.getOidQuery(formQuery.getSourceOid());
            Map<String, Object> replaceMap = wrapperReplaceMap(formQuery.getSourceData());
            UIFormDataVO formDataVO = new UIFormDataVO();
            replaceMap.put("oid", formQuery.getSourceOid().trim());
            if(!formDefineVO.isLinkTypeFlag()) {
                List<BusinessObject> cbos = null;
                if (StringUtils.isNotBlank(queryTemplate)) {
                    // replaceMap.put("oid", formQuery.getOid().trim());
                    cbos = boService.queryCBOByScheme(queryTemplate, conditionMap, replaceMap, null, queryFieldList.stream().collect(Collectors.toList()));
                } else {
                    //没有查询模板,那我们就直接主键和业务类型去查询
                    cbos = boService.queryCBO(formQuery.getBtmName(), conditionMap, null, queryFieldList.stream().collect(Collectors.toList()));
                }
                if (!CollectionUtils.isEmpty(cbos)) {
                    BusinessObject cbo = cbos.get(0);
                    formDataVO.setData(boService.cbo2Map(cbo));
                } else {
                    throw new VciBaseException(DATA_OID_NOT_EXIST);
                }
            }else{
                UILinkTypeDataQuery linkTypeDataQuery = new UILinkTypeDataQuery();
                linkTypeDataQuery.setQueryTemplateName(queryTemplate);
                linkTypeDataQuery.setReplaceMap(replaceMap);
                linkTypeDataQuery.setConditionMap(conditionMap);
                linkTypeDataQuery.setClauseList(queryFieldList);
                linkTypeDataQuery.setLinkType(formQuery.getBtmName());
                //linkTypeDataQuery.setDirection(formQuery.isOrientation());
                //linkTypeDataQuery.setToBtmType(treeDefineVO.getBtmType());
                DataGrid dataGrid = loService.queryGridByScheme(linkTypeDataQuery);
                if (dataGrid != null && !CollectionUtils.isEmpty(dataGrid.getData())) {
                    formDataVO.setData((Map<String, Object>) dataGrid.getData().get(0));
                }
            }
            //查询附件
            formDataVO.setAttachmentFileVOs(fileObjectService.listFilesByOwnbiz(formQuery.getSourceOid(), formQuery.getBtmName(), "attachment"));
            List<UIFormItemVO> fileItems = formDefineVO.getItems().stream().filter(s -> UIFieldTypeEnum.FILE.getValue().equalsIgnoreCase(s.getType())).collect(Collectors.toList());
            if(!CollectionUtils.isEmpty(fileItems)){
                //字段的属性肯定不会超过1000个
                //查询这些的值
                List<String> filePathList = new ArrayList<>();
                fileItems.stream().forEach(field->{
                    Object value = formDataVO.getData().getOrDefault(field.getField(),null);
                    if(value!=null && StringUtils.isNotBlank(value.toString())){
                        filePathList.add(value.toString());
                    }
                });
                List<VciFileObjectVO> fileObjectVOS = fileObjectService.listFileObjectByPath(filePathList, "filePathField");
                if(!CollectionUtils.isEmpty(fileObjectVOS)){
                    Map<String,VciFileObjectVO> fileObjectVOMap = fileObjectVOS.stream().collect(Collectors.toMap(s->s.getFilePath(),t->t,(o1,o2)->o2));
                    Map<String,VciFileObjectVO> fieldFileVOMap = new HashMap<>();
                    fileItems.stream().forEach(field->{
                        Object value = formDataVO.getData().getOrDefault(field.getField(),null);
                        if(value!=null){
                            VciFileObjectVO fileObjectVO = fileObjectVOMap.getOrDefault(value.toString(),null);
                            if(fileObjectVO!=null){
                                fieldFileVOMap.put(field.getField(),fileObjectVO);
                            }
                        }
                    });
                    formDataVO.setFilePathFieldMap(fieldFileVOMap);
                }
            }
            return formDataVO;
        }
        return formDataVO;
    }
    /**
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/uidataservice/impl/UIDataTestQueryServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.vci.web.service.uidataservice.impl;
import com.vci.corba.query.data.KV;
import com.vci.pagemodel.UIFormDataVO;
import com.vci.query.UIDataGridQuery;
import com.vci.query.UIFormQuery;
import com.vci.query.UITreeQuery;
import com.vci.starter.web.pagemodel.BaseResult;
import com.vci.starter.web.pagemodel.DataGrid;
import com.vci.starter.web.pagemodel.UIDataTree;
import com.vci.starter.web.util.VciBaseUtil;
import com.vci.web.service.uidataservice.UIDataBaseServiceI;
import com.vci.web.util.PlatformClientUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
 * è¿™æ˜¯ä¸€ä¸ªè‡ªå®šä¹‰æŸ¥è¯¢ç±»çš„示例服务
 * @author ludc
 * @date 2024/12/5 13:00
 */
@Service
public class UIDataTestQueryServiceImpl implements UIDataBaseServiceI {
    @Override
    public DataGrid getDataForGrid(UIDataGridQuery dataGridQuery) throws Exception {
        // TODO: 2024/12/5 Ludc åå°„方式调用,所以只能通过newPlatformClientUtil的形式,注解形式服务注入
        PlatformClientUtil platformClientUtil = new PlatformClientUtil();
        String sql = "select * from " + VciBaseUtil.getTableName(dataGridQuery.getBtmName())
                + " where oid in ('D5DFA9D3-D2AF-4D1D-850F-73B102532740','BCE5B0E3-A49C-2453-8E62-8F4C7F4BEDF2','257BB15B-12CF-68D2-FCFE-1FA3E29DBD1E')";
        KV[][] kvs = platformClientUtil.getQueryService().queryBySql(sql);
        List<Map<String, Object>> resultMap = convertKV2ListMap(kvs);
        DataGrid dataGrid = new DataGrid();
        dataGrid.setData(resultMap);
        dataGrid.setTotal(resultMap.size());
        // TODO: 2024/12/5 Ludc è¿™å„¿è¿˜å¯ä»¥æŒ‰ç…§dataGridQuery.getTableDefineId()来查询表格定义的内容,
        //  ç„¶åŽæ ¹æ®é…ç½®çš„页面信息来处理要查询条件或列以及返回的参数
        return dataGrid;
    }
    @Override
    public UIFormDataVO getDataForForm(UIFormQuery formQuery) throws Exception {
        return null;
    }
    @Override
    public List<UIDataTree> getDataForTree(UITreeQuery treeQuery) throws Exception {
        return null;
    }
    @Override
    public BaseResult getDataByTemp(UITreeQuery treeQuery) throws Exception {
        return null;
    }
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/xmlmodel/UIComponentDefineXO.java
@@ -162,6 +162,11 @@
     */
    private String queryTemplateName;
    /**
     * bs端使用的自定义查询类名或URL
     */
    private String bsCustQueryCLsOrUrl;
    public String getType() {
        return type;
    }
@@ -394,6 +399,14 @@
        this.queryTemplateName = queryTemplateName;
    }
    public void setBsCustQueryCLsOrUrl(String bsCustQueryCLsOrUrl) {
        this.bsCustQueryCLsOrUrl = bsCustQueryCLsOrUrl;
    }
    public String getBsCustQueryCLsOrUrl() {
        return bsCustQueryCLsOrUrl;
    }
    @Override
    public String toString() {
        return "UIComponentDefineXO{" +
@@ -426,6 +439,7 @@
                ", UIParser='" + UIParser + '\'' +
                ", extAttr='" + extAttr + '\'' +
                ", queryTemplateName='" + queryTemplateName + '\'' +
                ", bsCustQueryCLsOrUrl='" + bsCustQueryCLsOrUrl + '\'' +
                '}';
    }
}