ludc
2024-12-04 e405b861b9521f5ea38c5402203a5b05988f9de2
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java
@@ -6,10 +6,8 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.vci.client.common.oq.OQTool;
import com.vci.client.common.providers.ClientServiceProvider;
import com.vci.client.mw.ClientSessionUtility;
import com.vci.common.qt.object.Condition;
import com.vci.common.qt.object.QueryTemplate;
import com.vci.common.utility.ObjectUtility;
import com.vci.constant.FrameWorkLangCodeConstant;
import com.vci.corba.common.PLException;
import com.vci.corba.omd.atm.AttributeDef;
@@ -23,7 +21,6 @@
import com.vci.corba.omd.stm.StatePool;
import com.vci.corba.omd.vrm.VersionRule;
import com.vci.dto.OsBtmTypeDTO;
import com.vci.dto.OsBtmTypeLinkAttributesDTO;
import com.vci.model.IndexObject;
import com.vci.omd.constants.AttributeConstants;
import com.vci.omd.constants.FileObjectType;
@@ -31,14 +28,12 @@
import com.vci.omd.utils.ObjectTool;
import com.vci.pagemodel.*;
import com.vci.po.OsBtmTypePO;
import com.vci.po.OsLinkTypePO;
import com.vci.starter.poi.bo.ReadExcelOption;
import com.vci.starter.poi.bo.WriteExcelData;
import com.vci.starter.poi.bo.WriteExcelOption;
import com.vci.starter.poi.constant.ExcelLangCodeConstant;
import com.vci.starter.poi.util.ExcelUtil;
import com.vci.starter.web.annotation.log.VciUnLog;
import com.vci.starter.web.constant.QueryOptionConstant;
import com.vci.starter.web.enumpck.BooleanEnum;
import com.vci.starter.web.exception.VciBaseException;
import com.vci.starter.web.pagemodel.BaseResult;
@@ -46,9 +41,12 @@
import com.vci.starter.web.pagemodel.PageHelper;
import com.vci.starter.web.pagemodel.Tree;
import com.vci.starter.web.util.*;
import com.vci.starter.web.util.BeanUtil;
import com.vci.starter.web.util.Lcm.ConcurrentDateFormat;
import com.vci.starter.web.util.Lcm.DateUtil;
import com.vci.starter.web.util.Lcm.Func;
import com.vci.web.service.*;
import com.vci.web.util.*;
import com.vci.web.util.PlatformClientUtil;
import com.vci.web.util.WebUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -59,7 +57,6 @@
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import javax.swing.*;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
@@ -203,7 +200,7 @@
    @Override
    public List<OsBtmTypeVO> btmDO2VOs(Collection<BizType> btmItems,Map<String, OsAttributeVO> attributeVOMap) {
        List<OsBtmTypeVO> VOS = new ArrayList<>();
        Optional.ofNullable(btmItems).orElseGet(() -> new ArrayList<>()).stream().forEach(btmItem -> {
        Optional.ofNullable(btmItems).orElseGet(() -> new ArrayList<>()).parallelStream().forEach(btmItem -> {
            OsBtmTypeVO vo = btmDO2VO(btmItem,attributeVOMap);
            VOS.add(vo);
        });
@@ -244,9 +241,10 @@
            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.getRevisionRuleName()) || vo.isInputRevisionFlag()) {
            if (StringUtils.isNotBlank(vo.getRevisionRuleId()) || vo.isInputRevisionFlag()) {
                vo.setRevisionFlag(true);
            }
            vo.setLifeCycleIds(Arrays.stream(btmItem.lifeCycles).collect(Collectors.joining(",")));
@@ -255,7 +253,7 @@
            List<OsBtmTypeAttributeVO> btmTypeAttributeVOS = new ArrayList<>();
            Optional.ofNullable(attributeVOS).orElseGet(() -> new ArrayList<>()).stream().forEach(attributeVO -> {
                OsBtmTypeAttributeVO btmTypeAttributeVO = new OsBtmTypeAttributeVO();
                BeanUtil.convert(attributeVO, btmTypeAttributeVO);
                BeanUtilForVCI.convert(attributeVO, btmTypeAttributeVO);
                btmTypeAttributeVO.setPkBtmType(vo.getOid());
                btmTypeAttributeVO.setBtmTypeId(vo.getId());
                btmTypeAttributeVO.setAttributeDataType(attributeVO.getAttributeDataType());
@@ -290,12 +288,12 @@
        if (CollectionUtils.isEmpty(btmIds)) {
            return null;
        }
        Map<String, OsBtmTypeVO> btmTypeVOMap = self.selectAllBtmMap();
        //Map<String, OsBtmTypeVO> btmTypeVOMap = self.selectAllBtmMap();
        BtmDataFetcher btmDataFetcher = new BtmDataFetcher();
        List<OsBtmTypeVO> btmTypeVOS = new ArrayList<>();
        btmIds.stream().forEach(id -> {
            if (btmTypeVOMap.containsKey(id.toLowerCase())) {
                btmTypeVOS.add(btmTypeVOMap.get(id.toLowerCase()));
            }
            OsBtmTypeVO btmType = btmDataFetcher.getBtmType(id);
            btmTypeVOS.add(btmType);
        });
        return btmTypeVOS;
    }
@@ -307,12 +305,32 @@
     * @return 业务类型
     */
    @Override
    public OsBtmTypeVO getBtmById(String id) {
    public OsBtmTypeVO getBtmById(String id) throws PLException {
        if (StringUtils.isBlank(id)) {
            return null;
        }
        return self.selectAllBtmMap().getOrDefault(id.toLowerCase(), null);
        BizType bizType = platformClientUtil.getBtmService().getBizTypeByName(id);
        return btmDO2VO(bizType,null);
    }
    /**
     * 使用类型名获取业务类型,查不到直接报错
     * @param btmName 类型名
     * @return 业务类型
     * @throws
     */
    @Override
    public OsBtmTypeVO getBtmByName(String btmName) throws PLException{
        if(Func.isBlank(btmName)){
            throw new PLException("500",new String[]{"查询条件类型名不能为空!"});
        }
        BizType bizType = platformClientUtil.getBtmService().getBizTypeByName(btmName);
        if(Func.isEmpty(bizType) || Func.isBlank(bizType.oid)){
            throw new PLException("500",new String[]{"根据【"+btmName+"】未查询到对应业务类型!"});
        }
        return btmDO2VO(bizType,null);
    }
    /**
     * 使用编号获取业务类型
     *
@@ -424,11 +442,12 @@
        if (attrVOs == null) {
            attrVOs = new ArrayList<>();
        }
        if (!CollectionUtils.isEmpty(attributeService.getDefaultAttributeVOs())) {
        List<OsAttributeVO> defaultAttributeVOs = attributeService.getDefaultAttributeVOs();
        if (!CollectionUtils.isEmpty(defaultAttributeVOs)) {
            List<OsBtmTypeAttributeVO> finalAttrVOs = attrVOs;
            attributeService.getDefaultAttributeVOs().stream().forEach(attr -> {
            defaultAttributeVOs.stream().forEach(attr -> {
                OsBtmTypeAttributeVO attributeVO = new OsBtmTypeAttributeVO();
                BeanUtil.convert(attr, attributeVO);
                BeanUtilForVCI.convert(attr, attributeVO);
                attributeVO.setAttributeDataType(attr.getAttributeDataType());
                attributeVO.setAttributeLength(attr.getAttrLength());
                attributeVO.setReferBtmTypeId(attr.getBtmTypeId());
@@ -437,7 +456,8 @@
            });
            attrVOs = finalAttrVOs;
        }
        return attrVOs;
        // TODO: 2024/12/2 Ludc 返回值排序
        return attrVOs.stream().sorted(Comparator.comparing(o->o.getId(),String.CASE_INSENSITIVE_ORDER)).collect(Collectors.toList());
    }
    /**
@@ -495,7 +515,6 @@
    /**
     * 判断该属性是否已经在业务类型中产生了数据
     *
     * @param abName
     * @return
     * @throws PLException
@@ -604,7 +623,7 @@
     * @return 枚举的名称
     */
    @Override
    public String getNameById(String id) {
    public String getNameById(String id) throws PLException {
        OsBtmTypeVO btmTypeVO = getBtmById(id);
        if (btmTypeVO == null) {
            throw new VciBaseException("业务类型[{0}]在系统里不存在", new String[]{id});
@@ -618,7 +637,7 @@
     * @param btmId 业务类型主键
     */
    @Override
    public OsERVO createERDiagram(String btmId) {
    public OsERVO createERDiagram(String btmId) throws PLException {
        VciBaseUtil.alertNotNull(btmId, "业务类型编号");
        OsBtmTypeVO btmTypeVO = getBtmById(btmId);
        List<OsERNodeVO> nodeVOList = new ArrayList<>();
@@ -639,7 +658,7 @@
     * @return 执行结果
     */
    @Override
    public OsERVO createERUsed(String btmId) {
    public OsERVO createERUsed(String btmId) throws PLException {
        VciBaseUtil.alertNotNull(btmId, "业务类型编号");
        OsBtmTypeVO btmTypeVO = getBtmById(btmId);
        //获取使用当前类型的属性
@@ -694,6 +713,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));
@@ -701,7 +721,7 @@
                rootTreeList.add(tree);
            }
        }
        rootTreeList = rootTreeList.stream().sorted((o1, o2) -> o1.getId().compareTo(o2.getId())).collect(Collectors.toList());
        return rootTreeList;
    }
@@ -790,6 +810,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(","));
@@ -802,14 +823,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();
@@ -956,14 +972,14 @@
        String[] unRemovableFields = null;
        List<String> unRemovableFields_ = null;
        //需要移除的属性
        List<String> removableFields = null;
        List<String> removableFields = new ArrayList<>();
        //修改前业务类型在数据库中已存在的所有属性
        String[] apNameArray = btmTypeDTO.getApNameArray().split(",");
        List<String> apNameArray = Func.toStrList(btmTypeDTO.getApNameArray());
        Set<String> dbApNameArray = Arrays.stream(dbBizType.apNameArray)
                .collect(Collectors.toSet());
        //过滤出需要移除的属性
        removableFields = Arrays.stream(apNameArray)
                .filter(ap -> !dbApNameArray.contains(ap))   // 过滤不在 dbApSet 中的元素
        removableFields = dbApNameArray.stream()
                .filter(ap -> !apNameArray.contains(ap))   // 过滤不在 dbApSet 中的元素
                .collect(Collectors.toList());
        // 当业务类型表中某属性已经有值, 不删除该属性, 将已经移除的属性添加回来
        unRemovableFields = platformClientUtil.getBtmService().getUnRemovableFields(id, removableFields.toArray(new String[0]));
@@ -972,7 +988,9 @@
            if (this.hasInstanceByBtmName(id)) {
                //业务类型已有实例, 只能删除没有数据的列
                if (unRemovableFields != null && unRemovableFields.length > 0) {
                    unRemovableFields_ = Arrays.asList(unRemovableFields);
                    //移除了不可修改的属性直接报错,就不往下执行了
                    throw new VciBaseException("业务类型已有实例, 只能删除没有数据的列");
                    /*unRemovableFields_ = Arrays.asList(unRemovableFields);
                    for (int i = 0; i < removableFields.size(); i++) {
                        String abName = removableFields.get(i);
                        if (unRemovableFields_.contains(abName)) {
@@ -980,7 +998,7 @@
                                lastAttrList.add(abName);
                            }
                        }
                    }
                    }*/
                }
            }
        }
@@ -1383,7 +1401,7 @@
        //设置列名
        List<String> columns = new ArrayList<>(
                Arrays.asList("类型名称", "标签", "继承自", "实现类", "描述", "版本规则", "版本号规则",
                        "是否手工输入", "分隔符", "版次号规则", "生命周期", "备选生命周期列表", "属性列表")
                        "是否手工输入", "分隔符", "版次号规则","图标", "生命周期", "备选生命周期列表", "属性列表")
        );
        try {
            new File(excelPath).createNewFile();
@@ -1407,9 +1425,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++;
            }
@@ -1526,6 +1545,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(",");
@@ -1576,7 +1596,7 @@
        //boolean flag = DDLToolClient.getService().hasInstanceOralce(tableName);
        boolean flag = false;
        try {
            flag = ClientServiceProvider.getOMDService().getBTMService().hasData(btmName);
            flag = platformClientUtil.getBtmService().hasData(btmName);
        } catch (PLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
@@ -1599,6 +1619,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));
@@ -1633,7 +1654,14 @@
            itemList.add(nodePropertyVO);
            //判断参照
            if (hasRefer) {
                selectReferenceBtmType(attribute, btmTypeVO, nodeVOList, relationVOList);
                try {
                    selectReferenceBtmType(attribute, btmTypeVO, nodeVOList, relationVOList);
                } catch (PLException e) {
                    e.printStackTrace();
                    String exceptionMessage = "判断业务类型的属性是不是参照类型时出现错误,原因:"+VciBaseUtil.getExceptionMessage(e);
                    logger.error(exceptionMessage);
                    throw new VciBaseException(exceptionMessage);
                }
            }
        });
        nodeVO.setItems(itemList);
