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; /** * 个税申报 *

Copyright: Copyright (c) 2023

*

Company: 泛微软件

* * @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 listPage(TaxDeclarationListQueryParam queryParam) { PageInfo page = getTaxDeclareRecordService(user).listPageByParam(queryParam); List list = page.getList(); PageInfo dtoPage = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), TaxDeclareRecordListDTO.class); dtoPage.setTotal(page.getTotal()); if (CollectionUtils.isNotEmpty(list)) { // 查询个税扣缴义务人 Set taxAgentIds = SalaryEntityUtil.properties(list, TaxDeclareRecordPO::getTaxAgentId); List taxAgents = getTaxAgentService(user).listByIds(taxAgentIds); // 查询人员姓名 List employeeIds = SalaryEntityUtil.properties(list, TaxDeclareRecordPO::getCreator, Collectors.toList()); List simpleEmployees = getSalaryEmployeeService(user).getEmployeeByIds(employeeIds); List dtoList = Lists.newArrayList(); Map taxAgentNameMap = SalaryEntityUtil.convert2Map(taxAgents, TaxAgentPO::getId, TaxAgentPO::getName); Map 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 page = getTaxDeclarationValueService(user).listPageByTaxDeclarationIds(queryParam, Collections.singleton(queryParam.getTaxDeclarationId())); TaxDeclarationValueListDTO taxDeclarationValueListDTO = getTaxDeclarationValueService(user).convert2List(taxDeclaration, page.getList()); PageInfo> dtoPage = new PageInfo<>( page.getPageNum(), page.getPageSize(), page.getTotal(), SalaryPageUtil.convertList(taxDeclarationValueListDTO.getColumns()), taxDeclarationValueListDTO.getData()); return dtoPage; } /** * 未报送的人员列表 * * @param queryParam * @return */ public PageInfo listEmployeePage4NotDeclare(AbnormalEmployeeListQueryParam queryParam) { return listEmployeePage("NotDeclare", queryParam); } /** * 没有申报数据的人员列表 * * @param queryParam * @return */ public PageInfo listEmployeePage4NoValue(AbnormalEmployeeListQueryParam queryParam) { return listEmployeePage("NoValue", queryParam); } /** * 申报失败的人员列表 * * @param queryParam * @return */ public PageInfo listEmployeePage4Fail(AbnormalEmployeeListQueryParam queryParam) { // 查询个税申报记录 TaxDeclareRecordPO taxDeclareRecord = getTaxDeclareRecordService(user).getById(queryParam.getTaxDeclareRecordId()); // 查询申报失败的数据 List taxDeclareFailPOPageInfo = getTaxDeclareFailService(user).listPageByTaxDeclareRecordIds(Collections.singleton(taxDeclareRecord.getId())); // 转换成dto List failEmployeeListDTOS = getTaxDeclareFailService(user).convert2FailEmployeeList(taxDeclareRecord, taxDeclareFailPOPageInfo); PageInfo dtoPage = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), failEmployeeListDTOS, FailEmployeeListDTO.class); // 转成前端所需的格式 return dtoPage; } private PageInfo 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 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 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 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 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 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.getInstance().buildForm(TaxDeclareRecordFormDTO.class, formDTO); // weaForm.getItems().forEach((k, v) -> { // if (StringUtils.equals("salaryMonth", k)) { // Map 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 getTaxDeclarationTab(Long id) { // 查询个税申报记录 TaxDeclareRecordPO taxDeclareRecord = getTaxDeclareRecordService(user).getById(id); // 查询个税申报记录下的个税申报表 List 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 taxDeclarationMap = SalaryEntityUtil.convert2Map(taxDeclarations, TaxDeclarationPO::getIncomeCategory); List 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 notDeclareTaxDeclareEmployees = getTaxDeclareEmployeeService(user).list4NotDeclareByParam(queryParam); // 查询是否存在没有申报数据的人 List noValueTaxDeclareEmployees = getTaxDeclareEmployeeService(user).list4NoValueByParam(queryParam); // 查询是否存在申报失败的人 List 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 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 cancelCorrect(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).cancelCorrect(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, "cancelCorrect", 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); } public void contrast(Long id) { getTaxDeclareRecordService(user).contrast(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); } /** * 新增表单 * @param param * @return */ public TaxDeclareRecordDetailFormDTO getAddForm(TaxDeclareRecordDetailFormParam param) { TaxDeclarationPO taxDeclaration = getTaxDeclarationService(user).getById(param.getTaxDeclarationId()); if (taxDeclaration == null) { throw new SalaryRunTimeException("申报表不存在!"); } // 查询个税申报表列 List taxReportColumns = getTaxReportColumnService(user).listByIncomeCategory(IncomeCategoryEnum.parseByValue(taxDeclaration.getIncomeCategory()),0); //当前税款所属期报送成功且状态正常的人员 List employeeDeclarePOS = getEmployeeDeclareService(user).listByParam( EmployeeDeclareListQueryParam .builder() .taxCycle(taxDeclaration.getTaxCycle()) .taxAgentId(taxDeclaration.getTaxAgentId()) .declareStatus(DeclareStatusEnum.DECLARE_SUCCESS) .employmentStatus(EmploymentStatusEnum.NORMAL) .build() ); //过滤申报表中已存在的人员 List taxDeclarationValuePOS = getTaxDeclarationValueService(user).listByTaxDeclarationIds(Collections.singletonList(param.getTaxDeclarationId())); Set 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); } /** * 详细信息 * @param id * @return */ public TaxDeclareRecordDetailFormDTO detailInfo(Long id) { TaxDeclarationValuePO declarationValuePO = getTaxDeclarationValueService(user).getById(id); TaxDeclarationPO taxDeclarationPO = getTaxDeclarationService(user).getById(declarationValuePO.getTaxDeclarationId()); List 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 taxReportColumns = getTaxReportColumnService(user).listByIncomeCategory(IncomeCategoryEnum.parseByValue(taxDeclarationPO.getIncomeCategory()),0); 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 preview(DownloadTemplateParam param) { return getTaxDeclarationExcelService(user).preview(param); } public Map importData(DownloadTemplateParam param) { return getTaxDeclarationExcelService(user).importData(param); } }