weaver-hrm-salary/src/com/engine/salary/service/impl/TaxDeclarationValueServiceI...

174 lines
8.7 KiB
Java

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<TaxDeclarationValuePO> listPageByTaxDeclarationIds( Collection<Long> 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<TaxDeclarationValuePO> listByTaxDeclarationIds(Collection<Long> taxDeclarationIds) {
List<TaxDeclarationValuePO> 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<TaxDeclarationValuePO> listByTaxDeclarationIdsNoDecrypt(Collection<Long> 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<TaxDeclarationValuePO> taxDeclarationValues) {
// 查询个税申报表表头
IncomeCategoryEnum incomeCategoryEnum = SalaryEnumUtil.enumMatchByValue(taxDeclaration.getIncomeCategory(), IncomeCategoryEnum.class);
List<TaxReportColumnPO> taxReportColumns = taxReportColumnService.listByIncomeCategory(incomeCategoryEnum, tenantKey);
// 人员id
Set<Long> employeeIds = SalaryEntityUtil.properties(taxDeclarationValues, TaxDeclarationValuePO::getEmployeeId);
// 查询报送的人员
List<EmployeeDeclarePO> employeeDeclares = employeeDeclareService.listByTaxCycleAndTaxAgentIdAndEmployeeIds(
YearMonth.parse(taxDeclaration.getTaxCycle()), taxDeclaration.getTaxAgentId(), employeeIds, tenantKey);
// 查询人员信息
List<Long> simpleEmployeeIds = taxDeclarationValues.stream()
.filter(taxDeclarationValue -> Objects.equals(taxDeclarationValue.getEmployeeType(), EmployeeTypeEnum.ORGANIZATION.getValue()))
.map(TaxDeclarationValuePO::getEmployeeId)
.distinct()
.collect(Collectors.toList());
List<SimpleEmployee> simpleEmployees = hrmCommonEmployeeService.getEmployeeByIds(simpleEmployeeIds, tenantKey);
// 查询人员薪资(身份证号码等)
List<SimpleUserInfo> simpleUserInfos = salaryEmployeeService.listByEmployeeIds(simpleEmployeeIds, tenantKey);
// 查询外部人员
Set<Long> extEmployeeIds = taxDeclarationValues.stream()
.filter(taxDeclarationValue -> Objects.equals(taxDeclarationValue.getEmployeeType(), EmployeeTypeEnum.EXT_EMPLOYEE.getValue()))
.map(TaxDeclarationValuePO::getEmployeeId)
.collect(Collectors.toSet());
List<ExtEmployeePO> extEmployees = extEmployeeService.listByIdsWithDeleted(extEmployeeIds, tenantKey);
// 列表表头
List<WeaTableColumn> weaTableColumns = TaxDeclarationValueList.buildTableColumns(taxReportColumns);
// 列表数据
List<Map<String, Object>> data = TaxDeclarationValueList.buildTableData(incomeCategoryEnum, taxReportColumns, taxDeclarationValues,
employeeDeclares, simpleEmployees, simpleUserInfos, extEmployees);
return new TaxDeclarationValueListDTO().setColumns(weaTableColumns).setData(data);
}
@Override
public void batchSave(List<TaxDeclarationValuePO> 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<List<TaxDeclarationValuePO>> partition = Lists.partition(taxDeclarationValues, batchSize);
for (List<TaxDeclarationValuePO> subTaxDeclarationValues : partition) {
baseMapper.batchInsert(subTaxDeclarationValues);
}
}
}
@Override
public void deleteByTaxDeclareRecordIds(Collection<Long> 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<TaxDeclarationValuePO> decryptBatch(List<TaxDeclarationValuePO> 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;
}
}