diff --git a/src/com/engine/salary/constant/SalaryItemConstant.java b/src/com/engine/salary/constant/SalaryItemConstant.java index 26bac736b..a1f0d9a1b 100644 --- a/src/com/engine/salary/constant/SalaryItemConstant.java +++ b/src/com/engine/salary/constant/SalaryItemConstant.java @@ -25,5 +25,10 @@ public class SalaryItemConstant { */ public static final String RESULT_EXPORT_FIELD_SIGN="_salaryAcctResultExportFieldSign"; + /** + * 个税申报在线对比缓存表头字段key + */ + public static final String TAX_DECLARE_CONTRAST_FIELD_SIGN="_taxDeclareContrastFieldSign"; + } diff --git a/src/com/engine/salary/entity/taxdeclaration/dto/TaxReportColumnDTO.java b/src/com/engine/salary/entity/taxdeclaration/dto/TaxReportColumnDTO.java new file mode 100644 index 000000000..aa55a89f0 --- /dev/null +++ b/src/com/engine/salary/entity/taxdeclaration/dto/TaxReportColumnDTO.java @@ -0,0 +1,37 @@ +package com.engine.salary.entity.taxdeclaration.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 个税申报表表头 + *

Copyright: Copyright (c) 2023

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TaxReportColumnDTO { + + /** + * 主键id + */ + private Long id; + + /** + * 申报表的列名 + */ + private String reportColumnName; + + /** + * 申报表的列索引 + */ + private String reportColumnDataIndex; + +} diff --git a/src/com/engine/salary/entity/taxdeclaration/param/ContrastQueryParam.java b/src/com/engine/salary/entity/taxdeclaration/param/ContrastQueryParam.java index e1a24429e..7fa470450 100644 --- a/src/com/engine/salary/entity/taxdeclaration/param/ContrastQueryParam.java +++ b/src/com/engine/salary/entity/taxdeclaration/param/ContrastQueryParam.java @@ -3,6 +3,8 @@ package com.engine.salary.entity.taxdeclaration.param; import com.engine.salary.common.BaseQueryParam; import lombok.Data; +import java.util.List; + /** * 对比查询 *

Copyright: Copyright (c) 2023

@@ -28,4 +30,9 @@ public class ContrastQueryParam extends BaseQueryParam { * 是否只显示差异项 */ private boolean onlyShowDiffItem; + + /** + * 筛选对比项目 + */ + private List columns; } diff --git a/src/com/engine/salary/service/TaxDeclarationValueService.java b/src/com/engine/salary/service/TaxDeclarationValueService.java index 89de2d361..8fabdd5d7 100644 --- a/src/com/engine/salary/service/TaxDeclarationValueService.java +++ b/src/com/engine/salary/service/TaxDeclarationValueService.java @@ -1,6 +1,7 @@ package com.engine.salary.service; import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationValueListDTO; +import com.engine.salary.entity.taxdeclaration.dto.TaxReportColumnDTO; import com.engine.salary.entity.taxdeclaration.param.ContrastQueryParam; import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationValueListQueryParam; import com.engine.salary.entity.taxdeclaration.param.TaxDeclareRecordDetailSaveParam; @@ -8,6 +9,7 @@ import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationPO; import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationValuePO; import com.engine.salary.entity.taxdeclaration.po.TaxDeclareRecordPO; import com.engine.salary.util.page.PageInfo; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.util.Collection; import java.util.List; @@ -94,10 +96,27 @@ public interface TaxDeclarationValueService { */ Map contrast(ContrastQueryParam param); + /** + * 在线对比表头列表 + * @param param + */ + Map> contrastHeaderList(ContrastQueryParam param); + + /** + * 缓存在线对比表头列表 + * @param columnIndex + */ + void cacheContrastHeader(List columnIndex); + + /** + * 导出在线对比 + */ + XSSFWorkbook exportContrast(ContrastQueryParam param); /** * 根据主键删除 * @param deleteId */ void deleteById(Long deleteId); + } diff --git a/src/com/engine/salary/service/impl/TaxDeclarationValueServiceImpl.java b/src/com/engine/salary/service/impl/TaxDeclarationValueServiceImpl.java index 913dfdf7b..9465f88c8 100644 --- a/src/com/engine/salary/service/impl/TaxDeclarationValueServiceImpl.java +++ b/src/com/engine/salary/service/impl/TaxDeclarationValueServiceImpl.java @@ -1,10 +1,12 @@ package com.engine.salary.service.impl; import cn.hutool.core.util.NumberUtil; +import com.cloudstore.dev.api.util.Util_DataCache; import com.cloudstore.eccom.pc.table.WeaTableColumn; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.constant.SalaryDefaultTenantConstant; +import com.engine.salary.constant.SalaryItemConstant; import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.employeedeclare.po.EmployeeDeclarePO; @@ -12,6 +14,7 @@ import com.engine.salary.entity.extemp.po.ExtEmpPO; import com.engine.salary.entity.taxdeclaration.bo.TaxDeclarationValueList; import com.engine.salary.entity.taxdeclaration.dto.ContrastListDTO; import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationValueListDTO; +import com.engine.salary.entity.taxdeclaration.dto.TaxReportColumnDTO; import com.engine.salary.entity.taxdeclaration.param.ContrastQueryParam; import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationValueListQueryParam; import com.engine.salary.entity.taxdeclaration.param.TaxDeclareRecordDetailSaveParam; @@ -33,15 +36,17 @@ import com.engine.salary.service.*; import com.engine.salary.util.JsonUtil; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryEnumUtil; +import com.engine.salary.util.db.IdGenerator; import com.engine.salary.util.db.MapperProxyFactory; +import com.engine.salary.util.excel.ExcelUtilPlus; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import com.engine.salary.util.db.IdGenerator; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import weaver.general.Util; import weaver.hrm.User; @@ -321,6 +326,22 @@ public class TaxDeclarationValueServiceImpl extends Service implements TaxDeclar // 查询个税申报表表头 IncomeCategoryEnum incomeCategoryEnum = SalaryEnumUtil.enumMatchByValue(taxDeclaration.getIncomeCategory(), IncomeCategoryEnum.class); List taxReportColumns = getTaxReportColumnService(user).listByIncomeCategory(incomeCategoryEnum); + // 筛选表头 + // 获取缓存中保存的设置 + String cacheKey = user.getUID() + SalaryItemConstant.TAX_DECLARE_CONTRAST_FIELD_SIGN; + String cacheValue = (String) Util_DataCache.getObjVal(cacheKey); + List selectedItems = JsonUtil.parseList(cacheValue, String.class) == null ? new ArrayList<>() : JsonUtil.parseList(cacheValue, String.class); + if (CollectionUtils.isNotEmpty(selectedItems)) { + Map columnMap = SalaryEntityUtil.convert2Map(taxReportColumns, TaxReportColumnPO::getReportColumnDataIndex); + List finalColumn = new ArrayList<>(); + selectedItems.stream().forEach(index -> { + TaxReportColumnPO c = columnMap.get(index); + if (c!=null) { + finalColumn.add(c); + } + }); + taxReportColumns = finalColumn; + } List columns = SalaryEntityUtil.properties(taxReportColumns, TaxReportColumnPO::getReportColumnName, Collectors.toList()); // 人员id Set employeeIds = SalaryEntityUtil.properties(taxDeclarationValues, TaxDeclarationValuePO::getEmployeeId); @@ -370,6 +391,7 @@ public class TaxDeclarationValueServiceImpl extends Service implements TaxDeclar for (Map local : localList) { AtomicBoolean hasDiff = new AtomicBoolean(false); Map result = new HashMap<>(); + result.put("工号", local.get("jobNum")); result.put("姓名", local.get("姓名")); result.put("证件类型", local.get("证件类型")); result.put("证件号码", local.get("证件号码")); @@ -413,6 +435,72 @@ public class TaxDeclarationValueServiceImpl extends Service implements TaxDeclar return resultList; } + @Override + public Map> contrastHeaderList(ContrastQueryParam param) { + Map> resultMap = new HashMap<>(); + TaxDeclarationPO taxDeclaration = getTaxDeclarationService(user).getById(param.getTaxDeclarationId()); + if (taxDeclaration == null) { + throw new SalaryRunTimeException("无申报表"); + } + // 查询个税申报表表头 + IncomeCategoryEnum incomeCategoryEnum = SalaryEnumUtil.enumMatchByValue(taxDeclaration.getIncomeCategory(), IncomeCategoryEnum.class); + List taxReportColumns = getTaxReportColumnService(user).listByIncomeCategory(incomeCategoryEnum); + List defaultDtoList = new ArrayList<>(); + taxReportColumns.stream().forEach(po -> {defaultDtoList.add(TaxReportColumnDTO.builder().id(po.getId()).reportColumnName(po.getReportColumnName()).reportColumnDataIndex(po.getReportColumnDataIndex()).build());}); + resultMap.put("defaultList",defaultDtoList); + // 获取缓存中保存的设置 + String cacheKey = user.getUID() + SalaryItemConstant.TAX_DECLARE_CONTRAST_FIELD_SIGN; + String cacheValue = (String) Util_DataCache.getObjVal(cacheKey); + List selectedItems = JsonUtil.parseList(cacheValue, String.class) == null ? new ArrayList<>() : JsonUtil.parseList(cacheValue, String.class); + if (CollectionUtils.isEmpty(selectedItems)) { + // 默认全选 + resultMap.put("selectedList", defaultDtoList); + resultMap.put("unSelectedList", Collections.emptyList()); + } else { + Map columnMap = SalaryEntityUtil.convert2Map(defaultDtoList, TaxReportColumnDTO::getReportColumnDataIndex); + List selectedColumn = new ArrayList<>(); + selectedItems.stream().forEach(index -> { + TaxReportColumnDTO taxReportColumnDTO = columnMap.get(index); + if (taxReportColumnDTO != null) { + // 已选择的项目 + selectedColumn.add(taxReportColumnDTO); + } + }); + // 过滤出未选择的项目 + List unSelectedList = defaultDtoList.stream().filter(po -> !selectedItems.contains(po.getReportColumnDataIndex())).collect(Collectors.toList()); + resultMap.put("selectedList", selectedColumn); + resultMap.put("unSelectedList", unSelectedList); + } + + return resultMap; + } + + @Override + public void cacheContrastHeader(List columnIndex) { + String cacheKey = user.getUID() + SalaryItemConstant.TAX_DECLARE_CONTRAST_FIELD_SIGN; + Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(columnIndex)); + } + + @Override + public XSSFWorkbook exportContrast(ContrastQueryParam param) { + param.setPageSize(1000000000); + param.setCurrent(1); + // 获取线下对比结果 + Map contrastMap = contrast(param); + List header = (List)contrastMap.get("columns"); + PageInfo> pageInfo = (PageInfo>)contrastMap.get("pageInfo"); + List> list = pageInfo.getList(); + + List empInfoColumns = new ArrayList<>(); + empInfoColumns.add(new WeaTableColumn("100px", "工号", "jobNum")); + empInfoColumns.add(new WeaTableColumn("100px", "姓名", "username")); + empInfoColumns.add(new WeaTableColumn("100px", "证件类型", "cardType")); + empInfoColumns.add(new WeaTableColumn("100px", "证件号码", "cardNum")); + + return ExcelUtilPlus.genWorkbook4TaxDeclareContrast(empInfoColumns, header, list, "在线对比结果"); + + } + @Override public void deleteById(Long deleteId) { getTaxDeclarationValueMapper().deleteByIds(Collections.singletonList(deleteId)); diff --git a/src/com/engine/salary/util/excel/ExcelUtilPlus.java b/src/com/engine/salary/util/excel/ExcelUtilPlus.java index b9aee0531..cdf73e282 100644 --- a/src/com/engine/salary/util/excel/ExcelUtilPlus.java +++ b/src/com/engine/salary/util/excel/ExcelUtilPlus.java @@ -1,8 +1,11 @@ package com.engine.salary.util.excel; +import com.cloudstore.eccom.pc.table.WeaTableColumn; import com.engine.salary.component.WeaTableColumnGroup; +import com.engine.salary.entity.taxdeclaration.dto.ContrastListDTO; import com.engine.salary.util.SalaryDateUtil; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.*; @@ -10,6 +13,7 @@ import org.springframework.beans.BeanUtils; import java.awt.Color; import java.math.BigDecimal; +import java.util.List; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -691,23 +695,29 @@ public class ExcelUtilPlus { } public static float getFinalHeight(Object o, int width, float finalHeight, float height) { - if (o != null && getStrlength(o.toString()) > width) { - float remainder = getStrlength(o.toString()) % width; - int multiple = getStrlength(o.toString()) / width; - int finalMultiple = remainder > 0 ? (multiple + 1) : multiple; - float compareHeight = height * finalMultiple; - finalHeight = Math.max(finalHeight, compareHeight); + if (o != null) { + if (getStrlength(o.toString()) > width || o.toString().contains("\n")) { + float remainder = getStrlength(o.toString()) % width; + int multiple = getStrlength(o.toString()) / width; + int finalMultiple = remainder > 0 ? (multiple + 1) : multiple; + // 处理换行符 + int leastMultiple = StringUtils.countMatches(o.toString(), "\n") + 1; + finalMultiple = Math.max(leastMultiple, finalMultiple); + float compareHeight = height * finalMultiple; + finalHeight = Math.max(finalHeight, compareHeight); + } } return finalHeight; } public static int getStrlength(String str) { int strLength = 0; + String finalStr = str.replace("\n", ""); String chinese = "[\u0391-\uFFE5]"; /* 获取字段值的长度,如果含中文字符,则每个中文字符长度为2,否则为1 */ - for (int i = 0; i < str.length(); i++) { + for (int i = 0; i < finalStr.length(); i++) { /* 从字符串中获取一个字符 */ - String temp = str.substring(i, i + 1); + String temp = finalStr.substring(i, i + 1); /* 判断是否为中文字符 */ if (temp.matches(chinese)) { /* 中文字符长度为2 */ @@ -720,4 +730,134 @@ public class ExcelUtilPlus { return strLength; } + + public static XSSFWorkbook genWorkbook4TaxDeclareContrast(List empInfoColumns, List header, List> rowList, String sheetName) { + XSSFWorkbook workbook = new XSSFWorkbook(); + + // 设置title样式 + XSSFCellStyle titleCellStyle = workbook.createCellStyle(); + XSSFFont titleFont = workbook.createFont(); + titleFont.setBold(true); + titleFont.setFontName("仿宋"); + titleFont.setFontHeightInPoints((short) 15); + titleCellStyle.setFont(titleFont); + titleCellStyle.setAlignment(HorizontalAlignment.CENTER); + titleCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());//背景色 + titleCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + titleCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + titleCellStyle.setBorderLeft(BorderStyle.THIN); + titleCellStyle.setBorderRight(BorderStyle.THIN); + titleCellStyle.setBorderTop(BorderStyle.THIN); + titleCellStyle.setBorderBottom(BorderStyle.THIN); + + // 设置主体样式 + XSSFCellStyle cellStyle = workbook.createCellStyle(); + XSSFFont font = workbook.createFont(); + font.setFontName("宋体"); + font.setFontHeightInPoints((short) 10);// 设置字体大小 + cellStyle.setFont(font);// 选择需要用到的字体格式 + cellStyle.setWrapText(true); + cellStyle.setAlignment(HorizontalAlignment.CENTER); + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + cellStyle.setBorderLeft(BorderStyle.THIN); + cellStyle.setBorderRight(BorderStyle.THIN); + cellStyle.setBorderTop(BorderStyle.THIN); + cellStyle.setBorderBottom(BorderStyle.THIN); + + XSSFFont fontRed = workbook.createFont(); + fontRed.setFontName("宋体"); + fontRed.setFontHeightInPoints((short) 10);// 设置字体大小 + fontRed.setColor(IndexedColors.RED.getIndex()); + + + + XSSFSheet sheet = workbook.createSheet(sheetName); + //自适应宽度 + sheet.autoSizeColumn(0, true); + //默认列宽 + sheet.setDefaultColumnWidth(20); + //默认行高 + sheet.setDefaultRowHeightInPoints(18); + + //处理合并单元格 + XSSFRow row0 = sheet.createRow(0); + + int startIndex = 0; + // 设置表头人员信息 + for (int i = 0; i < empInfoColumns.size(); i++) { + WeaTableColumn empColumn = empInfoColumns.get(i); + XSSFCell rowZeroCell = row0.createCell(startIndex, CellType.STRING); + rowZeroCell.setCellValue(empColumn.getText()); + rowZeroCell.setCellStyle(titleCellStyle); + //设置列宽 + sheet.setColumnWidth(startIndex, Math.max(19, empColumn.getText().length() * 4) * 256); + startIndex++; + } + + // 设置表头项目字段 + for (int i = 0; i < header.size(); i++) { + String h = header.get(i); + XSSFCell rowZeroCell = row0.createCell(startIndex, CellType.STRING); + rowZeroCell.setCellValue(h); + rowZeroCell.setCellStyle(titleCellStyle); + //设置列宽 + sheet.setColumnWidth(startIndex, Math.max(19, h.length() * 4) * 256); + startIndex++; + } + + // 设置行内容 + for (int rowIndex = 0; rowIndex < rowList.size(); rowIndex++) { + Map rowMap = rowList.get(rowIndex); + XSSFRow row = sheet.createRow(rowIndex + 1); + float height = 18; + float finalHeight = 18; + float maxHeight = 0; + // 设置人员信息 + for (int j = 0; j < empInfoColumns.size(); j++) { + String column = empInfoColumns.get(j).getText(); + XSSFCell cell = row.createCell(j); + String cellValue = rowMap.get(column) == null ? "" : rowMap.get(column).toString(); + cell.setCellStyle(cellStyle); + cell.setCellType(CellType.STRING); + cell.setCellValue(cellValue); + //判断是否要调整高度 + int width = sheet.getColumnWidth(j) / 256; + finalHeight = getFinalHeight(cellValue, width, finalHeight, height); + maxHeight = Math.max(finalHeight, maxHeight); + } + // 列索引 + int cellIndex = empInfoColumns.size(); + // 设置项目信息 + for (int i = 0; i < header.size(); i++) { + String h = header.get(i); + XSSFCell cell = row.createCell(cellIndex); + cell.setCellStyle(cellStyle); + + cell.setCellType(CellType.STRING); + ContrastListDTO contrastListDTO = rowMap.get(h) != null ? (ContrastListDTO)rowMap.get(h) : new ContrastListDTO(); + String local = StringUtils.isBlank(contrastListDTO.getLocal()) ? "系统值:" : "系统值:" + contrastListDTO.getLocal(); + String online = StringUtils.isBlank(contrastListDTO.getOnline()) ? "线上值:" : "线上值:" + contrastListDTO.getOnline(); + Object diff = contrastListDTO.getDiff(); + if (diff == null) { + cell.setCellValue(local + "\n" + online); + } else { + String value = local + "\n" + online + "\n差值:" + diff; + XSSFRichTextString textString = new XSSFRichTextString(value); + textString.applyFont(0, value.indexOf("差值:"), font); + textString.applyFont(value.indexOf("差值:"), value.length(), fontRed); + cell.setCellValue(textString); + } + + //判断是否要调整高度 + int width = sheet.getColumnWidth(i) / 256; + finalHeight = getFinalHeight(cell.getStringCellValue(), width, finalHeight, height); + maxHeight = Math.max(finalHeight, maxHeight); + cellIndex++; + } + + row.setHeightInPoints(maxHeight); + } + return workbook; + } + } diff --git a/src/com/engine/salary/web/TaxDeclarationController.java b/src/com/engine/salary/web/TaxDeclarationController.java index d584782ed..c3e87f616 100644 --- a/src/com/engine/salary/web/TaxDeclarationController.java +++ b/src/com/engine/salary/web/TaxDeclarationController.java @@ -296,6 +296,71 @@ public class TaxDeclarationController { return new ResponseResult>(user).run(getTaxDeclareRecordWrapper(user)::contrast, param); } + /** + * 在线对比表头列表 + * + * @param request + * @param response + * @param param + * @return + */ + @POST + @Path("/contrastHeaderList") + @Produces(MediaType.APPLICATION_JSON) + public String contrastHeaderList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody ContrastQueryParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>>(user).run(getTaxDeclareRecordWrapper(user)::contrastHeaderList, param); + } + + + /** + * 缓存在线对比表头列表 + * + * @param request + * @param response + * @param param + * @return + */ + @POST + @Path("/cacheContrastHeader") + @Produces(MediaType.APPLICATION_JSON) + public String cacheContrastHeader(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody ContrastQueryParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult, Void>(user).run(getTaxDeclareRecordWrapper(user)::cacheContrastHeader, param.getColumns()); + } + + /** + * 导出在线对比 + * + * @return + */ + @POST + @Path("/exportContrast") + @Produces(MediaType.APPLICATION_OCTET_STREAM) + public Response exportContrast(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody ContrastQueryParam param) { + + try { + User user = HrmUserVarify.getUser(request, response); + XSSFWorkbook workbook = getTaxDeclareRecordWrapper(user).exportContrast(param); + String fileName = "在线对比结果-" + LocalDate.now(); + try { + fileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + StreamingOutput output = outputStream -> { + workbook.write(outputStream); + outputStream.flush(); + }; + response.setContentType("application/octet-stream"); + return Response.ok(output).header("Content-disposition", "attachment;filename=" + fileName).header("Cache-Control", "no-cache").build(); + } catch (Exception e) { + log.error("在线对比结果导出异常", e); + throw e; + } + } + /** * 作废 diff --git a/src/com/engine/salary/wrapper/TaxDeclareRecordWrapper.java b/src/com/engine/salary/wrapper/TaxDeclareRecordWrapper.java index 8e6e13663..bec6d0d4f 100644 --- a/src/com/engine/salary/wrapper/TaxDeclareRecordWrapper.java +++ b/src/com/engine/salary/wrapper/TaxDeclareRecordWrapper.java @@ -647,6 +647,32 @@ public class TaxDeclareRecordWrapper extends Service { return getTaxDeclarationValueService(user).contrast(param); } + + /** + * 在线对比表头列表 + * @param param + */ + public Map> contrastHeaderList(ContrastQueryParam param) { + return getTaxDeclarationValueService(user).contrastHeaderList(param); + } + + /** + * 在线对比表头列表 + * @param columnIndex + */ + public void cacheContrastHeader(List columnIndex) { + getTaxDeclarationValueService(user).cacheContrastHeader(columnIndex); + } + + /** + * 导出在线对比 + * @param param + * @return + */ + public XSSFWorkbook exportContrast(ContrastQueryParam param) { + return getTaxDeclarationValueService(user).exportContrast(param); + } + /** * 刷新数据 *