@@ -1649,7 +1677,7 @@
     * @param relationVOList 关系信息
     */
    private void selectReferenceBtmType(OsBtmTypeAttributeVO attribute, OsBtmTypeVO btmTypeVO,
                                        List<OsERNodeVO> nodeVOList, List<OsERRelationVO> relationVOList) {
                                        List<OsERNodeVO> nodeVOList, List<OsERRelationVO> relationVOList) throws PLException {
        if (StringUtils.isNotBlank(attribute.getReferBtmTypeId())) {
            //是参照类型的
            OsBtmTypeVO referenceBtmType = getBtmById(attribute.getReferBtmTypeId());
@@ -1738,7 +1766,14 @@
                items.add(nodePropertyVO);
                //判断参照
                if (!used) {
                    selectReferenceLinkType(attr, link, nodeVOList, relationVOList);
                    try {
                        selectReferenceLinkType(attr, link, nodeVOList, relationVOList);
                    } catch (PLException e) {
                        e.printStackTrace();
                        String exceptionMessage = "断链接类型的属性是不是参照类型时出现错误,原因:"+VciBaseUtil.getExceptionMessage(e);
                        logger.error(exceptionMessage);
                        throw new VciBaseException(exceptionMessage);
                    }
                }
            });
            nodeVO.setItems(items);
