weaver-hrm-salary/src/com/engine/salary/wrapper/TaxDeclareRecordWrapper.java

785 lines
37 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.engine.salary.wrapper;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.salary.cache.SalaryCacheKey;
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
import com.engine.salary.entity.employeedeclare.param.EmployeeDeclareListQueryParam;
import com.engine.salary.entity.employeedeclare.po.EmployeeDeclarePO;
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
import com.engine.salary.entity.taxdeclaration.bo.TaxDeclarationDetailBO;
import com.engine.salary.entity.taxdeclaration.dto.*;
import com.engine.salary.entity.taxdeclaration.param.*;
import com.engine.salary.entity.taxdeclaration.po.*;
import com.engine.salary.enums.employeedeclare.CardTypeEnum;
import com.engine.salary.enums.employeedeclare.DeclareStatusEnum;
import com.engine.salary.enums.employeedeclare.EmploymentStatusEnum;
import com.engine.salary.enums.salarysob.IncomeCategoryEnum;
import com.engine.salary.enums.taxdeclaration.TaxDeclareStatusEnum;
import com.engine.salary.enums.taxdeclaration.TaxDeclareTypeEnum;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.service.*;
import com.engine.salary.service.impl.*;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.SalaryEnumUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.page.PageInfo;
import com.engine.salary.util.page.SalaryPageUtil;
import com.weaver.util.threadPool.ThreadPoolUtil;
import com.weaver.util.threadPool.constant.ModulePoolEnum;
import com.weaver.util.threadPool.entity.LocalRunnable;
import dm.jdbc.util.IdGenerator;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.compress.utils.Lists;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import weaver.general.Util;
import weaver.hrm.User;
import java.util.*;
import java.util.stream.Collectors;
/**
* 个税申报
* <p>Copyright: Copyright (c) 2023</p>
* <p>Company: 泛微软件</p>
*
* @author qiantao
* @version 1.0
**/
@Slf4j
public class TaxDeclareRecordWrapper extends Service {
private TaxDeclareRecordService getTaxDeclareRecordService(User user) {
return ServiceUtil.getService(TaxDeclareRecordServiceImpl.class, user);
}
private TaxAgentService getTaxAgentService(User user) {
return ServiceUtil.getService(TaxAgentServiceImpl.class, user);
}
private SalaryEmployeeService getSalaryEmployeeService(User user) {
return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user);
}
private SalaryCacheService getSalaryCacheService(User user) {
return ServiceUtil.getService(SalaryCacheServiceImpl.class, user);
}
private TaxDeclarationService getTaxDeclarationService(User user) {
return ServiceUtil.getService(TaxDeclarationServiceImpl.class, user);
}
private TaxDeclarationValueService getTaxDeclarationValueService(User user) {
return ServiceUtil.getService(TaxDeclarationValueServiceImpl.class, user);
}
private TaxDeclarationExcelService getTaxDeclarationExcelService(User user) {
return ServiceUtil.getService(TaxDeclarationExcelServiceImpl.class, user);
}
private TaxDeclareEmployeeService getTaxDeclareEmployeeService(User user) {
return ServiceUtil.getService(TaxDeclareEmployeeServiceImpl.class, user);
}
private TaxDeclareFailService getTaxDeclareFailService(User user) {
return ServiceUtil.getService(TaxDeclareFailServiceImpl.class, user);
}
private TaxReportColumnService getTaxReportColumnService(User user) {
return ServiceUtil.getService(TaxReportColumnServiceImpl.class, user);
}
private EmployeeDeclareService getEmployeeDeclareService(User user) {
return ServiceUtil.getService(EmployeeDeclareServiceImpl.class, user);
}
/**
* 个税申报记录列表
*
* @param queryParam
* @return
*/
public PageInfo<TaxDeclareRecordListDTO> listPage(TaxDeclarationListQueryParam queryParam) {
PageInfo<TaxDeclareRecordPO> page = getTaxDeclareRecordService(user).listPageByParam(queryParam);
List<TaxDeclareRecordPO> list = page.getList();
PageInfo<TaxDeclareRecordListDTO> dtoPage = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), TaxDeclareRecordListDTO.class);
dtoPage.setTotal(page.getTotal());
if (CollectionUtils.isNotEmpty(list)) {
// 查询个税扣缴义务人
Set<Long> taxAgentIds = SalaryEntityUtil.properties(list, TaxDeclareRecordPO::getTaxAgentId);
List<TaxAgentPO> taxAgents = getTaxAgentService(user).listByIds(taxAgentIds);
// 查询人员姓名
List<Long> employeeIds = SalaryEntityUtil.properties(list, TaxDeclareRecordPO::getCreator, Collectors.toList());
List<DataCollectionEmployee> simpleEmployees = getSalaryEmployeeService(user).getEmployeeByIds(employeeIds);
List<TaxDeclareRecordListDTO> dtoList = Lists.newArrayList();
Map<Long, String> taxAgentNameMap = SalaryEntityUtil.convert2Map(taxAgents, TaxAgentPO::getId, TaxAgentPO::getName);
Map<Long, String> simpleEmployeeNameMap = SalaryEntityUtil.convert2Map(simpleEmployees, DataCollectionEmployee::getEmployeeId, DataCollectionEmployee::getUsername);
for (TaxDeclareRecordPO taxDeclareRecord : list) {
TaxDeclareTypeEnum taxDeclareTypeEnum = SalaryEnumUtil.enumMatchByValue(taxDeclareRecord.getTaxDeclareType(), TaxDeclareTypeEnum.class);
TaxDeclareStatusEnum taxDeclareStatusEnum = SalaryEnumUtil.enumMatchByValue(taxDeclareRecord.getTaxDeclareStatus(), TaxDeclareStatusEnum.class);
TaxDeclareRecordListDTO taxDeclareRecordListDTO = new TaxDeclareRecordListDTO()
.setId(taxDeclareRecord.getId())
.setTaxAgentId(taxDeclareRecord.getTaxAgentId())
.setTaxAgentName(taxAgentNameMap.get(taxDeclareRecord.getTaxAgentId()))
.setSalaryMonth(taxDeclareRecord.getSalaryMonth())
.setTaxCycle(taxDeclareRecord.getTaxCycle())
.setTaxDeclareType(taxDeclareTypeEnum)
.setTaxDeclareTypeDesc(taxDeclareTypeEnum == null ? "" : SalaryI18nUtil.getI18nLabel(taxDeclareTypeEnum.getLabelId(), taxDeclareTypeEnum.getDefaultLabel()))
.setTaxDeclareStatus(taxDeclareStatusEnum)
.setTaxDeclareStatusDesc(taxDeclareStatusEnum == null ? "" : SalaryI18nUtil.getI18nLabel(taxDeclareStatusEnum.getLabelId(), taxDeclareStatusEnum.getDefaultLabel()))
.setTaxPaidAmount(SalaryEntityUtil.thousandthConvert(taxDeclareRecord.getTaxPaidAmount()))
.setOperateEmployeeId(taxDeclareRecord.getCreator())
.setOperateEmployeeName(simpleEmployeeNameMap.get(taxDeclareRecord.getCreator()))
.setOperateTime(SalaryDateUtil.getFormatLocalDateTime(taxDeclareRecord.getCreateTime()))
.setDescription(taxDeclareRecord.getRemark())
.setDisplayIcon(Objects.equals(taxDeclareRecord.getDisplayUpdateIcon(), 1));
dtoList.add(taxDeclareRecordListDTO);
}
dtoPage.setList(dtoList);
}
return dtoPage;
}
/**
* 个税申报表明细列表
*
* @param queryParam 列表查询条件
* @return
*/
public PageInfo listValuePage(TaxDeclarationValueListQueryParam queryParam) {
// 查询个税申报表
TaxDeclarationPO taxDeclaration = getTaxDeclarationService(user).getById(queryParam.getTaxDeclarationId());
// 判断是否有权限查看
boolean canSee = getTaxDeclareRecordService(user).checkByAuthority(taxDeclaration);
if (!canSee) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(156515, "对不起,您暂时没有权限查看"));
}
// 查询个税申报表详情
PageInfo<TaxDeclarationValuePO> page = getTaxDeclarationValueService(user).listPageByTaxDeclarationIds(queryParam, Collections.singleton(queryParam.getTaxDeclarationId()));
TaxDeclarationValueListDTO taxDeclarationValueListDTO = getTaxDeclarationValueService(user).convert2List(taxDeclaration, page.getList());
PageInfo<Map<String, Object>> dtoPage = new PageInfo<>(
page.getPageNum(),
page.getPageSize(),
page.getTotal(),
SalaryPageUtil.convertList(taxDeclarationValueListDTO.getColumns()),
taxDeclarationValueListDTO.getData());
return dtoPage;
}
/**
* 未报送的人员列表
*
* @param queryParam
* @return
*/
public PageInfo<AbnormalEmployeeListDTO> listEmployeePage4NotDeclare(AbnormalEmployeeListQueryParam queryParam) {
return listEmployeePage("NotDeclare", queryParam);
}
/**
* 没有申报数据的人员列表
*
* @param queryParam
* @return
*/
public PageInfo<AbnormalEmployeeListDTO> listEmployeePage4NoValue(AbnormalEmployeeListQueryParam queryParam) {
return listEmployeePage("NoValue", queryParam);
}
/**
* 申报失败的人员列表
*
* @param queryParam
* @return
*/
public PageInfo<FailEmployeeListDTO> listEmployeePage4Fail(AbnormalEmployeeListQueryParam queryParam) {
// 查询个税申报记录
TaxDeclareRecordPO taxDeclareRecord = getTaxDeclareRecordService(user).getById(queryParam.getTaxDeclareRecordId());
// 查询申报失败的数据
List<TaxDeclareFailPO> taxDeclareFailPOPageInfo = getTaxDeclareFailService(user).listPageByTaxDeclareRecordIds(Collections.singleton(taxDeclareRecord.getId()));
// 转换成dto
List<FailEmployeeListDTO> failEmployeeListDTOS = getTaxDeclareFailService(user).convert2FailEmployeeList(taxDeclareRecord, taxDeclareFailPOPageInfo);
PageInfo<FailEmployeeListDTO> dtoPage = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), failEmployeeListDTOS, FailEmployeeListDTO.class);
// 转成前端所需的格式
return dtoPage;
}
private PageInfo<AbnormalEmployeeListDTO> listEmployeePage(String key, AbnormalEmployeeListQueryParam queryParam) {
// 查询个税申报记录
TaxDeclareRecordPO taxDeclareRecord = getTaxDeclareRecordService(user).getById(queryParam.getTaxDeclareRecordId());
queryParam.setTaxAgentId(taxDeclareRecord.getTaxAgentId());
queryParam.setTaxCycle(taxDeclareRecord.getTaxCycle());
if (StringUtils.isEmpty(queryParam.getKeyword())) {
// 查询个税申报记录的人员
PageInfo<TaxDeclareEmployeePO> page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), TaxDeclareEmployeePO.class);
if (StringUtils.equals("NotDeclare", key)) {
page = getTaxDeclareEmployeeService(user).listPage4NotDeclareByParam(queryParam);
} else if (StringUtils.equals("NoValue", key)) {
page = getTaxDeclareEmployeeService(user).listPage4NoValueByParam(queryParam);
}
PageInfo<AbnormalEmployeeListDTO> dtoPage = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), AbnormalEmployeeListDTO.class);
dtoPage.setList(getTaxDeclareEmployeeService(user).convert2AbnormalEmployeeList(taxDeclareRecord, page.getList()));
dtoPage.setTotal(page.getTotal());
return dtoPage;
} else {
// 查询条件中包含"keyword"时不好通过SQL分页所以在内存中分页
List<TaxDeclareEmployeePO> taxDeclareEmployees = Collections.emptyList();
if (StringUtils.equals("NotDeclare", key)) {
taxDeclareEmployees = getTaxDeclareEmployeeService(user).list4NotDeclareByParam(queryParam);
} else if (StringUtils.equals("NoValue", key)) {
taxDeclareEmployees = getTaxDeclareEmployeeService(user).list4NoValueByParam(queryParam);
}
List<AbnormalEmployeeListDTO> dtos = getTaxDeclareEmployeeService(user).convert2AbnormalEmployeeList(taxDeclareRecord, taxDeclareEmployees)
.stream()
.filter(e -> StringUtils.contains(e.getEmployeeName(), queryParam.getKeyword())
|| StringUtils.contains(e.getJobNum(), queryParam.getKeyword())
|| StringUtils.contains(e.getCardNum(), queryParam.getKeyword()))
.collect(Collectors.toList());
PageInfo<AbnormalEmployeeListDTO> dtoPage = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), dtos, AbnormalEmployeeListDTO.class);
return dtoPage;
}
}
/**
* 获取个税申报记录的表单
*
* @param id
* @return
*/
public Map getForm(Long id) {
// TaxDeclareRecordFormDTO formDTO = new TaxDeclareRecordFormDTO();
// formDTO.setTaxAgentRange(TaxAgentRangeEnum.SELECT_TAX_AGENT);
// // 判断当前是否开启了分权
// Boolean openDevolution = getTaxAgentService(user).isOpenDevolution();
// Boolean isChief = getTaxAgentService(user).isChief((long)user.getUID());
// // 转换成前端所需的数据格式
// WeaForm weaForm = SalaryFormatUtil.<TaxDeclareRecordFormDTO>getInstance().buildForm(TaxDeclareRecordFormDTO.class, formDTO);
// weaForm.getItems().forEach((k, v) -> {
// if (StringUtils.equals("salaryMonth", k)) {
// Map<String, Object> otherParams = new HashMap<>();
// otherParams.put("type", "month");
// v.setOtherParams(otherParams);
// }
// // 未开启分权,没有"作为管理员的个税扣缴义务人"
// if (!openDevolution && StringUtils.equals("taxAgentRange", k)) {
// v.getOptions().remove(1);
// }
// // 开启分权,但不是总管理员,没有"所有个税扣缴义务人"
// if (openDevolution && !isChief && StringUtils.equals("taxAgentRange", k)) {
// v.getOptions().remove(0);
// }
// });
return new HashMap();
}
/**
* 获取个税申报记录下的个税申报表TAB
*
* @param id
* @return
*/
public List<TaxDeclarationTabDTO> getTaxDeclarationTab(Long id) {
// 查询个税申报记录
TaxDeclareRecordPO taxDeclareRecord = getTaxDeclareRecordService(user).getById(id);
// 查询个税申报记录下的个税申报表
List<TaxDeclarationPO> taxDeclarations = getTaxDeclarationService(user).listByTaxCycleAndTaxAgentIds(SalaryDateUtil.localDate2YearMonth(taxDeclareRecord.getTaxCycle()),
Collections.singleton(taxDeclareRecord.getTaxAgentId()));
// taxDeclarations = taxDeclarations.stream()
// .filter(e -> Objects.equals(e.getControlView(), 0) || Objects.equals(e.getCreator(), (long)user.getUID()))
// .collect(Collectors.toList());
Map<Integer, TaxDeclarationPO> taxDeclarationMap = SalaryEntityUtil.convert2Map(taxDeclarations, TaxDeclarationPO::getIncomeCategory);
List<TaxDeclarationTabDTO> tabs = Lists.newArrayList();
for (IncomeCategoryEnum incomeCategoryEnum : IncomeCategoryEnum.values()) {
TaxDeclarationPO taxDeclaration = taxDeclarationMap.get(incomeCategoryEnum.getValue());
if (taxDeclaration != null) {
TaxDeclarationTabDTO taxDeclarationTabDTO = new TaxDeclarationTabDTO()
.setTabName(SalaryI18nUtil.getI18nLabel(incomeCategoryEnum.getLabelId(), incomeCategoryEnum.getDefaultLabel()))
.setIncomeCategory(incomeCategoryEnum)
.setTaxDeclarationId(taxDeclaration.getId());
tabs.add(taxDeclarationTabDTO);
}
}
return tabs;
}
/**
* 新增申报表
* @param param
*/
public void addTaxDeclaration(TaxDeclarationAddParam param) {
getTaxDeclarationService(user).addTaxDeclaration(param);
}
public void deleteTaxDeclaration(TaxDeclarationDeleteParam param) {
getTaxDeclarationService(user).deleteTaxDeclaration(param);
}
/**
* 查询个税申报表的基本信息
*
* @param id 个税申报表id
* @return
*/
public TaxDeclarationInfoDTO getTaxDeclarationInfoById(Long id) {
// 查询个税申报表
TaxDeclareRecordPO taxDeclareRecord = getTaxDeclareRecordService(user).getById(id);
if (Objects.isNull(taxDeclareRecord)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98877, "个税申报表不存在或已删除"));
}
AbnormalEmployeeListQueryParam queryParam = new AbnormalEmployeeListQueryParam()
.setTaxDeclareRecordId(taxDeclareRecord.getId())
.setTaxAgentId(taxDeclareRecord.getTaxAgentId())
.setTaxCycle(taxDeclareRecord.getTaxCycle());
// 查询是否存在有未报送的人
List<TaxDeclareEmployeePO> notDeclareTaxDeclareEmployees = getTaxDeclareEmployeeService(user).list4NotDeclareByParam(queryParam);
// 查询是否存在没有申报数据的人
List<TaxDeclareEmployeePO> noValueTaxDeclareEmployees = getTaxDeclareEmployeeService(user).list4NoValueByParam(queryParam);
// 查询是否存在申报失败的人
List<TaxDeclareFailPO> taxDeclareFails = getTaxDeclareFailService(user).listByTaxDeclareRecordIds(Collections.singleton(taxDeclareRecord.getId()));
// 查询个税扣缴义务人
TaxAgentPO taxAgentPO = getTaxAgentService(user).getById(taxDeclareRecord.getTaxAgentId());
TaxDeclareTypeEnum taxDeclareTypeEnum = SalaryEnumUtil.enumMatchByValue(taxDeclareRecord.getTaxDeclareType(), TaxDeclareTypeEnum.class);
TaxDeclareStatusEnum taxDeclareStatusEnum = SalaryEnumUtil.enumMatchByValue(taxDeclareRecord.getTaxDeclareStatus(), TaxDeclareStatusEnum.class);
return TaxDeclarationInfoDTO.builder()
.salaryMonth(taxDeclareRecord.getSalaryMonth())
.taxCycle(taxDeclareRecord.getTaxCycle())
.taxAgentId(taxDeclareRecord.getTaxAgentId())
.taxAgentName(Optional.ofNullable(taxAgentPO).map(TaxAgentPO::getName).orElse(""))
.declareType(taxDeclareTypeEnum)
.declareTypeDesc(taxDeclareTypeEnum == null ? "" : SalaryI18nUtil.getI18nLabel(taxDeclareTypeEnum.getLabelId(), taxDeclareTypeEnum.getDefaultLabel()))
.declareStatus(taxDeclareStatusEnum)
.declareStatusDesc(taxDeclareStatusEnum == null ? "" : SalaryI18nUtil.getI18nLabel(taxDeclareStatusEnum.getLabelId(), taxDeclareStatusEnum.getDefaultLabel()))
.declareErrorMsg(taxDeclareRecord.getTaxDeclareErrorMsg())
.displayIcon(Objects.equals(taxDeclareRecord.getDisplayUpdateIcon(), 1))
.declareFailSize(taxDeclareFails.size())
.abnormalSize(notDeclareTaxDeclareEmployees.size() + noValueTaxDeclareEmployees.size())
.taxPaidAmount(SalaryEntityUtil.thousandthConvert(taxDeclareRecord.getTaxPaidAmount()))
.build();
}
/**
* 保存
*
* @param saveParam 保存参数
*/
public String save(TaxDeclarationSaveParam saveParam) {
TaxDeclarationRateDTO taxDeclarationRate = new TaxDeclarationRateDTO().setStatus(true)
.setIndex(Util.null2String(IdGenerator.generate()))
.setMsg(SalaryI18nUtil.getI18nLabel(95836, "生成申报表"));
getSalaryCacheService(user).set(SalaryCacheKey.TAX_DECLARATION + taxDeclarationRate.getIndex(), taxDeclarationRate);
LocalRunnable localRunnable = new LocalRunnable() {
@Override
public void execute() {
try {
getTaxDeclareRecordService(user).save(saveParam);
taxDeclarationRate.setStatus(true).setFinish(true);
} catch (SalaryRunTimeException e) {
taxDeclarationRate.setStatus(false).setFinish(true).setMsg(e.getMessage());
} catch (Exception e) {
log.error("个税申报表生成报错:{}", e.getMessage(), e);
taxDeclarationRate.setStatus(false).setFinish(true).setMsg(SalaryI18nUtil.getI18nLabel(187276, "个税申报表生成报错:") + e.getMessage());
} finally {
getSalaryCacheService(user).set(SalaryCacheKey.TAX_DECLARATION + taxDeclarationRate.getIndex(), taxDeclarationRate);
}
}
};
ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.OTHER, "saveTaxDeclaration", localRunnable);
return taxDeclarationRate.getIndex();
}
/**
* 更新个税申报表的待刷新数据的标识
*
* @param id
*/
public void updateIcon(Long id) {
getTaxDeclareRecordService(user).updateIcon(id, NumberUtils.INTEGER_ZERO);
}
/**
* 删除个税申报表
*
* @param ids
*/
public void delete(Collection<Long> ids) {
getTaxDeclareRecordService(user).deleteByIds(ids);
}
/**
* 获取个税申报表是否已经生成
*
* @param index
* @return
*/
public TaxDeclarationRateDTO getRate(String index) {
return getSalaryCacheService(user).get(SalaryCacheKey.TAX_DECLARATION + index);
}
/**
* 申报
*
* @param id
*/
public String declare(Long id) {
checkBefore(id);
TaxDeclarationRateDTO taxDeclarationRate = new TaxDeclarationRateDTO().setStatus(true).setIndex(Util.null2String(id))
.setMsg(SalaryI18nUtil.getI18nLabel(156454, "在线申报"));
getSalaryCacheService(user).set(SalaryCacheKey.TAX_DECLARATION + taxDeclarationRate.getIndex(), taxDeclarationRate);
LocalRunnable localRunnable = new LocalRunnable() {
@Override
public void execute() {
try {
getTaxDeclareRecordService(user).declare(id);
taxDeclarationRate.setFinish(true);
} catch (SalaryRunTimeException e) {
taxDeclarationRate.setStatus(false).setFinish(true).setMsg(e.getMessage());
} catch (Exception e) {
log.error("在线申报失败:{}", e.getMessage(), e);
taxDeclarationRate.setStatus(false).setFinish(true).setMsg(SalaryI18nUtil.getI18nLabel(187274, "在线申报失败:") + e.getMessage());
} finally {
getSalaryCacheService(user).set(SalaryCacheKey.TAX_DECLARATION + taxDeclarationRate.getIndex(), taxDeclarationRate);
}
}
};
ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.OTHER, "declare", localRunnable);
return taxDeclarationRate.getIndex();
}
/**
* 获取申报反馈
*
* @param id
*/
public String getDeclareFeedback(Long id) {
checkBefore(id);
TaxDeclarationRateDTO taxDeclarationRate = new TaxDeclarationRateDTO().setStatus(true).setIndex(Util.null2String(id))
.setMsg(SalaryI18nUtil.getI18nLabel(182680, "获取申报反馈"));
getSalaryCacheService(user).set(SalaryCacheKey.TAX_DECLARATION + taxDeclarationRate.getIndex(), taxDeclarationRate);
LocalRunnable localRunnable = new LocalRunnable() {
@Override
public void execute() {
try {
getTaxDeclareRecordService(user).getDeclareFeedback(id, taxDeclarationRate);
taxDeclarationRate.setFinish(true);
} catch (SalaryRunTimeException e) {
taxDeclarationRate.setStatus(false).setFinish(true).setMsg(e.getMessage());
} catch (Exception e) {
log.error("获取申报反馈失败:{}", e.getMessage(), e);
taxDeclarationRate.setStatus(false).setFinish(true).setMsg(SalaryI18nUtil.getI18nLabel(187255, "获取申报反馈失败:") + e.getMessage());
} finally {
getSalaryCacheService(user).set(SalaryCacheKey.TAX_DECLARATION + taxDeclarationRate.getIndex(), taxDeclarationRate);
}
}
};
ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.OTHER, "getDeclareFeedback", localRunnable);
return taxDeclarationRate.getIndex();
}
public Object getDeclareTaxResultFeedback(Long id) {
return getTaxDeclareRecordService(user).getDeclareTaxResultFeedback(id);
}
public XSSFWorkbook exportGetDeclareTaxResultFeedback(DeclareTaxResultFeedbackQueryParam param) {
return getTaxDeclareRecordService(user).exportGetDeclareTaxResultFeedback(param);
}
/**
* 作废
*
* @param id
*/
public String cancelDeclare(Long id) {
checkBefore(id);
TaxDeclarationRateDTO taxDeclarationRate = new TaxDeclarationRateDTO().setStatus(true).setIndex(Util.null2String(id))
.setMsg(SalaryI18nUtil.getI18nLabel(158842, "作废申报"));
getSalaryCacheService(user).set(SalaryCacheKey.TAX_DECLARATION + taxDeclarationRate.getIndex(), taxDeclarationRate);
LocalRunnable localRunnable = new LocalRunnable() {
@Override
public void execute() {
try {
getTaxDeclareRecordService(user).cancelDeclare(id);
taxDeclarationRate.setFinish(true);
} catch (SalaryRunTimeException e) {
taxDeclarationRate.setStatus(false).setFinish(true).setMsg(e.getMessage());
} catch (Exception e) {
log.error("作废申报失败:{}", e.getMessage(), e);
taxDeclarationRate.setStatus(false).setFinish(true).setMsg(SalaryI18nUtil.getI18nLabel(187272, "作废申报失败:") + e.getMessage());
} finally {
getSalaryCacheService(user).set(SalaryCacheKey.TAX_DECLARATION + taxDeclarationRate.getIndex(), taxDeclarationRate);
}
}
};
ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.OTHER, "cancel", localRunnable);
return taxDeclarationRate.getIndex();
}
/**
* 获取作废反馈
*
* @param id
*/
public String getCancelFeedback(Long id) {
checkBefore(id);
TaxDeclarationRateDTO taxDeclarationRate = new TaxDeclarationRateDTO().setStatus(true).setIndex(Util.null2String(id))
.setMsg(SalaryI18nUtil.getI18nLabel(182681, "获取作废申报反馈"));
getSalaryCacheService(user).set(SalaryCacheKey.TAX_DECLARATION + taxDeclarationRate.getIndex(), taxDeclarationRate);
LocalRunnable localRunnable = new LocalRunnable() {
@Override
public void execute() {
try {
getTaxDeclareRecordService(user).getCancelFeedback(id, taxDeclarationRate);
taxDeclarationRate.setFinish(true);
} catch (SalaryRunTimeException e) {
taxDeclarationRate.setStatus(false).setFinish(true).setMsg(e.getMessage());
} catch (Exception e) {
log.error("获取作废反馈结果失败:{}", e.getMessage(), e);
taxDeclarationRate.setStatus(false).setFinish(true).setMsg(SalaryI18nUtil.getI18nLabel(187270, "获取作废反馈结果失败:") + e.getMessage());
} finally {
getSalaryCacheService(user).set(SalaryCacheKey.TAX_DECLARATION + taxDeclarationRate.getIndex(), taxDeclarationRate);
}
}
};
ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.OTHER, "getCancelFeedback", localRunnable);
return taxDeclarationRate.getIndex();
}
/**
* 更正申报
*
* @param id
* @return
*/
public String updateDeclare(Long id) {
checkBefore(id);
TaxDeclarationRateDTO taxDeclarationRate = new TaxDeclarationRateDTO().setStatus(true).setIndex(Util.null2String(id))
.setMsg(SalaryI18nUtil.getI18nLabel(177637, "更正申报"));
getSalaryCacheService(user).set(SalaryCacheKey.TAX_DECLARATION + taxDeclarationRate.getIndex(), taxDeclarationRate);
LocalRunnable localRunnable = new LocalRunnable() {
@Override
public void execute() {
try {
getTaxDeclareRecordService(user).updateDeclare(id);
taxDeclarationRate.setFinish(true);
} catch (SalaryRunTimeException e) {
taxDeclarationRate.setStatus(false).setFinish(true).setMsg(e.getMessage());
} catch (Exception e) {
log.error("更正申报失败:{}", e.getMessage(), e);
taxDeclarationRate.setStatus(false).setFinish(true).setMsg(SalaryI18nUtil.getI18nLabel(187269, "更正申报失败:") + e.getMessage());
} finally {
getSalaryCacheService(user).set(SalaryCacheKey.TAX_DECLARATION + taxDeclarationRate.getIndex(), taxDeclarationRate);
}
}
};
ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.OTHER, "updateDeclare", localRunnable);
return taxDeclarationRate.getIndex();
}
/**
* 税局端申报状态查询
*
* @param id
* @return
*/
public String queryDeclareStatus(Long id) {
return getTaxDeclareRecordService(user).queryDeclareStatus(id);
}
/**
* 税局端申报明细查询
*
* @param id
* @return
*/
public String queryCompanyIncomes(Long id) {
return getTaxDeclareRecordService(user).queryCompanyIncomes(id);
}
/**
* 刷新数据
*
* @param id
* @return
*/
public String refreshData(Long id) {
checkBefore(id);
TaxDeclarationRateDTO taxDeclarationRate = new TaxDeclarationRateDTO().setStatus(true).setIndex(Util.null2String(id))
.setMsg(SalaryI18nUtil.getI18nLabel(156447, "刷新数据"));
getSalaryCacheService(user).set(SalaryCacheKey.TAX_DECLARATION + taxDeclarationRate.getIndex(), taxDeclarationRate);
LocalRunnable localRunnable = new LocalRunnable() {
@Override
public void execute() {
try {
getTaxDeclareRecordService(user).refreshData(id);
taxDeclarationRate.setFinish(true);
} catch (SalaryRunTimeException e) {
taxDeclarationRate.setStatus(false).setFinish(true).setMsg(e.getMessage());
} catch (Exception e) {
log.error("刷新数据失败:{}", e.getMessage(), e);
taxDeclarationRate.setStatus(false).setFinish(true).setMsg(SalaryI18nUtil.getI18nLabel(187268, "刷新数据失败:") + e.getMessage());
} finally {
getSalaryCacheService(user).set(SalaryCacheKey.TAX_DECLARATION + taxDeclarationRate.getIndex(), taxDeclarationRate);
}
}
};
ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.OTHER, "refreshData", localRunnable);
return taxDeclarationRate.getIndex();
}
private void checkBefore(Long id) {
TaxDeclarationRateDTO taxDeclarationRate = getSalaryCacheService(user).get(SalaryCacheKey.TAX_DECLARATION + Util.null2String(id));
if (taxDeclarationRate != null && !taxDeclarationRate.isFinish()) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(182691, "当前正处于「{0}」中,请稍后再试").replace("{0}", taxDeclarationRate.getMsg()));
}
}
/**
* 导出个税申报明细列表
*
* @param queryParam
* @return
*/
public XSSFWorkbook exportTaxDeclarationValue(TaxDeclarationValueListQueryParam queryParam) {
return getTaxDeclarationExcelService(user).exportTaxDeclarationValue(queryParam);
}
/**
* 导出未报送的人员列表
*
* @param queryParam
* @return
*/
public XSSFWorkbook exportEmployee4NotDeclare(AbnormalEmployeeListQueryParam queryParam) {
return getTaxDeclarationExcelService(user).exportEmployee4NotDeclare(queryParam);
}
/**
* 导出没有申报数据的人员列表
*
* @param queryParam
* @return
*/
public XSSFWorkbook exportEmployee4NoValue(AbnormalEmployeeListQueryParam queryParam) {
return getTaxDeclarationExcelService(user).exportEmployee4NoValue(queryParam);
}
/**
* 导出申报失败的人员列表
*
* @param queryParam
* @return
*/
public XSSFWorkbook exportEmployee4Fail(AbnormalEmployeeListQueryParam queryParam) {
return getTaxDeclarationExcelService(user).exportEmployee4Fail(queryParam);
}
public TaxDeclareRecordDetailFormDTO getAddForm(TaxDeclareRecordDetailFormParam param) {
TaxDeclarationPO taxDeclaration = getTaxDeclarationService(user).getById(param.getTaxDeclarationId());
if (taxDeclaration == null) {
throw new SalaryRunTimeException("申报表不存在!");
}
// 查询个税申报表列
List<TaxReportColumnPO> taxReportColumns = getTaxReportColumnService(user).listByIncomeCategory(IncomeCategoryEnum.parseByValue(taxDeclaration.getIncomeCategory()));
//当前税款所属期报送成功且状态正常的人员
List<EmployeeDeclarePO> employeeDeclarePOS = getEmployeeDeclareService(user).listByParam(
EmployeeDeclareListQueryParam
.builder()
.taxCycle(taxDeclaration.getTaxCycle())
.taxAgentId(taxDeclaration.getTaxAgentId())
.declareStatus(DeclareStatusEnum.DECLARE_SUCCESS)
.employmentStatus(EmploymentStatusEnum.NORMAL)
.build()
);
//过滤申报表中已存在的人员
List<TaxDeclarationValuePO> taxDeclarationValuePOS = getTaxDeclarationValueService(user).listByTaxDeclarationIds(Collections.singletonList(param.getTaxDeclarationId()));
Set<Long> empIds = SalaryEntityUtil.properties(taxDeclarationValuePOS, TaxDeclarationValuePO::getEmployeeId);
employeeDeclarePOS = employeeDeclarePOS.stream().filter(emp -> !empIds.contains(emp.getEmployeeId())).collect(Collectors.toList());
return TaxDeclareRecordDetailFormDTO.builder()
.taxReportColumns(TaxDeclarationDetailBO.convert2ListTaxReportColumn(taxReportColumns))
.employeeDeclares(employeeDeclarePOS)
.taxDeclarationId(taxDeclaration.getTaxAgentId())
.build();
}
/**
* 新增
*
* @param param
*/
public void add(TaxDeclareRecordDetailSaveParam param) {
getTaxDeclarationValueService(user).save(param);
}
/**
* 编辑
*
* @param param
*/
public void edit(TaxDeclareRecordDetailSaveParam param) {
getTaxDeclarationValueService(user).edit(param);
}
public TaxDeclareRecordDetailFormDTO detailInfo(Long id) {
TaxDeclarationValuePO declarationValuePO = getTaxDeclarationValueService(user).getById(id);
TaxDeclarationPO taxDeclarationPO = getTaxDeclarationService(user).getById(declarationValuePO.getTaxDeclarationId());
List<EmployeeDeclarePO> employeeDeclarePOS = getEmployeeDeclareService(user).listByParam(
EmployeeDeclareListQueryParam
.builder()
.taxCycle(taxDeclarationPO.getTaxCycle())
.taxAgentId(taxDeclarationPO.getTaxAgentId())
.employeeId(declarationValuePO.getEmployeeId())
.build()
);
if (CollectionUtils.isEmpty(employeeDeclarePOS)) {
throw new SalaryRunTimeException("当前人员未报送!");
}
EmployeeDeclarePO employeeDeclarePO = employeeDeclarePOS.get(0);
// 查询个税申报表列
List<TaxReportColumnPO> taxReportColumns = getTaxReportColumnService(user).listByIncomeCategory(IncomeCategoryEnum.parseByValue(taxDeclarationPO.getIncomeCategory()));
return TaxDeclareRecordDetailFormDTO
.builder()
.id(id)
.employeeId(employeeDeclarePO.getEmployeeId())
.employeeType(employeeDeclarePO.getEmployeeType())
.taxDeclarationId(taxDeclarationPO.getId())
.incomeCategory(IncomeCategoryEnum.parseByValue(taxDeclarationPO.getIncomeCategory()).getDefaultLabel())
.cardNum(employeeDeclarePO.getCardNum())
.cardType(SalaryEnumUtil.enumMatchByValue(employeeDeclarePO.getCardType(), CardTypeEnum.class).getDefaultLabel())
.username(employeeDeclarePO.getEmployeeName())
.jobNum(employeeDeclarePO.getJobNum())
.taxReportColumns(TaxDeclarationDetailBO.convert2ListTaxReportColumn(taxReportColumns))
.resultValue(declarationValuePO.getResultValue())
.build();
}
public XSSFWorkbook downloadTemplate(DownloadTemplateParam param) {
return getTaxDeclarationExcelService(user).downloadTemplate(param);
}
public Map<String, Object> preview(DownloadTemplateParam param) {
return getTaxDeclarationExcelService(user).preview(param);
}
public Map<String, Object> importData(DownloadTemplateParam param) {
return getTaxDeclarationExcelService(user).importData(param);
}
}