package com.engine.salary.service.impl;
import com.cloudstore.eccom.pc.table.WeaTableColumn;
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.AbnormalEmployeeListDTO;
import com.engine.salary.entity.taxdeclaration.dto.FailEmployeeListDTO;
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationValueListDTO;
import com.engine.salary.entity.taxdeclaration.param.AbnormalEmployeeListQueryParam;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationValueListQueryParam;
import com.engine.salary.entity.taxdeclaration.po.*;
import com.engine.salary.service.*;
import com.engine.salary.util.JsonUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.excel.ExcelSheetData;
import com.engine.salary.util.excel.ExcelUtil;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import weaver.general.Util;
import weaver.hrm.User;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
* 个税申报表导出
*
Copyright: Copyright (c) 2022
* Company: 泛微软件
*
* @author qiantao
* @version 1.0
**/
@Slf4j
public class TaxDeclarationExcelServiceImpl extends Service implements TaxDeclarationExcelService {
private TaxDeclarationService getTaxDeclarationService(User user) {
return ServiceUtil.getService(TaxDeclarationServiceImpl.class, user);
}
private TaxDeclarationValueService getTaxDeclarationValueService(User user) {
return ServiceUtil.getService(TaxDeclarationValueServiceImpl.class, user);
}
private TaxDeclareRecordService getTaxDeclareRecordService(User user) {
return ServiceUtil.getService(TaxDeclareRecordServiceImpl.class, user);
}
private TaxDeclareEmployeeService getTaxDeclareEmployeeService(User user) {
return ServiceUtil.getService(TaxDeclareEmployeeServiceImpl.class, user);
}
private TaxDeclareFailService getTaxDeclareFailService(User user) {
return ServiceUtil.getService(TaxDeclareFailServiceImpl.class, user);
}
@Override
public XSSFWorkbook exportTaxDeclarationValue(TaxDeclarationValueListQueryParam queryParam) {
// 查询个税申报表
TaxDeclarationPO taxDeclarationPO = getTaxDeclarationService(user).getById(queryParam.getTaxDeclarationId());
// 查询个税申报表明细
List taxDeclarationValues = getTaxDeclarationValueService(user).listByTaxDeclarationIds(Collections.singleton(queryParam.getTaxDeclarationId()));
// 转成个税申报表明细
TaxDeclarationValueListDTO taxDeclarationValueListDTO = getTaxDeclarationValueService(user).convert2List(taxDeclarationPO, taxDeclarationValues);
// excel导出的数据
List> rows = Lists.newArrayList();
List headerList = Lists.newArrayList();
List dataIndexList = Lists.newArrayList();
// 解析表头
for (WeaTableColumn column : taxDeclarationValueListDTO.getColumns()) {
headerList.add(column.getText());
dataIndexList.add(column.getColumn());
}
rows.add(headerList);
// 解析表中数据
for (Map datum : taxDeclarationValueListDTO.getData()) {
List row = Lists.newArrayList();
for (String dataIndex : dataIndexList) {
row.add(Util.null2String(datum.get(dataIndex)));
}
rows.add(row);
}
String sheetName = SalaryI18nUtil.getI18nLabel(100090, "个税申报表");
return ExcelUtil.genWorkbook(rows, sheetName);
}
@Override
public XSSFWorkbook exportEmployee4NotDeclare(AbnormalEmployeeListQueryParam queryParam) {
// 查询个税申报记录
TaxDeclareRecordPO taxDeclareRecord = getTaxDeclareRecordService(user).getById(queryParam.getTaxDeclareRecordId());
queryParam.setTaxAgentId(taxDeclareRecord.getTaxAgentId());
queryParam.setTaxCycle(taxDeclareRecord.getTaxCycle());
// 查询个税申报表明细中的人员
List taxDeclareEmployees = getTaxDeclareEmployeeService(user).list4NotDeclareByParam(queryParam);
// 转换成列表dto
List dtoList = getTaxDeclareEmployeeService(user).convert2AbnormalEmployeeList(taxDeclareRecord, taxDeclareEmployees);
ExcelSheetData excelSheetData = getExcelSheetData(AbnormalEmployeeListDTO.class, dtoList);
return ExcelUtil.genWorkbook(excelSheetData);
}
@Override
public XSSFWorkbook exportEmployee4NoValue(AbnormalEmployeeListQueryParam queryParam) {
// 查询个税申报记录
TaxDeclareRecordPO taxDeclareRecord = getTaxDeclareRecordService(user).getById(queryParam.getTaxDeclareRecordId());
queryParam.setTaxAgentId(taxDeclareRecord.getTaxAgentId());
queryParam.setTaxCycle(taxDeclareRecord.getTaxCycle());
// 查询个税申报表明细中的人员
List taxDeclareEmployees = getTaxDeclareEmployeeService(user).list4NoValueByParam(queryParam);
// 转换成列表dto
List dtoList = getTaxDeclareEmployeeService(user).convert2AbnormalEmployeeList(taxDeclareRecord, taxDeclareEmployees);
ExcelSheetData excelSheetData = getExcelSheetData(AbnormalEmployeeListDTO.class, dtoList);
return ExcelUtil.genWorkbook(excelSheetData);
}
@Override
public XSSFWorkbook exportEmployee4Fail(AbnormalEmployeeListQueryParam queryParam) {
// 查询个税申报记录
TaxDeclareRecordPO taxDeclareRecord = getTaxDeclareRecordService(user).getById(queryParam.getTaxDeclareRecordId());
queryParam.setTaxAgentId(taxDeclareRecord.getTaxAgentId());
queryParam.setTaxCycle(taxDeclareRecord.getTaxCycle());
// 查询个税申报表明细中的人员
List taxDeclareFails = getTaxDeclareFailService(user).listByTaxDeclareRecordIds(Collections.singleton(taxDeclareRecord.getId()));
// 转换成列表dto
List dtoList = getTaxDeclareFailService(user).convert2FailEmployeeList(taxDeclareRecord, taxDeclareFails);
ExcelSheetData excelSheetData = getExcelSheetData(FailEmployeeListDTO.class, dtoList);
return ExcelUtil.genWorkbook(excelSheetData);
}
private ExcelSheetData getExcelSheetData(Class clazz, List dtoList) {
// 导出的表头
List headerList = Lists.newArrayList();
List dataIndexList = Lists.newArrayList();
parseHeader(clazz, headerList, dataIndexList);
// 导出的数据
List> rows = Lists.newArrayListWithExpectedSize(dtoList.size());
dtoList.forEach(dto -> {
Map map = JsonUtil.parseMap(dto, Object.class);
List