package com.engine.salary.service.impl; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.annotation.SalaryTableColumn; import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationAnnualListDTO; import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationLaborListDTO; import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationWageListDTO; import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailListQueryParam; import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationPO; import com.engine.salary.enums.salarysob.IncomeCategoryEnum; import com.engine.salary.mapper.taxdeclaration.TaxDeclarationDetailMapper; import com.engine.salary.service.TaxDeclarationDetailService; import com.engine.salary.service.TaxDeclarationExcelService; import com.engine.salary.service.TaxDeclarationService; import com.engine.salary.util.JsonUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.db.MapperProxyFactory; import com.engine.salary.util.excel.ExcelUtil; import com.engine.salary.util.page.PageInfo; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import weaver.hrm.User; import java.lang.reflect.Field; import java.util.List; import java.util.Map; import java.util.Objects; /** * 个税申报表导出 *

Copyright: Copyright (c) 2022

*

Company: 泛微软件

* * @author qiantao * @version 1.0 **/ @Slf4j public class TaxDeclarationExcelServiceImpl extends Service implements TaxDeclarationExcelService { private TaxDeclarationDetailService getTaxDeclarationDetailService(User user) { return ServiceUtil.getService(TaxDeclarationDetailServiceImpl.class, user); } private TaxDeclarationDetailMapper getTaxDeclarationDetailMapper() { return MapperProxyFactory.getProxy(TaxDeclarationDetailMapper.class); } private TaxDeclarationService getTaxDeclarationService(User user) { return ServiceUtil.getService(TaxDeclarationServiceImpl.class, user); } @Override public XSSFWorkbook exportTaxDeclaration(Long taxDeclarationId) { // 1.工作簿名称 String sheetName = SalaryI18nUtil.getI18nLabel(85368, "个税申报表"); TaxDeclarationPO taxDeclarationPO = getTaxDeclarationService(user).getById(taxDeclarationId); // 查询当前个税申报表一共有多少人员 int count = getTaxDeclarationDetailMapper().countEmployeeId(taxDeclarationId); // 以1000个人员一页,一共有多少页 int totalPages = (count % 1000 == 0) ? (count / 1000) : (count / 1000 + 1); //总页数 // excel导出的数据 List> rows = Lists.newArrayListWithExpectedSize(count); List headerList = Lists.newArrayList(); List dataIndexList = Lists.newArrayList(); if (Objects.equals(taxDeclarationPO.getIncomeCategory(), IncomeCategoryEnum.WAGES_AND_SALARIES.getValue())) { // 解析表头 parseHeader(TaxDeclarationWageListDTO.class, headerList, dataIndexList); rows.add(headerList); for (int i = 0; i < totalPages; i++) { TaxDeclarationDetailListQueryParam queryParam = new TaxDeclarationDetailListQueryParam(); queryParam.setTaxDeclarationId(taxDeclarationId); queryParam.setCurrent(i+1); queryParam.setPageSize(1000); PageInfo dtoPage = getTaxDeclarationDetailService(user).listDtoPageByParam4Wage(queryParam); List list = dtoPage.getList(); for (TaxDeclarationWageListDTO taxDeclarationWageListDTO : list) { List row = Lists.newArrayListWithExpectedSize(dataIndexList.size()); Map map = JsonUtil.parseMap(taxDeclarationWageListDTO, Object.class); for (String dataIndex : dataIndexList) { row.add(map.get(dataIndex)); } rows.add(row); } } } if (Objects.equals(taxDeclarationPO.getIncomeCategory(), IncomeCategoryEnum.REMUNERATION_FOR_LABOR.getValue())) { // 解析表头 parseHeader(TaxDeclarationLaborListDTO.class, headerList, dataIndexList); rows.add(headerList); for (int i = 0; i < totalPages; i++) { TaxDeclarationDetailListQueryParam queryParam = new TaxDeclarationDetailListQueryParam(); queryParam.setTaxDeclarationId(taxDeclarationId); queryParam.setCurrent(i); queryParam.setPageSize(1000); PageInfo dtoPage = getTaxDeclarationDetailService(user).listDtoPageByParam4Labor(queryParam); List list = dtoPage.getList(); for (TaxDeclarationLaborListDTO taxDeclarationLaborListDTO : list) { List row = Lists.newArrayListWithExpectedSize(dataIndexList.size()); Map map = JsonUtil.parseMap(taxDeclarationLaborListDTO, Object.class); for (String dataIndex : dataIndexList) { row.add(map.get(dataIndex)); } rows.add(row); } } } if (Objects.equals(taxDeclarationPO.getIncomeCategory(), IncomeCategoryEnum.ONETIME_ANNUAL_BONUS.getValue())) { // 解析表头 parseHeader(TaxDeclarationAnnualListDTO.class, headerList, dataIndexList); rows.add(headerList); for (int i = 0; i < totalPages; i++) { TaxDeclarationDetailListQueryParam queryParam = new TaxDeclarationDetailListQueryParam(); queryParam.setTaxDeclarationId(taxDeclarationId); queryParam.setCurrent(i); queryParam.setPageSize(1000); PageInfo dtoPage = getTaxDeclarationDetailService(user).listDtoPageByParam4Annual(queryParam); List list = dtoPage.getList(); for (TaxDeclarationAnnualListDTO taxDeclarationLaborListDTO : list) { List row = Lists.newArrayListWithExpectedSize(dataIndexList.size()); Map map = JsonUtil.parseMap(taxDeclarationLaborListDTO, Object.class); for (String dataIndex : dataIndexList) { row.add(map.get(dataIndex)); } rows.add(row); } } } return ExcelUtil.genWorkbookV2(rows, sheetName); } /** * 解析表头 * * @param clazz * @param headerList * @param dataIndexList * @param */ private void parseHeader(Class clazz, List headerList, List dataIndexList) { Field[] declaredFields = clazz.getDeclaredFields(); for (Field declaredField : declaredFields) { if (!declaredField.isAnnotationPresent(SalaryTableColumn.class)) { continue; } SalaryTableColumn annotation = declaredField.getAnnotation(SalaryTableColumn.class); headerList.add(SalaryI18nUtil.getI18nLabel( annotation.labelId(), annotation.text())); dataIndexList.add(declaredField.getName()); } } }