package com.engine.salary.service.impl; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.engine.core.impl.Service; import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationValuePO; import com.engine.salary.service.EmployeeDeclareService; import com.engine.salary.service.ExtEmpService; import com.engine.salary.service.SalaryEmployeeService; import com.engine.salary.service.TaxDeclarationValueService; import com.engine.salary.util.page.PageInfo; import com.google.common.collect.Lists; import com.weaver.common.component.table.column.WeaTableColumn; import com.weaver.common.hrm.service.HrmCommonEmployeeService; import com.weaver.framework.util.JsonUtil; import com.weaver.hrm.salary.entity.employeedeclare.po.EmployeeDeclarePO; import com.weaver.hrm.salary.entity.extemployee.po.ExtEmployeePO; import com.weaver.hrm.salary.entity.taxdeclaration.bo.TaxDeclarationValueList; import com.weaver.hrm.salary.entity.taxdeclaration.dto.TaxDeclarationValueListDTO; import com.weaver.hrm.salary.entity.taxdeclaration.po.TaxDeclarationPO; import com.weaver.hrm.salary.entity.taxdeclaration.po.TaxReportColumnPO; import com.weaver.hrm.salary.enums.salaryaccounting.EmployeeTypeEnum; import com.weaver.hrm.salary.enums.salarysob.IncomeCategoryEnum; import com.weaver.hrm.salary.enums.sicategory.DeleteTypeEnum; import com.weaver.hrm.salary.service.*; import com.weaver.hrm.salary.util.SalaryEntityUtil; import com.weaver.hrm.salary.util.SalaryEnumUtil; import com.weaver.hrm.salary.util.SalaryPageUtil; import com.weaver.teams.domain.hr.SimpleUserInfo; import com.weaver.teams.domain.user.SimpleEmployee; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import java.time.LocalDateTime; import java.time.YearMonth; import java.util.*; import java.util.stream.Collectors; import static com.engine.salary.entity.siaccount.param.DSTenantKeyThreadVar.tenantKey; /** * @description: 个税申报表 * @author: xiajun * @modified By: xiajun * @date: Created in 9/28/22 9:41 AM * @version:v1.0 */ @Slf4j public class TaxDeclarationValueServiceImpl extends Service implements TaxDeclarationValueService { private DataSecurityService dataSecurityService; private HrmCommonEmployeeService hrmCommonEmployeeService; private SalaryEmployeeService salaryEmployeeService; private ExtEmpService extEmployeeService; private EmployeeDeclareService employeeDeclareService; // private TaxReportColumnService taxReportColumnService; @Override public PageInfo listPageByTaxDeclarationIds( Collection taxDeclarationIds) { if (page == null) { return page; } page = new LambdaQueryChainWrapper<>(baseMapper) .eq(TaxDeclarationValuePO::getTenantKey, tenantKey) .eq(TaxDeclarationValuePO::getDeleteType, DeleteTypeEnum.NOT_DELETED.getValue()) .in(TaxDeclarationValuePO::getTaxDeclarationId, taxDeclarationIds) .page(page); page.setRecords(decryptBatch(page.getRecords(), tenantKey)); return page; } @Override public List listByTaxDeclarationIds(Collection taxDeclarationIds) { List taxDeclarationValues = new LambdaQueryChainWrapper<>(baseMapper) .eq(TaxDeclarationValuePO::getTenantKey, tenantKey) .eq(TaxDeclarationValuePO::getDeleteType, DeleteTypeEnum.NOT_DELETED.getValue()) .in(TaxDeclarationValuePO::getTaxDeclarationId, taxDeclarationIds) .list(); return decryptBatch(taxDeclarationValues); } @Override public List listByTaxDeclarationIdsNoDecrypt(Collection taxDeclarationIds) { return new LambdaQueryChainWrapper<>(baseMapper) .eq(TaxDeclarationValuePO::getTenantKey, tenantKey) .eq(TaxDeclarationValuePO::getDeleteType, DeleteTypeEnum.NOT_DELETED.getValue()) .in(TaxDeclarationValuePO::getTaxDeclarationId, taxDeclarationIds) .list(); } @Override public TaxDeclarationValueListDTO convert2List(TaxDeclarationPO taxDeclaration, List taxDeclarationValues) { // 查询个税申报表表头 IncomeCategoryEnum incomeCategoryEnum = SalaryEnumUtil.enumMatchByValue(taxDeclaration.getIncomeCategory(), IncomeCategoryEnum.class); List taxReportColumns = taxReportColumnService.listByIncomeCategory(incomeCategoryEnum, tenantKey); // 人员id Set employeeIds = SalaryEntityUtil.properties(taxDeclarationValues, TaxDeclarationValuePO::getEmployeeId); // 查询报送的人员 List employeeDeclares = employeeDeclareService.listByTaxCycleAndTaxAgentIdAndEmployeeIds( YearMonth.parse(taxDeclaration.getTaxCycle()), taxDeclaration.getTaxAgentId(), employeeIds, tenantKey); // 查询人员信息 List simpleEmployeeIds = taxDeclarationValues.stream() .filter(taxDeclarationValue -> Objects.equals(taxDeclarationValue.getEmployeeType(), EmployeeTypeEnum.ORGANIZATION.getValue())) .map(TaxDeclarationValuePO::getEmployeeId) .distinct() .collect(Collectors.toList()); List simpleEmployees = hrmCommonEmployeeService.getEmployeeByIds(simpleEmployeeIds, tenantKey); // 查询人员薪资(身份证号码等) List simpleUserInfos = salaryEmployeeService.listByEmployeeIds(simpleEmployeeIds, tenantKey); // 查询外部人员 Set extEmployeeIds = taxDeclarationValues.stream() .filter(taxDeclarationValue -> Objects.equals(taxDeclarationValue.getEmployeeType(), EmployeeTypeEnum.EXT_EMPLOYEE.getValue())) .map(TaxDeclarationValuePO::getEmployeeId) .collect(Collectors.toSet()); List extEmployees = extEmployeeService.listByIdsWithDeleted(extEmployeeIds, tenantKey); // 列表表头 List weaTableColumns = TaxDeclarationValueList.buildTableColumns(taxReportColumns); // 列表数据 List> data = TaxDeclarationValueList.buildTableData(incomeCategoryEnum, taxReportColumns, taxDeclarationValues, employeeDeclares, simpleEmployees, simpleUserInfos, extEmployees); return new TaxDeclarationValueListDTO().setColumns(weaTableColumns).setData(data); } @Override public void batchSave(List taxDeclarationValues) { if (CollectionUtils.isNotEmpty(taxDeclarationValues)) { // 加密 taxDeclarationValues.forEach(taxDeclarationValue -> taxDeclarationValue.setResultValueJson(JsonUtil.toJsonString(taxDeclarationValue.getResultValue()))); taxDeclarationValues = dataSecurityService.encryptBatch(taxDeclarationValues, TaxDeclarationValuePO.class, tenantKey); // 分批保存 int batchSize = SalaryPageUtil.getBatchSize(); List> partition = Lists.partition(taxDeclarationValues, batchSize); for (List subTaxDeclarationValues : partition) { baseMapper.batchInsert(subTaxDeclarationValues); } } } @Override public void deleteByTaxDeclareRecordIds(Collection taxDeclareRecordIds) { if (CollectionUtils.isEmpty(taxDeclareRecordIds)) { return; } new LambdaUpdateChainWrapper<>(baseMapper) .eq(TaxDeclarationValuePO::getTenantKey, tenantKey) .eq(TaxDeclarationValuePO::getDeleteType, DeleteTypeEnum.NOT_DELETED.getValue()) .in(TaxDeclarationValuePO::getTaxDeclareRecordId, taxDeclareRecordIds) .set(TaxDeclarationValuePO::getDeleteType, DeleteTypeEnum.PHYSICAL_DELETED.getValue()) .set(TaxDeclarationValuePO::getUpdateTime, LocalDateTime.now()) .update(); } private List decryptBatch(List taxDeclarationValues) { if (CollectionUtils.isEmpty(taxDeclarationValues)) { return Collections.emptyList(); } // 解密 taxDeclarationValues = dataSecurityService.decryptBatch(taxDeclarationValues, TaxDeclarationValuePO.class, tenantKey); taxDeclarationValues.forEach(salaryAcctResultValue -> { salaryAcctResultValue.setResultValue(JsonUtil.parseMap(salaryAcctResultValue.getResultValueJson(), String.class)); }); return taxDeclarationValues; } }