ludc
2023-05-18 9cacfb217b2dbf58c7efd1d96e818798a97d9382
以及发布webservice接口功能搭建,将通通用接口移植过来
已修改8个文件
895 ■■■■ 文件已修改
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/classify/QueryData.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeSyncUniversalController.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmIOService.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java 521 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/UniversalInterfaceImpl.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/update.json 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/classify/QueryData.java
@@ -8,7 +8,7 @@
public class QueryData {
    @XStreamAsAttribute
    private String systemId;
    private UserVO userVo;
    private UserVO user;
    private QueryLibraryVO library ;
    public QueryLibraryVO getLibrary() {
        return library;
@@ -26,15 +26,15 @@
        this.systemId = systemId;
    }
    public UserVO getUserVo() {
        return userVo;
    }
    public UserVO getUser() {
        return user;
    }
    public void setUserVo(UserVO userVo) {
        this.userVo = userVo;
    }
    public void setUser(UserVO user) {
        this.user = user;
    }
    @Override
    @Override
    public String toString() {
        return "QueryData{" +
                "systemId='" + systemId + '\'' +
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeSyncUniversalController.java
@@ -46,4 +46,82 @@
        }
        return result;
    }
    /****
     * 更新/删除/状态接口
     * @param dataString 属性信息
     * @param dataType 数据格式类型
     * @return
     * @throws Throwable
     */
    @PostMapping("/syncData")
    public String syncData(@RequestParam("dataString")String dataString,@RequestParam("dataType")String dataType)  {
        String result="";
        try {
            result= universalInterfaceI.syncEditData(dataString,dataType);
        }catch (Throwable e){
            e.printStackTrace();;
            logger.error("syncData->"+e.getMessage());
        }
        return result;
    }
    /****
     * 查询分类口
     * @param dataString 属性信息
     * @param dataType 数据格式类型
     * @return
     * @throws Throwable
     */
    @PostMapping("/queryClassify")
    public String queryClassify(@RequestParam("dataString")String dataString,@RequestParam("dataType")String dataType) throws Throwable {
        String result="";
        try {
            result = universalInterfaceI.queryClassify(dataString, dataType);
        }catch (Throwable e){
            e.printStackTrace();
            logger.error("queryClassify->"+e.getMessage());
        }
        return result;
    }
    /****
     * 查询分类口
     * @param dataString 属性信息
     * @param dataType 数据格式类型
     * @return
     * @throws Throwable
     */
    @PostMapping("/queryData")
    public String queryData(@RequestParam("dataString")String dataString,@RequestParam("dataType")String dataType) throws Throwable {
        String result="";
        try {
            result= universalInterfaceI.queryData(dataString,dataType);
        }catch (Throwable e){
            e.printStackTrace();
            logger.error("queryData->"+e.getMessage());
        }
        return result;
    }
    /****
     * 查询规则
     * @param dataString 属性信息
     * @param dataType 数据格式类型
     * @return
     * @throws Throwable
     */
    @PostMapping("/queryClassifyRule")
    public String queryClassifyRule(@RequestParam("dataString")String dataString,@RequestParam("dataType")String dataType) throws Throwable {
        String result="";
        try {
            result= universalInterfaceI.queryClassifyRule(dataString,dataType);
        }catch (Throwable e){
            e.printStackTrace();
            logger.error("queryData->"+e.getMessage());
        }
        return result;
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyService.java
@@ -244,4 +244,12 @@
     * @return
     */
    public List<CodeClassifyVO> getIdPathToNamePathByParentId(String classifyId,boolean enable);
    /**
     * 根据树形查询对象来查询数据对象
     *
         * @param treeQueryObject 树形查询对象
     * @return 查询结果,数据对象
     */
    List<CodeClassifyVO> selectCodeClassifyDOByTree(TreeQueryObject treeQueryObject);
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmIOService.java
@@ -1,11 +1,42 @@
package com.vci.ubcs.code.service;
import com.vci.ubcs.code.dto.CodeOrderDTO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyVO;
import com.vci.ubcs.code.vo.pagemodel.CodeImProtRusultVO;
import com.vci.ubcs.code.vo.webserviceModel.attrmap.DataObjectVO;
import com.vci.ubcs.code.vo.webserviceModel.result.xml.XMLResultDataObjectDetailDO;
import java.io.File;
import java.util.LinkedList;
public interface MdmIOService {
    /**
     * 集成批量申请数据
     * @param orderDTO 分类的主键
     * @param dataObjectVO 数据信息
     * @param resultDataObjectDetailDOs 错误信息
     * @return 有错误信息的excel
     */
    void batchSyncApplyCode(CodeOrderDTO orderDTO, DataObjectVO dataObjectVO, LinkedList<XMLResultDataObjectDetailDO> resultDataObjectDetailDOs);
    /**
     * 集成批量更改数据
     * @param codeClassifyVO;
     * @param dataObjectVO 数据信息
     * @param resultDataObjectDetailDOs 错误信息
     * @return 有错误信息的excel
     */
    void batchSyncEditDatas(CodeClassifyVO codeClassifyVO, DataObjectVO dataObjectVO, LinkedList<XMLResultDataObjectDetailDO>  resultDataObjectDetailDOs);
//
//    /**
//     * 生成导入的文件
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java
@@ -468,6 +468,19 @@
        }
        return tree;
    }
    /**
     * 根据树形查询对象来查询数据对象
     *
     * @param treeQueryObject 树形查询对象
     * @return 查询结果,数据对象
     */
    @Override
    public List<CodeClassifyVO> selectCodeClassifyDOByTree(TreeQueryObject treeQueryObject) {
        List<CodeClassify> doList =codeClassifyMapper.selectCodeClassifyVOByTree(treeQueryObject.getParentOid());
        List<CodeClassifyVO> voList = codeClassifyDO2VOs(doList);
        return voList;
    }
    /**
     * 使用编号的路径获取对象
     *
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java
@@ -1,381 +1,158 @@
package com.vci.ubcs.code.service.impl;
import com.alibaba.cloud.commons.lang.StringUtils;
import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
import com.vci.ubcs.code.dto.CodeOrderDTO;
import com.vci.ubcs.code.service.ICodeClassifyService;
import com.vci.ubcs.code.service.MdmEngineService;
import com.vci.ubcs.code.service.MdmIOService;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateAttrVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyVO;
import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
import com.vci.ubcs.code.vo.webserviceModel.attrmap.DataObjectVO;
import com.vci.ubcs.code.vo.webserviceModel.attrmap.RowDatas;
import com.vci.ubcs.code.vo.webserviceModel.result.xml.XMLResultDataObjectDetailDO;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
import static com.vci.ubcs.code.constant.MdmEngineConstant.*;
import static com.vci.ubcs.starter.poi.util.ExcelUtil.KEY_ATTR_CHAR;
import static com.vci.ubcs.starter.poi.util.ExcelUtil.REQUIRED_CHAR;
@Service
@Slf4j
public class MdmIOServiceImpl implements MdmIOService {
    /**
     * 分类服务层
     */
    @Resource
    @Lazy
    private ICodeClassifyService classifyService;
