diff --git a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/controller/FileSplitItemsEOController.java b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/controller/FileSplitItemsEOController.java index 487eba2..5cfc609 100644 --- a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/controller/FileSplitItemsEOController.java +++ b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/controller/FileSplitItemsEOController.java @@ -9,6 +9,7 @@ import com.jero.common.exception.JeroBootException; import com.jero.common.system.base.controller.JeroController; import com.jero.common.util.MessageUtils; import com.jero.modules.oss.service.IOSSFileService; +import com.jero.modules.split.entity.SarFileSplitInfoEO; import com.jero.modules.split.entity.SarFileSplitItemsEO; import com.jero.modules.split.entity.SarFileSplitItemsValEO; import com.jero.modules.split.service.IFileSplitItemsEOService; @@ -19,13 +20,14 @@ import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringEscapeUtils; -import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -56,7 +58,6 @@ public class FileSplitItemsEOController extends JeroController addSplitItems(@ApiParam("标签管理") @RequestBody Map parameter) { List itemValEOList = (List) parameter.get("itemValEOList"); if (CollectionUtils.isNotEmpty(itemValEOList)) { @@ -84,6 +85,14 @@ public class FileSplitItemsEOController extends JeroController importSplitResult(@ApiParam("标准拆分条id") String splitFileId, + @ApiParam("国际化") String cut, + SarFileSplitInfoEO splitInfoEO) throws IOException { + return fileSplitItemsEOService.importSplitResult(splitFileId, cut,splitInfoEO); + } + /** * 文件上传统一方法 * @@ -93,10 +102,37 @@ public class FileSplitItemsEOController extends JeroController upload(HttpServletRequest request, HttpServletResponse response, @ApiParam("状态") @RequestParam(value = "state",required = false) String state, @ApiParam("国际化") @RequestParam(value = "cut",required = false) String cut) { return fileSplitItemsEOService.upload(request, response, state, cut); } + + @AutoLog(value = "标准拆分条款信息-导入") + @ApiOperation(value = "标准拆分条款信息-导入") + @PostMapping(value = "/importSplitItems") + public Result importSplitItems(@ApiParam("文件对象") MultipartFile file, + @ApiParam("国际化") @RequestParam(value = "cut") String cut, + @ApiParam("菜单id") @RequestParam(value = "menuId") String menuId, + @ApiParam("标准拆分id") @RequestParam(value = "infoId") String infoId) throws Exception { + return fileSplitItemsEOService.importSplitItems(file, cut, menuId, infoId); + } + + @ApiOperation(value = "标准拆分条款信息-导出") + @GetMapping(value = "/exportSplitInfoZip") + public void exportSplitInfoZip(@ApiParam("国际化") @RequestParam(value = "cut") String cut, + @ApiParam("idList") @RequestParam(value = "idList", required = false) String idList, + @ApiParam("导出名") @RequestParam(value = "exportName", required = false) String exportName, + @ApiParam("标签管理") @RequestParam(value = "parameter") String parameter, + HttpServletResponse response, + HttpServletRequest request) { + try { + Map parameterMap = JSONObject.parseObject(parameter); + fileSplitItemsEOService.exportSplitInfo(cut, idList, parameterMap, exportName, response, request); + }catch (JeroBootException e){ + throw new JeroBootException(e.getMessage()); + }catch (Exception e){ + throw new JeroBootException(MessageUtils.getMessage(ResultCommon.ERROR)); + } + } } diff --git a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/controller/SarFileSplitMenuEOController.java b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/controller/SarFileSplitMenuEOController.java index e569971..570bfb5 100644 --- a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/controller/SarFileSplitMenuEOController.java +++ b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/controller/SarFileSplitMenuEOController.java @@ -34,7 +34,6 @@ public class SarFileSplitMenuEOController extends JeroController> list(SarFileSplitMenuEOPage page) throws Exception { page.setValidFlag("0"); page.setOrderBy("display_seq asc"); @@ -44,7 +43,6 @@ public class SarFileSplitMenuEOController extends JeroController create(@RequestBody SarFileSplitMenuEO sarFileSplitMenuEO) throws Exception { sarFileSplitMenuEOService.addMenu(sarFileSplitMenuEO); return Result.OK("新增成功",sarFileSplitMenuEO); @@ -52,7 +50,6 @@ public class SarFileSplitMenuEOController extends JeroController update(@RequestBody SarFileSplitMenuEO sarFileSplitMenuEO) throws Exception { sarFileSplitMenuEOService.updateByPrimaryKeySelective(sarFileSplitMenuEO); return Result.OK("修改成功",sarFileSplitMenuEO); @@ -60,14 +57,12 @@ public class SarFileSplitMenuEOController extends JeroController int batchSet(Map parameter); + Result importSplitItemsData(List> list, String menuId, String filepath, String infoId, String cut, List getSheetTableList); + + Result importSplitItems(MultipartFile file, String cut, String menuId, String infoId) throws IOException; + + Result importSplitResult(String splitFileId, String cut, SarFileSplitInfoEO sarFileSplitInfoEO) throws IOException; + + void exportTemplate(String cut, HttpServletResponse response, HttpServletRequest request); + List> getBatchSetForm(String flag, String cut); Map filterMap(Map map); + List> queryByOrdersForExport(String cut, String field, List idList, Map parameter); + void downLoadImgList(List allImgList,String fileNowPath) throws IOException; void downLoadFileList(List allRelevFileList, String fileNowPath) throws IOException; + void exportSplitInfo(String cut, String idList, Map parameter,String exportName, HttpServletResponse response, HttpServletRequest request); + + List combineItemValInfo(List getValList, + List allTableList, + List allImgList, + SarFileSplitItemsEOPage page); + + String[] getWorkbookTitleForExport(String cut); + int deleteByMenuIds(List idList); + String getFieldForExport(); int insertForeach(List messageList); // 拆分已入库文件专用 diff --git a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/service/impl/FileSplitItemsEOServiceImpl.java b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/service/impl/FileSplitItemsEOServiceImpl.java index 5a13386..2069b96 100644 --- a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/service/impl/FileSplitItemsEOServiceImpl.java +++ b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/service/impl/FileSplitItemsEOServiceImpl.java @@ -2,34 +2,50 @@ package com.jero.modules.split.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ZipUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.aliyuncs.utils.IOUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.jero.common.api.vo.Result; +import com.jero.common.constant.enums.IsMustEnum; import com.jero.common.constant.enums.LanguageEnum; import com.jero.common.constant.enums.ModuleEnum; import com.jero.common.constant.enums.YesOrNoEnum; +import com.jero.common.exception.JeroBootException; import com.jero.common.system.vo.LoginUser; import com.jero.common.util.*; import com.jero.generater.modules.online.cgform.entity.OnlCgformField; import com.jero.generater.modules.online.cgform.service.impl.OnlCgformFieldServiceImpl; import com.jero.modules.document.enums.FieldTypeEnum; import com.jero.modules.document.service.IBussDocumentLibraryEOService; +import com.jero.modules.documenttool.service.IDocumentSplitService; import com.jero.modules.oss.entity.OSSFile; import com.jero.modules.oss.service.IOSSFileService; +import com.jero.modules.split.common.ConvertHtml2Excel; +import com.jero.modules.split.common.FileUnZip; +import com.jero.modules.split.common.ReadExcel; +import com.jero.modules.split.common.SplitTableInfo; +import com.jero.modules.split.dto.FileSpiltValTableExportDto; import com.jero.modules.split.dto.FileSplitValExportDto; import com.jero.modules.split.dto.FileSplitValImgExportDto; import com.jero.modules.split.entity.*; +import com.jero.modules.split.enums.SplitEnum; import com.jero.modules.split.mapper.FileSplitItemsEOMapper; import com.jero.modules.split.mapper.SarFileSplitItemsValEOMapper; import com.jero.modules.split.mapper.SarFileSplitMenuEOMapper; +import com.jero.modules.split.page.SarFileSplitItemsEOPage; +import com.jero.modules.split.page.SarFileSplitItemsTableEOPage; +import com.jero.modules.split.page.SarFileSplitItemsValEOPage; +import com.jero.modules.split.page.SarFileSplitMenuEOPage; import com.jero.modules.split.service.IFileSplitItemsEOService; import com.jero.modules.split.service.ISarFileSplitInfoService; import com.jero.modules.split.service.ISarFileSplitItemsValEOService; import com.jero.modules.split.service.ISarFileSplitMenuEOService; +import com.jero.modules.split.util.POIReadExcelToHtml; import com.jero.modules.system.entity.SysCategory; import com.jero.modules.system.entity.SysCategoryTreeVO; import com.jero.modules.system.entity.SysDictItem; @@ -43,17 +59,30 @@ import com.jero.modules.tag.entity.LawsTag; import com.jero.modules.tag.enums.TableNameEnum; import org.apache.commons.collections.map.HashedMap; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.http.entity.ContentType; +import org.apache.poi.common.usermodel.HyperlinkType; +import org.apache.poi.hssf.usermodel.*; +import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.usermodel.XSSFCellStyle; +import org.apache.poi.xssf.usermodel.XSSFRichTextString; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.shiro.SecurityUtils; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; +import sun.misc.BASE64Decoder; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -61,10 +90,13 @@ import java.io.*; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; +import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; +import static com.jero.modules.split.util.ExcelUtil.checkObjAllFieldsIsNull; +import static org.jeecgframework.poi.util.ExcelUtil.getCellValue; /** * @Author: liyawei @@ -101,6 +133,8 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl fieldList = lawsCommonMapper.getFieldList(TableNameEnum.DOCUMENT_SPLIT.getTableName()); - // 列表展示字段 - List fieldListSelect = fieldList.stream().filter(v -> YesOrNoEnum.YES.getValue() - .equals(String.valueOf(v.getIsShowList()))).collect(Collectors.toList()); - - // 查询全部字段属性 -// List fieldList = onlCgformFieldService.getFieldList(ModuleEnum.FILE_SPLIT_ITEMS.getValue()); - // 文件类型字段 - List onlFieldFileList = fieldListSelect.stream().filter(e -> FieldTypeEnum.FILE.getValue().equals(e.getFieldShowType())).collect(Collectors.toList()); - List fieldFieldList = onlFieldFileList.stream().map(LawsTag::getDbFieldName).collect(Collectors.toList()); - // 日期类型字段(单日期选择) - List onlFieldDateList = fieldListSelect.stream().filter(e -> FieldTypeEnum.DATE_SINGLE.getValue().equals(e.getFieldShowType())).collect(Collectors.toList()); - List fieldDateList = onlFieldDateList.stream().map(LawsTag::getDbFieldName).collect(Collectors.toList()); - // 人员选择类型 - List onlFieldPersonList = fieldListSelect.stream().filter(e -> FieldTypeEnum.PERSON.getValue().equals(e.getFieldShowType())).collect(Collectors.toList()); - List fieldPersonList = onlFieldPersonList.stream().map(LawsTag::getDbFieldName).collect(Collectors.toList()); - // 标准选择类型 - List onlFieldStanList = fieldListSelect.stream().filter(e -> FieldTypeEnum.STANDARD.getValue().equals(e.getFieldShowType())).collect(Collectors.toList()); - List fieldStanList = onlFieldStanList.stream().map(LawsTag::getDbFieldName).collect(Collectors.toList()); - - List fieldPersonIdList = new ArrayList<>(); - fieldPersonList.forEach(item->{ - String fieldPersonId = item + "_id"; - fieldPersonIdList.add(fieldPersonId); - }); - List standardIdList = new ArrayList<>(); - fieldStanList.forEach(item->{ - String fieldStanId = item + "_id"; - standardIdList.add(fieldStanId); - }); - for (Map.Entry entry : parameter.entrySet()) { - String key = entry.getKey(); - Object value = entry.getValue(); - // 处理日期,文件,人员选择类型的字段 - //处理日期格式 - if (fieldDateList.contains(key) && ("create_time".equals(key) || "update_time".equals(key))) { - if (ObjectUtils.isNotEmpty(value)) { - if(value.toString().equals("") || value.toString().equals("null")){ - continue; - } - value = "str_to_date('" + value + "','%Y-%m-%d')"; - } else { - value = null; - } - valuesBuilder.append("," + value); - } else if (fieldFieldList.contains(key)) { - //处理文件类型 - if (ObjectUtils.isNotEmpty(value)) { - if("add".equals(type) || "import".equals(type)) { - String valueTemp = UUID.randomUUID().toString().replace("-", ""); - //修改文件表关联信息connect_id - List oSSFileList = new ArrayList<>(); - for (String fileId : value.toString().split(",")) { - OSSFile ossFile = new OSSFile(); - ossFile.setId(fileId); - ossFile.setConnectId(valueTemp); - oSSFileList.add(ossFile); - } - ossFileService.updateFileInfo(oSSFileList); - valuesBuilder.append("," + "'" + valueTemp + "'"); - } else if("set".equals(type) || "merge".equals(type) ||"copy".equals(type)){ - valuesBuilder.append("," + "'" + value + "'"); - } else if("update".equals(type)){ - // 前端标识 key_flag 0-未修改, 1-已修改 - if(value.toString().contains(",")){ // 新加了多个文件 - String valueTemp = UUID.randomUUID().toString().replace("-", ""); - //修改文件表关联信息connect_id - List oSSFileList = new ArrayList<>(); - for (String fileId : value.toString().split(",")) { - OSSFile ossFile = new OSSFile(); - ossFile.setId(fileId); - ossFile.setConnectId(valueTemp); - oSSFileList.add(ossFile); - } - ossFileService.updateFileInfo(oSSFileList); - valuesBuilder.append("," + "'" + valueTemp + "'"); - } else { - List ossFiles = ossFileService.getFileInfosByConnectId(value.toString()); - if(CollectionUtil.isNotEmpty(ossFiles)){ // 没有修改文件 - valuesBuilder.append("," + "'" + value + "'"); - } else { // 新加了一个文件 - String valueTemp = UUID.randomUUID().toString().replace("-", ""); - //修改文件表关联信息connect_id - List oSSFileList = new ArrayList<>(); - for (String fileId : value.toString().split(",")) { - OSSFile ossFile = new OSSFile(); - ossFile.setId(fileId); - ossFile.setConnectId(valueTemp); - oSSFileList.add(ossFile); - } - ossFileService.updateFileInfo(oSSFileList); - valuesBuilder.append("," + "'" + valueTemp + "'"); - } - } - - } - } else { - valuesBuilder.append("," + "'" + value + "'"); - } - } else if(fieldPersonList.contains(key)){ // || fieldStanList.contains(key) - // 人员选择类型 标准选择类型 - if(ObjectUtil.isNotNull(parameter.get(key+"_id"))) { - value = parameter.get(key + "_id"); - } - valuesBuilder.append("," + "'" + value + "'"); - } else if(fieldPersonIdList.contains(key) || standardIdList.contains(key)){ - continue; - } else { - if ("item_content".equals(key)) { - value = value.toString().replaceAll("\\\\", "\\\\\\\\").replaceAll("'", "\\\\'"); - } - valuesBuilder.append("," + "'" + value + "'"); - } - - fieldsBuilder.append("," + key); - }*/ +// // 查询全部字段列表 +// List fieldList = lawsCommonMapper.getFieldList(TableNameEnum.DOCUMENT_SPLIT.getTableName()); +// // 列表展示字段 +// List fieldListSelect = fieldList.stream().filter(v -> YesOrNoEnum.YES.getValue() +// .equals(String.valueOf(v.getIsShowList()))).collect(Collectors.toList()); +// +// // 查询全部字段属性 +//// List fieldList = onlCgformFieldService.getFieldList(ModuleEnum.FILE_SPLIT_ITEMS.getValue()); +// // 文件类型字段 +// List onlFieldFileList = fieldListSelect.stream().filter(e -> FieldTypeEnum.FILE.getValue().equals(e.getFieldShowType())).collect(Collectors.toList()); +// List fieldFieldList = onlFieldFileList.stream().map(LawsTag::getDbFieldName).collect(Collectors.toList()); +// // 日期类型字段(单日期选择) +// List onlFieldDateList = fieldListSelect.stream().filter(e -> FieldTypeEnum.DATE_SINGLE.getValue().equals(e.getFieldShowType())).collect(Collectors.toList()); +// List fieldDateList = onlFieldDateList.stream().map(LawsTag::getDbFieldName).collect(Collectors.toList()); +// // 人员选择类型 +// List onlFieldPersonList = fieldListSelect.stream().filter(e -> FieldTypeEnum.PERSON.getValue().equals(e.getFieldShowType())).collect(Collectors.toList()); +// List fieldPersonList = onlFieldPersonList.stream().map(LawsTag::getDbFieldName).collect(Collectors.toList()); +// // 标准选择类型 +// List onlFieldStanList = fieldListSelect.stream().filter(e -> FieldTypeEnum.STANDARD.getValue().equals(e.getFieldShowType())).collect(Collectors.toList()); +// List fieldStanList = onlFieldStanList.stream().map(LawsTag::getDbFieldName).collect(Collectors.toList()); +// +// List fieldPersonIdList = new ArrayList<>(); +// fieldPersonList.forEach(item->{ +// String fieldPersonId = item + "_id"; +// fieldPersonIdList.add(fieldPersonId); +// }); +// List standardIdList = new ArrayList<>(); +// fieldStanList.forEach(item->{ +// String fieldStanId = item + "_id"; +// standardIdList.add(fieldStanId); +// }); +// for (Map.Entry entry : parameter.entrySet()) { +// String key = entry.getKey(); +// Object value = entry.getValue(); +// // 处理日期,文件,人员选择类型的字段 +// //处理日期格式 +// if (fieldDateList.contains(key) && ("create_time".equals(key) || "update_time".equals(key))) { +// if (ObjectUtils.isNotEmpty(value)) { +// if(value.toString().equals("") || value.toString().equals("null")){ +// continue; +// } +// value = "str_to_date('" + value + "','%Y-%m-%d')"; +// } else { +// value = null; +// } +// valuesBuilder.append("," + value); +// } else if (fieldFieldList.contains(key)) { +// //处理文件类型 +// if (ObjectUtils.isNotEmpty(value)) { +// if("add".equals(type) || "import".equals(type)) { +// String valueTemp = UUID.randomUUID().toString().replace("-", ""); +// //修改文件表关联信息connect_id +// List oSSFileList = new ArrayList<>(); +// for (String fileId : value.toString().split(",")) { +// OSSFile ossFile = new OSSFile(); +// ossFile.setId(fileId); +// ossFile.setConnectId(valueTemp); +// oSSFileList.add(ossFile); +// } +// ossFileService.updateFileInfo(oSSFileList); +// valuesBuilder.append("," + "'" + valueTemp + "'"); +// } else if("set".equals(type) || "merge".equals(type) ||"copy".equals(type)){ +// valuesBuilder.append("," + "'" + value + "'"); +// } else if("update".equals(type)){ +// // 前端标识 key_flag 0-未修改, 1-已修改 +// if(value.toString().contains(",")){ // 新加了多个文件 +// String valueTemp = UUID.randomUUID().toString().replace("-", ""); +// //修改文件表关联信息connect_id +// List oSSFileList = new ArrayList<>(); +// for (String fileId : value.toString().split(",")) { +// OSSFile ossFile = new OSSFile(); +// ossFile.setId(fileId); +// ossFile.setConnectId(valueTemp); +// oSSFileList.add(ossFile); +// } +// ossFileService.updateFileInfo(oSSFileList); +// valuesBuilder.append("," + "'" + valueTemp + "'"); +// } else { +// List ossFiles = ossFileService.getFileInfosByConnectId(value.toString()); +// if(CollectionUtil.isNotEmpty(ossFiles)){ // 没有修改文件 +// valuesBuilder.append("," + "'" + value + "'"); +// } else { // 新加了一个文件 +// String valueTemp = UUID.randomUUID().toString().replace("-", ""); +// //修改文件表关联信息connect_id +// List oSSFileList = new ArrayList<>(); +// for (String fileId : value.toString().split(",")) { +// OSSFile ossFile = new OSSFile(); +// ossFile.setId(fileId); +// ossFile.setConnectId(valueTemp); +// oSSFileList.add(ossFile); +// } +// ossFileService.updateFileInfo(oSSFileList); +// valuesBuilder.append("," + "'" + valueTemp + "'"); +// } +// } +// +// } +// } else { +// valuesBuilder.append("," + "'" + value + "'"); +// } +// } else if(fieldPersonList.contains(key)){ // || fieldStanList.contains(key) +// // 人员选择类型 标准选择类型 +// if(ObjectUtil.isNotNull(parameter.get(key+"_id"))) { +// value = parameter.get(key + "_id"); +// } +// valuesBuilder.append("," + "'" + value + "'"); +// } else if(fieldPersonIdList.contains(key) || standardIdList.contains(key)){ +// continue; +// } else { +// if ("item_content".equals(key)) { +// value = value.toString().replaceAll("\\\\", "\\\\\\\\").replaceAll("'", "\\\\'"); +// } +// valuesBuilder.append("," + "'" + value + "'"); +// } +// +// fieldsBuilder.append("," + key); +// } String mustFields = "id,create_by,create_time,update_by,update_time,sys_org_code"; // String idTemp = UUID.randomUUID().toString().replace("-", ""); String mustValues = getMustValues(id); @@ -1121,6 +1155,1742 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl importSplitItemsData(List> list, + String menuId, + String filepath, + String infoId, + String cut, + List getSheetTableList) { + //此处需要做各种验证,数据库操作 + try { + // 查询全部字段列表 +// List fieldLists = lawsCommonMapper.getFieldList(TableNameEnum.DOCUMENT_SPLIT.getTableName()); + List fieldLists = new ArrayList<>(); + // 列表展示字段 + List fieldListSelect = fieldLists.stream().filter(v -> YesOrNoEnum.YES.getValue() + .equals(String.valueOf(v.getIsShowList()))).collect(Collectors.toList()); +// List onlCgformFieldList = onlCgformFieldService.getFieldList(ModuleEnum.FILE_SPLIT_ITEMS.getValue()); + // 树形数据字典 dictId + List dictIdList = fieldListSelect.stream() + .filter(e -> (YesOrNoEnum.YES.getValue().equals(String.valueOf(e.getIsShowForm())) + || "条文内容".equals(e.getDbFieldName())) + && FieldTypeEnum.TREE.getValue().equals(e.getFieldShowType()) + && StringUtils.isNotBlank(e.getDictId()) + ) + .map(LawsTag :: getDictId) + .distinct() + .collect(Collectors.toList()); + // 普通数据字典 dictCode + List dictCodeList = fieldListSelect.stream() + .filter(e -> (YesOrNoEnum.YES.getValue().equals(String.valueOf(e.getIsShowForm())) + || "条文内容".equals(e.getDbFieldName())) + && (FieldTypeEnum.PULL_SINGLE.getValue().equals(e.getFieldShowType()) || FieldTypeEnum.PULL_MORE.getValue().equals(e.getFieldShowType())) + && StringUtils.isNotBlank(e.getDictField()) + ) + .map(LawsTag :: getDictField) + .distinct() + .collect(Collectors.toList()); + + // 树形数据字典 + List categoryList = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(dictIdList)){ + LambdaQueryWrapper categoryWrapper = new LambdaQueryWrapper<>(); + categoryWrapper.in(CollectionUtil.isNotEmpty(dictIdList), SysCategory::getSysDictId, dictIdList); + categoryList = sysCategoryService.list(categoryWrapper); + } + + // 普通数据字典 + List dictItemList = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(dictCodeList)) { + for (String dictCode : dictCodeList) { + List dictItems = sysDictItemServiceImpl.selectItemsByDictCode(dictCode); + dictItemList.addAll(dictItems); + } + } + + // 表头 + List> fieldList = getImportOnlField(ModuleEnum.FILE_SPLIT_ITEMS.getValue(),cut); + //验证导入数据是否符合规则 + Map map = validateImportDatas(list,categoryList,dictItemList,fieldList,filepath,cut); + boolean isOk = (boolean) map.get("result"); + if (!isOk) { + //验证没有通过 + String message = (String) map.get("message"); + return Result.error(message); + } + //将导入数据循环合并整理后 新增至相应表 + list = (List>) map.get("resultList"); + int countSuccess = 0; + // 最终添加的数据 + List> addItemsEOList = new ArrayList<>(); + int itemNum = 0; + for (Map importDto : list) { + //判断此行数据是否全部为空,是则不读取 + if(checkObjAllFieldsIsNull(importDto)){ + continue; + } + String importDtoId = UUID.randomUUID().toString().replace("-", ""); + importDto.put("id", importDtoId); // 记得去掉 + importDto.put("info_id", infoId); + List addItemValList = new ArrayList<>(); + if (addItemsEOList != null && !addItemsEOList.isEmpty()) { + Map oldItems = addItemsEOList.get(addItemsEOList.size()-1); + if (itemNum > 0 && importDto.get("item_num").equals(oldItems.get("item_num")) + && importDto.get("item_title").equals(oldItems.get("item_title"))) { + if(ObjectUtil.isEmpty(importDto.get("item_content"))){ + continue; + } + addItemValList = (List) oldItems.get("itemValEOList"); + String itemContent = oldItems.get("item_content").toString() + importDto.get("item_content").toString(); + oldItems.put("item_content", itemContent); + String[] valArr = importDto.get("item_content").toString().split("\n"); + if (valArr != null && valArr.length > 0) { + for (int i=0;i nowfilelist = FileUnZip.readFileByFilename(filepath, valArr[i]); + if (nowfilelist != null && !nowfilelist.isEmpty()) { + String url = nowfilelist.get(0).getPath(); + MultipartFile multipartFile = createMfileByPath(url); + String state = "0"; +// String fileSuffix = url.substring(url.lastIndexOf(".")); +// String fileTypeStr = ".doc,.DOC,.docx,.DOCX,.xls, .XLS,.xlsx,.XLSX,.pdf,.PDF"; +// if (fileTypeStr.contains(fileSuffix)) { +// state = "1"; +// } + OSSFile oSSFile = ossFileService.uploadLocalForSplit(multipartFile, "",state,null); + if(oSSFile!=null){ +// oSSFile = ossFileService.getById(oSSFile.getId()); + isText = false; + +// BASE64Encoder base64Encoder = new BASE64Encoder(); +// String encode = base64Encoder.encode(oSSFile.getUrl().getBytes(StandardCharsets.UTF_8)); + String path = oSSFile.getUrl(); +// String path = imgpath + oSSFile.getUrl().substring(oSSFile.getUrl().lastIndexOf(File.separator)+1); +// String imgCon = ""; + valEO.setType("IMG"); +// valEO.setItemContent(imgCon); + valEO.setItemContent(path); + } + } + if (isText) { + valEO.setType("TEXT"); + valEO.setItemContent(valArr[i]); + } + addItemValList.add(valEO); + } + } + oldItems.put("itemValEOList", addItemValList); + }else { + if(ObjectUtil.isNotEmpty(importDto.get("item_content"))) { + String[] valArr = importDto.get("item_content").toString().split("\n"); + if (valArr != null && valArr.length > 0) { + for (int i = 0; i < valArr.length; i++) { + SarFileSplitItemsValEO valEO = new SarFileSplitItemsValEO(); + boolean isText = true; + if (getSheetTableList != null && !getSheetTableList.isEmpty()) { + for (SplitTableInfo splitTableInfo : getSheetTableList) { + if (splitTableInfo.getTableName().equals(valArr[i])) { + isText = false; + valEO.setType("TABLE"); + valEO.setItemContent(splitTableInfo.getTableHtml()); + } + } + } + List nowfilelist = FileUnZip.readFileByFilename(filepath, valArr[i]); + if (nowfilelist != null && !nowfilelist.isEmpty()) { + String url = nowfilelist.get(0).getPath(); + MultipartFile multipartFile = createMfileByPath(url); + String state = "0"; +// String fileSuffix = url.substring(url.lastIndexOf(".")); +// String fileTypeStr = ".doc,.DOC,.docx,.DOCX,.xls, .XLS,.xlsx,.XLSX,.pdf,.PDF"; +// if (fileTypeStr.contains(fileSuffix)) { +// state = "1"; +// } +// OSSFile oSSFile = ossFileService.uploadLocalOfCos(multipartFile, "", state,null); + OSSFile oSSFile = ossFileService.uploadLocalForSplit(multipartFile, "",state,null); +// oSSFile = ossFileService.getById(oSSFile.getId()); + if (oSSFile != null) { +// oSSFile = ossFileService.getById(oSSFile.getId()); + isText = false; + +// BASE64Encoder base64Encoder = new BASE64Encoder(); +// String encode = base64Encoder.encode(oSSFile.getUrl().getBytes(StandardCharsets.UTF_8)); + String path = oSSFile.getUrl(); +// String path = imgpath + oSSFile.getUrl().substring(oSSFile.getUrl().lastIndexOf(File.separator)+1); +// String imgCon = ""; + valEO.setType("IMG"); +// valEO.setItemContent(imgCon); + valEO.setItemContent(path); + } + } + if (isText) { + valEO.setType("TEXT"); + valEO.setItemContent(valArr[i]); + } + addItemValList.add(valEO); + } + } + importDto.put("itemValEOList", addItemValList); + } + addItemsEOList.add(importDto); + } + } else { + if(ObjectUtil.isNotEmpty(importDto.get("item_content"))) { + String[] valArr = importDto.get("item_content").toString().split("\n"); + if (valArr != null && valArr.length > 0) { + for (int i = 0; i < valArr.length; i++) { + SarFileSplitItemsValEO valEO = new SarFileSplitItemsValEO(); + boolean isText = true; + if (getSheetTableList != null && !getSheetTableList.isEmpty()) { + for (SplitTableInfo splitTableInfo : getSheetTableList) { + if (splitTableInfo.getTableName().equals(valArr[i])) { + isText = false; + valEO.setType("TABLE"); + valEO.setItemContent(splitTableInfo.getTableHtml()); + } + } + } + List nowfilelist = FileUnZip.readFileByFilename(filepath, valArr[i]); + if (nowfilelist != null && !nowfilelist.isEmpty()) { + String url = nowfilelist.get(0).getPath(); + MultipartFile multipartFile = createMfileByPath(url); + String state = "0"; +// OSSFile oSSFile = ossFileService.uploadLocalOfCos(multipartFile, "", state,null); + OSSFile oSSFile = ossFileService.uploadLocalForSplit(multipartFile, "",state,null); +// oSSFile = ossFileService.getById(oSSFile.getId()); + if (oSSFile != null) { + isText = false; + +// BASE64Encoder base64Encoder = new BASE64Encoder(); +// String encode = base64Encoder.encode(oSSFile.getUrl().getBytes(StandardCharsets.UTF_8)); + String path = oSSFile.getUrl(); +// String path = imgpath + oSSFile.getUrl().substring(oSSFile.getUrl().lastIndexOf(File.separator)+1); +// String imgCon = ""; + valEO.setType("IMG"); +// valEO.setItemContent(imgCon); + valEO.setItemContent(path); + } + } + if (isText) { + valEO.setType("TEXT"); + valEO.setItemContent(valArr[i]); + } + addItemValList.add(valEO); + } + } + importDto.put("itemValEOList", addItemValList); + } + addItemsEOList.add(importDto); + } + itemNum++; + } + //TODO 创建树结构 + Long treeListDisplay = 1L; + //获取导入数据一级节点级数 + int levelNum = 0; + SarFileSplitMenuEO targetMenuEO = sarFileSplitMenuEOMapper.selectByPrimaryKey(menuId); + if(targetMenuEO != null){ + //判断导入节点是否有子节点 + int childrenCount = sarFileSplitMenuEOMapper.getChildrenCountByParentId(menuId); + if(childrenCount > 1){ + //获取导入节点的下一级最后一个子节点的序号 + treeListDisplay = Long.valueOf(sarFileSplitMenuEOMapper.getMaxDisplayByidNextLevel(menuId)); + }else{ + //当导入节点没有子节点时,获取当前节点的序号 + treeListDisplay = targetMenuEO.getDisplaySeq(); + } + +// if(!"总目录".equals(targetMenuEO.getName())){ +// String regex = "^[0-9]{0}([0-9]|[.])+$"; //TODO 待优化:数字和点必须交替 +// if(!targetMenuEO.getName().matches(regex)){ +// throw new AdcDaBaseException("所选目录命名不规范"); +// } +// String[] str = targetMenuEO.getName().split("."); +// if(str.length == 0){ +// levelNum = 2; +// }else { +// levelNum = str.length + 1; +// } +// }else{ +// levelNum = 1; +// } + } + + //获取导入数据的所有一级节点 + int finalLevelNum = levelNum; + /*List itemNumList = new ArrayList<>(); + for(SarFileSplitItemsEO sarFileSplitItemsEO : addItemsEOList){ + String[] str = sarFileSplitItemsEO.getItemsNum().split("."); + if(str.length == finalLevelNum){ + itemNumList.add(sarFileSplitItemsEO); + } + }*/ + // 2022-03-31 注释 +// List itemNumList = addItemsEOList.stream() +// .filter(e->e.getItemsNum().split("\\.").length == finalLevelNum || e.getItemsNum().contains("附录")) +// .collect(Collectors.toList()); + //构造目录树 + HashMap menuAndItemMap = new HashMap<>(); +// if(CollectionUtils.isNotEmpty(itemNumList)) { + List> itemsEOList = new ArrayList<>(addItemsEOList); + List treeList = buildTree(itemsEOList, treeListDisplay, menuId); + + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = sysUser.getId(); + for (SarFileSplitMenuTreeNode treeNode : treeList) { + menuAndItemMap.put(treeNode.getItemId(), treeNode.getId()); + } +// }else{ +// throw new AdcDaBaseException("导入目录命名不规范"); +// } + //添加条款 + for (Map itemsEO : addItemsEOList) { + if(menuAndItemMap.get(itemsEO.get("id")) != null) { + createItemsInfo(itemsEO, menuAndItemMap.get((String)itemsEO.get("id")), infoId); + } + countSuccess++; + } + //导入之后的节点(包括子节点),序号加一 + SarFileSplitMenuEOPage page = new SarFileSplitMenuEOPage(); + page.setInfoId(targetMenuEO.getInfoId()); + page.setValidFlag("0"); + page.setOrderBy("display_seq asc"); + List getList = sarFileSplitMenuEOMapper.queryByList(page); + if (getList != null && !getList.isEmpty()) { + //除去导入节点 + for(SarFileSplitMenuEO menu : getList){ + if(menuAndItemMap.containsValue(menu.getId())){ + continue; + } + if(targetMenuEO.getId().equals(menu.getId())){ + continue; + } + Long oldSeq = menu.getDisplaySeq(); + if (oldSeq > treeListDisplay) { + menu.setDisplaySeq(oldSeq + countSuccess); + sarFileSplitMenuEOMapper.updateByPrimaryKeySelective(menu); + } + } + } + for (SarFileSplitMenuTreeNode treeNode : treeList) { + //创建菜单 + SarFileSplitMenuEO sarFileSplitMenuEO = new SarFileSplitMenuEO(); + sarFileSplitMenuEO.setId(treeNode.getId()); + sarFileSplitMenuEO.setInfoId(infoId); + sarFileSplitMenuEO.setName(treeNode.getName()); + sarFileSplitMenuEO.setItemName(treeNode.getItemName()); + sarFileSplitMenuEO.setPId(treeNode.getParentId()); + sarFileSplitMenuEO.setDisplaySeq(treeNode.getOrderNum()); + sarFileSplitMenuEO.setCreationUser(userId); + sarFileSplitMenuEO.setModifyUser(userId); + sarFileSplitMenuEO.setValidFlag(0); + sarFileSplitMenuEO.setCreationTime(new Date()); + sarFileSplitMenuEO.setModifyTime(new Date()); + sarFileSplitMenuEOMapper.insertSelective(sarFileSplitMenuEO); + } + String msg = ""; + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + msg = "成功导入" + countSuccess + "条"; + } else { + msg = "import " + countSuccess + " datas successfully"; + } + return Result.OK( msg, null); + } catch (Exception e) { + log.error(e.getMessage(),e); + String msg = ""; + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + msg = "导入失败"; + } else { + msg = "import failed"; + } + return Result.error(1,msg); + } + } + + @Override + public Result importSplitItems(MultipartFile file, String cut, String menuId, String infoId) throws IOException { + // 水平越权 + documentSplitService.isHorizontalOverstep(infoId); + + //验证文件名是否合格 + /* 截取后缀名 */ + int pos = file.getOriginalFilename().lastIndexOf("."); + String str = file.getOriginalFilename().substring(pos+1).toLowerCase(); + String filenameorg = file.getOriginalFilename().substring(0,pos); + String resultMsg = ""; + //判断上传文件必须是zip + // TODO 允许导入rar + if (!str.equals("zip")) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + resultMsg = "请上传zip文件"; + }else{ + resultMsg = "Please upload a zip file"; + } + return Result.error(resultMsg); + } + String path = uploadpath + File.separator + "modal" + File.separator + filenameorg + System.currentTimeMillis(); + File saveDirectory = new File(path); + if(!saveDirectory.isDirectory()){ + saveDirectory.mkdir(); + } + FileUtils.copyInputStreamToFile(file.getInputStream(), new File(path +File.separator+ file.getOriginalFilename())); + try{ + //解压缩 + String zipEntryName = FileUnZip.unZipFiles2(path +File.separator+ file.getOriginalFilename(), path); + // 数据相关处理, + // 1.获取其中的Excel, + List excelfilelist = FileUnZip.readExcelFile(zipEntryName); + if(excelfilelist.size()<1){ + //删除原上传文件 + FileUnZip.deleteDir(saveDirectory); + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + resultMsg = "压缩包内没有上传Excel数据"; + }else{ + resultMsg = "In the cabinet did not upload the Excel data"; + } + return Result.error(1, resultMsg); + + } else if (excelfilelist.size()>1) { + //删除原上传文件 + FileUnZip.deleteDir(saveDirectory); + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + resultMsg = "压缩包根目录下仅能存在一个excel为导入数据"; + }else{ + resultMsg = "Only one Excel file can be imported in the compressed package root directory"; + } + return Result.error(1, resultMsg); + } + File excelfile = excelfilelist.get(0); + + try { + // 导入表头 + String fields[] = getWorkbookTitleForExport(cut); // 有顺序 + + List> result = new ArrayList<>(); + String dbfields = getFieldForExport(); + List dbfieldList = Arrays.asList(dbfields.split(",")); // 有顺序 + // 解析excel,并返回校验信息 + result = read(excelfile, dbfieldList,fields,cut); + Long getExcelInfo = System.currentTimeMillis(); + //excel读取到的数据 + List> datas = result; + if(datas!=null &&!datas.isEmpty()){ + try { + //获取全部sheet页中表格 + XSSFWorkbook workbook=new XSSFWorkbook(new FileInputStream(excelfile)); + XSSFSheet sheet=null; + List getSheetTableList = new ArrayList(); + for (int i = 1; i < workbook.getNumberOfSheets(); i++) {//获取每个Sheet表 + sheet = workbook.getSheetAt(i); + SplitTableInfo splitTableInfo = new SplitTableInfo(); + splitTableInfo.setTableName(sheet.getSheetName()); + String tableHtml = POIReadExcelToHtml.readExcelToHtml(workbook,i,false); + tableHtml = tableHtml.replaceAll("\'","\""); + tableHtml = tableHtml.replaceAll("style","border=\"1\" style");// 解决导入的表格没线 + splitTableInfo.setTableHtml(tableHtml); + getSheetTableList.add(splitTableInfo); + } + int i = 0 ; + List> datasUpdate = new ArrayList<>(); + //2019.05.14 当读取exceL出现空行过多时,空行数为20以上时中断读取,将数据清洗为新的list + for(Map sarStandImportDto :datas){ + if(i>20){ + break; + } + //判断此行数据是否全部为空 + if(checkObjAllFieldsIsNull(sarStandImportDto)){ + i++; + //是则不读取 + continue; + } + i = 0; + datasUpdate.add(sarStandImportDto); + } + String unzipfilepath = zipEntryName; + Result message = importSplitItemsData(datasUpdate,menuId,unzipfilepath,infoId,cut,getSheetTableList); + //删除原上传文件 + FileUnZip.deleteDir(saveDirectory); + return message; + } catch (NullPointerException e){ + //删除原上传文件 + FileUnZip.deleteDir(saveDirectory); + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + resultMsg = "读取失败,请严格按照模板文件导入数据"; + }else{ + resultMsg = "The data fails to be read. Import data strictly according to the template file"; + } + return Result.error(1, resultMsg); + }catch (Exception e) { + //删除原上传文件 + FileUnZip.deleteDir(saveDirectory); + return Result.error(e.getMessage()); + } + }else{ + //删除原上传文件 + FileUnZip.deleteDir(saveDirectory); + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + resultMsg = "没有可导入的数据,请检查!"; + }else{ + resultMsg = "No data to import, please check"; + } + return Result.error(1, resultMsg); + } + } catch (NoSuchElementException e){ + FileUnZip.deleteDir(saveDirectory); + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + resultMsg = "没有可导入的数据,请检查!"; + }else{ + resultMsg = "No data to import, please check"; + } + return Result.error(1, resultMsg); + } catch (JeroBootException e){ + FileUnZip.deleteDir(saveDirectory); + return Result.error(1, e.getMessage()); + } catch (Exception e) { + //删除原上传文件 + FileUnZip.deleteDir(saveDirectory); + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + resultMsg = "读取失败,请严格按照模板文件导入数据"; + }else{ + resultMsg = "The data fails to be read. Import data strictly according to the template file"; + } + return Result.error(1, resultMsg); + } + } catch (Exception e) { + //删除原上传文件 + FileUnZip.deleteDir(saveDirectory); + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + resultMsg = "读取失败,请严格按照模板文件导入数据"; + }else{ + resultMsg = "The data fails to be read. Import data strictly according to the template file"; + } + return Result.error(1, resultMsg); + } + } + + @Override + public Result importSplitResult(String splitFileId, String cut, SarFileSplitInfoEO sarFileSplitInfoEO) throws IOException { + // 企标权限校验 + documentSplitService.enterpriseCheck(sarFileSplitInfoEO); + // 唯一校验 + documentSplitService.uniqueCheck(sarFileSplitInfoEO); + +// MultipartFile mFile = createMfileByPath(url); + + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + Date now = new Date(); + String infoId = UUID.randomUUID().toString().replace("-", ""); + sarFileSplitInfoEO.setId(infoId); + sarFileSplitInfoEO.setSplitResult("成功"); + sarFileSplitInfoEO.setSplitStatus(SplitEnum.SPLIT_STATUS1.getValue()); + sarFileSplitInfoEO.setAuthor(sysUser.getId()); + sarFileSplitInfoEO.setCreateTime(now); + sarFileSplitInfoEO.setUpdateTime(now); + sarFileSplitInfoService.save(sarFileSplitInfoEO); + +// // 新增拆分记录 +// Date now = new Date(); +// String infoId = UUID.randomUUID().toString().replace("-", ""); +// sarFileSplitInfoEO.setId(infoId); +// sarFileSplitInfoEO.setSplitResult("成功"); +// sarFileSplitInfoEO.setCreateTime(now); +// sarFileSplitInfoEO.setUpdateTime(now); +// sarFileSplitInfoService.save(sarFileSplitInfoEO); + + // 添加条款总目录 + SarFileSplitMenuEO sarFileSplitMenuEO = new SarFileSplitMenuEO(); + String menuId = UUID.randomUUID().toString().replace("-", ""); + sarFileSplitMenuEO.setName("总目录"); + sarFileSplitMenuEO.setInfoId(infoId); + sarFileSplitMenuEO.setDisplaySeq(1L); + sarFileSplitMenuEO.setId(menuId); + sarFileSplitMenuEO.setValidFlag(0); + sarFileSplitMenuEO.setCreationTime(new Date()); + sarFileSplitMenuEO.setModifyTime(new Date()); + sarFileSplitMenuEOMapper.insertSelective(sarFileSplitMenuEO); + + // 导入文件 + OSSFile ossFile = ossFileService.getById(splitFileId); + String url = ossFile.getUrl(); + if (!MinioUtil.doesObjectExist(url)) { + if (MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + throw new JeroBootException("导入的压缩包不存在!"); + } else { + throw new JeroBootException("Importing a compressed package that does not exist!"); + } + } + MultipartFile mFile = null; + try (InputStream inputStream = MinioUtil.download(url);) { + String fileName = url.substring((url.lastIndexOf("/") + 1)); + mFile = new MockMultipartFile(fileName, fileName, ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream); + } catch (IOException e) { + e.printStackTrace(); + log.error(e.getMessage(), e); + } + Result result = importSplitItems(mFile, cut, menuId, infoId); + + if(!result.isSuccess()){ + sarFileSplitInfoService.deleteById(infoId); + } + return result; + } + + private MultipartFile createMfileByPath(String path) { + MultipartFile mFile = null; + try { + File file = new File(path); + FileInputStream fileInputStream = new FileInputStream(file); + + String fileName = file.getName(); + fileName = fileName.substring((fileName.lastIndexOf(File.separator) + 1)); + mFile = new MockMultipartFile(fileName, fileName, ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream); + } catch (Exception e) { + log.error("封装文件出现错误:{}", e); + //e.printStackTrace(); + } + return mFile; + } + + private List> read(File file, List dbfieldList, String[] titles, String cut) throws Exception { + + //最终返回数据 + List> list = new ArrayList<>(); + + Workbook workbook = null; + InputStream is = new FileInputStream(file); + String name = file.getName().toLowerCase(); + // 创建excel操作对象 + if (name.contains(".xlsx")) { + workbook = WorkbookFactory.create(is); + } else { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + throw new JeroBootException("请导入正确模板!"); + } else { + throw new JeroBootException("Please import the correct template"); + } + } + //得到一个工作表 + Sheet sheet = workbook.getSheetAt(0); + + //获得数据的总行数 + int totalRowNum = sheet.getLastRowNum(); + + //获得总列数 + int cellLength = sheet.getRow(0).getPhysicalNumberOfCells(); + // 验证模板表头是否正确 + Row rowTitle = sheet.getRow(0); +// for (int i = 0; i < cellLength; i++) { +// if (rowTitle != null) { +// Cell cell = rowTitle.getCell(i); +// if(ObjectUtil.isNotNull(cell)){ +// //设置单元格类型 +// cell.setCellType(CellType.STRING); +// String cellValue = cell.getStringCellValue().substring(cell.getStringCellValue().indexOf("*")+1); +// if(!cellValue.equals(titles[i])){ +// if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ +// throw new JeroBootException("请导入正确模板!"); +// } else { +// throw new JeroBootException("Please import the correct template"); +// } +// } +// } else{ +// if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ +// throw new JeroBootException("请导入正确模板!"); +// } else { +// throw new JeroBootException("Please import the correct template"); +// } +// } +// }else{ +// if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ +// throw new JeroBootException("请导入正确模板!"); +// } else { +// throw new JeroBootException("Please import the correct template"); +// } +// } +// } + Row rowDescription= sheet.getRow(1); + if (rowDescription != null) { + Cell cell = rowDescription.getCell(0); + if(ObjectUtil.isNotNull(cell)){ + //设置单元格类型 + cell.setCellType(CellType.STRING); + String cellValue = cell.getStringCellValue(); + if(!cellValue.contains("模版说明")){ + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + throw new JeroBootException("请导入正确模板!"); + } else { + throw new JeroBootException("Please import the correct template"); + } + } + } else{ + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + throw new JeroBootException("请导入正确模板!"); + } else { + throw new JeroBootException("Please import the correct template"); + } + } + }else{ + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + throw new JeroBootException("请导入正确模板!"); + } else { + throw new JeroBootException("Please import the correct template"); + } + } + + Map map = null; + //获得所有数据 + //从第3行开始获取,第一行是表头,第二行是填写说明 + for (int x = 2; x <= totalRowNum; x++) { + map = new HashMap(); + //获得第i行对象 + Row row= sheet.getRow(x); + //如果一行里的所有单元格都为空则不放进list里面 + int a = 0; + for (int y = 0; y < cellLength; y++) { + if (!(row == null)) { + Cell cell = row.getCell(y); // cell 为空时会抛空指针异常 + if(ObjectUtil.isNull(cell)) { + map.put(dbfieldList.get(y), ""); + continue; + } + String cellValue = null; + + if (!(CellType.NUMERIC == cell.getCellType() && HSSFDateUtil.isCellDateFormatted(cell))) { + //设置单元格类型 + cell.setCellType(CellType.STRING); + + } + boolean isMerge = isMergedRegion(sheet, row.getRowNum(), cell.getColumnIndex()); + //判断是否具有合并单元格 + if (isMerge) { + cellValue = getMergedRegionValue(sheet, row.getRowNum(), cell.getColumnIndex()); + } else { + if (CellType.NUMERIC == cell.getCellType() && HSSFDateUtil.isCellDateFormatted(cell)) { + // 获取日期类型的单元格的值 + Date d = cell.getDateCellValue(); + // 进行格式转换 + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + cellValue = df.format(d); + } else { + cellValue = cell.getStringCellValue(); + } + } + // + map.put(dbfieldList.get(y), cellValue); + if (map.get(dbfieldList.get(y)) == null || "".equals(map.get(dbfieldList.get(y)))) { + a++; + } + } + } + // 当前行所有单元格均不为空时 + if (a != cellLength && row != null) { + list.add(map); + } + } + return list; + } + + /** + * 获取合并单元格的值 + * + * @param sheet + * @param row + * @param column + * @return + */ + private String getMergedRegionValue(Sheet sheet, int row, int column) { + int sheetMergeCount = sheet.getNumMergedRegions(); + for (int i = 0; i < sheetMergeCount; i++) { + CellRangeAddress ca = sheet.getMergedRegion(i); + int firstColumn = ca.getFirstColumn(); + int lastColumn = ca.getLastColumn(); + int firstRow = ca.getFirstRow(); + int lastRow = ca.getLastRow(); + if (row >= firstRow && row <= lastRow) { + if (column >= firstColumn && column <= lastColumn) { + Row fRow = sheet.getRow(firstRow); + Cell fCell = fRow.getCell(firstColumn); + if (CellType.NUMERIC == fCell.getCellType() && HSSFDateUtil.isCellDateFormatted(fCell)) { + // 获取日期类型的单元格的值 + Date d = fCell.getDateCellValue(); + // 进行格式转换 + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + String cellValue = df.format(d); + return cellValue; + } else { + return getCellValue(fCell); + } + } + } + } + return null; + } + + + /** + * 判断指定的单元格是否是合并单元格 + * + * @param sheet + * @param row 行下标 + * @param column 列下标 + * @return + */ + private boolean isMergedRegion(Sheet sheet, int row, int column) { + int sheetMergeCount = sheet.getNumMergedRegions(); + for (int i = 0; i < sheetMergeCount; i++) { + CellRangeAddress range = sheet.getMergedRegion(i); + int firstColumn = range.getFirstColumn(); + int lastColumn = range.getLastColumn(); + int firstRow = range.getFirstRow(); + int lastRow = range.getLastRow(); + if (row >= firstRow && row <= lastRow) { + if (column >= firstColumn && column <= lastColumn) { + return true; + } + } + } + return false; + } + + private Map validateImportDatas(List> datas, + List categoryList, + List dictItemList, + List> fieldList, + String filepath, + String cut) throws Exception { + //树形数据字典 + List treeNameList = new ArrayList<>(); + //普通数据字典 + List itemNameList = new ArrayList<>(); + if (MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + treeNameList = categoryList.stream().map(SysCategory::getName).collect(Collectors.toList()); + itemNameList = dictItemList.stream().map(SysDictItem::getItemText).collect(Collectors.toList()); + } else if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.EN.getValue())){ + treeNameList = categoryList.stream().map(SysCategory::getEnName).collect(Collectors.toList()); + itemNameList = dictItemList.stream().map(SysDictItem::getEnName).collect(Collectors.toList()); + } + + //存放数据验证结果信息 + List stringMessage = new ArrayList<>(); + int i = 2; //记录行号 + int num = 0; //记录是第几条数据 + //循环验证数据 + for (Map dto : datas) { + i++; + int countError = 0; //记录失败数据数量 + String errorMsg = ""; + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + errorMsg = "第" + i + "行:"; + }else{ + errorMsg = i + " line:"; + } + for (Map.Entry entry : dto.entrySet()) { + + String key = entry.getKey(); + if (key.contains("*")) { + key = key.replace("*", ""); + } + String value = (String) entry.getValue(); + String field = ""; + for (Map map : fieldList) { + String fieldName = (String) map.get("db_field_txt");//中文名称/英文名称 + String dbfieldName = (String) map.get("db_field_name");//字段名 + String mustInput = (String) map.get("field_must_input");//是否必填 + String dbLength = map.get("db_length").toString();//字段长度 + String fieldShowType = (String) map.get("field_show_type");//字段类型 + + if (key.equals(dbfieldName)) { + field = dbfieldName; + //验证字段是否必填,长度,下拉框和树形的值是否匹配 + if (FieldTypeEnum.TREE.getValue().equals(fieldShowType)) { + //树形 + //判断是否必填 + if (IsMustEnum.YES.getValue().equals(mustInput) && StringUtils.isBlank(value)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + errorMsg += fieldName + "为必填项,不能为空;"; + }else{ + errorMsg += fieldName + " is mandatory and cannot be empty;"; + } + countError++; + } + //判断长度 + if (StringUtils.isNotBlank(value) && value.length() > Long.parseLong(dbLength)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "不能超过" + dbLength + "个字符;"; + } else { + errorMsg += fieldName + " can not be more than " + dbLength + " char;"; + } + countError++; + } + //判断数据是否匹配 + if (StringUtils.isNotBlank(value)) { + value = value.replace(",",","); + for (String valueTemp : value.split(",")) { + String lastValue = valueTemp; + if(valueTemp.contains("/")){ + lastValue = valueTemp.substring(valueTemp.lastIndexOf("/")+1); + } + if (!treeNameList.contains(lastValue)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "中的" + lastValue + "与数据字典不匹配;"; + } else { + errorMsg += fieldName +" "+ lastValue + " does not match the data dictionary;"; + } + countError++; + } + } + } + List valueIdList = new ArrayList<>(); + //文字转ID + if (StringUtils.isNotBlank(value)) { + value = value.replace(",",","); + for (String valueTemp : value.split(",")) { + String lastValue = valueTemp; + if(valueTemp.contains("/")){ + lastValue = valueTemp.substring(valueTemp.lastIndexOf("/")+1); + } + if (treeNameList.contains(lastValue)) { + List collect = new ArrayList<>(); + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + String finalLastValue = lastValue; + collect = categoryList.stream().filter(e -> e.getName().equals(finalLastValue)).collect(Collectors.toList()); + } else if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.EN.getValue())) { + String finalLastValue1 = lastValue; + collect = categoryList.stream().filter(e -> e.getEnName().equals(finalLastValue1)).collect(Collectors.toList()); + } + if (collect.size() != 0) { + if(collect.size() == 1){ + valueIdList.add(collect.get(0).getId()); + } else { + // TODO 查询子节点的所有父节点 + for(SysCategory sysCategory : collect){ + List nameList = sysCategoryService.getParentPath(sysCategory); + List targetNameList = Arrays.asList(valueTemp.split("/")); + if(nameList.size() == targetNameList.size() && targetNameList.containsAll(nameList)) { + valueIdList.add(sysCategory.getId()); + continue; + } + } + } + } + } + } + value = StringUtils.join(valueIdList, ","); + } + + } else if (FieldTypeEnum.TEXT.getValue().equals(fieldShowType)) { + //输入框 + //判断是否必填 + if (IsMustEnum.YES.getValue().equals(mustInput) && StringUtils.isBlank(value)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "为必填项,不能为空;"; + } else { + errorMsg += fieldName + " is mandatory and cannot be empty;"; + } + countError++; + } + //判断长度 + if (StringUtils.isNotBlank(value) && value.length() > Long.parseLong(dbLength)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "不能超过" + dbLength + "个字符;"; + } else { + errorMsg += fieldName + " can not be more than" + dbLength + "char;"; + } + countError++; + } + + } else if (FieldTypeEnum.TEXT.getValue().equals(fieldShowType)) { + //输入框(数字) + //判断是否必填 + if (IsMustEnum.YES.getValue().equals(mustInput) && StringUtils.isBlank(value)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "为必填项,不能为空;"; + } else { + errorMsg += fieldName + " is mandatory and cannot be empty;"; + } + countError++; + } + //正则判断仅能为 负号(-),小数点(.)和数字 + String regexNumber = "^(\\-|\\+)?\\d+(\\.\\d+)?$"; + if(StringUtils.isNotBlank(value) && !value.matches(regexNumber)){ + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "仅能为 负号(-),小数点(.)和数字;"; + + } else { + errorMsg += fieldName + " only as a minus sign ( - ), dot (. ) and numbers;"; + } + countError++; + } + + } else if (FieldTypeEnum.PULL_SINGLE.getValue().equals(fieldShowType)) { + //下拉单选 + //判断是否必填 + if (IsMustEnum.YES.getValue().equals(mustInput) && StringUtils.isBlank(value)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "为必填项,不能为空;"; + } else { + errorMsg += fieldName + " is mandatory and cannot be empty;"; + } + countError++; + } + //判断长度 + if (StringUtils.isNotBlank(value) && value.length() > Long.parseLong(dbLength)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "不能超过" + dbLength + "个字符;"; + } else { + errorMsg += fieldName + " can not be more than" + dbLength + "char;"; + } + countError++; + } + //判断是否是单选 + if (StringUtils.isNotBlank(value) && value.contains(",")) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "为单选项;"; + } else { + errorMsg += fieldName + " is single type;"; + } + countError++; + } + //判断数据是否匹配 + if (StringUtils.isNotBlank(value)) { + if (!itemNameList.contains(value)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "中的" + value + "与数据字典不匹配;"; + } else{ + errorMsg += fieldName + " " + value + " does not match the data dictionary"; + } + countError++; + } + } + //文字转数据字典编码 + if (itemNameList.contains(value)) { + String finalValue = value; + List collect = new ArrayList<>(); + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + collect = dictItemList.stream().filter(e -> StringUtils.isNotBlank(e.getItemText()) && e.getItemText().equals(finalValue)).collect(Collectors.toList()); + } else if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.EN.getValue())) { + collect = dictItemList.stream().filter(e -> StringUtils.isNotBlank(e.getEnName()) && e.getEnName().equals(finalValue)).collect(Collectors.toList()); + } + if (collect.size() != 0) { + value = collect.get(0).getItemValue(); + } + } + } else if (FieldTypeEnum.PULL_MORE.getValue().equals(fieldShowType)) { + //判断是否必填 + if (IsMustEnum.YES.getValue().equals(mustInput) && StringUtils.isBlank(value)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "为必填项,不能为空;"; + } else { + errorMsg += fieldName + " is mandatory and cannot be empty;"; + } + countError++; + } + //判断长度 + if (StringUtils.isNotBlank(value) && value.length() > Long.parseLong(dbLength)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "不能超过" + dbLength + "个字符;"; + } else { + errorMsg += fieldName + " can not be more than" + dbLength + "char;"; + } + countError++; + } + //下拉多选 + if (StringUtils.isNotBlank(value)) { + value = value.replace(",",","); + for (String valueTemp : value.split(",")) { + if (!itemNameList.contains(valueTemp)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "中的" + valueTemp + "与数据字典不匹配;"; + } else{ + errorMsg += fieldName + " " + valueTemp + " does not match the data dictionary"; + } + countError++; + } + } + } + + String valueId = ""; + //文字转数据字典id + if (StringUtils.isNotBlank(value)) { + value = value.replace(",",","); + for (String valueTemp : value.split(",")) { + if (itemNameList.contains(valueTemp)) { + List collect = new ArrayList<>(); + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + collect = dictItemList.stream().filter(e -> StringUtils.isNotBlank(e.getItemText()) && e.getItemText().equals(valueTemp)).collect(Collectors.toList()); + } else if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.EN.getValue())) { + collect = dictItemList.stream().filter(e -> StringUtils.isNotBlank(e.getEnName()) && e.getEnName().equals(valueTemp)).collect(Collectors.toList()); + } + valueId += collect.get(0).getItemValue() + ","; + } + } + if (StringUtils.isNotBlank(valueId)) { + value = valueId.substring(0, valueId.length() - 1); + } + } + } else if (FieldTypeEnum.DATE_SINGLE.getValue().equals(fieldShowType)) { + //单选日期 + //判断是否必填 + if (IsMustEnum.YES.getValue().equals(mustInput) && StringUtils.isBlank(value)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "为必填项,不能为空;"; + } else { + errorMsg += fieldName + " is mandatory and cannot be empty;"; + } + countError++; + } + //判断是否是单日期选择 + value = value.replace(",",","); + if (StringUtils.isNotBlank(value) && value.contains(",")) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "为单日期选项;"; + } else { + errorMsg += fieldName + " is single date type;"; + } + countError++; + } + //判断格式是否正确 + if (!DateUtils.isValidDate((String) value)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + errorMsg += fieldName + "格式不正确,正确格式如:yyyy/MM/dd、yyyy-MM-dd、yyyy年MM月dd日;"; + }else{ + errorMsg += fieldName + " Incorrect format correct format is:yyyy/MM/dd、yyyy-MM-dd、yyyy年MM月dd日;"; + } + countError++; + } else { + value = DateUtils.coverDate((String) value); + } + + } else if (FieldTypeEnum.DATE_MORE.getValue().equals(fieldShowType)) { + //多选日期 + //判断是否必填 + if (IsMustEnum.YES.getValue().equals(mustInput) && StringUtils.isBlank(value)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "为必填项,不能为空;"; + } else { + errorMsg += fieldName + " is mandatory and cannot be empty;"; + } + countError++; + } + //判断格式是否正确 + if (!DateUtils.isValidDate((String) value)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + errorMsg += fieldName + "格式不正确,正确格式如:yyyy/m/d、yyyy-MM-dd、yyyy年MM月dd日;"; + }else{ + errorMsg += fieldName + " Incorrect format correct format is:yyyy/m/d、yyyy-MM-dd、yyyy年MM月dd日;"; + } + countError++; + } else { + value = DateUtils.coverDate((String) value); + } + if (StringUtils.isNotBlank(value)) { + //判断是否是两个日期点 + String str = value.replace(",", ","); + String[] strArr = str.split(","); + if (strArr.length != 2) { + if (MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "必须填写两个日期;"; + } else { + errorMsg += fieldName + " must fill in the two dates;"; + } + countError++; + } + } + + } else if (FieldTypeEnum.FILE.getValue().equals(fieldShowType)) { + //文件 + //判断是否必填 + if (IsMustEnum.YES.getValue().equals(mustInput) && StringUtils.isBlank(value)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "为必填项,不能为空;"; + } else { + errorMsg += fieldName + " is mandatory and cannot be empty;"; + } + countError++; + } + //判断长度 + if (StringUtils.isNotBlank(value) && value.length() > Long.parseLong(dbLength)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "不能超过" + dbLength + "个字符;"; + } else { + errorMsg += fieldName + " can not be more than" + dbLength + "char;"; + } + countError++; + } + if (StringUtils.isNotBlank(value)) { + StringBuilder sb = new StringBuilder(); + value = value.replace(",",","); + for (String fileName : value.split(",")) { + List nowFileList = FileUnZip.readFileByFilename(filepath, fileName,null,null,null,null,null); + if (nowFileList.size() == 0) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "压缩包中没有" + fileName + "文件; "; + } else { + errorMsg += fieldName + " " + fileName + "isn't present in the cabinet;"; + } + countError++; + } else { + try { + FileInputStream input = new FileInputStream(nowFileList.get(0)); + MultipartFile multipartFile = + new MockMultipartFile(nowFileList.get(0).getName(), nowFileList.get(0).getName(), "text/plain", input); + //文件存入文件表 + OSSFile ossFile = ossFileService.uploadLocalOfCos(multipartFile, "", null,null); + if (ObjectUtils.isNotEmpty(ossFile)) { + sb.append(ossFile.getId() + ","); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + if (StringUtils.isNotBlank(sb)) { + String substring = sb.substring(0, sb.length() - 1); + value = substring; + } + } + + } else if (FieldTypeEnum.STANDARD.getValue().equals(fieldShowType)) { + //标准选择 + //判断是否必填 + if (IsMustEnum.YES.getValue().equals(mustInput) && StringUtils.isBlank(value)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "为必填项,不能为空;"; + } else { + errorMsg += fieldName + " This parameter is mandatory and cannot be empty;"; + } + countError++; + } + //判断长度 + if (StringUtils.isNotBlank(value) && value.length() > Long.parseLong(dbLength)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "不能超过" + dbLength + "个字符;"; + } else { + errorMsg += fieldName + " Can not be more than" + dbLength + "char;"; + } + countError++; + } + + value = value.replace(",",","); + if (value.endsWith(",")){ + value = value.substring(0, value.length() - 1); + } + + } else if (FieldTypeEnum.PERSON.getValue().equals(fieldShowType)) { + //人员选择 + //判断是否必填 + if (IsMustEnum.YES.getValue().equals(mustInput) && StringUtils.isBlank(value)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "为必填项,不能为空;"; + } else { + errorMsg += fieldName + " is mandatory and cannot be empty;"; + } + countError++; + } +// String regexPerson = "^[\\u4e00-\\u9fa5A-Za-z0-9]{0,}\\([A-Za-z0-9.]*\\)$"; + value = value.replace(",",","); + if(StringUtils.isNotBlank(value)) { + String[] userNames = value.split(","); + List userIdList = new ArrayList<>(); + for(int u=0 ; u 0) { + stringMessage.add(errorMsg); + } + } + Map map = new HashMap(); + if (stringMessage.isEmpty()) { + map.put("result", true); + map.put("resultList", datas); + map.put("message", ""); + } else { + map.put("result", false); + String html = ""; + for (String message : stringMessage) { +// html += message; + html += message + "
"; + } + map.put("message", html); + } + return map; + } + + private void createItemsInfo(Map sarFileSplitItemsEO, String menuId, String infoId){ + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = sysUser.getId(); + //创建菜单 +// SarFileSplitMenuEO sarFileSplitMenuEO = new SarFileSplitMenuEO(); +// sarFileSplitMenuEO.setInfoId(infoId); +// sarFileSplitMenuEO.setName(sarFileSplitItemsEO.getItemsNum()); +// sarFileSplitMenuEO.setItemName(sarFileSplitItemsEO.getItemsName()); +// sarFileSplitMenuEO.setPId(parentId); +// sarFileSplitMenuEO.setDisplaySeq(countNum+1L); +// sarFileSplitMenuEO.setCreationUser(userId); +// sarFileSplitMenuEO.setModifyUser(userId); +// String menuId = sarFileSplitMenuEOService.addMenuForImport(sarFileSplitMenuEO); + //添加items表数据 +// String itemsId = UUIDUtils.randomUUID20(); +// sarFileSplitItemsEO.setId(itemsId); + sarFileSplitItemsEO.put("menu_id", menuId); + + //添加val表数据 + List getValList = (List) sarFileSplitItemsEO.get("itemValEOList"); + String itemConditions = ""; + int ind = 1; + if (getValList != null && !getValList.isEmpty()) { + for (SarFileSplitItemsValEO valEO : getValList) { + // 当前段内容 + String valContent = ""; + if ("TEXT".equals(valEO.getType())) { + valContent += "

" + valEO.getItemContent() + "

"; + } else if ("IMG".equals(valEO.getType())) { + valContent += ""; +// valContent += valEO.getItemContent(); + } else if ("TABLE".equals(valEO.getType())) { + valContent += valEO.getItemContent(); + } + itemConditions += valContent; + // val表信息 + valEO.setId(UUIDUtils.randomUUID20()); +// valEO.setItemId(itemsId); + valEO.setItemId((String)sarFileSplitItemsEO.get("id")); + valEO.setDisplaySeq(ind); + valEO.setValidFlag(0); + valEO.setCreationTime(new Date()); + valEO.setModifyTime(new Date()); + valEO.setCreationUser(userId); + valEO.setModifyUser(userId); + ind++; + } + sarFileSplitItemsValEOMapper.insertForeach(getValList); + sarFileSplitItemsEO.put("item_content", itemConditions); + } + String id = (String)sarFileSplitItemsEO.get("id"); + sarFileSplitItemsEO.remove("id"); + sarFileSplitItemsEO.remove("itemValEOList"); + sarFileSplitItemsEO = filterMap(sarFileSplitItemsEO); + insertInfo(sarFileSplitItemsEO,id,"import"); // 添加条款 + } + + private List buildTree(List> addItemsEOList, Long treeListDisplay, String menuId){ + //排序 + Collections.sort(addItemsEOList, new Comparator>() { + @Override + public int compare(Map o1, Map o2) { + return o1.get("item_num").toString().compareTo(o2.get("item_num").toString()); + } + }); + + List treeNodeList = new ArrayList<>(); + String regex = "^[0-9]{0}([0-9]|[.])+$"; //TODO 待优化:数字和点必须交替 + for (Map itemEO : addItemsEOList) { + String itemNum = itemEO.get("item_num").toString(); +// if(itemNum.matches(regex) || itemNum.contains("附录")) { // TODO 解除条款号格式限制 + SarFileSplitMenuTreeNode treeNode = new SarFileSplitMenuTreeNode(); + treeNode.setId(UUIDUtils.randomUUID20()); + treeNode.setName(itemNum); + if(itemNum.matches(regex)) { + //父级是 总目录时,不做处理 + if(itemNum.contains(".")) { + String parentName = itemNum.substring(0, itemNum.lastIndexOf(".")); + treeNode.setParentName(parentName); + List p = treeNodeList.stream().filter(e -> e.getName().equals(parentName)).collect(Collectors.toList()); + if (CollectionUtil.isNotEmpty(p)) { + //其他节点 + treeNode.setParentId(p.get(0).getId()); + }else{ + //一级节点 + treeNode.setParentId(menuId); + } + }else{ + treeNode.setParentId(menuId); + } + }else{ + treeNode.setParentId(menuId); + } + ++treeListDisplay; + treeNode.setOrderNum(treeListDisplay); + treeNode.setItemName(itemEO.get("item_title").toString()); + treeNode.setItemId(itemEO.get("id").toString()); + treeNodeList.add(treeNode); +// } + } + //其他节点 + /*for (SarFileSplitItemsEO itemEO : addItemsEOList) { + String itemNum = itemEO.getItemsNum(); + if (itemNum.matches(regex)) { + SarFileSplitMenuTreeNode treeNode = new SarFileSplitMenuTreeNode(); + String parentName = itemNum.substring(0, itemNum.lastIndexOf(".")); + List p = treeNodeList.stream().filter(e -> e.getName().equals(parentName)).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(p)) { + treeNode.setParentId(p.get(0).getId()); + } + treeNode.setId(UUIDUtils.randomUUID20()); + treeNode.setName(itemNum); + treeNode.setParentName(parentName); + //判断格式 + if (itemNum.lastIndexOf(".") + 1 < itemNum.length()) { +// treeNode.setOrderNum(Long.valueOf(itemNum.substring(itemNum.lastIndexOf(".") + 1, itemNum.length()))); + treeNode.setOrderNum(p.get(0).getOrderNum() + Long.valueOf(itemNum.substring(itemNum.lastIndexOf(".") + 1, itemNum.length()))); + } + + treeNode.setItemName(itemEO.getItemsName()); + treeNode.setItemId(itemEO.getId()); + treeNodeList.add(treeNode); + } + }*/ + + return treeNodeList; + } + + /** + * 模板下载 + * + * @param response + * @param request + */ + @Override + public void exportTemplate(String cut, HttpServletResponse response, HttpServletRequest request) { + OutputStream os = null; + XSSFWorkbook workbook = new XSSFWorkbook(); + String fileOriName = "导入模板"; + String filePath = uploadpath + File.separator + fileOriName; + try { + List list = getWorkbookTitle(cut); + //创建临时文件夹 + File nowFile = new File(filePath); + if (nowFile.exists()) { + nowFile.delete(); + } + nowFile.mkdirs(); + XSSFSheet sheet = workbook.createSheet("文档拆分条款导入模板"); + sheet.setDefaultColumnWidth(16);//列宽 + XSSFCellStyle cellStyle = workbook.createCellStyle(); + cellStyle.setWrapText(true);//自动换行 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("@")); // 设置文本格式 + + //合并单元格 + CellRangeAddress region1 = + new CellRangeAddress(1, 1, 0, Arrays.asList(list.get(0).split(",")).size() - 1); //参数1:起始行 参数2:终止行 参数3:起始列 参数4:终止列 + sheet.addMergedRegion(region1); + + for (int i = 0; i < 2; i++) { + //表头 + Row row = sheet.createRow(i);//开始创建标题行 + String exportFieldName = list.get(i); + if (i == 0) { + if (StringUtils.isNotBlank(exportFieldName)) { + String[] headerArr = exportFieldName.split(","); + String[] headerTypeArr = list.get(3).split(","); + + for (int j = 0; j < headerArr.length; j++) { + // 条款号和输入框数字类型 列 设置单元格格式为文本 + if ("条文号".equals(headerArr[j]) || "Item No.".equals(headerArr[j]) || FieldTypeEnum.TEXT.getValue().equals(headerTypeArr[j])) { + sheet.setDefaultColumnStyle(j, cellStyle); + } + row.createCell(j).setCellValue(headerArr[j]); + } + } + } else { + //说明 + short height = (short) (Integer.parseInt(list.get(2)) * 252); + row.setHeight((short) height); + Cell cell = row.createCell(0); + cell.setCellStyle(cellStyle); + cell.setCellValue(new XSSFRichTextString(list.get(i))); + } + + } + response.setHeader("Content-Disposition", + "attachment; filename=\"" + fileOriName + ".xlsx"); + response.setContentType("application/force-download"); + response.flushBuffer(); + os = response.getOutputStream(); + workbook.write(os); + } catch (Exception e) { + throw new JeroBootException("下载文件失败,请重试"); + } finally { + IOUtils.closeQuietly(os); + } + + } + + /** + * 获取模板下载的表头 + * + * @return + */ + private List getWorkbookTitle(String cut) { + // 查询条款表所有字段 + List fieldList = onlCgformFieldService.getFieldList(ModuleEnum.FILE_SPLIT_ITEMS.getValue()); + // 过滤导出字段 + if (fieldList.size() != 0) { + fieldList = fieldList.stream() + .filter(e -> YesOrNoEnum.YES.getValue().equals(String.valueOf(e.getIsShowForm())) || "条款内容".equals(e.getDbFieldTxt())) + .sorted(Comparator.comparing(OnlCgformField::getOrderNum)) // 必须按顺序 + .collect(Collectors.toList()); + } + //树形数据字典 + List sysCategoryTree = sysCategoryService.getSysCategoryTreeByCut(cut); // 查询所有 并以树结构返回 + + List> list = new ArrayList<>(); + for (OnlCgformField onlCgformField : fieldList) { + Map map = new HashMap<>(); + if (FieldTypeEnum.TREE.getValue().equals(onlCgformField.getFieldShowType())) { + List sysCategoryTreeVOList = sysCategoryTree.stream() + .filter(e -> onlCgformField.getDictId().equals(e.getDictId())) + .collect(Collectors.toList()); + map.put("tree", sysCategoryTreeVOList); // 树形结构字段 设置树形结构字段值 + } else { + map.put("tree", new ArrayList<>()); // 其他类型字段 该key为空 + } + + map.put("area", null);//展示区域。没用到 + map.put("field_show_type", onlCgformField.getFieldShowType());//类型(判断是下拉还是输入框,等等) + map.put("field_must_input", onlCgformField.getFieldMustInput());//是否必填 + map.put("dict_field", onlCgformField.getDictField()); //下拉类型的数据字典编码 + map.put("db_field_name", onlCgformField.getDbFieldName());//字段 + map.put("db_length", onlCgformField.getDbLength());//字段长度 + if (MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + map.put("db_field_txt", onlCgformField.getDbFieldTxt());//字段中文名 + } else { + map.put("db_field_txt", onlCgformField.getDbFieldEnName());//字段英文名 + } + list.add(map); + } + + // 获取新增表单字段 + List> addForm = list; + StringBuilder sb = new StringBuilder(); + StringBuilder sbOfType = new StringBuilder(); + List pullMoreList = new LinkedList<>();//多选字段 + List pullSingleList = new LinkedList<>();//单选字段 + List fileList = new LinkedList<>();//文件字段 + List textNumberList = new LinkedList<>();//数字输入框字段 + List textStringList = new LinkedList<>();//字符串输入框字段 + List dateSingleList = new LinkedList<>();//单选日期字段 + List dateMoreList = new LinkedList<>();//多选日期字段 + List standardList = new LinkedList<>();//标准选择字段 + List treeList = new LinkedList<>();//树形结构字段 + for (Map map : addForm) { + if ("1".equals(map.get("field_must_input"))) { + sb.append("*" + map.get("db_field_txt") + ","); + } else { + sb.append(map.get("db_field_txt") + ","); + } + String fieldShowType = "field_show_type"; + sbOfType.append(map.get(fieldShowType) + ","); + //多选字段 + if (FieldTypeEnum.PULL_MORE.getValue().equals(map.get(fieldShowType))) { + pullMoreList.add((String) map.get("db_field_txt")); + } else if (FieldTypeEnum.PULL_SINGLE.getValue().equals(map.get(fieldShowType))) { + //单选字段 + pullSingleList.add((String) map.get("db_field_txt")); + } else if (FieldTypeEnum.FILE.getValue().equals(map.get(fieldShowType))) { + //文件字段 + fileList.add((String) map.get("db_field_txt")); + } else if (FieldTypeEnum.TEXT.getValue().equals(map.get(fieldShowType))) { + //数字输入框字段 + textNumberList.add((String) map.get("db_field_txt")); + } else if (FieldTypeEnum.TEXT.getValue().equals(map.get(fieldShowType))) { + //字符串输入框字段 + textStringList.add((String) map.get("db_field_txt")); + } else if (FieldTypeEnum.DATE_SINGLE.getValue().equals(map.get(fieldShowType))) { + //单选日期字段 + dateSingleList.add((String) map.get("db_field_txt")); + } else if (FieldTypeEnum.DATE_MORE.getValue().equals(map.get(fieldShowType))) { + //多选日期字段 + dateMoreList.add((String) map.get("db_field_txt")); + } else if (FieldTypeEnum.STANDARD.getValue().equals(map.get(fieldShowType))) { + //标准选择字段 + standardList.add((String) map.get("db_field_txt")); + } else if (FieldTypeEnum.TREE.getValue().equals(map.get(fieldShowType))) { + //树形结构字段 + treeList.add((String) map.get("db_field_txt")); + } + } + String title = sb.substring(0, sb.length() - 1); + String type = sbOfType.substring(0, sbOfType.length() - 1); + + //第二行 + StringBuilder sbTwo = new StringBuilder(); + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + sbTwo.append("填写说明\n" + "1.导入数据从第三行开始,第一行为表头,第二行为填写说明,第三行是正式数据\n" + "2.所有带*号的字段必须填写\n"); + }else{ + sbTwo.append("Filling explanation\n" + + "1.Import data starts at the third line, the first line is the header, the second line is the description, and the third line is the official data\n" + + "2.All fields marked with * must be filled in\n"); + } + int count = 3; + if (pullSingleList.size() != 0) { + //单选 + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + String pullSingle = StringUtils.join(pullSingleList, ",") + "字段是单选属性,必须和系统中的对应字段选项相匹配\n"; + sbTwo.append(count++ + "." + pullSingle); + }else{ + String pullSingle = StringUtils.join(pullSingleList, ",") + " fields are single type,Must match the corresponding field option in the system\n"; + sbTwo.append(count++ + "." + pullSingle); + } + } + if (textNumberList.size() != 0) { + //文本框(数字) + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + String textNumber = StringUtils.join(textNumberList, ",") + "字段仅能填写数字,负数,小数\n"; + sbTwo.append(count++ + "." + textNumber); + } else { + String textNumber = StringUtils.join(textNumberList, ",") + " fields can only fill in the numbers, negative numbers, fractions\n"; + sbTwo.append(count++ + "." + textNumber); + } + } + if (pullMoreList.size() != 0) { + //多选 + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + String pullMore = StringUtils.join(pullMoreList, ",") + "字段是多选属性,必须和系统中的对应字段选项相匹配,填写多个时采用英文或中文逗号分割\n"; + sbTwo.append(count++ + "." + pullMore); + }else{ + String pullMore = StringUtils.join(pullMoreList, ",") + " fields are multi-select type, must match the corresponding field in the system. If multiple fields are filled in, separate them by commas (,)\n"; + sbTwo.append(count++ + "." + pullMore); + } + } + if (dateSingleList.size() != 0) { + //单选日期 + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + String dateSingle = StringUtils.join(dateSingleList, ",") + "字段为日期,必须精确到日\n"; + sbTwo.append(count++ + "." + dateSingle); + }else{ + String dateSingle = StringUtils.join(dateSingleList, ",") + " fields are date type, must be exact to the day\n"; + sbTwo.append(count++ + "." + dateSingle); + } + } + if (dateMoreList.size() != 0) { + //多选日期 + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + String dateMore = StringUtils.join(dateMoreList, ",") + "字段为日期,必须精确到日,可填写多个,填写多个时采用英文或中文逗号分割\n"; + sbTwo.append(count++ + "." + dateMore); + } else { + String dateMore = StringUtils.join(dateMoreList, ",") + " fields are date type, must be accurate to a day, fill in more, fill out multiple commas in English or Chinese segmentation\n"; + sbTwo.append(count++ + "." + dateMore); + } + } + if (textStringList.size() != 0) { + //输入框 + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + String textString = StringUtils.join(textStringList, ",") + "字段为文本,填写文本内容\n"; + sbTwo.append(count++ + "." + textString); + }else{ + String textString = StringUtils.join(textStringList, ",") + " fields are text type. Enter the text content\n"; + sbTwo.append(count++ + "." + textString); + } + } + if (standardList.size() != 0) { + //标准选择 + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + String standard = StringUtils.join(standardList, ",") + "字段为标准号,填写多个时采用英文或中文逗号分割\n"; + sbTwo.append(count++ + "." + standard); + }else{ + String standard = StringUtils.join(standardList, ",") + " fields are standard number type. If you fill in more than one field, separate it with English or Chinese commas\n"; + sbTwo.append(count++ + "." + standard); + } + } + if (fileList.size() != 0) { + //文件 + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + String file = StringUtils.join(fileList, ",") + "字段为文件属性,填写时需要在本文件同级目录下以标准号为名称建立文件夹,并在文件夹下放置文件,假设在AAA标准号下放置了B.pdf,则应填写AAA/B.pdf\n"; + sbTwo.append(count++ + "." + file); + }else{ + String file = StringUtils.join(fileList, ",") + " fields are file type, must create a folder in the directory of the same level as the file with the name of the standard number and place the file in the folder. Assume that the file is saved in the AAA standard numberB.pdf,Should fill inAAA/B.pdf\n"; + sbTwo.append(count++ + "." + file); + } + } + if (treeList.size() != 0) { + //树形结构 + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())){ + String tree = StringUtils.join(treeList, ",") + "字段为树形结构,填写的数据每层级间用反斜杠(/)划分,如A/B/C代表A层级下B,B层级下的C\n"; + sbTwo.append(count++ + "." + tree); + }else{ + String tree = StringUtils.join(treeList, ",") + " fields are tree type,Fill in the data between each level with a backslash ( / ) partition, such as b,b under a/b/c represent a hierarchy level under the C\n"; + sbTwo.append(count++ + "." + tree); + } + } + List resultList = new LinkedList<>(); + resultList.add(title); + resultList.add(sbTwo.toString()); + resultList.add(count + ""); + resultList.add(type); + return resultList; + } + /** * 查询条件 * @@ -1320,8 +3090,8 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl YesOrNoEnum.YES.getValue().equals(String.valueOf(e.getIsShowForm())) - && (FieldTypeEnum.TREE.getValue().equals(e.getFieldShowType()) || FieldTypeEnum.PULL_SINGLE.getValue().equals(e.getFieldShowType()) - || FieldTypeEnum.PULL_MORE.getValue().equals(e.getFieldShowType()))) + && (FieldTypeEnum.TREE.getValue().equals(e.getFieldShowType()) || FieldTypeEnum.PULL_SINGLE.getValue().equals(e.getFieldShowType()) + || FieldTypeEnum.PULL_MORE.getValue().equals(e.getFieldShowType()))) .collect(Collectors.toList()); } //树形数据字典 @@ -1355,6 +3125,52 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl> getImportOnlField(String flag, String cut) { +// List fieldList = onlCgformFieldService.getFieldList(flag); + // 查询全部字段列表 +// List fieldList = lawsCommonMapper.getFieldList(TableNameEnum.DOCUMENT_SPLIT.getTableName()); + List fieldList = new ArrayList<>(); + // 列表展示字段 + fieldList = fieldList.stream().filter(v -> YesOrNoEnum.YES.getValue() + .equals(String.valueOf(v.getIsShowList()))).collect(Collectors.toList()); + if (fieldList.size() != 0) { + //过滤出导入字段 + fieldList = fieldList.stream() + .filter(e -> YesOrNoEnum.YES.getValue().equals(String.valueOf(e.getIsShowForm())) + || "条文内容".equals(e.getDbFieldName())) + .collect(Collectors.toList()); + } + //树形数据字典 + List sysCategoryTree = sysCategoryService.getSysCategoryTreeByCut(cut); // 查询所有 并以树结构返回 + + List> list = new ArrayList<>(); + for (LawsTag onlCgformField : fieldList) { + Map map = new HashMap<>(); + if (FieldTypeEnum.TREE.getValue().equals(onlCgformField.getFieldShowType())) { + List sysCategoryTreeVOList = sysCategoryTree.stream() + .filter(e -> onlCgformField.getDictId().equals(e.getDictId())) + .collect(Collectors.toList()); + map.put("tree", sysCategoryTreeVOList); // 树形结构字段 设置树形结构字段值 + } else { + map.put("tree", new ArrayList<>()); // 其他类型字段 该key为空 + } + + map.put("area", null);//展示区域。没用到 + map.put("field_show_type", onlCgformField.getFieldShowType());//类型(判断是下拉还是输入框,等等) + map.put("field_must_input", onlCgformField.getFieldMustInput());//是否必填 + map.put("dict_field", onlCgformField.getDictField()); //下拉类型的数据字典编码 + map.put("db_field_name", onlCgformField.getDbFieldName());//字段 + map.put("db_length", onlCgformField.getDbLength());//字段长度 + if (MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + map.put("db_field_txt", onlCgformField.getDbFieldTxt());//字段中文名 + } else { + map.put("db_field_txt", onlCgformField.getDbFieldEnName());//字段英文名 + } + list.add(map); + } + return list; + } + /** * 过滤map中的值为 null的键值对 * @param map @@ -1370,6 +3186,184 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl> queryByOrdersForExport(String cut, String field, List idList, Map parameter){ + if (CollectionUtil.isEmpty(idList)) { + idList = null; + } + //sql查询条件 + String condition = getConditionStr(parameter, "export"); + List> itemsDataForExport = dao.queryByOrdersForExport(field, idList, condition); + + // 查询条款表所有字段 +// List fieldList = onlCgformFieldService.getFieldList(ModuleEnum.FILE_SPLIT_ITEMS.getValue()); + // 查询全部字段列表 +// List fieldList = lawsCommonMapper.getFieldList(TableNameEnum.DOCUMENT_SPLIT.getTableName()); + List fieldList = new ArrayList<>(); + // 列表展示字段 + fieldList = fieldList.stream().filter(v -> YesOrNoEnum.YES.getValue() + .equals(String.valueOf(v.getIsShowList()))).collect(Collectors.toList()); + + // 日期类型字段 + List onlCgformFieldList = fieldList.stream() + .filter(e -> FieldTypeEnum.DATE_SINGLE.getValue().equals(e.getFieldShowType())) + .collect(Collectors.toList()); + List fieldDateList = onlCgformFieldList.stream().map(LawsTag::getDbFieldName).collect(Collectors.toList()); + // 人员选择 + List onlCgformFieldPersonList = fieldList.stream() + .filter(e -> FieldTypeEnum.PERSON.getValue().equals(e.getFieldShowType())) + .collect(Collectors.toList()); + List fieldPersonList = onlCgformFieldPersonList.stream().map(LawsTag::getDbFieldName).collect(Collectors.toList()); + // 标准选择 + List onlCgformFieldStanList = fieldList.stream() + .filter(e -> FieldTypeEnum.STANDARD.getValue().equals(e.getFieldShowType())) + .collect(Collectors.toList()); + List fieldStanList = onlCgformFieldStanList.stream().map(LawsTag::getDbFieldName).collect(Collectors.toList()); + // 文件字段 +// List onlCgformFieldFileList = fieldList.stream() +// .filter(e -> FieldTypeEnum.FILE.getValue().equals(e.getFieldShowType())) +// .collect(Collectors.toList()); +// List fileList = onlCgformFieldFileList.stream().map(OnlCgformField::getDbFieldName).collect(Collectors.toList()); + + // 过滤导出字段 + if (fieldList.size() != 0) { + fieldList = fieldList.stream() + .filter(e -> YesOrNoEnum.YES.getValue().equals(String.valueOf(e.getIsShowList())) || "条文内容".equals(e.getDbFieldTxt())) + .collect(Collectors.toList()); + } + + //树形数据字典 + List categoryList = sysCategoryService.list(); + //过滤出树形字段 + List treeFieldList = fieldList.stream() + .filter(e -> FieldTypeEnum.TREE.getValue().equals(e.getFieldShowType())) + .collect(Collectors.toList()); + //数据字典 + List sysDictItems = sysDictItemServiceImpl.selectItemsAll(); + List fileIdList = new ArrayList<>(); + // 处理数据下拉框,树形结构数据及中英文切换 + for (Map record : itemsDataForExport) { + Map record1 = (Map) record; + for (Map.Entry entry : record1.entrySet()) { + List collect = fieldList.stream() + .filter(e -> entry.getKey().equals(e.getDbFieldName()) && !FieldTypeEnum.TREE.getValue().equals(e.getFieldShowType())) + .collect(Collectors.toList()); + // 特殊翻译 + if (entry.getKey().equals("applicable_components")){ + String applicableComponents = (String) entry.getValue(); +// List partNames = partNameService.queryEcho(applicableComponents); +// entry.setValue(partNames.stream().map(PartName::getName).collect(Collectors.joining(","))); + continue; + } + if (entry.getKey().equals("property_tag")){ + String propertyTag = (String) entry.getValue(); +// List lawsLabelDatabases = lawsLabelDatabaseService.queryByCodes(propertyTag); +// entry.setValue(lawsLabelDatabases.stream().map(LawsLabelDatabase::getName).collect(Collectors.joining(","))); + continue; + } + + //下拉选处理数据字典 + dictItem2(sysDictItems, entry, collect, cut); + // 树形结构处理数据字典 + treeDictItem2(categoryList, entry, treeFieldList, cut); + // 单日期 +// if(fieldDateList.contains(entry.getKey()) && ObjectUtil.isNotEmpty(entry.getValue())){ +// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); +// entry.setValue(dateFormat.format((Date)entry.getValue())); +// } + // 人员选择 + if(fieldPersonList.contains(entry.getKey()) && StringUtils.isNotBlank((String)entry.getValue())) { + List sysUserList = sysUserService.listByIds(Arrays.asList(entry.getValue().toString().split(","))); + if(CollectionUtil.isNotEmpty(sysUserList)){ + StringBuilder stringBuilder = new StringBuilder(); + for(SysUser user : sysUserList){ +// stringBuilder.append(user.getRealname()).append("(").append(user.getUsername()).append("),"); + stringBuilder.append(user.getUsername()).append(","); + } + String value = stringBuilder.substring(0, stringBuilder.lastIndexOf(",")); + entry.setValue(value); + } + } + } + } + return itemsDataForExport; + } + + @Override + public List combineItemValInfo(List getValList, List allTableList, List allImgList, SarFileSplitItemsEOPage page) { + int tableIndex = page.getTableIndex(); + int imgIndex = page.getImgIndex(); + List valContent = new ArrayList<>(); + BASE64Decoder base64Decoder = new BASE64Decoder(); + if (getValList != null && !getValList.isEmpty()) { + String preType = ""; + for (int i = 0; i < getValList.size(); i++) { + SarFileSplitItemsValEO itemsValEO = getValList.get(i); + String type = itemsValEO.getType(); + FileSplitValExportDto lastOne = new FileSplitValExportDto(); + lastOne.setValType(type); + if(preType.equals(type) && "TEXT".equals(type)) { + lastOne = valContent.get(valContent.size() - 1); + lastOne.setValContent(lastOne.getValContent()+itemsValEO.getItemContent() + "\n"); + valContent.set(valContent.size() - 1, lastOne); + + //循环到最后一次是文本的情况 + if(getValList.size() == (i+1)){ + splitContext(valContent); + } + + } else if ("TEXT".equals(type)) { + lastOne.setValContent(StringUtils.isNotEmpty(lastOne.getValContent())? lastOne.getValContent() : "" + itemsValEO.getItemContent() + "\n"); + valContent.add(lastOne); + + //第一次 + splitContext(valContent); + + } else if ("TABLE".equals(type)) { + //上次是TEXT类型的时候 + splitContext(valContent); + + String tableName = String.valueOf(tableIndex); + lastOne.setValContent("tableSheet" + tableName); + //查询table信息 + SarFileSplitItemsTableEOPage tablePage = new SarFileSplitItemsTableEOPage(); + tablePage.setItemsValId(itemsValEO.getId()); + valContent.add(lastOne); +// List> tableList = combineTableList(itemsValEO); + FileSpiltValTableExportDto tableExportDto = new FileSpiltValTableExportDto(); + tableExportDto.setTableName("tableSheet" + tableName); +// tableExportDto.setTableEOList(tableList); + tableExportDto.setTableHtCon(itemsValEO.getItemContent()); + allTableList.add(tableExportDto); + tableIndex++; + page.setTableIndex(tableIndex); + } else if ("IMG".equals(type)) { + //上次是TEXT类型的时候 + splitContext(valContent); + + String imgContent = itemsValEO.getItemContent(); + String imgUUIndex = "img" + String.valueOf(imgIndex); + if (MyStringUtils.isNotEmpty(imgContent)){ + lastOne.setValContent(imgUUIndex+".png"); + valContent.add(lastOne); + FileSplitValImgExportDto fileSplitValImgExportDto = new FileSplitValImgExportDto(); + fileSplitValImgExportDto.setImgName(imgUUIndex+".png"); + String url = imgContent.substring(imgContent.lastIndexOf("=") + 1); + + fileSplitValImgExportDto.setImgPath(url); + + allImgList.add(fileSplitValImgExportDto); + imgIndex++; + page.setImgIndex(imgIndex); + + } + } + preType = itemsValEO.getType(); + } + } + return valContent; + } + private void splitContext(List valContent){ if(CollectionUtils.isNotEmpty(valContent)){ FileSplitValExportDto fileSplitValExportDto = valContent.get(valContent.size() - 1); // 始终判断最后一个内容是否超出长度 @@ -1475,11 +3469,370 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl parameter,String exportName, HttpServletResponse response, HttpServletRequest request) { + // 水平越权 + documentSplitService.isHorizontalOverstep(String.valueOf(parameter.get("info_id"))); + + OutputStream os = null; + OutputStream excelOS = null; + HSSFWorkbook workbook = new HSSFWorkbook(); + String fileOriName = "拆分条款信息"; + if (StringUtils.isNotEmpty(exportName)) { + fileOriName = exportName; + } + try{ + //创建临时文件夹 + String fileNowPath = uploadpath + "/tempZip/" + UUID.randomUUID().toString().replace("-","") + File.separator + fileOriName; + File nowFile = new File(fileNowPath); + if (nowFile.exists()){ + nowFile.delete(); + } + nowFile.mkdirs(); + String fileName = fileOriName + ".xls"; + // 设置表格相关属性 + HSSFSheet sheetItems = workbook.createSheet("条文内容"); + String[] headers = getWorkbookTitleForExport(cut); // 获取表头 + HSSFCellStyle cellStyle =workbook.createCellStyle(); + cellStyle.setWrapText(true); +// cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + HSSFCellStyle cellStyle1 =workbook.createCellStyle(); + cellStyle1.setAlignment( HorizontalAlignment.CENTER); + HSSFCellStyle cellStyleLink =workbook.createCellStyle(); + HSSFFont font = workbook.createFont(); + font.setColor(HSSFColor.HSSFColorPredefined.LIGHT_BLUE.getIndex()); + cellStyleLink.setFont(font); + cellStyleLink.setWrapText(true); + + // 处理勾选导出相关字段 + List itemIdList = new ArrayList<>(); + if (StringUtils.isNotBlank(idList)){ + itemIdList = Arrays.asList(idList.split(",")); + } + SarFileSplitItemsEOPage page = new SarFileSplitItemsEOPage(); + // 查询需要导出的字段 + String field = getFieldForExport(); // 字符串形式 + List fieldList = Arrays.asList(field.split(",")); // list形式 + // 查询导出数据 + List> allItemsList = queryByOrdersForExport(cut, field, itemIdList, parameter); // id记得去掉 + // 文件类型字段 + // 查询全部字段列表 +// List fieldLists = lawsCommonMapper.getFieldList(TableNameEnum.DOCUMENT_SPLIT.getTableName()); + List fieldLists = new ArrayList<>(); + // 列表展示字段 + fieldLists = fieldLists.stream().filter(v -> YesOrNoEnum.YES.getValue() + .equals(String.valueOf(v.getIsShowList()))).collect(Collectors.toList()); +// List allFieldList = onlCgformFieldService.getFieldList(ModuleEnum.FILE_SPLIT_ITEMS.getValue()); // 查询条款表所有字段 + List onlCgformFieldFileList = fieldLists.stream() + .filter(e -> FieldTypeEnum.FILE.getValue().equals(e.getFieldShowType())) + .collect(Collectors.toList()); + List fileList = onlCgformFieldFileList.stream().map(LawsTag::getDbFieldName).collect(Collectors.toList()); + + // 开始处理工作表 + List allTableList = new ArrayList<>(); // 存储表格数据 + List allImgList = new ArrayList<>(); // 存储文件数据 + List allRelevFileList = new ArrayList<>(); + int countMaxFile = 1; + if (allItemsList != null && !allItemsList.isEmpty()) { + for (Map itemsExportDto : allItemsList) { + SarFileSplitItemsValEOPage valEOPage = new SarFileSplitItemsValEOPage(); + valEOPage.setItemId(itemsExportDto.get("id").toString()); + valEOPage.setOrderBy("DISPLAY_SEQ,ID"); + List getValList = sarFileSplitItemsValEOService.queryByList(valEOPage); + List valContentList = combineItemValInfo(getValList,allTableList,allImgList,page); //TODO + itemsExportDto.put("itemValContent", valContentList); + } + } + // 在excel表中添加表头 + HSSFRow row = sheetItems.createRow(0); + for (int i = 0; i < headers.length; i++) { + HSSFCell cell = row.createCell(i); + HSSFRichTextString text = new HSSFRichTextString(headers[i]); + cell.setCellValue(text); + cell.setCellStyle(cellStyle1); + // 设置单元格宽度 + if("条文内容".equals(headers[i]) || "条文解读".equals(headers[i])) { + sheetItems.setColumnWidth(i, 80 * 256); + } else { + sheetItems.setColumnWidth(i, 20 * 256); + } + } + //放文字内容 + int allRow = 0; + for(int rowNum = 0;rowNum < allItemsList.size(); rowNum++){ + Map exportDto = allItemsList.get(rowNum); + exportDto.remove("id"); // id 不导出 + List valList = (List) exportDto.get("itemValContent"); + int countFile = 0; + if(valList != null && !valList.isEmpty()){ // 如果有条目 + int startRow = allRow + 1; + for (int valRow=0;valRow ossFileList = ossFileService.getFileInfosByConnectId(connectId); + List fileNameList = new ArrayList<>(); + if (ossFileList != null && !ossFileList.isEmpty()) { + fileNameList = ossFileList.stream().map(OSSFile :: getFileName).collect(Collectors.toList()); + row1.createCell(cellNum).setCellValue(StringUtils.join(fileNameList, ",")); + row1.getCell(cellNum).setCellStyle(cellStyle); +// if (countMaxFile < fileList.size()) { +// countMaxFile = fileList.size(); +// } +// countFile = 0; +// for (OSSFile ossFile : ossFileList) { + /* 连接跳转*/ // 搞不了 +// String releFileName = ossFile.getFileName(); +// CreationHelper createHelper = workbook.getCreationHelper(); +// Hyperlink hyperlink1 = createHelper.createHyperlink(HyperlinkType.URL); +// hyperlink1.setAddress(releFileName); +// row1.createCell(9 + countFile).setHyperlink(hyperlink1); +// row1.createCell(9 + countFile).setCellValue(releFileName); +// row1.getCell(9 + countFile).setCellStyle(cellStyleLink); +// countFile++; +// } + allRelevFileList.addAll(ossFileList); + } + } else { + row1.createCell(cellNum).setCellValue(exportDto.get(fieldList.get(cellNum)).toString()); + row1.getCell(cellNum).setCellStyle(cellStyle); + } + + } else if ("item_content".equals(fieldList.get(cellNum))) { + // 条款内容特殊处理 + HSSFCell cell2 = row1.createCell(cellNum); + row1.getCell(cellNum).setCellStyle(cellStyle); + String content = valList.get(valRow).getValContent(); + if (StringUtils.isNotEmpty(content)) { + content = content.replaceAll("null",""); + if (content.lastIndexOf("\n") > -1) { + content = content.substring(0,content.lastIndexOf("\n")); + } + } + + if("TABLE".equals(valList.get(valRow).getValType())){ + /* 连接跳转*/ + CreationHelper createHelper = workbook.getCreationHelper(); + Hyperlink hyperlink1 = createHelper.createHyperlink(HyperlinkType.DOCUMENT); + String tableName = "#\'"+ content + "\'!A1"; + hyperlink1.setAddress(tableName); + cell2.setHyperlink(hyperlink1);// 链接 + row1.getCell(cellNum).setCellStyle(cellStyleLink); + } else if ("IMG".equals(valList.get(valRow).getValType())) { + /* 连接跳转*/ + CreationHelper createHelper = workbook.getCreationHelper(); + Hyperlink hyperlink1 = createHelper.createHyperlink(HyperlinkType.FILE); + String imgName = content; + hyperlink1.setAddress(imgName); + cell2.setHyperlink(hyperlink1);// 链接 + row1.getCell(cellNum).setCellStyle(cellStyleLink); + } + cell2.setCellValue(content); // IllegalArgumentException异常,excel单元格最大字符长度有限制 + } else if ("interpretation_articles".equals(fieldList.get(cellNum))) { + // 条文解读特殊处理 + HSSFCell cell2 = row1.createCell(cellNum); + row1.getCell(cellNum).setCellStyle(cellStyle); + String content = (String) allItemsList.get(rowNum).get("interpretation_articles"); + if (StringUtils.isNotEmpty(content)) { + content = content.replaceAll("

",""); + content = content.replaceAll("

","\n"); + if (content.lastIndexOf("\n") > -1) { + content = content.substring(0,content.lastIndexOf("\n")); + } + } + cell2.setCellValue(content); // IllegalArgumentException异常,excel单元格最大字符长度有限制 + } + } + } + if (allRow > startRow) { + for(int cellNum = 0; cellNum < fieldList.size(); cellNum++) { + if (!"item_content".equals(fieldList.get(cellNum))) { + sheetItems.addMergedRegion(new CellRangeAddress(startRow, allRow, cellNum, cellNum)); + } + } +// if (countFile > 0) { +// for (int i=0;i<=countFile;i++) { +// sheetItems.addMergedRegion(new CellRangeAddress(startRow,allRow,9+i,9+i)); +// } +// } + } + } else { + allRow++; + HSSFRow row1 = sheetItems.createRow(allRow); + for(int cellNum = 0; cellNum < fieldList.size(); cellNum++){ + if (!"item_content".equals(fieldList.get(cellNum)) && ObjectUtils.isNotEmpty(exportDto.get(fieldList.get(cellNum)))) { + // 处理文件 + if(fileList.contains(fieldList.get(cellNum))) { + String connectId = (String) exportDto.get(fieldList.get(cellNum)); + List ossFileList = ossFileService.getFileInfosByConnectId(connectId); + List fileNameList = new ArrayList<>(); + if (ossFileList != null && !ossFileList.isEmpty()) { + fileNameList = ossFileList.stream().map(OSSFile :: getFileName).collect(Collectors.toList()); + row1.createCell(cellNum).setCellValue(StringUtils.join(fileNameList, ",")); + row1.getCell(cellNum).setCellStyle(cellStyle); +// if (countMaxFile < fileList.size()) { +// countMaxFile = fileList.size(); +// } +// countFile = 0; +// for (OSSFile ossFile : ossFileList) { + /* 连接跳转*/ // 搞不了 +// String releFileName = ossFile.getFileName(); +// CreationHelper createHelper = workbook.getCreationHelper(); +// Hyperlink hyperlink1 = createHelper.createHyperlink(HyperlinkType.URL); +// hyperlink1.setAddress(releFileName); +// row1.createCell(9 + countFile).setHyperlink(hyperlink1); +// row1.createCell(9 + countFile).setCellValue(releFileName); +// row1.getCell(9 + countFile).setCellStyle(cellStyleLink); +// countFile++; +// } + allRelevFileList.addAll(ossFileList); + } + } else { + row1.createCell(cellNum).setCellValue(exportDto.get(fieldList.get(cellNum)).toString()); + row1.getCell(cellNum).setCellStyle(cellStyle); + } + + } else if ("item_content".equals(fieldList.get(cellNum))) { + row1.createCell(cellNum).setCellValue(""); + row1.getCell(cellNum).setCellStyle(cellStyle); + } + } + } + } +// if (countMaxFile > 1) { +// for (int i=1;i> rowtableList = tableExportDto.getTableEOList(); +// HSSFSheet sheetTable = workbook.createSheet(tableExportDto.getTableName()); + String tableName = tableExportDto.getTableName(); + String tableHtml = tableExportDto.getTableHtCon(); + if (StringUtils.isNotEmpty(tableHtml) && tableHtml.indexOf("") < 0) { + if (tableHtml.indexOf("") < 0) { + tableHtml = tableHtml.replaceFirst("",""); + tableHtml = tableHtml.replaceFirst("",""); + } else { + tableHtml = tableHtml.replaceFirst("",""); + tableHtml = tableHtml.replaceFirst("",""); + } + } + String cnt = "\n"; + tableHtml = tableHtml.replaceAll("<[\\s]*?br[^>]*?>|<[\\s]*?\\/[\\s]*?br[\\s]*?>", cnt); + workbook = ConvertHtml2Excel.table2Excel(tableHtml,workbook,tableName); +// for (int r=0;r colTableList = rowtableList.get(r); +// HSSFRow tRow = sheetTable.createRow(colTableList.get(0).getRowNum()-1); +// for(int c=0;c fieldList = lawsCommonMapper.getFieldList(TableNameEnum.DOCUMENT_SPLIT.getTableName()); + List fieldList = new ArrayList<>(); + // 列表展示字段 + List fieldListSelect = fieldList.stream().filter(v -> YesOrNoEnum.YES.getValue() + .equals(String.valueOf(v.getIsShowList()))).collect(Collectors.toList()); + List fieldForExport = new ArrayList<>(); + if (MessageUtils.getLanguage().getValue().equals(LanguageEnum.EN.getValue())){ + fieldForExport = fieldListSelect.stream().map(LawsTag::getDbFieldEnName).collect(Collectors.toList()); + } else { + fieldForExport = fieldListSelect.stream().map(LawsTag::getDbFieldTxt).collect(Collectors.toList()); + } + return StringUtils.join(fieldForExport, ",").split(","); + } + @Override public int deleteByMenuIds(List idList) { return dao.deleteByMenuIds(idList); } + /** + * 获取导出文件的表头对应的数据库字段 + * + * @return + */ + @Override + public String getFieldForExport() { + // 查询条款表所有字段 +// List fieldList = onlCgformFieldService.getFieldList(ModuleEnum.FILE_SPLIT_ITEMS.getValue()); +// List fields = fieldList.stream() +// .filter(e-> YesOrNoEnum.YES.getValue().equals(String.valueOf(e.getIsShowForm())) || "条款内容".equals(e.getDbFieldTxt())) +// .sorted(Comparator.comparing(OnlCgformField::getOrderNum)) // 必须按顺序 才能导出时表头和数据一致 +// .map(OnlCgformField::getDbFieldName) +// .collect(Collectors.toList()); + + + // 查询全部字段列表 +// List fieldList = lawsCommonMapper.getFieldList(TableNameEnum.DOCUMENT_SPLIT.getTableName()); + List fieldList = new ArrayList<>(); + // 列表展示字段 + List fieldListSelect = fieldList.stream().filter(v -> YesOrNoEnum.YES.getValue() + .equals(String.valueOf(v.getIsShowList()))).map(LawsTag::getDbFieldName).collect(Collectors.toList()); + return StringUtils.join(fieldListSelect, ","); + } + @Override public int insertForeach(List messageList) { // 解决一次批量插入太多 PacketTooBigException 异常