diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/poi/excel/handler/ExcelFillCellMergeStrategy.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/poi/excel/handler/ExcelFillCellMergeStrategy.java new file mode 100644 index 0000000000..6b08ca5e74 --- /dev/null +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/poi/excel/handler/ExcelFillCellMergeStrategy.java @@ -0,0 +1,114 @@ +package com.epmet.commons.tools.utils.poi.excel.handler; + +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.write.handler.CellWriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteTableHolder; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.util.CellRangeAddress; + +import java.util.List; + +/** + * desc:单元格合并策略 + * @author liujianjun + */ +public class ExcelFillCellMergeStrategy implements CellWriteHandler { + + private int[] mergeColumnIndex; + private int mergeRowIndex; + + public ExcelFillCellMergeStrategy() { + } + + public ExcelFillCellMergeStrategy(int mergeRowIndex, int[] mergeColumnIndex) { + this.mergeRowIndex = mergeRowIndex; + this.mergeColumnIndex = mergeColumnIndex; + } + + @Override + public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) { + + } + + @Override + public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + // 隐藏id列 + writeSheetHolder.getSheet().setColumnHidden(0, true); + } + + @Override + public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List> list, Cell cell, Head head, Integer integer, Boolean aBoolean) { + int curRowIndex = cell.getRowIndex(); + int curColIndex = cell.getColumnIndex(); + int size = list.size(); + System.out.println(size); + if (mergeColumnIndex == null) { + if (curRowIndex > 2) { + mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex); + } + }else{ + if (curRowIndex > mergeRowIndex) { + for (int i = 0; i < mergeColumnIndex.length; i++) { + if (curColIndex == mergeColumnIndex[i]) { + mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex); + break; + } + } + } + } + } + + /** + * 当前单元格向上合并 + * + * @param writeSheetHolder + * @param cell 当前单元格 + * @param curRowIndex 当前行 + * @param curColIndex 当前列 + */ + private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) { + //writeSheetHolder.getExcelWriteHeadProperty(). + // 当前行的第一个Cell + Cell curFirstCell = cell.getSheet().getRow(curRowIndex).getCell(0); + Object curFirstData = curFirstCell.getCellType() == CellType.STRING ? curFirstCell.getStringCellValue() : curFirstCell.getNumericCellValue(); + // 上一行的第一个Cell + Cell preFirstCell = cell.getSheet().getRow(curRowIndex - 1).getCell(0); + Object preFirstData = preFirstCell.getCellType() == CellType.STRING ? preFirstCell.getStringCellValue() : preFirstCell.getNumericCellValue(); + + if (curFirstData.equals(preFirstData)) { + Object curData = cell.getCellType() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue(); + Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex); + Object preData = preCell.getCellType() == CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue(); + // 将当前单元格数据与上一个单元格数据比较 + Boolean dataBool = preData.equals(curData); + //此处需要注意:因为我是按照序号确定是否需要合并的,所以获取每一行第一列数据和上一行第一列数据进行比较,如果相等合并 + Boolean bool = cell.getRow().getCell(0).getStringCellValue().equals(cell.getSheet().getRow(curRowIndex - 1).getCell(0).getStringCellValue()); + if (dataBool && bool) { + Sheet sheet = writeSheetHolder.getSheet(); + List mergeRegions = sheet.getMergedRegions(); + boolean isMerged = false; + for (int i = 0; i < mergeRegions.size() && !isMerged; i++) { + CellRangeAddress cellRangeAddr = mergeRegions.get(i); + // 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元 + if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) { + sheet.removeMergedRegion(i); + cellRangeAddr.setLastRow(curRowIndex); + sheet.addMergedRegion(cellRangeAddr); + isMerged = true; + } + } + // 若上一个单元格未被合并,则新增合并单元 + if (!isMerged) { + CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex); + sheet.addMergedRegion(cellRangeAddress); + } + } + } + } + +} diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/poi/excel/handler/ExcelMergeStrategy.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/poi/excel/handler/ExcelMergeStrategy.java new file mode 100644 index 0000000000..141c7de5d7 --- /dev/null +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/poi/excel/handler/ExcelMergeStrategy.java @@ -0,0 +1,213 @@ +package com.epmet.commons.tools.utils.poi.excel.handler; + +/** + * desc: + * + * @author: LiuJanJun + * @date: 2022/4/26 1:36 下午 + * @version: 1.0 + */ + +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.metadata.data.CellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.write.handler.CellWriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteTableHolder; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.util.CellRangeAddress; + +import java.util.List; +import java.util.Objects; +import java.util.stream.IntStream; + +/** + * 相同值合并策略 + */ + +public class ExcelMergeStrategy implements CellWriteHandler { + + /** + * 合并起始行 + */ + + private int mergeRowIndex; + /** + * 多少行合并一次 + */ + + private int eachRow; + + /** + * 合并字段的下标 + */ + + private int[] mergeColumnIndex; + + public ExcelMergeStrategy(int mergeRowIndex, int[] mergeColumnIndex, int eachRow) { + + if (mergeRowIndex < 0) { + + throw new IllegalArgumentException("mergeRowIndex must be greater than 0"); + + } + + if (eachRow < 0) { + + throw new IllegalArgumentException("eachRow must be greater than 0"); + + } + + this.mergeRowIndex = mergeRowIndex; + + this.mergeColumnIndex = mergeColumnIndex; + + this.eachRow = eachRow; + + } + + @Override + + public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) { + } + + @Override + + public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + } + + // @Override + public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + + int curRowIndex = cell.getRowIndex(); + +//当前列 + + int curColIndex = cell.getColumnIndex(); + +//合并条件: + +//1.当前行>合并起始行,默认标题行(0)不参加合并 + +//2.间隔行(eachRow)的上下两条不参加合并 + +//2.1间隔行(eachRow)==0时,不设置间隔 + + if (isMerge(curRowIndex)) { + + IntStream.range(0, mergeColumnIndex.length).anyMatch(i -> { + + if (curColIndex == mergeColumnIndex[i]) { + + mergeWithPrevRow(writeSheetHolder, cellData, cell, curRowIndex, curColIndex); + + return true; + + } + + return false; + + }); + + } + + } + + @Override + public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + } + + /** + * 判断是否合并 + *