//
//    /**
//     * 主题库分类的服务
//     */
//    @Resource
//    private ICodeClassifyService classifyService;
//
//    /**
//     * 模板的服务
//     */
//    @Resource
//    private CodeClstemplateServiceImpl templateService;
//
//    /**
//     * 主数据引擎的服务
//     */
//    @Resource
//    private MdmEngineService engineService;
//
//    /**
//     * 生成导入的文件
//     *
//     * @param codeClassifyOid 分类的主键
//     * @param isHistory 是否历史数据导入
//     * @return excel的文件地址
//     */
//    @Override
//    public String createImportExcel(String codeClassifyOid, boolean isHistory) {
//        List<CodeClstemplateVO> templateVOList=new ArrayList<>();
//
//        VciBaseUtil.alertNotNull("导出模板","导出的配置",codeClassifyOid,"主题库分类的主键");
//
//        CodeClassifyVO codeClassifyVO = classifyService.getObjectByOid(codeClassifyOid);
//
//        if(isHistory){
//            templateVOList= templateService.childTemplates(codeClassifyOid);
//        }else{
//            //找模板
//            CodeClstemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(codeClassifyOid);
//            templateVOList.add(templateVO);
//        }
//
//        WriteExcelOption eo = new WriteExcelOption();
//        eo.setAppend(true);
//        //增加模板的信息导入
//        LinkedList<WriteExcelData> tempEDList = new LinkedList<>();
//        tempEDList.add(new WriteExcelData(0,0,"模板主键"));
//        tempEDList.add(new WriteExcelData(0,1,"模板代号"));
//        tempEDList.add(new WriteExcelData(0,2,"模板名称"));
//        for(int j=0;j<templateVOList.size();j++){
//            CodeClstemplateVO  templateVO=templateVOList.get(j);
//            CodeClassifyTemplateVO codeClassifyTemplateVO = new CodeClassifyTemplateVO();
//            BeanUtils.copyProperties(templateVO,codeClassifyTemplateVO);
//            //组合格式的不导入,
//            // 枚举的提供序列的选择
//            //时间全部统一为yyyy-MM-dd HH:mm:ss
//            //参照的自行输入名称
//            //分类注入的不用,都是导入后自动处理的
//            //编码,状态等字段不导入
//            List<CodeClassifyTemplateAttrVO> templateAttrVOS = codeClassifyTemplateVO.getAttributes().stream().filter(s ->
//                !DEFAULT_ATTR_LIST.contains(s.getId())
//                    && StringUtils.isBlank(s.getComponentRule())
//                    && StringUtils.isBlank(s.getClassifyInvokeAttr())
//                    && (isHistory || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
//            ).collect(Collectors.toList());
//
//            if(CollectionUtils.isEmpty(templateAttrVOS)){
//                throw new VciBaseException("模板没有配置任何【表单显示】为【是】的属性");
//            }
//            List<CodeClassifyTemplateAttrVO> idAttrVOList = codeClassifyTemplateVO.getAttributes().stream().filter(s -> s.getId().equalsIgnoreCase(CODE_FIELD)).collect(Collectors.toList());
//            LinkedList<WriteExcelData> excelDataList = new LinkedList<>();
//            Workbook workbook = new HSSFWorkbook();
//            if(isHistory){
//                excelDataList.add(new WriteExcelData(0,0,"分类路径"));
//                excelDataList.add(new WriteExcelData(0,1,"码段宽度"));
//                excelDataList.add(new WriteExcelData(0,2,!CollectionUtils.isEmpty(idAttrVOList)?idAttrVOList.get(0).getName():"企业编码"));
//            }
//            for (int i = 0; i < templateAttrVOS.size(); i++) {
//                CodeClassifyTemplateAttrVO attrVO = templateAttrVOS.get(i);
//
//                Object text = attrVO.getName();
//                text = exportKeyAndRequired(workbook,attrVO,text);
//                int colIndex = (isHistory?3:0) + i;
//                WriteExcelData excelData = new WriteExcelData(0, colIndex, text);
//                if(StringUtils.isNotBlank(attrVO.getCodeDateFormat())
//                    || VciFieldTypeEnum.VTDateTime.name().equalsIgnoreCase(attrVO.getAttributeDataType())
//                    || VciFieldTypeEnum.VTDate.name().equalsIgnoreCase(attrVO.getAttributeDataType())
//                    ||VciFieldTypeEnum.VTTime.name().equalsIgnoreCase(attrVO.getAttributeDataType())){
//                    excelData.setDateFormat(VciDateUtil.DateTimeFormat);
//                }
//                if(text instanceof RichTextString){
//                    excelData.setFontColor(String.valueOf(HSSFColor.HSSFColorPredefined.RED.getIndex()));
//                }
//                excelDataList.add(excelData);
//                if(StringUtils.isNotBlank(attrVO.getEnumString()) || StringUtils.isNotBlank(attrVO.getEnumId())){
//                    //添加数据有效性
//                    List<String> enumValueList = new ArrayList<>();
//                    enumValueList.add("");
//                    List<KeyValue> valueList = engineService.listComboboxItems(attrVO);
//                    if(!CollectionUtils.isEmpty(valueList)){
//                        valueList.stream().forEach(kv->{
//                            enumValueList.add(kv.getValue());
//                        });
//                    }
//                    //默认加1万条
//                    WriteExcelData ed = new WriteExcelData(1,colIndex,"");
//                    ed.setRowTo(100);
//                    ed.setColTo(colIndex);
//                    ed.setValidation(true);
//                    ed.setValidationDataList(enumValueList);
//                    ed.setValidationErrorMsg("请在序列中选择正确的值");
//                    excelDataList.add(ed);
//                }
//                if(VciFieldTypeEnum.VTBoolean.name().equalsIgnoreCase(attrVO.getAttributeDataType())){
//                    List<String> booleanList = new ArrayList<>();
//
//                    booleanList.add("是");
//                    booleanList.add("否");
//                    //默认加1万条
//                    WriteExcelData ed = new WriteExcelData(1,colIndex,"");
//                    ed.setRowTo(100);
//                    ed.setColTo(colIndex);
//                    ed.setValidation(true);
//                    ed.setValidationDataList(booleanList);
//                    ed.setValidationErrorMsg("请在序列中选择正确的值");
//                    excelDataList.add(ed);
//                }
//            }
//            eo.addSheetDataList(j+templateVO.getName(),excelDataList);
//            tempEDList.add(new WriteExcelData(j+1,0,templateVO.getOid()));
//            tempEDList.add(new WriteExcelData(j+1,1,templateVO.getId()));
//            tempEDList.add(new WriteExcelData(j+1,2,templateVO.getName()));
//        }
//        String excelName = LocalFileUtil.getDefaultTempFolder() + File.separator + codeClassifyVO.getName() + (isHistory?"_历史数据导入模板.xls": "_导入模板.xls");
//        eo.addSheetDataList(templateVOList.size()+"模板信息【请勿删除或移动】",tempEDList);
//        ExcelUtil.writeDataToFile(excelName,eo);
//        return excelName;
//    }
//
//    /**
//     * 导出的时候封装必输和关键属性
//     * @param attrVO 属性的显示对象
//     * @param text 单元格的值
//     */
//    private Object exportKeyAndRequired(Workbook workbook,CodeClassifyTemplateAttrVO attrVO,Object text){
//        //必输加*,关键属性为蓝色
//        if (VciBaseUtil.getBoolean(attrVO.getRequireFlag()) || VciBaseUtil.getBoolean(attrVO.getKeyAttrFlag())) {
//            String value = text.toString();
//            if(VciBaseUtil.getBoolean(attrVO.getRequireFlag())) {
//                value += REQUIRED_CHAR;
//            }
//            if(VciBaseUtil.getBoolean(attrVO.getKeyAttrFlag())){
//                value += KEY_ATTR_CHAR;
//            }
//            RichTextString ts = new HSSFRichTextString(value);
//            if(VciBaseUtil.getBoolean(attrVO.getRequireFlag())){
//                Font font =  workbook.createFont();
//                font.setColor(HSSFColor.HSSFColorPredefined.RED.getIndex());
//                ts.applyFont(font);
//            }
//
//            if(VciBaseUtil.getBoolean(attrVO.getKeyAttrFlag())){
//                Font font =  workbook.createFont();
//                font.setColor(HSSFColor.HSSFColorPredefined.BLUE.getIndex());
//                ts.applyFont(font);
//            }
//            return ts;
//        }
//        return text;
//    }
//
//
//    /**
//     * 批量申请编码数据
//     *
//     * @param orderDTO 编码申请信息,必须包含分类主键和码段的信息
//     * @param file     excel文件的信息
//     * @return  有错误信息的excel的文件
//     */
//    @Override
//    public CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file) {
//        VciBaseUtil.alertNotNull(orderDTO,"编码申请相关的数据",orderDTO.getCodeClassifyOid(),"主题库分类主键");
//        ReadExcelOption reo = new ReadExcelOption();
//        reo.setReadAllSheet(true);
//        List<SheetDataSet> sheetDataSetList = ExcelUtil.readDataObjectFromExcel(file,null,reo);
//        if(CollectionUtils.isEmpty(sheetDataSetList) || CollectionUtils.isEmpty(sheetDataSetList.get(0).getRowData())
//            ||sheetDataSetList.get(0).getRowData().size()<1){
//            throw new VciBaseException("没有读取到任何的数据");
//        }
//        if(sheetDataSetList.size()>LIMIT+1){
//            throw new VciBaseException("为了保证系统的稳定性,请一次不要导入超过1万条的数据");
//        }
//        //先找到每一行的标题,然后根据标题来获取对应的属性
//        SheetDataSet dataSet = sheetDataSetList.get(0);
//        //找第一行,为了找标题
//        CodeClstemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(orderDTO.getCodeClassifyOid());
//
//        //校验模板是不是最新的
//        checkTemplateSync(sheetDataSetList,templateVO,0);
//        //先不用管属性是否都存在,先转换一下数据
//        Map<String,String> errorMap = new HashMap<>();
//        String redisUUid=batchImportCodes(orderDTO,templateVO,dataSet,errorMap,true);
//        CodeImProtRusultVO codeImProtRusultVO = new CodeImProtRusultVO();
//        List<String> needRowIndexList = new ArrayList<>();
////        String filePath = returnErrorToExcel(dataSet.getRowData(), errorMap, needRowIndexList, dataSet.getColName());
////        if(StringUtils.isNotBlank(filePath)) {
////            codeImProtRusultVO.setFilePath(filePath);
////        }
////        if(StringUtils.isNotBlank(redisUUid)){
////            codeImProtRusultVO.setRedisUuid(redisUUid);
////        }
//        return null;
////        return codeImProtRusultVO;
//    }
//
//    /**
//     * 校验模板是否为同步的
//     * @param sheetDataSetList excel里的内容
//     * @param templateVO 模板的信息
//     */
//    private void checkTemplateSync(List<SheetDataSet> sheetDataSetList,CodeClstemplateVO templateVO,int i){
//        String templateOidInExcel = "";
//        String templateName="";
//        if(!CollectionUtils.isEmpty(sheetDataSetList)
//            && sheetDataSetList.size()>1 && !CollectionUtils.isEmpty(sheetDataSetList.get(sheetDataSetList.size()-1).getColName())){
//            List<SheetRowData>  rowData=  sheetDataSetList.get(sheetDataSetList.size()-1).getRowData();
//            templateName=rowData.get(i).getData().get(2);
//            templateOidInExcel=rowData.get(i).getData().get(0);
//            //templateOidInExcel = sheetDataSetList.get(sheetDataSetList.size()-1).getColName().get(sheetDataSetList.size()-i);
//        }
//       /* if(!CollectionUtils.isEmpty(sheetDataSetList)
//                && sheetDataSetList.size()>1 && !CollectionUtils.isEmpty(sheetDataSetList.get(sheetDataSetList.size()-1).getColName())){
//            List<SheetRowData>  rowData=  sheetDataSetList.get(sheetDataSetList.size()-1).getRowData();
//            templateOidInExcel=rowData.get(i).getData().get(0);
//           //templateOidInExcel = sheetDataSetList.get(sheetDataSetList.size()-1).getColName().get(sheetDataSetList.size()-i);
//        }*/
//        if(StringUtils.isBlank(templateOidInExcel) || !templateOidInExcel.equalsIgnoreCase(templateVO.getOid())){
//            throw new VciBaseException("模板【"+templateName+"】中的数据获取的模版信息与当前模板不匹配,请确保excel文件里有【模板信息-请勿移动或删除】的工作表,且确保每次导入都是先下载的导入模板后添加的数据");
//        }
//
//    }
//
//
//    /***
//     * 批量处理申请数据
//     * @param orderDTO
//     * @param templateVO
//     * @param dataSet
//     * @return
//     */
//    private String batchImportCodes(CodeOrderDTO orderDTO,CodeClstemplateVO templateVO,SheetDataSet dataSet,Map<String,String> errorMap,boolean isEnumType){
//        List<String> codeList=new ArrayList<>();
////        CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
//        //规则的主键需要去获取
////        CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
////        //1.判断规则中除了流水码段,是否有其他码段
////        engineService.checkSecValueOnOrder(ruleVO,orderDTO);
////        List<SheetRowData> rowDataList = dataSet.getRowData();
////
////        //除去默认的属性.还有只有表单显示的字段才导入
////        List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->
////            !DEFAULT_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormdisplayflag())
////        ).collect(Collectors.toList());
////        Map<Integer/**列号**/,String/**字段的名称**/> fieldIndexMap = new HashMap<>();
////        List<String> titleRowData = dataSet.getColName();
////        Map<String/**中文名称**/, String/**英文名称**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId().toLowerCase(Locale.ROOT),(o1, o2)->o2));
////        getFieldIndexMap(titleRowData,attrNameIdMap,fieldIndexMap);
////
////        //需要判断是否所有的属性都在模板上了
////        List<CodeClassifyTemplateAttrVO> unExistAttrVOs = attrVOS.stream().filter(s -> !fieldIndexMap.containsValue(s.getId().toLowerCase(Locale.ROOT))
////            && StringUtils.isBlank(s.getComponentrule()) && StringUtils.isBlank(s.getClassifyinvokeattr())//组合规则和分类注入确实没给用户导出去
////        ).collect(Collectors.toList());
////        if(!CollectionUtils.isEmpty(unExistAttrVOs)){
////            throw new VciBaseException("【" + unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName) + "】这些属性在列表中没有找到");
////        }
////        List<ClientBusinessObject> cboList = new ArrayList<>();
////        String fullPath = getFullPath(classifyFullInfo);
////        excelToCbo(classifyFullInfo,fieldIndexMap,rowDataList,templateVO,cboList,fullPath,true);
////
////        //都转换完了。需要批量检查
////        //如果出错了,我们依然执行有效的数据,无效的数据写回到excel中
////        //2.判断必输项。。需要全部的属性,如果是必输,但是表单里面不显示的,只能是分类注入或者组合规则
////        batchCheckRequiredAttrOnOrder(templateVO,cboList,errorMap);
////        //3.判断关键属性
////        CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList);
////        Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
////        Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
////        if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
////            selfRepeatRowIndexList.stream().forEach(rowIndex->{
////                errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";在当前处理的数据文件中关键属性重复" );
////            });
////        }
////        if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
////            keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
////                errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";关键属性与系统中的重复" );
////            });
////        }
////        //分类注入
////        batchSwitchClassifyAttrOnOrder(attrVOS,cboList,classifyFullInfo,false);
////        //boolean
////        reSwitchBooleanAttrOnOrder(attrVOS,cboList);
////        //4.校验规则
////        batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
////        if(isEnumType) {//是否需要校验枚举/参照
////            //5.校验枚举是否正确
////            batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
////            //7.处理参照的情况
////            batchSwitchReferAttrOnOrder(attrVOS,cboList,errorMap);
////        }
////        //6.时间格式的验证
////        //6.时间的,必须统一为yyyy-MM-dd HH:mm:ss
////        batchSwitchDateAttrOnOrder(attrVOS,cboList,errorMap);
////        //最后弄组合规则
////        batchSwitchComponentAttrOnOrder(attrVOS,cboList);
////        String uuid=redisService.getUUIDEveryDay();
////        Map<String, ClientBusinessObject> rowIndexCboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
////
////        if(errorMap.size()>0) {
////            createRedisDatas(uuid + "-error",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap,false);
////        }
////        boolean isCreateUUid=false;
////        List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
////            String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
////            return !errorMap.containsKey(rowIndex);
////        }).collect(Collectors.toList());
////        //相似校验
////        Map<String,String>resembleMap=new HashMap<>();
////        List<DataResembleVO> dataResembleVOS=new ArrayList<>();
////        String btmtypeid= classifyFullInfo.getTopClassifyVO().getBtmtypeid();
////        bathcResembleQuery(orderDTO.getCodeClassifyOid(),templateVO,needSaveCboList,resembleMap,btmtypeid,dataResembleVOS);
////        if(resembleMap.size()>0) {
////            isCreateUUid=true;
////            if(!CollectionUtils.isEmpty(dataResembleVOS)) {
////                redisService.setCacheList(uuid + "-resemble-data", dataResembleVOS);
////                createRedisDatas(uuid + "-resemble",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
////            }
////        }
////        //排除错误的,剩下正确的
////        Map<String,String> newErrorMap=new HashMap<>();
////        newErrorMap.putAll(resembleMap);
////        newErrorMap.putAll(errorMap);
////        needSaveCboList = cboList.stream().filter(cbo -> {
////            String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
////            return !newErrorMap.containsKey(rowIndex);
////        }).collect(Collectors.toList());
////        if((errorMap.size()>0&&needSaveCboList.size()>0)||resembleMap.size()>0){
////            isCreateUUid=true;
////        }
////        createRedisByCodeClassify(uuid + "-class",templateVO,dataSet,fieldIndexMap,false);
////        if(newErrorMap.size()>0) {
////            createRedisDatas(uuid + "-ok",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap,true);
////        }else {
////            uuid="";
////            //要把以上的错误的都抛出后,再继续处理时间和组合规则
////            needSaveCboList = cboList.stream().filter(cbo -> {
////                String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
////                return !newErrorMap.containsKey(rowIndex);
////            }).collect(Collectors.toList());
////            if (!CollectionUtils.isEmpty(needSaveCboList)) {
////                //9.我们处理业务数据
////                //生成编码的内容
////                codeList = productCodeService.productCodeAndSaveData(classifyFullInfo, templateVO, ruleVO, orderDTO.getSecDTOList(), needSaveCboList);
////                //如果是编码生成失败,则直接就失败了,其他的判断出来有错误的我们都统一返回到excel里面
////                engineService.batchSaveSelectChar(templateVO, needSaveCboList);
////            }
////        }
////        if(!isCreateUUid){
////            return uuid="";
////        }
////        return uuid;
//        return null;
//    }
    /**
     * 分类服务层
     */
    @Resource
    @Lazy
    private MdmEngineService engineService;
    /**
     * 集成批量申请数据
     * @param orderDTO 分类的主键
     * @param dataObjectVO 数据信息
     * @param resultDataObjectDetailDOs 错误信息
     * @return 有错误信息的excel
     */
    @Override
    public void batchSyncApplyCode(CodeOrderDTO orderDTO, DataObjectVO dataObjectVO, LinkedList<XMLResultDataObjectDetailDO> resultDataObjectDetailDOs) {
        Map<String,String> errorMap=new HashMap<>();
        VciBaseUtil.alertNotNull(orderDTO,"编码申请相关的数据",orderDTO.getCodeClassifyOid(),"主题库分类主键");
        CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
        //规则的主键需要去获取
        CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
        //1.判断规则中除了流水码段,是否有其他码段
        //engineService.checkSecValueOnOrder(ruleVO,orderDTO);
        //查询分类和模板
        //先找到每一行的标题,然后根据标题来获取对应的属性
        List<RowDatas> rowDataList = dataObjectVO.getRowData();
        Map<String , RowDatas>rowDataMap=new LinkedHashMap<>();
        rowDataList.stream().forEach(rowData->{
            rowDataMap.put(rowData.getRowIndex(),rowData);
        });
        //找第一行,为了找标题
        CodeClassifyTemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(orderDTO.getCodeClassifyOid());
        //校验模板是不是最新的
        //checkTemplateSync(sheetDataSetList,templateVO);
        //除去默认的属性.还有只有表单显示的字段才导入
        List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->!DEFAULT_SYNC_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
        ).collect(Collectors.toList());
        Map<Integer/**列号**/,String/**字段的名称**/> fieldIndexMap = new HashMap<>();
        List<String> titleRowData = dataObjectVO.getColName();
        Map<String/**中文名称**/, String/**英文名称**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId().toLowerCase(Locale.ROOT),(o1, o2)->o2));
        getFieldIndexMap(titleRowData,attrNameIdMap,fieldIndexMap);
        //需要判断是否所有的属性都在模板上了
        List<CodeClassifyTemplateAttrVO> unExistAttrVOs = attrVOS.stream().filter(s -> !fieldIndexMap.containsValue(s.getId().toLowerCase(Locale.ROOT))
            && StringUtils.isBlank(s.getComponentRule()) && StringUtils.isBlank(s.getClassifyInvokeAttr())//组合规则和分类注入确实没给用户导出去
        ).collect(Collectors.toList());
        if(!CollectionUtils.isEmpty(unExistAttrVOs)){
            throw new VciBaseException("【" + unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName) + "】这些属性在excel中没有找到");
        }
        String fullPath = getFullPath(classifyFullInfo);
        // List<CodeClassifyProcessTempVO> codeClassifyProcessTempVOS=codeClassifyProcessTempService.listProcessTemplate(templateVO.getOid(),"code_cls_flow_use_order");
        boolean isProcess=false;
        //注释掉此处下面所有都按照不判断流程存储状态了
        /** if(!CollectionUtils.isEmpty(codeClassifyProcessTempVOS)){
         isProcess=true;
         }***/
        //List<ClientBusinessObject> cboList = new ArrayList<>();
        //Map<String,String> codeOidToSystemOidMap=new HashMap<>();//存储编码数据和集成系统数据oid对照映射
        //excelToCbo(classifyFullInfo,titleRowData,fieldIndexMap,rowDataList,templateVO,cboList,fullPath,isProcess,"create",errorMap,codeOidToSystemOidMap);
        //都转换完了。需要批量检查
        //如果出错了,我们依然执行有效的数据,无效的数据写回到excel中
        //2.判断必输项。。需要全部的属性,如果是必输,但是表单里面不显示的,只能是分类注入或者组合规则
    }
    @Override
    public void batchSyncEditDatas(CodeClassifyVO codeClassifyVO, DataObjectVO dataObjectVO, LinkedList<XMLResultDataObjectDetailDO> resultDataObjectDetailDOs) {
    }
    /**
     * 获取分类的全路径
     * @param classifyFullInfo 分类的全部信息
     * @return 全路径
     */
    private String getFullPath(CodeClassifyFullInfoBO classifyFullInfo){
        String fullPath = "";
        if(!CollectionUtils.isEmpty(classifyFullInfo.getParentClassifyVOs())){
            fullPath = classifyFullInfo.getParentClassifyVOs().stream().sorted(((o1, o2) -> o1.getDataLevel().compareTo(o2.getDataLevel())))
                .map(CodeClassifyVO::getOid).collect(Collectors.joining("##"));
        }else{
            fullPath = classifyFullInfo.getCurrentClassifyVO().getOid();
        }
        return fullPath;
    }
    /**
     * excel的标题上获取字段所在的位置
     * @param titleRowData 标题的内容
     * @param attrNameIdMap 模板中属性名称和英文的映射
     * @param fieldIndexMap 位置和英文字段的映射
     */
    private void getFieldIndexMap(List<String> titleRowData,Map<String/**名称**/,String/**字段名**/> attrNameIdMap,Map<Integer/**位置**/,String/**英文名字**/> fieldIndexMap){
        for (int i = 0; i < titleRowData.size(); i++) {
            String title = titleRowData.get(i);
            String id = attrNameIdMap.getOrDefault(title.replace(KEY_ATTR_CHAR,"").replace(REQUIRED_CHAR
                ,""),"");
            if(StringUtils.isBlank(id) && "分类路径".equalsIgnoreCase(title)){
                id = CODE_CLASSIFY_OID_FIELD;
            }
            if(StringUtils.isBlank(id) && "码段宽度".equalsIgnoreCase(title)){
                id = CODE_SEC_LENGTH_FIELD;
            }
            if(StringUtils.isBlank(id) && "企业编码".equalsIgnoreCase(title)){
                id = CODE_FIELD;
            }
            if(StringUtils.isNotBlank(id)){
                fieldIndexMap.put(i,id);
            }
        }
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/UniversalInterfaceImpl.java
@@ -15,10 +15,12 @@
import com.vci.ubcs.code.vo.pagemodel.*;
import com.vci.ubcs.code.vo.webserviceModel.apply.*;
import com.vci.ubcs.code.vo.webserviceModel.attrmap.*;
import com.vci.ubcs.code.vo.webserviceModel.classify.*;
import com.vci.ubcs.code.vo.webserviceModel.result.json.*;
import com.vci.ubcs.code.vo.webserviceModel.result.xml.XMLResultClassfyVO;
import com.vci.ubcs.code.vo.webserviceModel.result.xml.XMLResultDataObjectDetailDO;
import com.vci.ubcs.code.vo.webserviceModel.result.xml.XMLResultSystemVO;
import com.vci.ubcs.starter.revision.model.TreeQueryObject;
import com.vci.ubcs.starter.web.pagemodel.SessionInfo;
import com.vci.ubcs.starter.web.util.BeanUtilForVCI;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
@@ -174,7 +176,7 @@
                        CodeOrderDTO orderDTO = new CodeOrderDTO();
                        orderDTO.setCodeClassifyOid(codeClassifyVO.getOid());//分类主键
                        orderDTO.setSecDTOList(codeOrderSecDTOList);//分类码段
                        //mdmIOService.batchSyncApplyCode(orderDTO, dataObjectVO, resultDataObjectDetailDOs);
                        mdmIOService.batchSyncApplyCode(orderDTO, dataObjectVO, resultDataObjectDetailDOs);
                        log.info("end:申请获取完毕");
                    } catch (Throwable e) {
                        XMLResultDataObjectDetailDO xmlResultDataObjectDetailDO=new XMLResultDataObjectDetailDO();
@@ -258,7 +260,121 @@
     */
    @Override
    public String queryClassify(String data, String dataType) throws Throwable {
        return null;
        boolean issucess=false;
        String resultStr = "";
        String errorid="0";
        msg="成功";
        String systemId="";
        log.info("查询分类的数据参数:->"+data);
        log.info("查询分类的数据类型:->"+dataType);
        ResultClassifyVO resultClassifyVO =new ResultClassifyVO();
        List<ClassifyVO> classifyVOList=new ArrayList<>();
        ResultData resultData=new ResultData();
        try {
            if (StringUtils.isBlank(data)) {
                errorid = "101";
                throw new Throwable("接口参数:传递为空");
            }
            QueryClassifyVO queryClassifyVO = new QueryClassifyVO();
            //如果dataType是xml则,通过xml序列化成对象形式,如果是json则通过json转换成对象格式
            try {
                if ("xml".equals(dataType)) {
                    XStream xStream = new XStream(new DomDriver());
                    xStream.processAnnotations(QueryData.class);
                    xStream.autodetectAnnotations(true);
                    QueryData queryData = (QueryData) xStream.fromXML(data);
                    queryClassifyVO.setData(queryData);
                } else {
                    queryClassifyVO = JSONObject.toJavaObject(JSONObject.parseObject(data), QueryClassifyVO.class);
                }
            } catch (Throwable e) {
                errorid = "101";
                msg="接口参数:传入数据参数解析失败";
                e.printStackTrace();
                throw new Throwable("接口参数:传入数据参数解析失败");
            }
            QueryData queryData=queryClassifyVO.getData();
            UserVO userVo=queryData.getUser();
            systemId=queryData.getSystemId();
            QueryLibraryVO libraryVO= queryData.getLibrary();
            String libId= libraryVO.getId();
            List<String> classifyIdList=  libraryVO.getClassifyid();
            List<CodeClassifyVO> codeClassifyVOS =new ArrayList<>();
            //这是账号信息
            //这是账号信息
            if(userVo!=null) {
                SessionInfo sessionInfo = new SessionInfo();
                sessionInfo.setUserId(userVo.getUserName());
                sessionInfo.setUserName(userVo.getTrueName());
                sessionInfo.setIp(userVo.getIp());
                VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
            }else{
                errorid = "101";
                throw new Throwable("接口参数:账号信息获取失败");
            }
            if(!CollectionUtils.isEmpty(classifyIdList)){
                //先简称是否有关联模板,有模板要先删除
                List<CodeClassify> libIdDos = classifyService.selectByWrapper(Wrappers.<CodeClassify>query().lambda().in(CodeClassify::getId, classifyIdList));
                codeClassifyVOS=classifyService.codeClassifyDO2VOs(libIdDos);
            }else {
                List<CodeClassify> libIdDos = classifyService.selectByWrapper(Wrappers.<CodeClassify>query().lambda().eq(CodeClassify::getId, libId));
                String oid= libIdDos.get(0).getOid();
                TreeQueryObject treeQueryObject=new TreeQueryObject();
                treeQueryObject.setParentOid(oid);
                treeQueryObject.setQueryAllLevel(true);
                codeClassifyVOS=classifyService.selectCodeClassifyDOByTree(treeQueryObject);
            }
            LibraryVO libraryVo=new LibraryVO();
            libraryVo.setId(libId);
            libraryVo.setName("");
            if(!CollectionUtils.isEmpty(codeClassifyVOS)){
                errorid = "0";
                msg="成功!";
                codeClassifyVOS.stream().forEach(codeClassifyDO -> {
                    ClassifyVO classifyVO=new ClassifyVO();
                    classifyVO.setId(codeClassifyDO.getOid());
                    classifyVO.setLcStatus(codeClassifyDO.getLcStatus());
                    classifyVO.setClassCode(codeClassifyDO.getId());
                    classifyVO.setDescription(codeClassifyDO.getDescription());
                    classifyVO.setName(codeClassifyDO.getName());
                    classifyVO.setPid(codeClassifyDO.getParentcodeclassifyoid());
                    classifyVO.setFullPathName(codeClassifyDO.getPath());
                    classifyVOList.add(classifyVO);
                });
                libraryVo.setClassify(classifyVOList);
            }else{
                errorid = "100";
                msg="未查询到相关的分类信息";
            }
            issucess=true;
            resultData.setLibrary(libraryVo);
        }catch (Throwable e){
            e.printStackTrace();;
            msg="查询分类失败:"+e.getMessage();
        }finally {
            resultData.setErrorid(errorid);
            resultData.setMsg(msg);
            resultClassifyVO.setResultData(resultData);
        }
        if(dataType.equals("xml")){
            //组织返回接口信息
            XStream xStream = new XStream(new DomDriver());
            xStream.processAnnotations(XMLResultSystemVO.class);
            xStream.autodetectAnnotations(true);
            resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" + xStream.toXML(resultData);
        }else{
            Object object = JSONObject.toJSON(resultClassifyVO);
            resultStr = object.toString();
        }
        try {
            //记录日志
            this.saveLogs(systemId, systemId, data, resultStr, issucess, msg, "queryClassify");
        }catch (Throwable e){
            e.printStackTrace();
        }
        log.info("返回参数:"+resultStr);
        return resultStr;
    }
    /***
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/update.json
@@ -1,111 +1,17 @@
{
  "data": {
    "systemId": "RLM",
    "systemId": "MPM",
    "user": {
      "userName": "weidy",
      "trueName": "魏大勇",
      "ip": "127.0.0.1"
    },
    "classifys": {
      "classify": [
        {
          "classCode": "020104",
          "library": "StdLib",
          "fullclsfNamePath": "物品##VCI##标准件##VCI##螺栓",
          "objects": {
            "object": [
              {
                "code": "0201040002",
                "id": "0023401",
                "status": "Released",
                "operate": "update",
                "editor": "weidy",
                "prop": [
                  {
                    "key": "partNo",
                    "text": "牌号",
                    "value": "HB1-221"
                  },
                  {
                    "key": "partName",
                    "text": "名称",
                    "value": "半圆头螺钉1"
                  },
                  {
                    "key": "PartNumber",
                    "text": "",
                    "value": "HB1-221-M4*6"
                  },
                  {
                    "key": "牌号",
                    "text": "",
                    "value": "HB1-221"
                  },
                  {
                    "key": "规格",
                    "text": "",
                    "value": "M41"
                  },
                  {
                    "key": "表面处理",
                    "text": "",
                    "value": "电镀"
                  },
                  {
                    "key": "保险孔型式",
                    "text": "",
                    "value": "无1"
                  }
                ]
              },
              {
                "code": "0201040003",
                "id": "0023402",
                "status": "Released",
                "operate": "update",
                "editor": "weidy",
                "prop": [
                  {
                    "key": "partNo",
                    "text": "牌号",
                    "value": "HB1-221"
                  },
                  {
                    "key": "partName",
                    "text": "名称",
                    "value": "半圆头螺钉2"
                  },
                  {
                    "key": "PartNumber",
                    "text": "",
                    "value": "HB1-221-M4*5"
                  },
                  {
                    "key": "牌号",
                    "text": "",
                    "value": "HB1-221"
                  },
                  {
                    "key": "规格",
                    "text": "",
                    "value": "M43"
                  },
                  {
                    "key": "表面处理",
                    "text": "",
                    "value": "电镀"
                  },
                  {
                    "key": "保险孔型式",
                    "text": "",
                    "value": "无2"
                  }
                ]
              }
            ]
          }
        }
    "library": {
      "id": "wupin",
      "classifyid":[
        "020201",
        "020202"
      ]
    }
  }
}
}