@@ -1813,7 +1848,7 @@
     * @param nodeVOList     节点对象
     * @param relationVOList 关系对象
     */
    private void selectReferenceLinkType(OsLinkTypeAttributeVO attr, OsLinkTypeVO linkTypeVO, List<OsERNodeVO> nodeVOList, List<OsERRelationVO> relationVOList) {
    private void selectReferenceLinkType(OsLinkTypeAttributeVO attr, OsLinkTypeVO linkTypeVO, List<OsERNodeVO> nodeVOList, List<OsERRelationVO> relationVOList) throws PLException {
        if (StringUtils.isNotBlank(attr.getReferBtmTypeId())) {
            //是参照类型的
            OsBtmTypeVO referenceBtmType = getBtmById(attr.getReferBtmTypeId());
@@ -2064,4 +2099,41 @@
    }
    private class BtmDataFetcher {
        //业务类型
        private Map<String, BizType> btmTypeVOMap = new HashMap<String, BizType>();
        public BtmDataFetcher() {
            initBtmDataFetcher();
        }
        private void initBtmDataFetcher(){
            try {
                BizType[] bizTypes = platformClientUtil.getBtmService().getBizTypes("");
                //List<OsBtmTypeVO> osBtmTypeVOS = btmDO2VOs(Arrays.asList(bizTypes), null);
                if(Func.isNotEmpty(bizTypes)){
                    btmTypeVOMap = Arrays.stream(bizTypes).collect(Collectors.toMap(btm -> btm.name, btm -> btm));
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        /**
         * 获取业务类型
         * @param id
         * @return
         */
        public OsBtmTypeVO getBtmType(String id) {
            BizType bizType = btmTypeVOMap.get(id);
            if(Func.isEmpty(bizType)){
                return null;
            }
            //获取的时候才赚VO对象,这样避免一次性全部Btm转VO太慢的问题
            return btmDO2VO(bizType,null);
        }
    }
}