+ * 1.当前位置必须大于开始位置:curRowIndex > mergeRowIndex + *

+ * 2.根据eachRow 判断数据分割的间隔 + *

+ * 2.1如果根据eachRow=0,默认不合并 + *

+ * 2.2如果1如果根据eachRow>0,分割后的第一条数据不会与之前的合并:(curRowIndex-mergeRowIndex)%eachRow==0 + * + * @return + */ + + private boolean isMerge(Integer curRowIndex) { + if ((curRowIndex > mergeRowIndex) && eachRow > 0) { + + if ((curRowIndex - mergeRowIndex) % eachRow == 0) { + + return false; + + } + + return true; + + } + return false; + + } + + private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, CellData cellData, Cell cell, int curRowIndex, int curColIndex) { + +//获取当前行的当前列的数据和上一行的当前列列数据,通过上一行数据是否相同进行合并 + + Object curData = cellData.getType() == CellDataTypeEnum.STRING ? cellData.getStringValue() : cellData.getNumberValue(); + + Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex); + + Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() : + + preCell.getNumericCellValue(); + +// 比较当前行的第一列的单元格与上一行是否相同,相同合并当前单元格与上一行 + + if (Objects.equals(curData, preData)) { + + Sheet sheet = writeSheetHolder.getSheet(); + + List mergeRegions = sheet.getMergedRegions(); + + boolean isMerged = false; + + for (int i = 0; i < mergeRegions.size() && !isMerged; i++) { + + CellRangeAddress cellRangeAddr = mergeRegions.get(i); + +// 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元 + + if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) { + + sheet.removeMergedRegion(i); + + cellRangeAddr.setLastRow(curRowIndex); + + sheet.addMergedRegion(cellRangeAddr); + + isMerged = true; + + } + + } + +// 若上一个单元格未被合并,则新增合并单元 + + if (!isMerged) { + + CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, + + curColIndex); + + sheet.addMergedRegion(cellRangeAddress); + + } + + } + + } + +} + diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/ConditionResultDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/ConditionResultDTO.java index fe2e7b03cb..4d0a000b8a 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/ConditionResultDTO.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/ConditionResultDTO.java @@ -91,5 +91,10 @@ public class ConditionResultDTO implements Serializable { private String funType; private List options; + + /** + * 这个表 是否支持添加 即是否是多对一 eg:居民需求是多个对一个 + */ + private boolean supportAdd; } diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/IcCustomExportResultDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/IcCustomExportResultDTO.java index 3b5ad1cdf2..31f09c2be0 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/IcCustomExportResultDTO.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/IcCustomExportResultDTO.java @@ -1,8 +1,10 @@ package com.epmet.dto.result; +import com.epmet.commons.tools.constant.NumConstant; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import org.springframework.util.CollectionUtils; import java.io.Serializable; import java.util.ArrayList; @@ -26,6 +28,10 @@ public class IcCustomExportResultDTO implements Serializable { private List> headers = new ArrayList<>(); + + private Integer headerRow; + + /** * sql中要返回的 列名 顺序跟表头顺序一致 */ @@ -42,9 +48,22 @@ public class IcCustomExportResultDTO implements Serializable { public static class SqlColumn { private String itemId; private String tableName; + private Boolean manyToOne; private String columnName; private String optionSourceType; - private String optionSourceValue; } + /** + * desc:获取有几行头 + * @return + */ + public Integer getHeaderRow() { + if (CollectionUtils.isEmpty(headers)){ + return NumConstant.ZERO; + } + return headers.stream().mapToInt(List::size).max().orElse(0); + } + + + } diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/IcExportTemplateForExportResultDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/IcExportTemplateForExportResultDTO.java index 3e00f6e072..d8ad9b8e5a 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/IcExportTemplateForExportResultDTO.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/IcExportTemplateForExportResultDTO.java @@ -57,6 +57,9 @@ public class IcExportTemplateForExportResultDTO implements Serializable { private String columnName; private String optionSourceValue; - private String optionSourceType; + /** + * 是否支持添加 即是否是多对一 eg:居民需求是多个对一个 + */ + private boolean supportAdd; } diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/SubTableJoinDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/SubTableJoinDTO.java index a7b950d891..e0ccb7c850 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/SubTableJoinDTO.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/SubTableJoinDTO.java @@ -10,4 +10,8 @@ public class SubTableJoinDTO implements Serializable { private static final long serialVersionUID = 8243764437194993736L; private String tableName; private String joinTableSql; + /** + * 是否支持添加一行,1支持,默认0不支持 + */ + private Boolean supportAdd; } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcExportTemplateServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcExportTemplateServiceImpl.java index 50fb337bcd..5bb93a162a 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcExportTemplateServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcExportTemplateServiceImpl.java @@ -229,7 +229,7 @@ public class IcExportTemplateServiceImpl extends BaseServiceImpl> resultTemp, IcExportTemplateForExportResultDTO root, List> headerList, List showSqlColumns, List hiddenSqlColumns, Set hasExistColumnSet) { if (StringUtils.isNotBlank(root.getColumnName())) { - showSqlColumns.add(new IcCustomExportResultDTO.SqlColumn(root.getItemId(),root.getTableName(), root.getColumnName(),root.getOptionSourceType(),root.getOptionSourceValue())); + showSqlColumns.add(new IcCustomExportResultDTO.SqlColumn(root.getItemId(),root.getTableName(),root.isSupportAdd(), root.getColumnName(),root.getOptionSourceValue())); if (StringUtils.isNotBlank(root.getOptionSourceValue())&&root.getOptionSourceValue().contains(StrConstant.QUESTION_MARK)) { String[] paramArr = root.getOptionSourceValue().split(StrConstant.QUESTION_MARK_TRANSFER)[NumConstant.ONE].split(StrConstant.AND_MARK); //先remote中再添加 然后移除item中有的 diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcExportTemplateDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcExportTemplateDao.xml index 29b847ff64..fb453591f5 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcExportTemplateDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcExportTemplateDao.xml @@ -20,8 +20,17 @@ select temp.TABLE_NAME as tableName, - CONCAT('left join ',temp.TABLE_NAME, ' on ( ic_resi_user.ID=',temp.TABLE_NAME,'.IC_RESI_USER and ',temp.TABLE_NAME,'.del_flag="0" )') as joinTableSql + CONCAT('left join ',temp.TABLE_NAME, ' on ( ic_resi_user.ID=',temp.TABLE_NAME,'.IC_RESI_USER and ',temp.TABLE_NAME,'.del_flag="0" )') as joinTableSql, + SUPPORT_ADD as supportAdd from ( SELECT DISTINCT - m.TABLE_NAME + m.TABLE_NAME, + m.SUPPORT_ADD FROM ic_form_item_group m WHERE diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index f2f7a81797..9392de35a4 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -62,7 +62,8 @@ public interface IcResiUserDao extends BaseDao { @Param("currentStaffAgencyId") String currentStaffAgencyId, @Param("staffOrgPath") String staffOrgPath, @Param("resultTableName") String resultTableName, - @Param("keyword") String keyword); + @Param("keyword") String keyword, + @Param("groupByTables")Set groupByTables); /** * 查询主表 @@ -108,7 +109,8 @@ public interface IcResiUserDao extends BaseDao { @Param("conditions") List conditions, @Param("subTables") List subTables, @Param("showSqlColumns") List showSqlColumns, @Param("currentStaffAgencyId") String currentStaffAgencyId, - @Param("staffOrgPath") String staffOrgPath); + @Param("staffOrgPath") String staffOrgPath, + @Param("groupByTables") List groupByTables); /** * @param userId diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserExportServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserExportServiceImpl.java index ab4667f026..14b772af77 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserExportServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserExportServiceImpl.java @@ -22,6 +22,7 @@ import com.epmet.commons.tools.utils.ExcelUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.utils.SpringContextUtils; import com.epmet.commons.tools.utils.poi.excel.FreezeAndFilter; +import com.epmet.commons.tools.utils.poi.excel.handler.ExcelFillCellMergeStrategy; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.constant.IcResiUserConstant; import com.epmet.dto.form.ExportResiUserFormDTO; @@ -90,14 +91,6 @@ public class IcResiUserExportServiceImpl implements IcResiUserExportService { String templateId = exportResiUserFormDTO.getTemplateId(); - // 头的策略 - WriteCellStyle headWriteCellStyle = new WriteCellStyle(); - // 背景设置为红色 - headWriteCellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex()); - HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle,new WriteCellStyle()); - - - ExcelWriter excelWriter = null; try { //获取用户配置的导出条件 @@ -106,17 +99,44 @@ public class IcResiUserExportServiceImpl implements IcResiUserExportService { Map itemOriginMap = getItemMap(searchForm.getCustomerId()); IcCustomExportResultDTO exportConfigData = exportConfigResult.getData(); log.info("查询到的模板配置信息:{}", JSON.toJSONString(exportConfigData)); + + CustomerStaffInfoCacheResult staffInfoCacheResult = CustomerStaffRedis.getStaffInfo(searchForm.getCustomerId(), searchForm.getStaffId()); + if (staffInfoCacheResult == null){ + throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(),"获取工作人员信息失败"); + } + + List allShowColumns = new ArrayList<>(exportConfigData.getShowSqlColumns()); + + + //需要合并的列 + List mergeColumnIndexList = new ArrayList<>(); + for (int i = 0; i < allShowColumns.size(); i++) { + IcCustomExportResultDTO.SqlColumn sqlColumn = allShowColumns.get(i); + if (!sqlColumn.getManyToOne()){ + mergeColumnIndexList.add(i); + } + } + + int[] mergeColumnIndex = mergeColumnIndexList.stream().filter(Objects::nonNull).mapToInt(i->i).toArray(); + + // 从那一列开始合并 + int mergeRowIndex = exportConfigData.getHeaderRow(); + + // 头的策略 + WriteCellStyle headWriteCellStyle = new WriteCellStyle(); + // 背景设置为红色 + headWriteCellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex()); + HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle,new WriteCellStyle()); FreezeAndFilter writeHandler = new FreezeAndFilter(); - excelWriter = EasyExcel.write(ExcelUtils.getOutputStreamForExcel("居民基本信息.xlsx", response)).registerWriteHandler(writeHandler).build(); + excelWriter = EasyExcel.write(ExcelUtils.getOutputStreamForExcel("居民基本信息.xlsx", response)) + .registerWriteHandler(new ExcelFillCellMergeStrategy(mergeRowIndex, mergeColumnIndex)) + .registerWriteHandler(writeHandler).build(); + WriteSheet writeSheet = EasyExcel.writerSheet() .registerWriteHandler(horizontalCellStyleStrategy) .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) .head(exportConfigData.getHeaders()).build(); - CustomerStaffInfoCacheResult staffInfoCacheResult = CustomerStaffRedis.getStaffInfo(searchForm.getCustomerId(), searchForm.getStaffId()); - if (staffInfoCacheResult == null){ - throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(),"获取工作人员信息失败"); - } String staffOrgPath = null; if (StringUtils.isNotBlank(staffInfoCacheResult.getAgencyPIds()) && !NumConstant.ZERO_STR.equals(staffInfoCacheResult.getAgencyPIds())) { staffOrgPath = staffInfoCacheResult.getAgencyPIds().concat(StrConstant.COLON).concat(staffInfoCacheResult.getAgencyId()); @@ -124,7 +144,7 @@ public class IcResiUserExportServiceImpl implements IcResiUserExportService { staffOrgPath = staffInfoCacheResult.getAgencyId(); } Page> mapListPage = null; - List allShowColumns = new ArrayList<>(exportConfigData.getShowSqlColumns()); + allShowColumns.addAll(exportConfigData.getHiddenSqlColumns()); do { String finalStaffOrgPath = staffOrgPath; @@ -204,8 +224,15 @@ public class IcResiUserExportServiceImpl implements IcResiUserExportService { Result exportConfigResult = operCustomizeOpenFeignClient.getExcelHeaderAndSqlColumnForExport(param); if (!exportConfigResult.success() || exportConfigResult.getData() == null) { log.error("获取模板失败"); - throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(),"获取模板失败"); + throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(),"获取模板失败"+exportConfigResult.getInternalMsg()); } + IcCustomExportResultDTO data = exportConfigResult.getData(); + + //添加一个虚拟列Id 用于分组 + data.getShowSqlColumns().add(0,new IcCustomExportResultDTO.SqlColumn(null,"ic_resi_user",false,"ID","local")); + List id = new ArrayList<>(); + id.add("ID"); + data.getHeaders().add(0, id); return exportConfigResult; } @@ -258,6 +285,9 @@ public class IcResiUserExportServiceImpl implements IcResiUserExportService { } private String putOptionValue(FormItemResult e, String vauleStr) { + if (e == null){ + return vauleStr; + } FormItemTypeEnum itemTypeEnum = FormItemTypeEnum.getEnum(e.getItemType()); switch (itemTypeEnum) { case CHECKBOX: diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index e94a579d9f..0bcd38c55d 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -554,14 +554,18 @@ public class IcResiUserServiceImpl extends BaseServiceImpl finalSubTables = new ArrayList<>(); - subTables.forEach(subTable -> { - if (tables.contains(subTable.getTableName())) { + List finalSubTables =new ArrayList<>(); + //groupBy用到的表 + Set groupByTables=new HashSet<>(); + subTables.forEach(subTable->{ + if(tables.contains(subTable.getTableName())){ finalSubTables.add(subTable.getJoinTableSql()); + if(subTable.getSupportAdd()){ + groupByTables.add(subTable.getTableName()); + } } }); - PageInfo> pageInfo=new PageInfo<>(); if (null == formDTO.getIsPage()||formDTO.getIsPage()) { //分页 @@ -572,17 +576,19 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> list = baseDao.selectListResiMap(formDTO.getCustomerId(), + staffInfoCacheResult.getAgencyId(), finalStaffOrgPath,null, formDTO.getKeyword(), + groupByTables)); + }else{ + List> list=baseDao.selectListResiMap(formDTO.getCustomerId(), formDTO.getFormCode(), formDTO.getConditions(), resultColumns, finalSubTables, staffInfoCacheResult.getAgencyId(), - staffOrgPath, null, - formDTO.getKeyword()); - pageInfo.setTotal(CollectionUtils.isEmpty(list) ? NumConstant.ZERO : list.size()); + staffOrgPath,null, + formDTO.getKeyword(), + groupByTables); + pageInfo.setTotal(CollectionUtils.isEmpty(list)?NumConstant.ZERO:list.size()); pageInfo.setList(list); } @@ -748,13 +754,14 @@ public class IcResiUserServiceImpl extends BaseServiceImpl conditions, String currentStaffAgencyId, String staffOrgPath){ - List finalSubTables = getFinalSubables(customerId, formCode, resultTableName, conditions); - - return baseDao.dynamicQuery(customerId,resultTableName,conditions,finalSubTables, null, currentStaffAgencyId,staffOrgPath); + // List finalSubTables = getFinalSubables(customerId, formCode, resultTableName, conditions); + Map> map=getFinalSubables(customerId, formCode, resultTableName, conditions, null); + return baseDao.dynamicQuery(customerId,resultTableName,conditions,map.get("finalSubTables"), null, currentStaffAgencyId,staffOrgPath,map.get("groupByTables")); } @NotNull - public List getFinalSubables(String customerId, String formCode, String resultTableName, List conditions) { + public Map> getFinalSubables(String customerId, String formCode, String resultTableName, List conditions, List exportNeedTableList) { + Map> map=new HashMap<>(); CustomerFormQueryDTO queryDTO=new CustomerFormQueryDTO(); queryDTO.setCustomerId(customerId); queryDTO.setFormCode(formCode); @@ -767,15 +774,25 @@ public class IcResiUserServiceImpl extends BaseServiceImpl whereConditionTables=conditions.stream().map(ResiUserQueryValueDTO::getTableName).collect(Collectors.toSet()); Set tables = new HashSet<>(whereConditionTables); tables.add(resultTableName); + if (CollectionUtils.isNotEmpty(exportNeedTableList)){ + tables.addAll(exportNeedTableList); + } // log.info("2、查询条件+查询列对应的tables并集去重:"+ JSON.toJSONString(tables,true)); //最终关联的子表对应的sql: List finalSubTables =new ArrayList<>(); + //groupBy用到的表 + Set groupByTables=new HashSet<>(); subTables.forEach(subTable->{ if(tables.contains(subTable.getTableName())){ finalSubTables.add(subTable.getJoinTableSql()); + if(subTable.getSupportAdd()){ + groupByTables.add(subTable.getTableName()); + } } }); - return finalSubTables; + map.put("finalSubTables",finalSubTables); + map.put("groupByTables",groupByTables.stream().collect(Collectors.toList())); + return map; } /** @@ -1687,8 +1704,10 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> dynamicQuery(String customerId, String formCode, String resultTableName, List showSqlColumns, List conditions, String currentStaffAgencyId, String staffOrgPath) { - List finalSubTables = getFinalSubables(customerId, formCode, resultTableName, conditions); - return baseDao.dynamicQuery(customerId,resultTableName,conditions,finalSubTables,showSqlColumns,currentStaffAgencyId,staffOrgPath); + // List finalSubTables = getFinalSubables(customerId, formCode, resultTableName, conditions); + List exportNeedTableList = showSqlColumns.stream().map(IcCustomExportResultDTO.SqlColumn::getTableName).collect(Collectors.toList()); + Map> map=getFinalSubables(customerId, formCode, resultTableName, conditions, exportNeedTableList); + return baseDao.dynamicQuery(customerId,resultTableName,conditions,map.get("finalSubTables"),showSqlColumns,currentStaffAgencyId,staffOrgPath,map.get("groupByTables")); } } diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index e1dd2c0899..2f7b823bb5 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -160,6 +160,11 @@ group by IC_RESI_USER.id + + + ${groupTableName}.ID + + order by ic_resi_user.CREATED_TIME desc @@ -193,6 +198,11 @@ group by IC_RESI_USER.id + + + ${groupTableName}.ID + + order by ic_resi_user.CREATED_TIME desc