diff --git a/bonus-business/src/main/java/com/bonus/business/mapper/DocumentScreenMapper.java b/bonus-business/src/main/java/com/bonus/business/mapper/DocumentScreenMapper.java index b8edaf7..29f62fd 100644 --- a/bonus-business/src/main/java/com/bonus/business/mapper/DocumentScreenMapper.java +++ b/bonus-business/src/main/java/com/bonus/business/mapper/DocumentScreenMapper.java @@ -159,6 +159,8 @@ public interface DocumentScreenMapper { */ List getFileChildList(); + List getFileChildList2(); + /** * 数据查询 * @param vo @@ -197,4 +199,37 @@ public interface DocumentScreenMapper { * @return */ Integer getPublicFolderNum(TbFolderFileVo vo); + + /** + * 修改状态类型 + * @param childeList2 + * @param type + */ + void updateDocumentToType(@Param("list") List childeList2,@Param("type") String type,@Param("userId")String userId); + + /** + * 修改状态 + * @param id + * @param type + */ + void updateDocumentType(@Param("id") String id,@Param("type") String type,@Param("userId")String userId); + + /** + * 更新文件内容 + * @param tbUserFiles + */ + void updateDocumentData(TbUserFiles tbUserFiles); + + /** + * 删除数据 + * @param tbUserFiles + */ + void delLables(TbUserFiles tbUserFiles); + + /** + * 查询修改数据信息 + * @param vo + * @return + */ + TbDocumentFolder getDocumnetData(TbFolderFileVo vo); } diff --git a/bonus-business/src/main/java/com/bonus/business/service/impl/DocumentScreenImpl.java b/bonus-business/src/main/java/com/bonus/business/service/impl/DocumentScreenImpl.java index 817105b..6d0a819 100644 --- a/bonus-business/src/main/java/com/bonus/business/service/impl/DocumentScreenImpl.java +++ b/bonus-business/src/main/java/com/bonus/business/service/impl/DocumentScreenImpl.java @@ -19,10 +19,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.*; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -141,7 +138,7 @@ public class DocumentScreenImpl implements DocumentScreenService { public AjaxResult addDocument(TbDocumentFolder vo) { try{ if("3".equals(vo.getType()) || "userDocument".equals(vo.getParentId())){ - vo.setTttt(vo.getType()); + vo.setTttt("3"); } if("companyDocument".equals(vo.getParentId())){ return AjaxResult.error("当前文件夹下不运行创建文件夹"); @@ -164,13 +161,14 @@ public class DocumentScreenImpl implements DocumentScreenService { vo.setParentId(vo.getParentId().split("_")[2]); } } - if("userDocument".equals(type)){ + if("userDocument".equals(vo.getParentId())){ vo.setPublicFolderId(vo.getParentId()); vo.setParentId("0"); + vo.setType("3"); } - vo.setType("3"); + if("3".equals(vo.getType()) || "userDocument".equals(vo.getParentId())){ - vo.setTttt(vo.getType()); + vo.setTttt("3"); } vo.setParentIds(vo.getParentIds()+vo.getParentId()+","); @@ -233,11 +231,11 @@ public class DocumentScreenImpl implements DocumentScreenService { vo.setCreateUser(SecurityUtils.getUserId().toString()); String repeatType=vo.getRepeatType(); //创建文件 - if("userDocument".equals(vo.getType())){ + if("userDocument".equals(vo.getParentId())){ vo.setParentId("0"); vo.setType("3"); } - + Map map=new HashMap<>(); List list=mapper.getDocumentFileList(vo); List fileList=new ArrayList<>(file.length); List delete=new ArrayList<>(); @@ -260,29 +258,31 @@ public class DocumentScreenImpl implements DocumentScreenService { } }else{ //覆盖 - for (MultipartFile multipartFile : file) { - String originFileName = multipartFile.getOriginalFilename(); - for (TbUserFiles tbUserFiles : list) { + for (MultipartFile multipartFile : file) { + String originFileName = multipartFile.getOriginalFilename(); fileList.add(multipartFile); - assert originFileName != null; - if (originFileName.equals(tbUserFiles.getOriginalName())) { - delete.add(tbUserFiles); - break; + for (TbUserFiles tbUserFiles : list) { + + assert originFileName != null; + if (originFileName.equals(tbUserFiles.getOriginalName())) { + delete.add(tbUserFiles); + break; + } } } - } - //删除文件 - for (TbUserFiles tbUserFiles : delete) { - //删除文件 - service.delFile(tbUserFiles.getFilePath()); - } - //删除文件 - if(delete.size()>0){ - mapper.deleteCompanyFile(delete); - } + //删除文件 + for (TbUserFiles tbUserFiles : delete) { + //删除文件 + map.put(tbUserFiles.getOriginalName(),tbUserFiles); + service.delFile(tbUserFiles.getFilePath()); + } + //删除文件 +// if(delete.size()>0){ +// // mapper.deleteCompanyFile(delete); +// } } - AjaxResult result=uploadFile(fileList,vo); + AjaxResult result=uploadFile(fileList,vo,map); // 文件上传 if(result.isError()){ return result; @@ -384,7 +384,6 @@ public class DocumentScreenImpl implements DocumentScreenService { if("companyDocument".equals(vo.getNewParentId()) || "myShare".equals(vo.getNewParentId()) || "otherShare".equals(vo.getNewParentId())){ return AjaxResult.error("目标文件夹没有权限"); } - //验证目标文件夹名称 String name=mapper.getNowName(vo); Integer publicFolderNum= mapper.getPublicFolderNum(vo); @@ -395,17 +394,26 @@ public class DocumentScreenImpl implements DocumentScreenService { if ("0".equals(vo.getParentId())) { TbFolderFileVo data=mapper.getDocumentRealData(vo); TbDocumentFolder documentFolder = getTbDocumentFolder(vo, data); + documentFolder.setUserId(userId); //目标不是文档中心 if("userDocument".equals(vo.getNewParentId())) { - - int num=mapper.getToName(name,vo.getPublicFolderId()); + vo.setToType("3"); + int num=mapper.getToName(name,vo.getNewParentId()); if(num>0){ - return AjaxResult.error("目标文件夹名称已存在"); + return AjaxResult.error("目标文件夹已存在该文件不可移入"); + } + List childeList=mapper.getFileChildList2(); + TreeBuild treeBuild1 = new TreeBuild(childeList); + List childeList2=treeBuild1.buildTree(vo.getId()); + List allList=new ArrayList<>(); + getChildListAll(childeList2,allList); + if(!allList.isEmpty()){ + mapper.updateDocumentToType(allList,"3",userId); } mapper.deleteDocumentReal(data); mapper.addDocumentRealUser(documentFolder); + mapper.updateDocumentType(documentFolder.getId(),"3",userId); }else{ - List childeList=mapper.getFileChildList(); TreeBuild treeBuild1 = new TreeBuild(childeList); List childeList2=treeBuild1.buildTree(vo.getId()); @@ -413,22 +421,38 @@ public class DocumentScreenImpl implements DocumentScreenService { if(isChiild){ return AjaxResult.error("目标文件夹不能是自己子文件夹"); } - int num=mapper.getToName2(name,vo.getNewParentId()); if(num>0){ - return AjaxResult.error("目标文件夹名称已存在"); + return AjaxResult.error("目标文件夹已存在该文件不可移入"); } mapper.deleteDocumentReal(data); + if(publicFolderNum>0){ + vo.setNewParentId("0"); + vo.setParentIds("0,"); + mapper.addDocumentRealUser(documentFolder); + } + List childeList3=mapper.getFileChildList2(); + TreeBuild treeBuild4 = new TreeBuild(childeList3); + List childeList5=treeBuild4.buildTree(vo.getId()); + List allList=new ArrayList<>(); + getChildListAll(childeList5,allList); if("3".equals(vo.getToType())){ vo.setToType("3"); + if(!childeList5.isEmpty()){ + mapper.updateDocumentToType(allList,"3",userId); + } }else{ vo.setToType(null); + if(!childeList5.isEmpty()){ + mapper.updateDocumentToType(allList,null,userId); + } } mapper.updateDocumentParentId(vo); + } }else{ //非初始化节点 查询全部子数据 - if("3".equals(vo.getToType())){ + if("3".equals(vo.getToType()) || "userDocument".equals(vo.getNewParentId())){ vo.setToType("3"); }else{ vo.setToType(null); @@ -450,6 +474,15 @@ public class DocumentScreenImpl implements DocumentScreenService { } mapper.addDocumentRealUser(documentFolder); mapper.updateDocumentParentId(vo); + List childeList=mapper.getFileChildList2(); + TreeBuild treeBuild1 = new TreeBuild(childeList); + List childeList2=treeBuild1.buildTree(vo.getId()); + List allList=new ArrayList<>(); + getChildListAll(childeList2,allList); + if(!allList.isEmpty()){ + mapper.updateDocumentToType(allList,vo.getToType(),userId); + } + mapper.updateDocumentType(documentFolder.getId(),vo.getToType(),userId); }else{ List childeList=mapper.getFileChildList(); TreeBuild treeBuild1 = new TreeBuild(childeList); @@ -463,6 +496,17 @@ public class DocumentScreenImpl implements DocumentScreenService { return AjaxResult.error("目标文件夹名称已存在"); } mapper.updateDocumentParentId(vo); + + List childList5=mapper.getFileChildList2(); + TreeBuild treeBuild3 = new TreeBuild(childList5); + List childeList4=treeBuild3.buildTree(vo.getId()); + List allList=new ArrayList<>(); + getChildListAll(childeList4,allList); + if(!allList.isEmpty()){ + mapper.updateDocumentToType(allList,vo.getToType(),userId); + } + mapper.updateDocumentType(vo.getId(),vo.getToType(),userId); + } } } @@ -490,6 +534,15 @@ public class DocumentScreenImpl implements DocumentScreenService { } + private void getChildListAll(List childeList2,List allList) { + for (DocumentTreeVo vo : childeList2){ + allList.add(vo); + if( vo.getChildTree()!=null && !vo.getChildTree().isEmpty()){ + getChildListAll(vo.getChildTree(),allList); + } + } + } + /** * * @param vo @@ -602,9 +655,30 @@ public class DocumentScreenImpl implements DocumentScreenService { @Override public AjaxResult updateName(TbFolderFileVo vo) { try{ + + + if(dataIds.contains(vo.getId())){ return AjaxResult.error("当前文件夹不允许重命名"); } + TbDocumentFolder documentFolder=mapper.getDocumnetData(vo); + if("0".equals(documentFolder.getParentId())){ + if("userDocument".equals(documentFolder.getPublicFolderId())){ + documentFolder.setType("3"); + }else{ + documentFolder.setType("1"); + } + }else{ + if(StringUtils.isEmpty(documentFolder.getPublicFolderId())){ + documentFolder.setType("2"); + } + } + documentFolder.setUserId(SecurityUtils.getUserId().toString()); + documentFolder.setFolderName(vo.getFolderName()); + Integer num= mapper.getDocumentByNum(documentFolder); + if(num!=null && num>0){ + return AjaxResult.error("文件夹名称已存在"); + } //父节点更新 String userId=SecurityUtils.getUserId().toString(); @@ -875,6 +949,18 @@ public static String getZipPath(){ e.printStackTrace(); } } + public static void main(String[] args) { + String filePath = "path/to/your/file.txt"; // 示例路径 + + // 获取后缀 + int dotIndex = filePath.lastIndexOf('.'); + String extension = dotIndex > 0 ? filePath.substring(dotIndex) : ""; + // 获取名称(不带后缀) + String nameWithoutExtension = dotIndex > 0 ? filePath.substring(filePath.lastIndexOf('/') + 1, dotIndex) : filePath; + + System.out.println("Extension: " + extension); // 输出后缀 + System.out.println("Name without extension: " + nameWithoutExtension); // 输出不带后缀的名称 + } /** * 依据id 查询全部子节点数据 @@ -909,6 +995,27 @@ public static String getZipPath(){ tbDocumentFolder.setFileType(vo2.getFileType()); tbDocumentFolder.setRemark(vo2.getRemark()); tbDocumentFolder.setFilePath(vo2.getFilePath()); + if("1".equals(vo2.getFileType())){ + // + // 获取后缀 + int dotIndex = vo2.getName().lastIndexOf('.'); + String extension = dotIndex > 0 ? vo2.getName().substring(dotIndex) : ""; + // 获取名称(不带后缀) + String nameWithoutExtension = dotIndex > 0 ? vo2.getName().substring(vo2.getName().lastIndexOf('/') + 1, dotIndex) : vo2.getName(); + if(nameWithoutExtension.contains("副本")){ + tbDocumentFolder.setFolderName(nameWithoutExtension.split("_")[0]+"_副本_"+time+extension); + }else{ + tbDocumentFolder.setFolderName(nameWithoutExtension+"_副本_"+time+extension); + } + }else{ + if(vo2.getName().contains("副本")){ + tbDocumentFolder.setFolderName(vo2.getName().split("_")[0]+"_副本_"+time); + }else{ + tbDocumentFolder.setFolderName(vo2.getName()+"_副本_"+time); + } + + } + tbDocumentFolder.setFolderName(vo2.getName()+"_副本_"+time); tbDocumentFolder.setFileSuffix(vo2.getFileSuffix()); tbDocumentFolder.setLabels(vo2.getLabName()); @@ -926,6 +1033,7 @@ public static String getZipPath(){ //添加关联数据 tbDocumentFolder.setAuthType("4"); tbDocumentFolder.setDataType("1"); + tbDocumentFolder.setAuth("4"); if("0".equals(vo.getNewParentId())){ tbDocumentFolder.setPublicFolderId(vo.getPublicFolderId()); }else{ @@ -941,12 +1049,32 @@ public static String getZipPath(){ tbDocumentFolder.setFileType(vo2.getFileType()); tbDocumentFolder.setRemark(vo2.getRemark()); tbDocumentFolder.setFilePath(vo2.getFilePath()); - tbDocumentFolder.setFolderName(vo2.getName()+"_副本_"+time); + if("1".equals(vo2.getFileType())){ + // 获取后缀 + int dotIndex = vo2.getName().lastIndexOf('.'); + String extension = dotIndex > 0 ? vo2.getName().substring(dotIndex) : ""; + // 获取名称(不带后缀) + String nameWithoutExtension = dotIndex > 0 ? vo2.getName().substring(vo2.getName().lastIndexOf('/') + 1, dotIndex) : vo2.getName(); + if(nameWithoutExtension.contains("副本")){ + tbDocumentFolder.setFolderName(nameWithoutExtension.split("_")[0]+"_副本_"+time+extension); + }else{ + tbDocumentFolder.setFolderName(nameWithoutExtension+"_副本_"+time+extension); + } + }else{ + if(vo2.getName().contains("副本")){ + tbDocumentFolder.setFolderName(vo2.getName().split("_")[0]+"_副本_"+time); + }else{ + tbDocumentFolder.setFolderName(vo2.getName()+"_副本_"+time); + } + + } + + // tbDocumentFolder.setFolderName(vo2.getName()+"_副本_"+time); tbDocumentFolder.setFileSuffix(vo2.getFileSuffix()); tbDocumentFolder.setLabels(vo2.getLabName()); - tbDocumentFolder.setCreateUser(vo2.getCreateUser()); - tbDocumentFolder.setUpdateUser(vo2.getUpdateUser()); - if("3".equals(vo.getToType())){ + tbDocumentFolder.setCreateUser(userId); + tbDocumentFolder.setUpdateUser(userId); + if("3".equals(vo.getToType()) || "userDocument".equals(vo.getNewParentId())){ tbDocumentFolder.setTttt("3"); } mapper.addDocumentCompany(tbDocumentFolder); @@ -973,7 +1101,26 @@ public static String getZipPath(){ tbDocumentFolder.setFileType(vo2.getFileType()); tbDocumentFolder.setRemark(vo2.getRemark()); tbDocumentFolder.setFilePath(vo2.getFilePath()); - tbDocumentFolder.setFolderName(vo2.getName()+"_副本_"+time); + if("1".equals(vo2.getFileType())){ + // 获取后缀 + int dotIndex = vo2.getName().lastIndexOf('.'); + String extension = dotIndex > 0 ? vo2.getName().substring(dotIndex) : ""; + // 获取名称(不带后缀) + String nameWithoutExtension = dotIndex > 0 ? vo2.getName().substring(vo2.getName().lastIndexOf('/') + 1, dotIndex) : vo2.getName(); + if(nameWithoutExtension.contains("副本")){ + tbDocumentFolder.setFolderName(nameWithoutExtension.split("_")[0]+"_副本_"+time+extension); + }else{ + tbDocumentFolder.setFolderName(nameWithoutExtension+"_副本_"+time+extension); + } + }else{ + if(vo2.getName().contains("副本")){ + tbDocumentFolder.setFolderName(vo2.getName().split("_")[0]+"_副本_"+time); + }else{ + tbDocumentFolder.setFolderName(vo2.getName()+"_副本_"+time); + } + + } + // tbDocumentFolder.setFolderName(vo2.getName()+"_副本_"+time); tbDocumentFolder.setFileSuffix(vo2.getFileSuffix()); tbDocumentFolder.setLabels(vo2.getLabName()); tbDocumentFolder.setCreateUser(userId); @@ -993,11 +1140,30 @@ public static String getZipPath(){ tbDocumentFolder.setFileType(vo2.getFileType()); tbDocumentFolder.setRemark(vo2.getRemark()); tbDocumentFolder.setFilePath(vo2.getFilePath()); - tbDocumentFolder.setFolderName(vo2.getName()+"_副本_"+time); + if("1".equals(vo2.getFileType())){ + // 获取后缀 + int dotIndex = vo2.getName().lastIndexOf('.'); + String extension = dotIndex > 0 ? vo2.getName().substring(dotIndex) : ""; + // 获取名称(不带后缀) + String nameWithoutExtension = dotIndex > 0 ? vo2.getName().substring(vo2.getName().lastIndexOf('/') + 1, dotIndex) : vo2.getName(); + if(nameWithoutExtension.contains("副本")){ + tbDocumentFolder.setFolderName(nameWithoutExtension.split("_")[0]+"_副本_"+time+extension); + }else{ + tbDocumentFolder.setFolderName(nameWithoutExtension+"_副本_"+time+extension); + } + }else{ + if(vo2.getName().contains("副本")){ + tbDocumentFolder.setFolderName(vo2.getName().split("_")[0]+"_副本_"+time); + }else{ + tbDocumentFolder.setFolderName(vo2.getName()+"_副本_"+time); + } + + } + // tbDocumentFolder.setFolderName(vo2.getName()+"_副本_"+time); tbDocumentFolder.setFileSuffix(vo2.getFileSuffix()); tbDocumentFolder.setLabels(vo2.getLabName()); - tbDocumentFolder.setCreateUser(vo2.getCreateUser()); - tbDocumentFolder.setUpdateUser(vo2.getUpdateUser()); + tbDocumentFolder.setCreateUser(userId); + tbDocumentFolder.setUpdateUser(userId); mapper.addDocumentCompany(tbDocumentFolder); //如果文件 需要copy标签 if("1".equals(vo2.getFileType())){ @@ -1045,17 +1211,18 @@ public static String getZipPath(){ * @param * @return */ - public AjaxResult uploadFile(List multipartFileList,TbUserFiles files){ + public AjaxResult uploadFile(List multipartFileList,TbUserFiles files, Map map){ String type=files.getType(); String filePath = "document/file/"+files.getUploadUser() +separator + year + separator + month + separator + day +separator ; TbDocumentFolder documentFolder=new TbDocumentFolder(); //文件类型 - documentFolder.setFileType("1"); - documentFolder.setPublicFolderId(files.getParentId()); - if("1".equals(type) || "userDocument".equals(files.getParentId())){ + if("userDocument".equals(files.getFolderId())){ + documentFolder.setPublicFolderId("userDocument"); + } + if("1".equals(type) || "userDocument".equals(files.getFolderId())){ documentFolder.setParentId("0"); }else{ documentFolder.setParentId(files.getParentId()); @@ -1080,8 +1247,8 @@ public static String getZipPath(){ String originFileName = file.getOriginalFilename(); String suffix=StringUtils.substringAfterLast(originFileName, "."); //产品 封面 - filePath =filePath+uuid + "." + suffix; - String path=service.uploadFile(file, filePath); + String newPath =filePath+uuid + "." + suffix; + String path=service.uploadFile(file, newPath); if(path==null){ return AjaxResult.error("文件上传失败"); } @@ -1089,7 +1256,7 @@ public static String getZipPath(){ files.setDownTimes(0); files.setSeeTimes(0); files.setFileName(uuid+"." + suffix); - files.setFilePath(filePath); + files.setFilePath(newPath); files.setBucketName(path); files.setOriginalName(originFileName); files.setFileSuffix(suffix); @@ -1101,7 +1268,7 @@ public static String getZipPath(){ //数据 documentFolder.setFolderName(originFileName); documentFolder.setFileSuffix(suffix); - documentFolder.setFilePath(filePath); + documentFolder.setFilePath(newPath); String userId=SecurityUtils.getUserId().toString(); documentFolder.setCreateUser(userId); documentFolder.setUpdateUser(userId); @@ -1110,23 +1277,36 @@ public static String getZipPath(){ if("3".equals(type)){ documentFolder.setTttt(type); } + documentFolder.setAuth("4"); //新增文档 - Integer num=mapper.addDocumentCompany(documentFolder); - //新增文档标签 - mapper.addDocumentLabels(list); - if("1".equals(type) || "userDocument".equals(files.getParentId())){ - documentFolder.setAuthType("4"); - //创建的都是4 - documentFolder.setDataType("1"); - Integer num3= mapper.addDocumentRealUser(documentFolder); - if(num3!=1){ + TbUserFiles tbUserFiles=map.get(originFileName); + if(tbUserFiles==null){ + Integer num=mapper.addDocumentCompany(documentFolder); + //新增文档标签 + mapper.addDocumentLabels(list); + + if("1".equals(type) || "userDocument".equals(files.getParentId()) || "userDocument".equals(files.getFolderId())){ + documentFolder.setAuthType("4"); + //创建的都是4 + documentFolder.setDataType("1"); + Integer num3= mapper.addDocumentRealUser(documentFolder); + if(num3!=1){ + return AjaxResult.error("添加失败"); + } + } + if(num!=1){ return AjaxResult.error("添加失败"); } + }else{ + tbUserFiles.setLabels(files.getLabels()); + tbUserFiles.setFilePath(newPath); + mapper.updateDocumentData(tbUserFiles); + mapper.delLables(tbUserFiles); + mapper.addDocumentLabels(list); + } - if(num!=1){ - return AjaxResult.error("添加失败"); - } + } return AjaxResult.success(); } diff --git a/bonus-business/src/main/resources/mapper/business/DocumentScreenMapper.xml b/bonus-business/src/main/resources/mapper/business/DocumentScreenMapper.xml index 8f283dc..ae24df8 100644 --- a/bonus-business/src/main/resources/mapper/business/DocumentScreenMapper.xml +++ b/bonus-business/src/main/resources/mapper/business/DocumentScreenMapper.xml @@ -34,6 +34,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" delete from tb_public_real_user where user_folder_id=#{id} and data_type in(2,3) + + delete from tb_document_files_label where file_id=#{id} + insert into tb_document_files_label( file_id, lable_id, lable_name)values @@ -69,6 +72,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update tb_public_folder set down_times=#{downNum} where id=#{id} + + update tb_user_document_folder set type=#{type},create_user=#{userId},update_user=#{userId} + + where id in + + #{item.id} + + + + + update tb_user_document_folder set type=#{type} ,create_user=#{userId},update_user=#{userId} where id =#{id} + + + update tb_user_document_folder set labels=#{labels},file_path=#{filePath} + where id=#{id} + @@ -155,14 +174,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and folder.parent_id=#{parentId} - and folder.parent_id=#{parentId} AND folder.create_user=#{createUser} - + + and pru.public_folder_id=#{parentId} + + + and folder.parent_id=#{parentId} AND folder.create_user=#{createUser} + select id, folder_name as name, parent_id parentId, file_type fileType, parent_ids parentIds, file_path filePath, - #{newId} newParentId, + #{newId} newParentId,labels labName, IFNULL(down_times,0) downNum, 0 readNum from tb_user_document_folder where parent_id=#{id} @@ -336,11 +384,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from tb_user_document_folder where file_type=0 + +