2022-04-08 19:08:59 +08:00
|
|
|
|
package com.engine.salary.service.impl;
|
|
|
|
|
|
|
2022-04-12 19:25:19 +08:00
|
|
|
|
import com.engine.common.util.ServiceUtil;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
import com.engine.core.impl.Service;
|
2022-04-29 17:15:22 +08:00
|
|
|
|
import com.engine.salary.cache.SalaryCacheKey;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
import com.engine.salary.common.LocalDateRange;
|
2022-05-31 16:02:41 +08:00
|
|
|
|
import com.engine.salary.encrypt.salaryacct.SalaryAcctResultPOEncrypt;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
|
2022-04-11 20:17:47 +08:00
|
|
|
|
import com.engine.salary.entity.datacollection.dto.AttendQuoteFieldListDTO;
|
|
|
|
|
|
import com.engine.salary.entity.salaryacct.bo.SalaryAcctCalculateBO;
|
|
|
|
|
|
import com.engine.salary.entity.salaryacct.bo.SalaryAcctCalculatePriorityBO;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
import com.engine.salary.entity.salaryacct.bo.SalaryAcctResultBO;
|
|
|
|
|
|
import com.engine.salary.entity.salaryacct.dto.ConsolidatedTaxDetailDTO;
|
2022-04-11 20:17:47 +08:00
|
|
|
|
import com.engine.salary.entity.salaryacct.dto.SalaryAcctProgressDTO;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultDetailDTO;
|
2022-04-11 20:17:47 +08:00
|
|
|
|
import com.engine.salary.entity.salaryacct.param.SalaryAcctCalculateParam;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
import com.engine.salary.entity.salaryacct.param.SalaryAcctEmployeeQueryParam;
|
|
|
|
|
|
import com.engine.salary.entity.salaryacct.param.SalaryAcctResultQueryParam;
|
|
|
|
|
|
import com.engine.salary.entity.salaryacct.param.SalaryAcctResultSaveParam;
|
|
|
|
|
|
import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO;
|
|
|
|
|
|
import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO;
|
|
|
|
|
|
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
|
2022-04-11 20:17:47 +08:00
|
|
|
|
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultTempPO;
|
2022-04-28 15:02:11 +08:00
|
|
|
|
import com.engine.salary.entity.salaryformula.ExpressFormula;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
|
2022-04-11 20:17:47 +08:00
|
|
|
|
import com.engine.salary.entity.salarysob.dto.SalarySobCycleDTO;
|
|
|
|
|
|
import com.engine.salary.entity.salarysob.po.SalarySobAdjustRulePO;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
import com.engine.salary.entity.salarysob.po.SalarySobEmpFieldPO;
|
|
|
|
|
|
import com.engine.salary.entity.salarysob.po.SalarySobItemPO;
|
|
|
|
|
|
import com.engine.salary.entity.salarysob.po.SalarySobPO;
|
2022-05-31 16:41:11 +08:00
|
|
|
|
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
|
2022-04-11 20:17:47 +08:00
|
|
|
|
import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
import com.engine.salary.enums.salarysob.IncomeCategoryEnum;
|
|
|
|
|
|
import com.engine.salary.exception.SalaryRunTimeException;
|
|
|
|
|
|
import com.engine.salary.mapper.salaryacct.SalaryAcctResultMapper;
|
|
|
|
|
|
import com.engine.salary.service.*;
|
|
|
|
|
|
import com.engine.salary.util.SalaryDateUtil;
|
|
|
|
|
|
import com.engine.salary.util.SalaryEntityUtil;
|
|
|
|
|
|
import com.engine.salary.util.SalaryI18nUtil;
|
2022-04-12 19:25:19 +08:00
|
|
|
|
import com.engine.salary.util.db.MapperProxyFactory;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
import com.engine.salary.util.page.PageInfo;
|
2022-04-11 20:17:47 +08:00
|
|
|
|
import com.google.common.collect.Lists;
|
|
|
|
|
|
import com.weaver.util.threadPool.ThreadPoolUtil;
|
|
|
|
|
|
import com.weaver.util.threadPool.constant.ModulePoolEnum;
|
|
|
|
|
|
import com.weaver.util.threadPool.entity.LocalRunnable;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
|
import org.apache.commons.collections4.CollectionUtils;
|
2022-04-11 20:17:47 +08:00
|
|
|
|
import org.apache.commons.collections4.MapUtils;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
|
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
|
2022-04-12 19:25:19 +08:00
|
|
|
|
import weaver.hrm.User;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
|
2022-04-11 20:17:47 +08:00
|
|
|
|
import java.math.BigDecimal;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
import java.util.*;
|
2022-04-11 20:17:47 +08:00
|
|
|
|
import java.util.concurrent.BlockingDeque;
|
|
|
|
|
|
import java.util.concurrent.CountDownLatch;
|
|
|
|
|
|
import java.util.concurrent.LinkedBlockingDeque;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 薪资核算结果
|
|
|
|
|
|
* <p>Copyright: Copyright (c) 2022</p>
|
|
|
|
|
|
* <p>Company: 泛微软件</p>
|
|
|
|
|
|
*
|
|
|
|
|
|
* @author qiantao
|
|
|
|
|
|
* @version 1.0
|
|
|
|
|
|
**/
|
|
|
|
|
|
@Slf4j
|
|
|
|
|
|
public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctResultService {
|
|
|
|
|
|
|
2022-04-29 17:15:22 +08:00
|
|
|
|
private SalaryAcctResultMapper getSalaryAcctResultMapper() {
|
2022-04-12 19:25:19 +08:00
|
|
|
|
return MapperProxyFactory.getProxy(SalaryAcctResultMapper.class);
|
|
|
|
|
|
}
|
2022-04-29 17:15:22 +08:00
|
|
|
|
|
2022-04-12 19:25:19 +08:00
|
|
|
|
private SalaryAcctEmployeeService getSalaryAcctEmployeeService(User user) {
|
|
|
|
|
|
return (SalaryAcctEmployeeService) ServiceUtil.getService(SalaryAcctEmployeeServiceImpl.class, user);
|
|
|
|
|
|
}
|
2022-04-29 17:15:22 +08:00
|
|
|
|
|
2022-04-12 19:25:19 +08:00
|
|
|
|
private SalarySobItemService getSalarySobItemService(User user) {
|
|
|
|
|
|
return (SalarySobItemService) ServiceUtil.getService(SalarySobItemServiceImpl.class, user);
|
|
|
|
|
|
}
|
2022-04-29 17:15:22 +08:00
|
|
|
|
|
2022-04-12 19:25:19 +08:00
|
|
|
|
private SalaryItemService getSalaryItemService(User user) {
|
|
|
|
|
|
return (SalaryItemService) ServiceUtil.getService(SalaryItemServiceImpl.class, user);
|
|
|
|
|
|
}
|
2022-04-29 17:15:22 +08:00
|
|
|
|
|
2022-04-12 19:25:19 +08:00
|
|
|
|
private SalarySobEmpFieldService getSalarySobEmpFieldService(User user) {
|
|
|
|
|
|
return (SalarySobEmpFieldService) ServiceUtil.getService(SalarySobEmpFieldServiceImpl.class, user);
|
|
|
|
|
|
}
|
2022-04-29 17:15:22 +08:00
|
|
|
|
|
2022-04-12 19:25:19 +08:00
|
|
|
|
private SalarySobService getSalarySobService(User user) {
|
|
|
|
|
|
return (SalarySobService) ServiceUtil.getService(SalarySobServiceImpl.class, user);
|
|
|
|
|
|
}
|
2022-04-29 17:15:22 +08:00
|
|
|
|
|
2022-04-12 19:25:19 +08:00
|
|
|
|
private SalaryAcctRecordService getSalaryAcctRecordService(User user) {
|
|
|
|
|
|
return (SalaryAcctRecordService) ServiceUtil.getService(SalaryAcctRecordServiceImpl.class, user);
|
|
|
|
|
|
}
|
2022-04-29 17:15:22 +08:00
|
|
|
|
|
2022-05-31 21:05:59 +08:00
|
|
|
|
private TaxAgentService getTaxAgentService(User user) {
|
|
|
|
|
|
return ServiceUtil.getService(TaxAgentServiceImpl.class, user);
|
2022-05-31 16:41:11 +08:00
|
|
|
|
}
|
2022-04-08 19:08:59 +08:00
|
|
|
|
|
2022-04-12 19:25:19 +08:00
|
|
|
|
private SalaryEmployeeService getSalaryEmployeeService(User user) {
|
|
|
|
|
|
return (SalaryEmployeeService) ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user);
|
|
|
|
|
|
}
|
2022-04-29 17:15:22 +08:00
|
|
|
|
|
2022-04-12 19:25:19 +08:00
|
|
|
|
private SalaryFormulaService getSalaryFormulaService(User user) {
|
2022-04-14 10:03:49 +08:00
|
|
|
|
return (SalaryFormulaService) ServiceUtil.getService(SalaryFormulaServiceImpl.class, user);
|
2022-04-12 19:25:19 +08:00
|
|
|
|
}
|
2022-04-29 17:15:22 +08:00
|
|
|
|
|
2022-04-12 19:25:19 +08:00
|
|
|
|
private SalarySobAdjustRuleService getSalarySobAdjustRuleService(User user) {
|
|
|
|
|
|
return (SalarySobAdjustRuleService) ServiceUtil.getService(SalarySobAdjustRuleServiceImpl.class, user);
|
|
|
|
|
|
}
|
2022-04-29 17:15:22 +08:00
|
|
|
|
|
2022-04-12 19:25:19 +08:00
|
|
|
|
private SalaryAcctCalculateService getSalaryAcctCalculateService(User user) {
|
|
|
|
|
|
return (SalaryAcctCalculateService) ServiceUtil.getService(SalaryAcctCalculateServiceImpl.class, user);
|
|
|
|
|
|
}
|
2022-04-29 17:15:22 +08:00
|
|
|
|
|
|
|
|
|
|
private SalaryAcctProgressService getSalaryAcctProgressService(User user) {
|
|
|
|
|
|
return (SalaryAcctProgressService) ServiceUtil.getService(SalaryAcctProgressServiceImpl.class, user);
|
|
|
|
|
|
}
|
2022-04-08 19:08:59 +08:00
|
|
|
|
|
|
|
|
|
|
private DataSourceTransactionManager dataSourceTransactionManager;
|
|
|
|
|
|
|
2022-04-12 19:25:19 +08:00
|
|
|
|
private SalaryAcctResultTempService getSalaryAcctResultTempService(User user) {
|
|
|
|
|
|
return (SalaryAcctResultTempService) ServiceUtil.getService(SalaryAcctResultTempServiceImpl.class, user);
|
|
|
|
|
|
}
|
2022-04-07 16:54:10 +08:00
|
|
|
|
// private LoggerTemplate salaryAcctRecordLoggerTemplate;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
|
2022-04-28 15:02:11 +08:00
|
|
|
|
private SIAccountService getSIAccountService(User user) {
|
|
|
|
|
|
return (SIAccountService) ServiceUtil.getService(SIAccountServiceImpl.class, user);
|
|
|
|
|
|
}
|
2022-04-08 19:08:59 +08:00
|
|
|
|
|
2022-04-12 19:25:19 +08:00
|
|
|
|
private AttendQuoteFieldService getAttendQuoteFieldService(User user) {
|
|
|
|
|
|
return (AttendQuoteFieldService) ServiceUtil.getService(AttendQuoteFieldServiceImpl.class, user);
|
|
|
|
|
|
}
|
2022-04-29 17:15:22 +08:00
|
|
|
|
|
2022-04-12 19:25:19 +08:00
|
|
|
|
private SalaryCheckResultService salaryCheckResultService;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalaryAcctResultPO> listBySalaryAcctRecordIds(Collection<Long> salaryAcctRecordIds) {
|
|
|
|
|
|
if (CollectionUtils.isEmpty(salaryAcctRecordIds)) {
|
|
|
|
|
|
return Collections.emptyList();
|
|
|
|
|
|
}
|
2022-05-24 09:23:17 +08:00
|
|
|
|
List<SalaryAcctResultPO> salaryAcctResultPOS =
|
|
|
|
|
|
getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctRecordIds(salaryAcctRecordIds).build());
|
2022-05-31 16:02:41 +08:00
|
|
|
|
SalaryAcctResultPOEncrypt.decryptList(salaryAcctResultPOS);
|
2022-05-24 09:23:17 +08:00
|
|
|
|
return salaryAcctResultPOS;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalaryAcctResultPO> listBySalaryAcctEmployeeId(Long salaryAcctEmployeeId) {
|
2022-05-24 09:23:17 +08:00
|
|
|
|
List<SalaryAcctResultPO> salaryAcctResultPOS = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctEmpId(salaryAcctEmployeeId).build());
|
2022-05-31 16:02:41 +08:00
|
|
|
|
SalaryAcctResultPOEncrypt.decryptList(salaryAcctResultPOS);
|
2022-05-24 09:23:17 +08:00
|
|
|
|
// 解密
|
|
|
|
|
|
return salaryAcctResultPOS;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalaryAcctResultPO> listBySalaryAcctEmployeeIds(Collection<Long> salaryAcctEmployeeIds) {
|
|
|
|
|
|
if (CollectionUtils.isEmpty(salaryAcctEmployeeIds)) {
|
|
|
|
|
|
return Collections.emptyList();
|
|
|
|
|
|
}
|
2022-05-24 09:23:17 +08:00
|
|
|
|
List<SalaryAcctResultPO> salaryAcctResultPOS = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctEmpIds(salaryAcctEmployeeIds).build());
|
|
|
|
|
|
// 解密
|
2022-06-02 17:01:26 +08:00
|
|
|
|
SalaryAcctResultPOEncrypt.decryptList(salaryAcctResultPOS);
|
2022-05-24 09:23:17 +08:00
|
|
|
|
return salaryAcctResultPOS;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalaryAcctResultPO> listBySalaryAcctRecordIdsAndEmployeeIds(Collection<Long> salaryAcctRecordIds, Collection<Long> employeeIds) {
|
|
|
|
|
|
if (CollectionUtils.isEmpty(salaryAcctRecordIds) || CollectionUtils.isEmpty(employeeIds)) {
|
|
|
|
|
|
return Collections.emptyList();
|
|
|
|
|
|
}
|
2022-05-24 09:23:17 +08:00
|
|
|
|
List<SalaryAcctResultPO> salaryAcctResultPOS = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctRecordIds(salaryAcctRecordIds).employeeIds(employeeIds).build());
|
2022-05-31 16:02:41 +08:00
|
|
|
|
SalaryAcctResultPOEncrypt.decryptList(salaryAcctResultPOS);
|
2022-05-24 09:23:17 +08:00
|
|
|
|
return salaryAcctResultPOS;
|
2022-04-08 19:08:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public SalaryAcctResultDetailDTO getBySalaryAcctEmployeeId(Long salaryAcctEmployeeId) {
|
|
|
|
|
|
// 查询薪资核算人员
|
2022-04-12 19:25:19 +08:00
|
|
|
|
SalaryAcctEmployeePO salaryAcctEmployeePO = getSalaryAcctEmployeeService(user).getById(salaryAcctEmployeeId);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
if (Objects.isNull(salaryAcctEmployeePO)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98831, "薪资核算人员不存在或已被删除"));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 查询薪资核算所用薪资账套的薪资项目副本
|
2022-04-12 19:25:19 +08:00
|
|
|
|
List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctEmployeePO.getSalarySobId());
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 查询薪资项目
|
|
|
|
|
|
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
|
2022-04-12 19:25:19 +08:00
|
|
|
|
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 查询薪资核算所用薪资账套的人员信息字段
|
2022-04-12 19:25:19 +08:00
|
|
|
|
List<SalarySobEmpFieldPO> salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salaryAcctEmployeePO.getSalarySobId());
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 查询人员信息
|
2022-04-12 19:25:19 +08:00
|
|
|
|
DataCollectionEmployee simpleEmployee = getSalaryEmployeeService(user).getEmployeeById(salaryAcctEmployeePO.getEmployeeId());
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 查询薪资核算结果
|
|
|
|
|
|
List<SalaryAcctResultPO> salaryAcctResultPOS = listBySalaryAcctEmployeeId(salaryAcctEmployeeId);
|
|
|
|
|
|
// 查询个税扣缴义务人
|
2022-05-31 16:41:11 +08:00
|
|
|
|
TaxAgentPO taxAgent = getTaxAgentService(user).getById(salaryAcctEmployeePO.getTaxAgentId());
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 转换成薪资核算结果详情dto
|
|
|
|
|
|
return SalaryAcctResultBO.convert2DetailDTO(simpleEmployee, taxAgent, salaryAcctEmployeePO, salarySobEmpFieldPOS, salarySobItemPOS, salaryItemPOS, salaryAcctResultPOS);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public PageInfo<Map<String, Object>> listPageByParam(SalaryAcctResultQueryParam queryParam) {
|
|
|
|
|
|
// 查询薪资核算人员(分页)
|
2022-04-12 19:25:19 +08:00
|
|
|
|
PageInfo<SalaryAcctEmployeePO> page = getSalaryAcctEmployeeService(user).listPageByResultQueryParam(queryParam);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 查询薪资核算结果
|
|
|
|
|
|
List<Map<String, Object>> data = listBySalaryAcctEmployees(page.getList(), queryParam);
|
|
|
|
|
|
// 薪资核算结果的分页结果
|
|
|
|
|
|
PageInfo<Map<String, Object>> resultPage = new PageInfo<>();
|
|
|
|
|
|
resultPage.setList(data);
|
2022-04-19 19:32:09 +08:00
|
|
|
|
resultPage.setTotal(page.getTotal());
|
|
|
|
|
|
resultPage.setPageNum(page.getPageNum());
|
|
|
|
|
|
resultPage.setPageSize(page.getPageSize());
|
2022-04-08 19:08:59 +08:00
|
|
|
|
return resultPage;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<Map<String, Object>> listByParam(SalaryAcctResultQueryParam queryParam) {
|
|
|
|
|
|
// 查询薪资核算人员
|
2022-04-12 19:25:19 +08:00
|
|
|
|
List<SalaryAcctEmployeePO> salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listByResultQueryParam(queryParam);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 查询薪资核算结果
|
|
|
|
|
|
return listBySalaryAcctEmployees(salaryAcctEmployeePOS, queryParam);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 根据薪资核算人员查询薪资核算结果
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param salaryAcctEmployeePOS 薪资核算人员
|
|
|
|
|
|
* @param queryParam 列表查询条件
|
|
|
|
|
|
* @return
|
|
|
|
|
|
*/
|
|
|
|
|
|
private List<Map<String, Object>> listBySalaryAcctEmployees(List<SalaryAcctEmployeePO> salaryAcctEmployeePOS,
|
|
|
|
|
|
SalaryAcctResultQueryParam queryParam) {
|
|
|
|
|
|
if (CollectionUtils.isEmpty(salaryAcctEmployeePOS)) {
|
|
|
|
|
|
return Collections.emptyList();
|
|
|
|
|
|
}
|
|
|
|
|
|
// 查询薪资核算记录
|
2022-04-12 19:25:19 +08:00
|
|
|
|
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(queryParam.getSalaryAcctRecordId());
|
2022-04-08 19:08:59 +08:00
|
|
|
|
if (Objects.isNull(salaryAcctRecordPO)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 查询薪资核算所用的薪资账套的员工信息字段
|
2022-04-12 19:25:19 +08:00
|
|
|
|
List<SalarySobEmpFieldPO> salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 查询薪资核算所用薪资账套的薪资项目
|
2022-04-12 19:25:19 +08:00
|
|
|
|
List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
|
2022-04-08 19:08:59 +08:00
|
|
|
|
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
|
2022-04-12 19:25:19 +08:00
|
|
|
|
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 查询薪资核算结果
|
|
|
|
|
|
Set<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId);
|
|
|
|
|
|
List<SalaryAcctResultPO> salaryAcctResultPOS = listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds);
|
|
|
|
|
|
// 查询人员信息
|
|
|
|
|
|
List<Long> employeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getEmployeeId, Collectors.toList());
|
2022-04-12 19:25:19 +08:00
|
|
|
|
List<DataCollectionEmployee> simpleEmployees = getSalaryEmployeeService(user).listByIds(employeeIds);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 查询个税扣缴义务人
|
|
|
|
|
|
Set<Long> taxAgentIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getTaxAgentId);
|
2022-05-31 16:41:11 +08:00
|
|
|
|
List<TaxAgentPO> taxAgentPOS = getTaxAgentService(user).listByIds(taxAgentIds);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 判断是否存在合并计税
|
|
|
|
|
|
Set<Long> salaryAcctEmployeeIds4ConsolidatedTax;
|
|
|
|
|
|
if (StringUtils.isNotEmpty(queryParam.getConsolidatedTaxation())) {
|
|
|
|
|
|
// 如果查询条件中含有"合并计税",那么在入参中的salaryAcctEmployeePOS就已经全部都是存在合并计税的人员了(前面已经过滤了),无需再次查询合并计税的人员
|
|
|
|
|
|
salaryAcctEmployeeIds4ConsolidatedTax = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 如果查询条件中没有包含"合并计税",那么就需要查询出存在合并计税的人,标记给前端
|
2022-04-12 19:25:19 +08:00
|
|
|
|
SalaryAcctEmployeeQueryParam accEmployeeQueryParam = SalaryAcctEmployeeQueryParam.builder()
|
|
|
|
|
|
.salaryAcctRecordId(queryParam.getSalaryAcctRecordId())
|
|
|
|
|
|
.ids(SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId))
|
|
|
|
|
|
.build();
|
|
|
|
|
|
List<SalaryAcctEmployeePO> salaryAcctEmployeePOS4ConsolidatedTax = getSalaryAcctEmployeeService(user).listByParam4ConsolidatedTax(accEmployeeQueryParam);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
salaryAcctEmployeeIds4ConsolidatedTax = SalaryEntityUtil.properties(salaryAcctEmployeePOS4ConsolidatedTax, SalaryAcctEmployeePO::getId);
|
|
|
|
|
|
}
|
|
|
|
|
|
// 查询公式详情
|
|
|
|
|
|
Set<Long> formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId);
|
2022-04-12 19:25:19 +08:00
|
|
|
|
List<ExpressFormula> expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
Map<Long, String> expressFormulaMap = SalaryEntityUtil.convert2Map(expressFormulas, ExpressFormula::getId, ExpressFormula::getFormula);
|
|
|
|
|
|
Map<Long, String> customParameters = SalaryEntityUtil.convert2Map(salarySobItemPOS, SalarySobItemPO::getSalaryItemId, salarySobItemPO -> {
|
|
|
|
|
|
if (salarySobItemPO.getFormulaId() <= 0) {
|
|
|
|
|
|
return SalaryI18nUtil.getI18nLabel(92004, "输入/导入");
|
|
|
|
|
|
}
|
|
|
|
|
|
return expressFormulaMap.getOrDefault(salarySobItemPO.getFormulaId(), StringUtils.EMPTY);
|
|
|
|
|
|
});
|
|
|
|
|
|
// 转换成薪资核算结果列表
|
|
|
|
|
|
return SalaryAcctResultBO
|
|
|
|
|
|
.buildTableData(salaryItemPOS, salarySobEmpFieldPOS, simpleEmployees, salaryAcctEmployeePOS, salaryAcctResultPOS, taxAgentPOS, salaryAcctEmployeeIds4ConsolidatedTax, customParameters);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public ConsolidatedTaxDetailDTO getConsolidatedTaxDetail(Long salaryAcctEmployeeId) {
|
|
|
|
|
|
// 查询当前的薪资核算人员
|
2022-04-12 19:25:19 +08:00
|
|
|
|
SalaryAcctEmployeePO salaryAcctEmployeePO = getSalaryAcctEmployeeService(user).getById(salaryAcctEmployeeId);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
if (Objects.isNull(salaryAcctEmployeePO)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98831, "薪资核算人员不存在或已被删除"));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 查询当前的薪资核算人员的个税扣缴义务人
|
2022-05-31 16:41:11 +08:00
|
|
|
|
TaxAgentPO taxAgentPO = getTaxAgentService(user).getById(salaryAcctEmployeePO.getTaxAgentId());
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 查询当前的薪资核算人员的人员信息
|
2022-04-12 19:25:19 +08:00
|
|
|
|
DataCollectionEmployee simpleEmployee = getSalaryEmployeeService(user).getEmployeeById(salaryAcctEmployeePO.getEmployeeId());
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 查询当前的薪资核算记录
|
2022-04-12 19:25:19 +08:00
|
|
|
|
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryAcctEmployeePO.getSalaryAcctRecordId());
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 查询当前薪资核算记录所用的薪资账套
|
2022-04-12 19:25:19 +08:00
|
|
|
|
SalarySobPO salarySobPO = getSalarySobService(user).getById(salaryAcctRecordPO.getSalarySobId());
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 当前薪资核算记录所用的薪资账套的员工信息字段
|
2022-04-12 19:25:19 +08:00
|
|
|
|
List<SalarySobEmpFieldPO> salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salarySobPO.getId());
|
2022-04-08 19:08:59 +08:00
|
|
|
|
|
|
|
|
|
|
List<SalaryAcctRecordPO> salaryAcctRecordPOS = Collections.singletonList(salaryAcctRecordPO);
|
|
|
|
|
|
List<SalaryAcctEmployeePO> salaryAcctEmployeePOS = Collections.singletonList(salaryAcctEmployeePO);
|
|
|
|
|
|
|
|
|
|
|
|
// 如果当前薪资核算记录所用的薪资账套的薪资类型是工资薪金,代表可能存在合并计税
|
|
|
|
|
|
if (Objects.equals(salarySobPO.getIncomeCategory(), IncomeCategoryEnum.WAGES_AND_SALARIES.getValue())) {
|
|
|
|
|
|
// 查询所有薪资类型为工资薪金的账套
|
2022-04-12 19:25:19 +08:00
|
|
|
|
List<SalarySobPO> salarySobPOS = getSalarySobService(user).listByIncomeCategory(IncomeCategoryEnum.WAGES_AND_SALARIES);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 查询相同税款所属期内的薪资类型为工资薪金的账套的所有核算记录
|
|
|
|
|
|
Set<Long> salarySobIds = SalaryEntityUtil.properties(salarySobPOS, SalarySobPO::getId);
|
|
|
|
|
|
LocalDateRange taxCycleDateRange = SalaryDateUtil.localDate2Range(salaryAcctRecordPO.getTaxCycle());
|
2022-04-12 19:25:19 +08:00
|
|
|
|
salaryAcctRecordPOS = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(salarySobIds, taxCycleDateRange);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 查询当前薪资核算人员所涉及的合并计税的所有薪资核算人员
|
|
|
|
|
|
Set<Long> salaryAcctRecordIds = SalaryEntityUtil.properties(salaryAcctRecordPOS, SalaryAcctRecordPO::getId);
|
2022-04-12 19:25:19 +08:00
|
|
|
|
salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listByRecordIdsAndEmpIdAndTaxAgentId(salaryAcctRecordIds,
|
2022-04-08 19:08:59 +08:00
|
|
|
|
salaryAcctEmployeePO.getEmployeeId(), salaryAcctEmployeePO.getTaxAgentId());
|
|
|
|
|
|
}
|
|
|
|
|
|
// 查询薪资核算人员的薪资核算结果
|
|
|
|
|
|
Set<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId);
|
|
|
|
|
|
List<SalaryAcctResultPO> salaryAcctResultPOS = listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds);
|
|
|
|
|
|
// 查询薪资核算人员所有合并计税的薪资核算记录所用的账套
|
|
|
|
|
|
Set<Long> salarySobIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getSalarySobId);
|
2022-04-12 19:25:19 +08:00
|
|
|
|
List<SalarySobPO> salarySobPOS = getSalarySobService(user).listByIds(salarySobIds);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 查询薪资项目所引用的薪资项目
|
2022-04-12 19:25:19 +08:00
|
|
|
|
List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemService(user).listBySalarySobIds(salarySobIds);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 查询薪资项目
|
|
|
|
|
|
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
|
2022-04-12 19:25:19 +08:00
|
|
|
|
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 转换成合并计税详情dto
|
|
|
|
|
|
return SalaryAcctResultBO.convert2ConsolidatedTaxDetailDTO(simpleEmployee, taxAgentPO, salarySobEmpFieldPOS, salaryItemPOS,
|
|
|
|
|
|
salaryAcctEmployeePOS, salarySobPOS, salaryAcctRecordPOS, salaryAcctResultPOS);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void save(SalaryAcctResultSaveParam saveParam) {
|
|
|
|
|
|
// 查询薪资核算人员
|
2022-04-12 19:25:19 +08:00
|
|
|
|
SalaryAcctEmployeePO salaryAcctEmployeePO = getSalaryAcctEmployeeService(user).getById(saveParam.getSalaryAcctEmpId());
|
2022-04-08 19:08:59 +08:00
|
|
|
|
if (Objects.isNull(salaryAcctEmployeePO)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98831, "薪资核算人员不存在或已被删除"));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 保存参数转换成薪资核算结果po
|
2022-04-29 17:15:22 +08:00
|
|
|
|
List<SalaryAcctResultPO> salaryAcctResultPOS = SalaryAcctResultBO.convert2PO(saveParam, salaryAcctEmployeePO, (long) user.getUID());
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 删除原来的薪资核算结果
|
|
|
|
|
|
deleteBySalaryAcctEmployeeIds(Collections.singleton(saveParam.getSalaryAcctEmpId()));
|
|
|
|
|
|
// 保存薪资核算结果
|
|
|
|
|
|
if (CollectionUtils.isNotEmpty(salaryAcctResultPOS)) {
|
2022-06-02 17:01:26 +08:00
|
|
|
|
// 加密
|
|
|
|
|
|
SalaryAcctResultPOEncrypt.encryptList(salaryAcctResultPOS);
|
2022-06-16 17:55:26 +08:00
|
|
|
|
List<List<SalaryAcctResultPO>> partition = Lists.partition(salaryAcctResultPOS, 100);
|
|
|
|
|
|
partition.forEach(getSalaryAcctResultMapper()::batchInsert);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
// 查询操作日志的targetName
|
2022-04-12 19:25:19 +08:00
|
|
|
|
String targetName = getSalaryAcctRecordService(user).getLogTargetNameById(salaryAcctEmployeePO.getSalaryAcctRecordId());
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 查询人员信息
|
2022-04-12 19:25:19 +08:00
|
|
|
|
DataCollectionEmployee simpleEmployee = getSalaryEmployeeService(user).getEmployeeById(salaryAcctEmployeePO.getEmployeeId());
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 查询个税扣缴义务人
|
2022-05-31 16:41:11 +08:00
|
|
|
|
// TaxAgentPO taxAgentPO = getTaxAgentService(user).getById(salaryAcctEmployeePO.getTaxAgentId());
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// 记录日志
|
2022-04-07 16:54:10 +08:00
|
|
|
|
// String operateDesc = simpleEmployee.getUsername() + "(" + Optional.ofNullable(taxAgentPO).map(TaxAgentPO::getName).orElse(StringUtils.EMPTY) + ")";
|
|
|
|
|
|
// LoggerContext<SalaryCheckResultPO> loggerContext = new LoggerContext<>();
|
|
|
|
|
|
// loggerContext.setTargetId(String.valueOf(salaryAcctEmployeePO.getSalaryAcctRecordId()));
|
|
|
|
|
|
// loggerContext.setTargetName(targetName);
|
|
|
|
|
|
// loggerContext.setOperateType(OperateTypeEnum.UPDATE.getValue());
|
|
|
|
|
|
// loggerContext.setOperateTypeName(SalaryI18nUtil.getI18nLabel(95783, "编辑薪资核算结果") + ": " + operateDesc);
|
|
|
|
|
|
// loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel(95783, "编辑薪资核算结果") + ": " + operateDesc);
|
|
|
|
|
|
// loggerContext.setNewValueList(Lists.newArrayList(salaryAcctResultPOS));
|
|
|
|
|
|
// salaryAcctRecordLoggerTemplate.write(loggerContext);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void batchSave(Collection<SalaryAcctResultPO> salaryAcctResultPOS) {
|
|
|
|
|
|
if (CollectionUtils.isNotEmpty(salaryAcctResultPOS)) {
|
2022-06-16 17:55:26 +08:00
|
|
|
|
List<SalaryAcctResultPO> list = (List<SalaryAcctResultPO>)salaryAcctResultPOS;
|
|
|
|
|
|
// 数据加密
|
|
|
|
|
|
SalaryAcctResultPOEncrypt.encryptList(list);
|
|
|
|
|
|
List<List<SalaryAcctResultPO>> partition = Lists.partition(list, 100);
|
|
|
|
|
|
partition.forEach(getSalaryAcctResultMapper()::batchInsert);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void deleteBySalaryAcctEmployeeIds(Collection<Long> salaryAcctEmployeeIds) {
|
2022-04-12 19:25:19 +08:00
|
|
|
|
getSalaryAcctResultMapper().deleteBySalaryAcctEmpIds(salaryAcctEmployeeIds);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void deleteByAcctEmployeeIdsAndSalaryItemIds(Collection<Long> salaryAcctEmployeeIds, Collection<Long> salaryItemIds) {
|
2022-04-12 19:25:19 +08:00
|
|
|
|
getSalaryAcctResultMapper().deleteByAcctEmpIdsAndSalaryItemIds(salaryAcctEmployeeIds, salaryItemIds);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void deleteBySalaryAcctRecordIds(Collection<Long> salaryAcctRecordIds) {
|
2022-04-12 19:25:19 +08:00
|
|
|
|
getSalaryAcctResultMapper().deleteBySalaryAcctRecordIds(salaryAcctRecordIds);
|
2022-04-08 19:08:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-11 20:17:47 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public void calculate(SalaryAcctCalculateParam calculateParam, DataCollectionEmployee simpleEmployee) {
|
2022-06-15 17:53:12 +08:00
|
|
|
|
log.info("开始核算V2{}", calculateParam);
|
2022-04-11 20:17:47 +08:00
|
|
|
|
try {
|
|
|
|
|
|
// 1、查询薪资核算记录
|
2022-04-12 19:25:19 +08:00
|
|
|
|
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(calculateParam.getSalaryAcctRecordId());
|
2022-04-11 20:17:47 +08:00
|
|
|
|
if (Objects.isNull(salaryAcctRecordPO)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
|
|
|
|
|
|
}
|
2022-06-15 17:53:12 +08:00
|
|
|
|
//查询对应账套
|
|
|
|
|
|
SalarySobPO salarySobPO = getSalarySobService(user).getById(salaryAcctRecordPO.getSalarySobId());
|
|
|
|
|
|
if (Objects.isNull(salarySobPO)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资账套不存在或已被删除"));
|
|
|
|
|
|
}
|
2022-04-11 20:17:47 +08:00
|
|
|
|
// 1.1、如果薪资核算记录已经归档了,就不能继续核算
|
|
|
|
|
|
if (!Objects.equals(salaryAcctRecordPO.getStatus(), SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue())) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99148, "当前薪资核算记录已归档,请重新打开后再进行核算"));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 2、查询薪资核算记录的薪资周期、考勤周期等
|
2022-04-12 19:25:19 +08:00
|
|
|
|
SalarySobCycleDTO salarySobCycleDTO = getSalaryAcctRecordService(user).getSalarySobCycleById(calculateParam.getSalaryAcctRecordId());
|
2022-04-11 20:17:47 +08:00
|
|
|
|
// 3、查询薪资核算记录所用薪资账套的薪资项目副本
|
2022-04-12 19:25:19 +08:00
|
|
|
|
List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
|
2022-04-11 20:17:47 +08:00
|
|
|
|
if (CollectionUtils.isEmpty(salarySobItemPOS)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99151, "当前所用的薪资账套未选择任何薪资项目,无法核算"));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 4、查询当前租户的所有薪资项目
|
2022-04-12 19:25:19 +08:00
|
|
|
|
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listAll();
|
2022-04-11 20:17:47 +08:00
|
|
|
|
// 5、查询薪资核算记录所用薪资账套的调薪计薪规则
|
2022-04-12 19:25:19 +08:00
|
|
|
|
List<SalarySobAdjustRulePO> salarySobAdjustRulePOS = getSalarySobAdjustRuleService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
|
2022-04-28 15:02:11 +08:00
|
|
|
|
// 6、查询社保福利的所有字段
|
|
|
|
|
|
Map<String, String> welfareColumns = getSIAccountService(user).welfareColumns();
|
2022-04-11 20:17:47 +08:00
|
|
|
|
// 7、查询考勤引用的所有字段
|
2022-04-12 19:25:19 +08:00
|
|
|
|
List<AttendQuoteFieldListDTO> attendQuoteFieldListDTOS = getAttendQuoteFieldService(user).listAll();
|
2022-04-11 20:17:47 +08:00
|
|
|
|
// 8、查询公式详情
|
|
|
|
|
|
Set<Long> formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId);
|
|
|
|
|
|
formulaIds.addAll(SalaryEntityUtil.properties(salaryItemPOS, SalaryItemPO::getFormulaId));
|
2022-04-14 10:03:49 +08:00
|
|
|
|
List<ExpressFormula> expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds);
|
2022-04-11 20:17:47 +08:00
|
|
|
|
// 9、计算薪资项目的运算优先级
|
|
|
|
|
|
List<List<Long>> salarySobItemsWithPriority = SalaryAcctCalculatePriorityBO.calculatePriority(salarySobItemPOS, salaryItemPOS, expressFormulas);
|
|
|
|
|
|
// 10、根据id查询其他合并计税的薪资核算记录
|
2022-04-12 19:25:19 +08:00
|
|
|
|
List<SalaryAcctRecordPO> otherSalaryAcctRecordPOS = getSalaryAcctRecordService(user).listById4OtherConsolidatedTax(salaryAcctRecordPO.getId());
|
2022-04-11 20:17:47 +08:00
|
|
|
|
// 11、查询本次核算人员
|
|
|
|
|
|
List<SalaryAcctEmployeePO> salaryAcctEmployeePOS;
|
|
|
|
|
|
if (CollectionUtils.isEmpty(calculateParam.getIds())) {
|
2022-04-12 19:25:19 +08:00
|
|
|
|
salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salaryAcctRecordPO.getId());
|
2022-04-11 20:17:47 +08:00
|
|
|
|
} else {
|
2022-04-12 19:25:19 +08:00
|
|
|
|
salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listByIds(calculateParam.getIds());
|
2022-04-11 20:17:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
if (CollectionUtils.isEmpty(salaryAcctEmployeePOS)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(103378, "薪资核算人员不能为空"));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 11.1、初始化进度
|
|
|
|
|
|
SalaryAcctProgressDTO initProgress = new SalaryAcctProgressDTO()
|
|
|
|
|
|
.setTitle(SalaryI18nUtil.getI18nLabel(97515, "核算中"))
|
|
|
|
|
|
.setTitleLabelId(97515L)
|
|
|
|
|
|
.setTotalQuantity(salaryAcctEmployeePOS.size() * 2 + 1)
|
|
|
|
|
|
.setCalculatedQuantity(0)
|
|
|
|
|
|
.setProgress(BigDecimal.ZERO)
|
|
|
|
|
|
.setStatus(true)
|
|
|
|
|
|
.setMessage(StringUtils.EMPTY);
|
2022-04-29 17:15:22 +08:00
|
|
|
|
getSalaryAcctProgressService(user).initProgress(SalaryCacheKey.ACCT_PROGRESS + calculateParam.getSalaryAcctRecordId(), initProgress);
|
2022-04-11 20:17:47 +08:00
|
|
|
|
// 12、对薪资核算人员进行拆分
|
2022-05-09 10:32:14 +08:00
|
|
|
|
List<List<SalaryAcctEmployeePO>> partition = Lists.partition(salaryAcctEmployeePOS, 500);
|
2022-04-11 20:17:47 +08:00
|
|
|
|
// 12.1、监控子线程的任务执行
|
|
|
|
|
|
CountDownLatch childMonitor = new CountDownLatch(partition.size());
|
|
|
|
|
|
// 12.2、记录子线程的执行结果
|
|
|
|
|
|
BlockingDeque<SalaryAcctCalculateBO.Result> calculateResults = new LinkedBlockingDeque<>(partition.size());
|
|
|
|
|
|
// 12.3、生成本次运算的key
|
|
|
|
|
|
String calculateKey = UUID.randomUUID().toString();
|
|
|
|
|
|
// 12.4、多线程运算,运算结果存放在临时表中
|
|
|
|
|
|
for (List<SalaryAcctEmployeePO> acctEmployeePOS : partition) {
|
|
|
|
|
|
SalaryAcctCalculateBO salaryAcctCalculateBO = new SalaryAcctCalculateBO()
|
|
|
|
|
|
.setSalaryAcctRecordPO(salaryAcctRecordPO)
|
2022-06-15 17:53:12 +08:00
|
|
|
|
.setSalarySobPO(salarySobPO)
|
2022-04-11 20:17:47 +08:00
|
|
|
|
.setSalarySobCycleDTO(salarySobCycleDTO)
|
|
|
|
|
|
.setOtherSalaryAcctRecordPOS(otherSalaryAcctRecordPOS)
|
|
|
|
|
|
.setSalarySobItemPOS(salarySobItemPOS)
|
|
|
|
|
|
.setSalaryItemIdWithPriorityList(salarySobItemsWithPriority)
|
|
|
|
|
|
.setExpressFormulas(expressFormulas)
|
|
|
|
|
|
.setSalaryItemPOS(salaryItemPOS)
|
|
|
|
|
|
.setSalarySobAdjustRulePOS(salarySobAdjustRulePOS)
|
|
|
|
|
|
.setWelfareColumns(MapUtils.emptyIfNull(welfareColumns))
|
|
|
|
|
|
.setAttendQuoteFieldListDTOS(attendQuoteFieldListDTOS)
|
|
|
|
|
|
.setSalaryAcctEmployeePOS(acctEmployeePOS)
|
|
|
|
|
|
.setChildMonitor(childMonitor)
|
|
|
|
|
|
.setResults(calculateResults)
|
|
|
|
|
|
.setCalculateKey(calculateKey);
|
|
|
|
|
|
LocalRunnable localRunnable = new LocalRunnable() {
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void execute() {
|
2022-04-12 19:25:19 +08:00
|
|
|
|
getSalaryAcctCalculateService(user).calculate(salaryAcctCalculateBO, simpleEmployee);
|
2022-04-11 20:17:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
};
|
2022-05-12 15:41:12 +08:00
|
|
|
|
ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.HRM, "salaryAcctCalculateV2", localRunnable);
|
2022-04-11 20:17:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
// 13、等待所有子线程执行完毕
|
|
|
|
|
|
childMonitor.await();
|
|
|
|
|
|
// 14、判断子线程执行结果
|
|
|
|
|
|
boolean allSuccess = calculateResults.stream().allMatch(SalaryAcctCalculateBO.Result::isStatus);
|
|
|
|
|
|
if (!allSuccess) {
|
|
|
|
|
|
// 薪资核算实现的线程的错误信息
|
|
|
|
|
|
String errorMsg = calculateResults.stream()
|
|
|
|
|
|
.filter(result -> !result.isStatus())
|
|
|
|
|
|
.map(SalaryAcctCalculateBO.Result::getErrMsg)
|
|
|
|
|
|
.collect(Collectors.joining("|"));
|
2022-04-29 17:15:22 +08:00
|
|
|
|
getSalaryAcctProgressService(user).fail(SalaryCacheKey.ACCT_PROGRESS + calculateParam.getSalaryAcctRecordId(), errorMsg);
|
2022-04-11 20:17:47 +08:00
|
|
|
|
// 删除薪资核算临时存储表中的数据
|
2022-04-12 19:25:19 +08:00
|
|
|
|
getSalaryAcctResultTempService(user).deleteByCalculateKey(calculateKey);
|
2022-04-11 20:17:47 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
// 15、处理核算结果临时表数据
|
|
|
|
|
|
handleSalaryAcctResultTemp(calculateParam, calculateKey);
|
|
|
|
|
|
// 16、开始运行校验规则
|
2022-04-07 16:54:10 +08:00
|
|
|
|
// SalaryAcctCheckParam salaryAcctCheckParam = new SalaryAcctCheckParam()
|
|
|
|
|
|
// .setSalaryAcctRecordId(calculateParam.getSalaryAcctRecordId())
|
|
|
|
|
|
// .setIds(calculateParam.getIds());
|
2022-04-08 19:08:59 +08:00
|
|
|
|
// salaryCheckResultService.check(salaryAcctCheckParam, true, simpleEmployee);
|
2022-04-29 17:15:22 +08:00
|
|
|
|
// Thread.sleep(10);
|
|
|
|
|
|
getSalaryAcctProgressService(user).finish(SalaryCacheKey.ACCT_PROGRESS + calculateParam.getSalaryAcctRecordId(), true);
|
2022-04-11 20:17:47 +08:00
|
|
|
|
// 记录日志
|
|
|
|
|
|
// 查询操作日志的targetName
|
2022-04-12 19:25:19 +08:00
|
|
|
|
// String targetName = getSalaryAcctRecordService(user).getLogTargetNameById(calculateParam.getSalaryAcctRecordId());
|
2022-04-07 16:54:10 +08:00
|
|
|
|
// LoggerContext<SalaryCheckResultPO> loggerContext = new LoggerContext<>();
|
|
|
|
|
|
// loggerContext.setTargetId(String.valueOf(calculateParam.getSalaryAcctRecordId()));
|
|
|
|
|
|
// loggerContext.setTargetName(targetName);
|
|
|
|
|
|
// loggerContext.setOperateType(OperateTypeEnum.UPDATE.getValue());
|
|
|
|
|
|
// loggerContext.setOperateTypeName(SalaryI18nUtil.getI18nLabel(95783, "薪资核算"));
|
|
|
|
|
|
// loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel(95783, "薪资核算"));
|
|
|
|
|
|
// salaryAcctRecordLoggerTemplate.write(loggerContext);
|
2022-04-11 20:17:47 +08:00
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
log.info("薪资核算出错:{}", e.getMessage(), e);
|
2022-04-29 17:15:22 +08:00
|
|
|
|
// throw new SalaryRunTimeException(e);
|
|
|
|
|
|
getSalaryAcctProgressService(user).fail(SalaryCacheKey.ACCT_PROGRESS + calculateParam.getSalaryAcctRecordId(), SalaryI18nUtil.getI18nLabel(99642, "薪资核算出错") + ": " + e.getMessage());
|
2022-04-11 20:17:47 +08:00
|
|
|
|
} finally {
|
|
|
|
|
|
// 数据库字段加密用
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2022-04-08 19:08:59 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 处理薪资核算临时存储表中的数据
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param calculateParam
|
|
|
|
|
|
* @param calculateKey
|
|
|
|
|
|
*/
|
2022-04-11 20:17:47 +08:00
|
|
|
|
private void handleSalaryAcctResultTemp(SalaryAcctCalculateParam calculateParam, String calculateKey) {
|
2022-04-12 19:25:19 +08:00
|
|
|
|
// TransactionStatus status = dataSourceTransactionManager.getTransaction(new DefaultTransactionDefinition());
|
|
|
|
|
|
// try {
|
2022-04-29 17:15:22 +08:00
|
|
|
|
// 查询薪资核算结果的临时存储
|
|
|
|
|
|
List<SalaryAcctResultTempPO> salaryAcctResultTempPOS = getSalaryAcctResultTempService(user).listByCalculateKey(calculateKey);
|
|
|
|
|
|
// 删除原来的薪资核算结果
|
|
|
|
|
|
if (CollectionUtils.isNotEmpty(calculateParam.getIds())) {
|
|
|
|
|
|
getSalaryAcctResultMapper().deleteBySalaryAcctEmpIds(calculateParam.getIds());
|
|
|
|
|
|
} else {
|
|
|
|
|
|
getSalaryAcctResultMapper().deleteBySalaryAcctRecordIds(Collections.singleton(calculateParam.getSalaryAcctRecordId()));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 保存薪资的薪资核算结果
|
|
|
|
|
|
List<SalaryAcctResultPO> salaryAcctResultPOS = SalaryAcctResultBO.convert2ResultPO(salaryAcctResultTempPOS);
|
|
|
|
|
|
batchSave(salaryAcctResultPOS);
|
|
|
|
|
|
// 删除薪资核算临时存储表中的数据
|
|
|
|
|
|
getSalaryAcctResultTempService(user).deleteByCalculateKey(calculateKey);
|
2022-04-12 19:25:19 +08:00
|
|
|
|
// // 提交事务
|
|
|
|
|
|
// dataSourceTransactionManager.commit(status);
|
|
|
|
|
|
// } catch (Exception e) {
|
|
|
|
|
|
// dataSourceTransactionManager.rollback(status);
|
|
|
|
|
|
// throw e;
|
|
|
|
|
|
// }
|
2022-04-11 20:17:47 +08:00
|
|
|
|
}
|
2022-06-07 19:10:40 +08:00
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalaryAcctResultPO> listBySalaryAcctRecordIdsAndTaxAgentIds(Collection<Long> salaryAcctRecordIds, Collection<Long> taxAgentIds) {
|
|
|
|
|
|
if (CollectionUtils.isEmpty(salaryAcctRecordIds)) {
|
|
|
|
|
|
return Collections.emptyList();
|
|
|
|
|
|
}
|
2022-06-15 12:03:17 +08:00
|
|
|
|
return SalaryAcctResultPOEncrypt.decryptList(getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctRecordIds(salaryAcctRecordIds).taxAgentIds(taxAgentIds).build()));
|
2022-06-07 19:10:40 +08:00
|
|
|
|
}
|
2022-04-08 19:08:59 +08:00
|
|
|
|
}
|