xiejun
2024-08-28 e019e6cffffe3b4b764bff4d60fffb5d62b160cd
表单表格导出功能开发
已修改4个文件
307 ■■■■ 文件已修改
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebPortalVIController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsAttributeServiceI.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsAttributeServiceImpl.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsPortalVIServiceImpl.java 268 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebPortalVIController.java
@@ -149,12 +149,12 @@
    /**
     * 导出数据库的表信息到excel
     * @param response 响应对象
     * @param btmTypeIds 业务类型的编号,用逗号分割
     * @param ids 业务类型的编号,用逗号分割
     */
    @PostMapping("/exportExcel")
    @VciBusinessLog(operateName = "导出表单/表格到excel中")
    public void exportExcel(String btmTypeIds,HttpServletResponse response){
        String excelFileName = portalVIServiceI.exportToExcel(VciBaseUtil.str2List(btmTypeIds));
    public void exportExcel(String ids,HttpServletResponse response){
        String excelFileName = portalVIServiceI.exportToExcel(VciBaseUtil.str2List(ids));
        try {
            ControllerUtil.writeFileToResponse(response,excelFileName);
        } catch (IOException e) {
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsAttributeServiceI.java
@@ -178,4 +178,12 @@
     */
    boolean isDefaultAttr(String attr);
    /**
     * 根据业务类型/链接类型获取属性信息
     * @param btName 业务类型/链接类型
     * @param typeFlag 0:业务类型,1:链接类型
     * @return
     */
    List<OsAttributeVO> getOsAttributeVOSByBtName(String btName,int typeFlag)throws Exception;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsAttributeServiceImpl.java
@@ -1136,6 +1136,31 @@
    }
    /**
     * 根据业务类型获取属性信息
     * @param btName 业务类型/链接类型
     * @param typeFlag 0:业务类型,1:链接类型
     * @return
     */
    @Override
    public List<OsAttributeVO> getOsAttributeVOSByBtName(String btName, int typeFlag) throws Exception{
        VciBaseUtil.alertNotNull(btName,"参数不允许为空",typeFlag,"参数不允许为空");
        List<OsAttributeVO> attributeVOS=new ArrayList<>();
        try {
            AttributeDef[] attributeDefs=new AttributeDef[]{};
            if(typeFlag==0){
                attributeDefs=    platformClientUtil.getBtmService().getAttributeDefs(btName);
            }else{
                attributeDefs=platformClientUtil.getLinkTypeService().getAttributes(btName);
            }
            attributeVOS=attributeDO2VOs(Arrays.asList(attributeDefs));
        }catch (PLException e){
            throw new Exception("根据业务类型获取属性异常"+e.getMessage());
        }
        return attributeVOS;
    }
    /**
     * 是否为参照属性
     * @param other 配置的其他
     * @return true 是参照
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsPortalVIServiceImpl.java
@@ -1,26 +1,37 @@
package com.vci.web.service.impl;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ZipUtil;
import com.vci.bo.ItemSeniorQueryBO;
import com.vci.common.utility.ObjectUtility;
import com.vci.corba.common.PLException;
import com.vci.corba.omd.qtm.QTD;
import com.vci.corba.omd.qtm.QTInfo;
import com.vci.corba.portal.PortalService.GetPagePortalVIArrayByPageInfoResult;
import com.vci.corba.portal.data.PortalVI;
import com.vci.dto.*;
import com.vci.model.*;
import com.vci.pagemodel.*;
import com.vci.starter.poi.bo.WriteExcelData;
import com.vci.starter.web.enumpck.VciFieldTypeEnum;
import com.vci.starter.poi.bo.WriteExcelOption;
import com.vci.starter.poi.util.ExcelUtil;
import com.vci.starter.web.exception.VciBaseException;
import com.vci.starter.web.pagemodel.BaseQueryObject;
import com.vci.starter.web.pagemodel.BaseResult;
import com.vci.starter.web.pagemodel.DataGrid;
import com.vci.starter.web.util.LocalFileUtil;
import com.vci.starter.web.util.VciBaseUtil;
import com.vci.starter.word.bo.WordMergeStartTableDataBO;
import com.vci.starter.word.util.WordUtil;
import com.vci.web.enumpck.ItemTypeEnum;
import com.vci.web.enumpck.PortalVIType;
import com.vci.web.enumpck.PortalVITypeFlag;
import com.vci.web.service.OsAttributeServiceI;
import com.vci.web.service.OsPortalVIServiceI;
import com.vci.web.service.OsQuereyTemplateServiceI;
import com.vci.web.util.PlatformClientUtil;
import com.vci.web.util.UITools;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -29,8 +40,9 @@
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.io.*;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -51,13 +63,22 @@
    @Autowired(required = false)
    @Lazy
    private OsPortalVIServiceI self;
    /**
     * 加载自身
     */
    @Autowired(required = false)
   private OsAttributeServiceI osAttributeService;
    /**
     * 平台的调用工具类
     */
    @Autowired
    private PlatformClientUtil platformClientUtil;
    /**
     * 查询模板服务
     */
    @Autowired
    private OsQuereyTemplateServiceI quereyTemplateServiceI;
    @Override
    public void clearCache() {
@@ -134,7 +155,7 @@
     */
    @Override
    public PortalVIVO getPortalVIById(String id,String viType) throws PLException {
        VciBaseUtil.alertNotNull(id,"主键为空!");
        VciBaseUtil.alertNotNull(id,"主键");
        String lableName=PortalVIType.Form.getLabel();
        if(PortalVIType.Table.getName()==viType){
            lableName=PortalVIType.Table.getLabel();
@@ -159,7 +180,8 @@
    @Override
    public boolean delete(DeletePortalVIDTOList portalVIDTOList) throws PLException {
        if(portalVIDTOList==null||CollectionUtils.isEmpty(portalVIDTOList.getPortalVIDTOList())){
            VciBaseUtil.alertNotNull("请选择要删除的对象!");
          //  VciBaseUtil.alertNotNull("删除的对象");
            throw new PLException("1001",new String[]{"请选择要删除的对象!}"});
        }
        try {
            for(PortalVIDTO portalVIDTO:portalVIDTOList.getPortalVIDTOList()) {
@@ -235,6 +257,7 @@
                short typeFlag = clonedestObject.getTypeFlag();
                if (viName != null) {
                    VciBaseUtil.alertNotNull(viName, "克隆名称不允许为空");
                    //throw new PLException("1001",new String[]{"请选择要删除的对象!}"});
                    if(  PortalVIMap.containsKey(viName)){
                        throw  new VciBaseException("克隆名称"+viName+"已存在,请核对!");
                    }
@@ -260,77 +283,175 @@
    @Override
    public String exportToExcel(Collection<String> idList) {
        /*List<PortalVIVO>  portalVIVOList= listByIds(idList);
        String defaultTempFolder = LocalFileUtil.getDefaultTempFolder();
        String xfileName="export.xls";
        List<WriteExcelData> rowDataList = new ArrayList<>();
        final int[] index = {0};
        if(!CollectionUtils.isEmpty(portalVIVOList)) {
            portalVIVOList.stream().forEach(PortalVIVO -> {
                //先是名称
                int rowIndex = index[0];
                WriteExcelData idED = new WriteExcelData(rowIndex, 0, btmId);
                idED.setMerged(true);
                if (attributeVOS.size() > 0) {
                    idED.setRowTo(rowIndex + attributeVOS.size() - 1 + 3);
                }
                rowDataList.add(idED);
        List<WriteExcelData> qtRowDataList = new ArrayList<>();
        //VciBaseUtil.alertNotNull(idList);
        List<PortalVIDTO>  portalVIDTOList= listByIds(idList);
        final int index=0;
                WriteExcelData nameED = new WriteExcelData(rowIndex, 1, btmTypeVO.getName());
                nameED.setMerged(true);
                if (attributeVOS.size() > 0) {
                    nameED.setRowTo(rowIndex + attributeVOS.size() - 1 + 3);
                }
                rowDataList.add(nameED);
        String excelFileName = defaultTempFolder + File.separator + xfileName;
        File excelFile = new File(excelFileName);
        try {
            excelFile.createNewFile();
        }catch (Throwable e){
            String msg = "在创建excel文件的时候出现了错误";
            if(logger.isErrorEnabled()){
                logger.error(msg,e);
            }
            throw new VciBaseException(msg+",{0}",new String[]{excelFileName},e);
        }
                rowDataList.add(new WriteExcelData(rowIndex, 2, "id"));
                rowDataList.add(new WriteExcelData(rowIndex, 3, "编号"));
                rowDataList.add(new WriteExcelData(rowIndex, 4, "字符串"));
                rowDataList.add(new WriteExcelData(rowIndex, 5, "是"));
                rowDataList.add(new WriteExcelData(rowIndex, 6, "50"));
                rowIndex++;
                rowDataList.add(new WriteExcelData(rowIndex, 2, "name"));
                rowDataList.add(new WriteExcelData(rowIndex, 3, "名称"));
                rowDataList.add(new WriteExcelData(rowIndex, 4, "字符串"));
                rowDataList.add(new WriteExcelData(rowIndex, 5, "是"));
                rowDataList.add(new WriteExcelData(rowIndex, 6, "50"));
                rowIndex++;
                rowDataList.add(new WriteExcelData(rowIndex, 2, "description"));
                rowDataList.add(new WriteExcelData(rowIndex, 3, "描述"));
                rowDataList.add(new WriteExcelData(rowIndex, 4, "字符串"));
                rowDataList.add(new WriteExcelData(rowIndex, 5, "是"));
                rowDataList.add(new WriteExcelData(rowIndex, 6, "150"));
                //处理属性
                rowIndex++;
                for (int i = 0; i < attributeVOS.size(); i++) {
                    OsBtmTypeAttributeVO attributeVO = attributeVOS.get(i);
                    //先是属性的英文名称
                    rowDataList.add(new WriteExcelData(rowIndex, 2, attributeVO.getId()));
                    //然后属性的中文名称
                    rowDataList.add(new WriteExcelData(rowIndex, 3, attributeVO.getName()));
                    //属性的类型
                    rowDataList.add(new WriteExcelData(rowIndex, 4, VciFieldTypeEnum.getTextByValue(attributeVO.getAttributeDataType())));
                    //是否可以为空
                    rowDataList.add(new WriteExcelData(rowIndex, 5, attributeVO.isNullableFlag() ? "是" : "否"));
                    //属性长度
                    String length = attributeVO.getAttributeLength()==null?"":attributeVO.getAttributeLength() + "" ;
                    if (attributeVO.getPrecisionLength() != null) {
                        length = length + "(" + attributeVO.getPrecisionLength() + "," + attributeVO.getScaleLength() == null ? "2" : (attributeVO.getScaleLength() + "") + ")" ;
        rowDataList.add(new WriteExcelData(index, 0, "业务类型名称"));
        rowDataList.add(new WriteExcelData(index, 1, "名称"));
        rowDataList.add(new WriteExcelData(index, 2, "业务类型"));
        rowDataList.add(new WriteExcelData(index, 3, "表单类型"));
        rowDataList.add(new WriteExcelData(index, 4, "配置文本"));
        rowDataList.add(new WriteExcelData(index, 5, "属性"));
        rowDataList.add(new WriteExcelData(index, 6, "查询模板名称"));
        rowDataList.add(new WriteExcelData(index, 7, "查询模板配置文本"));
        rowDataList.add(new WriteExcelData(index, 8, "查询模板业务类型"));
        qtRowDataList.add(new WriteExcelData(index, 0, "业务类型名称"));
        qtRowDataList.add(new WriteExcelData(index, 1, "链接类型名称"));
        qtRowDataList.add(new WriteExcelData(index, 2, "查询模板定义名称"));
        qtRowDataList.add(new WriteExcelData(index, 3, "属性"));
        if(!CollectionUtils.isEmpty(portalVIDTOList)){
            final int[] rowIndex = {1};
            boolean isLink=PortalVITypeFlag.LinkType.getIntVal()== portalVIDTOList.get(0).getTypeFlag()?true:false;
            try {
                BaseResult baseResult=  quereyTemplateServiceI.queryTemplateList( portalVIDTOList.get(0).getTypeName(),isLink);
                if(baseResult.isSuccess()){
                    final int[] rowIndex1 = {1};
                    Collection< QTD> qtdList=  baseResult.getData();
                    if(!CollectionUtils.isEmpty(qtdList)){
                        qtdList.stream().forEach(qtd -> {
                            qtRowDataList.add(new WriteExcelData(rowIndex1[0], 0, qtd.btmName));
                            qtRowDataList.add(new WriteExcelData(rowIndex1[0], 1, qtd.linkTypeName));
                            qtRowDataList.add(new WriteExcelData(rowIndex1[0], 2, qtd.name));
                            qtRowDataList.add(new WriteExcelData(rowIndex1[0], 3, VciBaseUtil.array2String(qtd.abNames)));
                            rowIndex1[0]++;
                        });
                    }
                    rowDataList.add(new WriteExcelData(rowIndex, 6, length));
                    //备注
                    rowDataList.add(new WriteExcelData(rowIndex, 7, attributeVO.getDescription() == null ? "" : attributeVO.getDescription()));
                    rowIndex++;
                }
            } catch (PLException e) {
                e.printStackTrace();
            }
            portalVIDTOList.stream().forEach(portalVIDTO -> {
                //先是名称
                rowDataList.add(new WriteExcelData(rowIndex[0], 0, portalVIDTO.getTypeName()));//业务类型名称
                rowDataList.add(new WriteExcelData(rowIndex[0], 1, portalVIDTO.getViName()));//名称
                rowDataList.add(new WriteExcelData(rowIndex[0], 2, PortalVITypeFlag.getByIntVal(portalVIDTO.getTypeFlag()).getLabel()));//业务类型
                rowDataList.add(new WriteExcelData(rowIndex[0], 3,PortalVIType.getByIntVal(portalVIDTO.getViType()).getLabel()));//表单类型
                try {
                    String prmText=UITools.getPRMText(prmDOO2VIS(portalVIDTO.getPrm(),portalVIDTO.getViType()));
                    String prmTextFileName=    ObjectUtility.getNewObjectID36() + ".txt";
                    String prmTextFileNameAllName = xfileName + "." + prmTextFileName;
                    writeDataToFile(defaultTempFolder,prmTextFileNameAllName,prmText);
                    rowDataList.add(new WriteExcelData(rowIndex[0], 4,prmTextFileName));//配置文本
                } catch (Throwable e) {
                    e.printStackTrace();
                }
                String attributeStr="";
                try {
                    List<OsAttributeVO> osAttributeVOList=osAttributeService.getOsAttributeVOSByBtName(portalVIDTO.getTypeName(),portalVIDTO.getTypeFlag());
                    if(!CollectionUtils.isEmpty(osAttributeVOList)){
                      List<String> filedList= osAttributeVOList.stream().map(OsAttributeVO::getId).collect(Collectors.toList());
                        attributeStr=VciBaseUtil.array2String(filedList.toArray(new String[]{}));
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                rowDataList.add(new WriteExcelData(rowIndex[0], 5, attributeStr));//属性
              String qtName="";
                try {
                    QTInfo qt = platformClientUtil.getQTDService().getQT(portalVIDTO.getPrm().getFormQtName());
                    qtName=qt.qtName;
                    rowDataList.add(new WriteExcelData(rowIndex[0], 6,qtName));//查询模板名称
                    String qtFileName = ObjectUtility.getNewObjectID36() + ".txt";
                    String qtFileNameAllName = xfileName + "." + qtFileName;
                    writeDataToFile(defaultTempFolder,qtFileNameAllName,qt.qtText);
                    rowDataList.add(new WriteExcelData(rowIndex[0], 7, qtFileName));//查询模板配置文本
                    rowDataList.add(new WriteExcelData(rowIndex[0], 8, qt.btmName));//查询模板业务类型
                } catch (PLException e) {
                    e.printStackTrace();
                }
                index[0] = rowIndex;
                rowIndex[0]++;
            });
        }
*/
        return null;
       /* String excelTemplateFileName = "/excelTemplate/dataBaseExport.xls";
        if(this.getClass().getResource(excelTemplateFileName) == null){
            throw new VciBaseException("请联系管理员,系统中缺少{0}这个模板文件",new String[]{excelTemplateFileName});
        }
        try {
            ExcelUtil.copyFileFromJar(excelTemplateFileName,excelFile);
            //这个方法会关闭文件流
        }catch (Throwable e){
            String msg = "从模板文件拷贝到目标文件出现了错误";
            if(logger.isErrorEnabled()){
                logger.error(msg,e);
            }
            throw new VciBaseException(msg+",{0}",new String[]{excelFileName},e);
        }*/
        try{
            WriteExcelOption excelOption = new WriteExcelOption();
            excelOption.addSheetDataList("portalvi",rowDataList);
            excelOption.addSheetDataList("QTD",qtRowDataList);
            ExcelUtil.writeDataToFile(excelFile,excelOption);
        }catch (Throwable e){
            String msg = "把数据写入到excel文件中出现错误";
            if(logger.isErrorEnabled()){
                logger.error(msg,e);
            }
            throw new VciBaseException(msg+",{0}",new String[]{excelFileName},e);
        }
        File zip = ZipUtil.zip(defaultTempFolder);
        FileUtil.del(defaultTempFolder + File.separator);
        //最后返回excel文件名称
        return zip.getAbsoluteFile().getAbsolutePath();
    }
    public List<PortalVIVO> listByIds(Collection idList){
        List<PortalVIVO> portalVIVOList=new ArrayList<>();
    /**
     * 拷贝数据到word模板中
     * @param fileName 要写入的数据
     * @return word 文件路径
     */
    public String writeDataToFile(String defaultTempFolder,String fileName,String str){
        String tempFolder = LocalFileUtil.getDefaultTempFolder();
        //拷贝文件
        String filePath = tempFolder + File.separator + fileName;
        File file = new File(filePath);
        FileOutputStream out = null;
        try {
            file.createNewFile();
            out=  new FileOutputStream(file);
            IOUtils.write(str,out);
        }catch (Throwable e){
            IOUtils.closeQuietly(out);
            String msg = "在创建文件的时候出现了错误";
            if(logger.isErrorEnabled()){
                logger.error(msg,e);
            }
            throw new VciBaseException(msg+",{0}",new String[]{filePath},e);
        }finally {
            IOUtils.closeQuietly(out);
            //移动属性到链接类型文件夹里面去
            FileUtil.move(file, new File(defaultTempFolder),true);
            FileUtil.del(tempFolder);
        }
        return filePath;
    }
    public List<PortalVIDTO> listByIds(Collection idList){
        List<PortalVIDTO> portalVIVOList=new ArrayList<>();
        if(CollectionUtils.isEmpty(idList)){
            throw  new VciBaseException("请选择需要导出的数据");
        }
@@ -343,7 +464,7 @@
                e.printStackTrace();
            }
        });
        portalVIVOList=  portalVIDOO2VOS(portalVIList);
        portalVIVOList=  portalVIO2DTOS(portalVIList);
        return portalVIVOList;
    }
    private BaseResult savePortalVIDTO(PortalVIDTO portalVIDTO,boolean isEdit)  {
@@ -870,8 +991,12 @@
        List<String> itemSelectoutFieldList= allKeyList.stream().filter(s ->!itemOutFieldList.stream().map(s1 -> s1).collect(Collectors.toList()).contains(s) ).collect(Collectors.toList());
        prmItemDTO.setItemSelectoutFieldList(itemSelectoutFieldList);//待选择的属性字段
        prmItemDTO.setItemOutFieldList(itemOutFieldList);//需要使用的集合
        List<String> itemSearchFieldList= itemOutFieldList.stream().filter(s ->!itemKeyFieldList.stream().map(s1 -> s1).collect(Collectors.toList()).contains(s) ).collect(Collectors.toList());
        prmItemDTO.setItemSearchFieldList(itemSearchFieldList);//待搜索字段
        List<String> itemSearchFieldList=new ArrayList<>();
        if(!CollectionUtils.isEmpty(itemKeyFieldList)){
            itemSearchFieldList= itemOutFieldList.stream().filter(s ->!itemKeyFieldList.contains(s)).collect(Collectors.toList());
        }else{
            itemSearchFieldList=itemOutFieldList;
        } prmItemDTO.setItemSearchFieldList(itemSearchFieldList);//待搜索字段
        prmItemDTO.setItemKeyFieldList(itemKeyFieldList);//搜索字段
    }
    /**
@@ -915,11 +1040,14 @@
    private List<KeyValue>  initItemFieldWidthList(String itemOutFields,String itemFieldWidth){
        List<KeyValue> keyValueList=new ArrayList<>();
        List<String>itemOutFieldList=   VciBaseUtil.str2List(itemOutFields);
        List<String>itemFieldWidthList=  VciBaseUtil.str2List(itemFieldWidth,":");
        List<String>itemFieldWidthList=  VciBaseUtil.str2List(itemFieldWidth,",");
        if(itemOutFieldList.size()>0) {
            for (int i = 0; i < itemOutFieldList.size(); i++) {
                KeyValue keyValue = new KeyValue();
                String with = itemFieldWidthList.get(i);
                String with="250";
                if(i<itemFieldWidthList.size()) {
                    with  = itemFieldWidthList.get(i);
               }
                keyValue.setKey(itemOutFieldList.get(i));
                keyValue.setValue(StringUtils.isBlank(with) ? "250" : with);
                keyValueList.add(keyValue);