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

2464 lines
148 KiB
Java
Raw Normal View History

2022-04-08 19:08:59 +08:00
package com.engine.salary.service.impl;
2023-12-11 11:08:30 +08:00
import cn.hutool.core.util.ObjectUtil;
2024-07-05 09:24:17 +08:00
import com.cloudstore.eccom.pc.table.WeaTableColumn;
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;
2024-04-01 20:25:23 +08:00
import com.engine.hrmelog.entity.dto.LoggerContext;
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;
2024-01-24 09:50:58 +08:00
import com.engine.salary.config.SalaryElogConfig;
2023-12-05 14:57:34 +08:00
import com.engine.salary.constant.SalaryDefaultTenantConstant;
import com.engine.salary.encrypt.EncryptUtil;
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;
2023-06-27 14:58:33 +08:00
import com.engine.salary.entity.progress.ProgressDTO;
import com.engine.salary.entity.report.bo.SalaryAcctResultReportBO;
import com.engine.salary.entity.report.po.SalaryAcctResultReportPO;
2023-05-15 10:28:17 +08:00
import com.engine.salary.entity.salaryacct.bo.*;
2024-07-05 09:24:17 +08:00
import com.engine.salary.entity.salaryacct.dto.*;
2022-11-17 09:28:40 +08:00
import com.engine.salary.entity.salaryacct.param.*;
2023-05-15 10:28:17 +08:00
import com.engine.salary.entity.salaryacct.po.*;
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;
import com.engine.salary.entity.salarysob.dto.*;
2022-08-24 10:31:42 +08:00
import com.engine.salary.entity.salarysob.po.*;
2023-06-27 14:58:33 +08:00
import com.engine.salary.entity.taxagent.po.TaxAgentAdminPO;
2022-05-31 16:41:11 +08:00
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
2024-01-24 09:50:58 +08:00
import com.engine.salary.enums.OperateTypeEnum;
2022-11-17 09:28:40 +08:00
import com.engine.salary.enums.SalaryValueTypeEnum;
2023-10-08 13:38:37 +08:00
import com.engine.salary.enums.UserStatusEnum;
2024-01-24 09:50:58 +08:00
import com.engine.salary.enums.common.FilterEnum;
2024-09-10 18:09:33 +08:00
import com.engine.salary.enums.datacollection.UseEmployeeTypeEnum;
2022-11-17 09:28:40 +08:00
import com.engine.salary.enums.salaryaccounting.LockStatusEnum;
2022-04-11 20:17:47 +08:00
import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum;
2023-05-15 10:28:17 +08:00
import com.engine.salary.enums.salaryaccounting.SalaryAcctResultDataSourceEnum;
2022-09-27 15:47:13 +08:00
import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum;
2022-04-08 19:08:59 +08:00
import com.engine.salary.enums.salarysob.IncomeCategoryEnum;
import com.engine.salary.exception.SalaryRunTimeException;
2024-09-10 18:09:33 +08:00
import com.engine.salary.mapper.salaryacct.*;
2023-06-15 18:48:31 +08:00
import com.engine.salary.report.service.SalaryStatisticsReportService;
import com.engine.salary.report.service.impl.SalaryStatisticsReportServiceImpl;
2022-04-08 19:08:59 +08:00
import com.engine.salary.service.*;
2023-06-02 15:25:46 +08:00
import com.engine.salary.sys.constant.SalarySysConstant;
import com.engine.salary.sys.entity.po.SalarySysConfPO;
2023-07-04 09:32:12 +08:00
import com.engine.salary.sys.enums.TaxDeclarationFunctionEnum;
2023-06-02 15:25:46 +08:00
import com.engine.salary.sys.service.SalarySysConfService;
import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl;
2022-04-08 19:08:59 +08:00
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.SalaryI18nUtil;
2024-04-01 20:25:23 +08:00
import com.engine.salary.util.db.IdGenerator;
2022-04-12 19:25:19 +08:00
import com.engine.salary.util.db.MapperProxyFactory;
2025-01-21 15:23:30 +08:00
import com.engine.salary.util.excel.ExcelUtilPlus;
2022-04-08 19:08:59 +08:00
import com.engine.salary.util.page.PageInfo;
2023-10-08 15:44:09 +08:00
import com.engine.salary.util.page.SalaryPageUtil;
2023-12-05 14:57:34 +08:00
import com.engine.salary.util.valid.ValidUtil;
2022-04-11 20:17:47 +08:00
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
2022-11-17 09:28:40 +08:00
import com.google.common.collect.Sets;
2024-09-10 18:09:33 +08:00
import com.weaver.general.TimeUtil;
2022-04-11 20:17:47 +08:00
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.apache.commons.lang3.math.NumberUtils;
2025-01-21 15:23:30 +08:00
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
2022-04-08 19:08:59 +08:00
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
2023-09-26 14:29:12 +08:00
import org.springframework.util.StopWatch;
2024-07-05 09:24:17 +08:00
import weaver.conn.RecordSet;
2024-09-10 18:09:33 +08:00
import weaver.formmode.setup.ModeRightInfo;
2023-12-11 11:08:30 +08:00
import weaver.general.BaseBean;
2024-07-05 09:24:17 +08:00
import weaver.general.Util;
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;
2024-07-05 09:24:17 +08:00
import java.math.RoundingMode;
2024-09-10 18:09:33 +08:00
import java.text.SimpleDateFormat;
2024-07-05 09:24:17 +08:00
import java.time.LocalDate;
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 {
private EncryptUtil encryptUtil = new EncryptUtil();
2022-04-08 19:08:59 +08:00
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 ServiceUtil.getService(SalaryAcctEmployeeServiceImpl.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 SalarySobItemService getSalarySobItemService(User user) {
return ServiceUtil.getService(SalarySobItemServiceImpl.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 SalaryItemService getSalaryItemService(User user) {
return ServiceUtil.getService(SalaryItemServiceImpl.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 SalarySobEmpFieldService getSalarySobEmpFieldService(User user) {
return ServiceUtil.getService(SalarySobEmpFieldServiceImpl.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 SalarySobService getSalarySobService(User user) {
return ServiceUtil.getService(SalarySobServiceImpl.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 SalaryAcctRecordService getSalaryAcctRecordService(User user) {
return ServiceUtil.getService(SalaryAcctRecordServiceImpl.class, user);
2022-04-12 19:25:19 +08:00
}
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 ServiceUtil.getService(SalaryEmployeeServiceImpl.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 SalaryFormulaService getSalaryFormulaService(User user) {
return 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 ServiceUtil.getService(SalarySobAdjustRuleServiceImpl.class, user);
2022-04-12 19:25:19 +08:00
}
2022-04-29 17:15:22 +08:00
2022-08-24 10:31:42 +08:00
private SalarySobItemHideService getSalarySobItemHideService(User user) {
return (SalarySobItemHideService) ServiceUtil.getService(SalarySobItemHideServiceImpl.class, user);
}
2022-04-12 19:25:19 +08:00
private SalaryAcctCalculateService getSalaryAcctCalculateService(User user) {
return ServiceUtil.getService(SalaryAcctCalculateServiceImpl.class, user);
2022-04-12 19:25:19 +08:00
}
2022-04-29 17:15:22 +08:00
2023-06-06 10:30:49 +08:00
private ProgressService getSalaryAcctProgressService(User user) {
return ServiceUtil.getService(ProgressServiceImpl.class, user);
2022-04-29 17:15:22 +08:00
}
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 ServiceUtil.getService(SalaryAcctResultTempServiceImpl.class, user);
2022-04-12 19:25:19 +08:00
}
2022-04-08 19:08:59 +08:00
2022-04-28 15:02:11 +08:00
private SIAccountService getSIAccountService(User user) {
return ServiceUtil.getService(SIAccountServiceImpl.class, user);
2022-04-28 15:02:11 +08:00
}
2022-04-08 19:08:59 +08:00
2022-04-12 19:25:19 +08:00
private AttendQuoteFieldService getAttendQuoteFieldService(User user) {
return ServiceUtil.getService(AttendQuoteFieldServiceImpl.class, user);
}
private SalaryAcctReportService getSalaryAcctReportService(User user) {
return ServiceUtil.getService(SalaryAcctReportServiceImpl.class, user);
2022-04-12 19:25:19 +08:00
}
2022-04-29 17:15:22 +08:00
2022-08-24 10:31:42 +08:00
private SalarySobItemGroupService getSalarySobItemGroupService(User user) {
return (SalarySobItemGroupService) ServiceUtil.getService(SalarySobItemGroupServiceImpl.class, user);
}
private SalarySobBackItemService getSalarySobBackItemService(User user) {
return ServiceUtil.getService(SalarySobBackItemServiceImpl.class, user);
}
private SalaryAcctResultService getSalaryAcctResultService(User user) {
return (SalaryAcctResultService) ServiceUtil.getService(SalaryAcctResultServiceImpl.class, user);
}
2023-05-15 10:28:17 +08:00
private SalaryAcctResultLogService getSalaryAcctResultLogService(User user) {
return ServiceUtil.getService(SalaryAcctResultLogServiceImpl.class, user);
}
2023-06-02 15:25:46 +08:00
private SalarySysConfService getSalarySysConfService(User user) {
return ServiceUtil.getService(SalarySysConfServiceImpl.class, user);
}
2023-06-15 18:48:31 +08:00
private SalaryStatisticsReportService getSalaryStatisticsReportService(User user) {
return ServiceUtil.getService(SalaryStatisticsReportServiceImpl.class, user);
}
2023-06-27 14:58:33 +08:00
private TaxAgentAdminService getTaxAgentAdminService(User user) {
return ServiceUtil.getService(TaxAgentAdminServiceImpl.class, user);
}
2025-01-21 15:23:30 +08:00
public UfXzhlbService getUfXzhlbService(User user) {
return ServiceUtil.getService(UfXzhlbServiceImpl.class, user);
2024-07-05 09:24:17 +08:00
}
2024-09-10 18:09:33 +08:00
private GwPltxDt1Service getGwPltxDt1Service(User user) {
return ServiceUtil.getService(GwPltxDt1ServiceImpl.class, user);
}
private SalaryAcctExcelService getSalaryAcctExcelService(User user) {
return ServiceUtil.getService(SalaryAcctExcelServiceImpl.class, user);
}
private UfTxjlgljmbMapper getUfTxjlgljmbMapper() {
return MapperProxyFactory.getProxy(UfTxjlgljmbMapper.class);
}
private UfTxjlgljmbDt1Mapper getUfTxjlgljmbDt1Mapper() {
return MapperProxyFactory.getProxy(UfTxjlgljmbDt1Mapper.class);
}
private UfTxjlgljmbDt2Mapper getUfTxjlgljmbDt2Mapper() {
return MapperProxyFactory.getProxy(UfTxjlgljmbDt2Mapper.class);
}
private UfTxjlgljmbDt3Mapper getUfTxjlgljmbDt3Mapper() {
return MapperProxyFactory.getProxy(UfTxjlgljmbDt3Mapper.class);
}
2025-01-21 15:23:30 +08:00
private UfHwxcbbpzMapper getUfHwxcbbpzMapper() {
return MapperProxyFactory.getProxy(UfHwxcbbpzMapper.class);
}
2025-01-04 23:25:45 +08:00
private GwPltxDt3Service getGwPltxDt3Service(User user) {
return ServiceUtil.getService(GwPltxDt3ServiceImpl.class, user);
}
2025-01-21 15:23:30 +08:00
private SalaryArchiveService getSalaryArchiveService(User user) {
return ServiceUtil.getService(SalaryArchiveServiceImpl.class, user);
}
2022-08-24 10:31:42 +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();
}
List<SalaryAcctResultPO> salaryAcctResultPOS = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctRecordIds(salaryAcctRecordIds).build());
encryptUtil.decryptList(salaryAcctResultPOS, SalaryAcctResultPO.class, user);
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());
encryptUtil.decryptList(salaryAcctResultPOS, SalaryAcctResultPO.class, user);
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();
}
2023-05-05 17:15:25 +08:00
List<List<Long>> partition = Lists.partition((List<Long>) salaryAcctEmployeeIds, 500);
2023-05-04 11:56:34 +08:00
List<SalaryAcctResultPO> salaryAcctResultPOS = new ArrayList<>();
partition.forEach(empIds -> {
salaryAcctResultPOS.addAll(getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctEmpIds(empIds).build()));
});
2022-05-24 09:23:17 +08:00
// 解密
encryptUtil.decryptList(salaryAcctResultPOS, SalaryAcctResultPO.class, user);
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();
}
2023-05-05 17:15:25 +08:00
List<List<Long>> partition = Lists.partition((List<Long>) employeeIds, 500);
2023-05-04 11:56:34 +08:00
List<SalaryAcctResultPO> salaryAcctResultPOS = new ArrayList<>();
partition.forEach(empIds -> {
salaryAcctResultPOS.addAll(getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctRecordIds(salaryAcctRecordIds).employeeIds(empIds).build()));
});
encryptUtil.decryptList(salaryAcctResultPOS, SalaryAcctResultPO.class, user);
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(user.getLanguage(),542301, "薪资核算人员不存在或已被删除"));
2022-04-08 19:08:59 +08:00
}
// 查询是否是回算
SalaryAcctRecordPO byId = getSalaryAcctRecordService(user).getById(salaryAcctEmployeePO.getSalaryAcctRecordId());
boolean isBackCal = Objects.equals(byId.getBackCalcStatus(), 1);
2022-08-24 10:31:42 +08:00
//----------------------------------------------
// 查询薪资账套的薪资项目分类
List<SalarySobItemGroupPO> salarySobItemGroupPOS = getSalarySobItemGroupService(user).listBySalarySobIdWithItemHide(salaryAcctEmployeePO.getSalarySobId());
// 获取关闭显示的分类
List<Long> hideGroupIDs = getSalarySobItemHideService(user).listHideGroupBysalarySobId(SalarySobItemHidePO.builder().salarySobId(salaryAcctEmployeePO.getSalarySobId()).isGroup(1).build());
// 过滤关闭显示的薪资项目分类
salarySobItemGroupPOS = salarySobItemGroupPOS.stream().filter(group -> !(hideGroupIDs.contains(group.getId()))).collect(Collectors.toList());
// 获取薪资项目分类ID
List<Long> salarySobItemGroupIds = salarySobItemGroupPOS.stream().map(SalarySobItemGroupPO::getId).collect(Collectors.toList());
2023-03-02 11:25:25 +08:00
//加上未分类
salarySobItemGroupIds.add(0L);
2022-08-24 10:31:42 +08:00
// 查询薪资账套的薪资项目副本(已经过滤关闭分类显示按钮的薪资项目)
2022-09-27 15:47:13 +08:00
List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemService(user).listBySalarySobIdAndGroupId(salaryAcctEmployeePO.getSalarySobId(), salarySobItemGroupIds);
2022-08-24 10:31:42 +08:00
//----------------------------------------------
2022-04-08 19:08:59 +08:00
// 查询薪资核算所用薪资账套的薪资项目副本
2022-08-24 10:31:42 +08:00
// List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctEmployeePO.getSalarySobId());
// 获取关闭显示的薪资项目
List<Long> hideItemIDs = getSalarySobItemHideService(user).listHideGroupBysalarySobId(SalarySobItemHidePO.builder().salarySobId(salaryAcctEmployeePO.getSalarySobId()).isGroup(0).build());
// 过滤薪资项目
2022-09-27 15:47:13 +08:00
salarySobItemPOS = salarySobItemPOS.stream().filter(item -> !(hideItemIDs.contains(item.getSalaryItemId()))).collect(Collectors.toList());
2022-08-24 10:31:42 +08:00
// 查询已发补发薪资项目
List<SalarySobBackItemPO> salarySobBackItemPOList = Collections.emptyList();
List<SalaryItemPO> salaryBackItemPOS = Collections.emptyList();
// key:账套中回算薪资项目的薪资项目id value:账套中回算薪资项目所对应的公式内容
Map<Long, String> salaryBackItemFormula = new HashMap<>();
2023-05-04 11:56:34 +08:00
if (isBackCal) {
salarySobBackItemPOList = getSalarySobBackItemService(user).listBySalarySobId(byId.getSalarySobId());
Set<Long> salarySobBackItemIds = SalaryEntityUtil.properties(salarySobBackItemPOList, SalarySobBackItemPO::getSalaryItemId);
salaryBackItemPOS = getSalaryItemService(user).listByIds(salarySobBackItemIds);
// 查询薪资账套中已发补发的公式内容
List<ExpressFormula> expressFormulas = getSalaryFormulaService(user).listExpressFormula(SalaryEntityUtil.properties(salarySobBackItemPOList, SalarySobBackItemPO::getFormulaId));
Map<Long, String> expressFormulaMap = SalaryEntityUtil.convert2Map(expressFormulas, ExpressFormula::getId, ExpressFormula::getFormula);
for(SalarySobBackItemPO salarySobBackItemPO:salarySobBackItemPOList){
String exp = Objects.equals(expressFormulaMap.get(salarySobBackItemPO.getFormulaId()), 0)
? SalaryI18nUtil.getI18nLabel(user.getLanguage(),554, "输入") : expressFormulaMap.get(salarySobBackItemPO.getFormulaId());
salaryBackItemFormula.put(salarySobBackItemPO.getSalaryItemId(),exp);
}
}
2022-08-24 10:31:42 +08:00
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());
2023-05-16 15:41:11 +08:00
// 查询公式
Map<String, SalaryAcctResultListColumnDTO> formulaContentMap = getSalaryAcctResultService(user).getColumnBySalaryAcctRecordId(salaryAcctEmployeePO.getSalaryAcctRecordId());
2023-12-06 16:05:08 +08:00
List<Long> lockItems = byId.getLockSalaryItemIds() == null ? Collections.emptyList() : byId.getLockSalaryItemIds();
2022-08-24 10:31:42 +08:00
2022-04-08 19:08:59 +08:00
// 转换成薪资核算结果详情dto
Merge branch 'release/2.12.1.2403.02' into custom/上海港湾-多语言 # Conflicts: # src/com/engine/salary/biz/AddUpDeductionBiz.java # src/com/engine/salary/biz/AddUpSituationBiz.java # src/com/engine/salary/biz/OtherDeductionBiz.java # src/com/engine/salary/biz/SIArchivesBiz.java # src/com/engine/salary/biz/SICategoryBiz.java # src/com/engine/salary/biz/SalaryArchiveItemBiz.java # src/com/engine/salary/biz/SpecialAddDeductionBiz.java # src/com/engine/salary/cmd/siarchives/SIArchivesTipsCmd.java # src/com/engine/salary/entity/datacollection/AddUpDeduction.java # src/com/engine/salary/entity/datacollection/AddUpSituation.java # src/com/engine/salary/entity/datacollection/DataCollectionEmployee.java # src/com/engine/salary/entity/datacollection/dto/AddUpDeductionDTO.java # src/com/engine/salary/entity/datacollection/po/OtherDeductionPO.java # src/com/engine/salary/entity/extemp/po/ExtEmpPO.java # src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateListDTO.java # src/com/engine/salary/entity/salaryBill/param/SalarySendInfoQueryParam.java # src/com/engine/salary/entity/salaryBill/param/SalaryTemplateCopyParam.java # src/com/engine/salary/entity/salaryacct/bo/SalaryAcctRecordBO.java # src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java # src/com/engine/salary/entity/salaryacct/po/SalaryAcctEmployeePO.java # src/com/engine/salary/entity/salaryarchive/dto/SalaryArchiveListDTO.java # src/com/engine/salary/entity/salarysob/dto/SalarySobItemDTO.java # src/com/engine/salary/entity/siaccount/bo/InsuranceComparisonResultBO.java # src/com/engine/salary/entity/sicategory/dto/ICategoryListDTO.java # src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationDetailBO.java # src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationAnnualListDTO.java # src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationLaborListDTO.java # src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationWageListDTO.java # src/com/engine/salary/enums/OperateTypeEnum.java # src/com/engine/salary/enums/salaryarchive/SalaryArchiveItemAdjustReasonEnum.java # src/com/engine/salary/enums/salaryarchive/SalaryArchiveStatusEnum.java # src/com/engine/salary/mapper/datacollection/EmployMapper.java # src/com/engine/salary/mapper/datacollection/EmployMapper.xml # src/com/engine/salary/report/service/impl/SalaryStatisticsItemServiceImpl.java # src/com/engine/salary/report/service/impl/SalaryStatisticsReportServiceImpl.java # src/com/engine/salary/report/wrapper/SalaryStatisticsDimensionWrapper.java # src/com/engine/salary/service/SalaryAcctResultService.java # src/com/engine/salary/service/SalaryEmployeeService.java # src/com/engine/salary/service/SalarySendService.java # src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java # src/com/engine/salary/service/impl/AddUpSituationServiceImpl.java # src/com/engine/salary/service/impl/AttendQuoteDataServiceImpl.java # src/com/engine/salary/service/impl/AttendQuoteServiceImpl.java # src/com/engine/salary/service/impl/ColumnBuildServiceImpl.java # src/com/engine/salary/service/impl/OtherDeductionServiceImpl.java # src/com/engine/salary/service/impl/SIAComparisonResultServiceImpl.java # src/com/engine/salary/service/impl/SIAccountServiceImpl.java # src/com/engine/salary/service/impl/SIArchivesServiceImpl.java # src/com/engine/salary/service/impl/SIBalanceServiceImpl.java # src/com/engine/salary/service/impl/SICategoryServiceImpl.java # src/com/engine/salary/service/impl/SIExportServiceImpl.java # src/com/engine/salary/service/impl/SIImportServiceImpl.java # src/com/engine/salary/service/impl/SISchemeServiceImpl.java # src/com/engine/salary/service/impl/SalaryAcctEmployeeServiceImpl.java # src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java # src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java # src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java # src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java # src/com/engine/salary/service/impl/SalaryArchiveItemServiceImpl.java # src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java # src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java # src/com/engine/salary/service/impl/SalaryItemServiceImpl.java # src/com/engine/salary/service/impl/SalarySendServiceImpl.java # src/com/engine/salary/service/impl/SalarySobAdjustRuleServiceImpl.java # src/com/engine/salary/service/impl/SalarySobCheckRuleServiceImpl.java # src/com/engine/salary/service/impl/SalarySobItemServiceImpl.java # src/com/engine/salary/service/impl/SalarySobRangeServiceImpl.java # src/com/engine/salary/service/impl/SalarySobServiceImpl.java # src/com/engine/salary/service/impl/SalaryTemplateServiceImpl.java # src/com/engine/salary/service/impl/SpecialAddDeductionServiceImpl.java # src/com/engine/salary/service/impl/SysSalaryItemServiceImpl.java # src/com/engine/salary/service/impl/TaxAgentManageRangeServiceImpl.java # src/com/engine/salary/service/impl/TaxAgentServiceImpl.java # src/com/engine/salary/service/impl/TaxDeclarationExcelServiceImpl.java # src/com/engine/salary/sys/service/impl/SalarySysConfServiceImpl.java # src/com/engine/salary/util/SalaryI18nUtil.java # src/com/engine/salary/util/page/SalaryPageUtil.java # src/com/engine/salary/web/SIExportController.java # src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java # src/com/engine/salary/wrapper/SalaryFormulaWrapper.java # src/com/engine/salary/wrapper/SalarySendWrapper.java # src/com/engine/salary/wrapper/SalaryTemplateWrapper.java
2024-03-28 15:47:11 +08:00
return SalaryAcctResultBO.convert2DetailDTO(simpleEmployee, taxAgent, salaryAcctEmployeePO, salarySobEmpFieldPOS, salarySobItemGroupPOS, salarySobItemPOS, salaryItemPOS, salaryAcctResultPOS, salarySobBackItemPOList, salaryBackItemPOS, salaryBackItemFormula, formulaContentMap, user, lockItems);
2022-04-08 19:08:59 +08:00
}
@Override
public PageInfo<Map<String, Object>> listPageByParam(SalaryAcctResultQueryParam queryParam) {
2023-10-08 15:44:09 +08:00
PageInfo<SalaryAcctEmployeePO> page = null;
//其他条件
List<SalaryAcctResultQueryParam.OtherCondition> otherConditions = queryParam.getOtherConditions();
if (CollectionUtils.isNotEmpty(otherConditions)) {
List<Long> items = SalaryEntityUtil.properties(otherConditions, SalaryAcctResultQueryParam.OtherCondition::getItemId, Collectors.toList());
List<SalaryAcctResultPO> list = listBySalaryAcctRecordIdsAndSalaryItemIds(Collections.singletonList(queryParam.getSalaryAcctRecordId()), items);
for (int i = 0; i < otherConditions.size(); i++) {
SalaryAcctResultQueryParam.OtherCondition otherCondition = otherConditions.get(i);
Long itemId = otherCondition.getItemId();
FilterEnum filter = otherCondition.getFilter();
List<String> params = otherCondition.getParams();
list = list.stream().filter(a -> Objects.equals(a.getSalaryItemId(), itemId)).filter(a -> filter.filter(params).test(a.getResultValue())).collect(Collectors.toList());
}
List<Long> salaryAcctEmpId = SalaryEntityUtil.properties(list, SalaryAcctResultPO::getSalaryAcctEmpId, Collectors.toList());
if (CollectionUtils.isEmpty(salaryAcctEmpId)) {
//条件不满足直接返回空列表
page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), new ArrayList<>(), SalaryAcctEmployeePO.class);
} else {
queryParam.setIds(salaryAcctEmpId);
// 查询薪资核算人员(分页)
page = getSalaryAcctEmployeeService(user).listPageByResultQueryParam(queryParam);
}
} else {
// 查询薪资核算人员(分页)
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;
}
2022-09-27 15:47:13 +08:00
@Override
public Map<String, Object> sumRow(SalaryAcctResultQueryParam queryParam) {
//其他条件
List<SalaryAcctResultQueryParam.OtherCondition> otherConditions = queryParam.getOtherConditions();
2024-01-24 09:50:58 +08:00
if (CollectionUtils.isNotEmpty(otherConditions)) {
List<Long> items = SalaryEntityUtil.properties(otherConditions, SalaryAcctResultQueryParam.OtherCondition::getItemId, Collectors.toList());
List<SalaryAcctResultPO> list = listBySalaryAcctRecordIdsAndSalaryItemIds(Collections.singletonList(queryParam.getSalaryAcctRecordId()), items);
for (int i = 0; i < otherConditions.size(); i++) {
SalaryAcctResultQueryParam.OtherCondition otherCondition = otherConditions.get(i);
Long itemId = otherCondition.getItemId();
FilterEnum filter = otherCondition.getFilter();
List<String> params = otherCondition.getParams();
list = list.stream().filter(a -> Objects.equals(a.getSalaryItemId(), itemId)).filter(a -> filter.filter(params).test(a.getResultValue())).collect(Collectors.toList());
}
List<Long> salaryAcctEmpId = SalaryEntityUtil.properties(list, SalaryAcctResultPO::getSalaryAcctEmpId, Collectors.toList());
if (CollectionUtils.isEmpty(salaryAcctEmpId)) {
//条件不满足直接返回空列表
return new HashMap<>();
} else {
queryParam.setIds(salaryAcctEmpId);
}
}
2022-09-27 15:47:13 +08:00
// 查询薪资核算人员
List<SalaryAcctEmployeePO> salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listByResultQueryParam(queryParam);
if (CollectionUtils.isEmpty(salaryAcctEmployeePOS)) {
return null;
}
// 查询薪资核算记录
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(queryParam.getSalaryAcctRecordId());
if (Objects.isNull(salaryAcctRecordPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(user.getLanguage(),542300, "薪资核算记录不存在或已被删除"));
2022-09-27 15:47:13 +08:00
}
// 查询薪资核算所用薪资账套的薪资项目
List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
2023-07-25 16:46:57 +08:00
Map<Long, SalarySobItemPO> salaryItemIdKeySalarySobItemPOMap = SalaryEntityUtil.convert2Map(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
2022-09-27 15:47:13 +08:00
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
2023-09-26 14:29:12 +08:00
if (Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), NumberUtils.INTEGER_ONE)) {
2023-04-28 16:04:52 +08:00
// 是回算,获取回算项
List<SalarySobBackItemPO> salarySobBackItemPOS = getSalarySobBackItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
salaryItemIds.addAll(salarySobBackItemPOS.stream().map(SalarySobBackItemPO::getSalaryItemId).collect(Collectors.toList()));
}
2022-09-27 15:47:13 +08:00
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds);
2023-07-25 16:46:57 +08:00
2022-09-27 15:47:13 +08:00
// 查询薪资核算结果
2023-09-26 14:29:12 +08:00
List<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId, Collectors.toList());
2022-09-27 15:47:13 +08:00
List<SalaryAcctResultPO> salaryAcctResultPOS = listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds);
Map<String, Object> map = new HashMap<>();
Map<Long, List<SalaryAcctResultPO>> acctResultMap = SalaryEntityUtil.group2Map(salaryAcctResultPOS, SalaryAcctResultPO::getSalaryItemId);
salaryItemPOS.stream().filter(item -> SalaryDataTypeEnum.NUMBER.getValue().equals(item.getDataType())).forEach(item -> {
2023-09-26 17:18:27 +08:00
BigDecimal sum = Optional.ofNullable(acctResultMap.get(item.getId())).orElse(new ArrayList<>()).stream().map(SalaryAcctResultPO::getResultValue).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(BigDecimal.ZERO, BigDecimal::add);
2023-07-25 16:46:57 +08:00
map.put(item.getId().toString(), SalaryAcctFormulaBO.roundResultValue(sum.toString(), item, Collections.emptyList(), Collections.emptyMap(), salaryItemIdKeySalarySobItemPOMap));
2022-09-27 15:47:13 +08:00
});
return map;
}
2022-04-08 19:08:59 +08:00
@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) {
2022-04-08 19:08:59 +08:00
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(user.getLanguage(),542300, "薪资核算记录不存在或已被删除"));
2022-04-08 19:08:59 +08:00
}
boolean isBackCalc = Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), 1);
2022-04-08 19:08:59 +08:00
// 查询薪资核算所用的薪资账套的员工信息字段
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);
// 是否是回算
List<SalarySobBackItemPO> salarySobBackItemPOList = Collections.emptyList();
if (isBackCalc) {
// 根据薪资账套获取回算信息项
salarySobBackItemPOList = getSalarySobBackItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
salaryItemIds.addAll(salarySobBackItemPOList.stream().map(SalarySobBackItemPO::getSalaryItemId).collect(Collectors.toList()));
}
2022-04-12 19:25:19 +08:00
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds);
2022-04-08 19:08:59 +08:00
// 查询薪资核算结果
2023-09-26 14:29:12 +08:00
List<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId, Collectors.toList());
2022-04-08 19:08:59 +08:00
List<SalaryAcctResultPO> salaryAcctResultPOS = listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds);
// 查询人员信息
List<Long> employeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getEmployeeId, Collectors.toList());
2023-04-12 15:27:35 +08:00
List<DataCollectionEmployee> simpleEmployees = getSalaryEmployeeService(user).getEmployeeByIdsAll(employeeIds);
2023-10-08 15:44:09 +08:00
simpleEmployees.forEach(e -> {
2023-10-08 13:38:37 +08:00
UserStatusEnum userStatusEnum = UserStatusEnum.parseByValue(Integer.parseInt(e.getStatus()));
2023-10-08 15:44:09 +08:00
if (userStatusEnum != null) {
2023-10-08 13:38:37 +08:00
e.setStatusName(userStatusEnum.getDefaultLabel());
}
});
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 {
// 如果查询条件中没有包含"合并计税",那么就需要查询出存在合并计税的人,标记给前端
2024-01-30 10:26:44 +08:00
SalaryAcctEmployeeQueryParam accEmployeeQueryParam = SalaryAcctEmployeeQueryParam.builder().salaryAcctRecordId(queryParam.getSalaryAcctRecordId()).ids(SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId, Collectors.toList())).build();
2022-04-12 19:25:19 +08:00
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-12-06 15:29:08 +08:00
// 获取回算公式
if (isBackCalc) {
2023-05-04 11:56:34 +08:00
formulaIds.addAll(salarySobBackItemPOList.stream().map(SalarySobBackItemPO::getFormulaId).collect(Collectors.toList()));
}
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(user.getLanguage(),542339, "输入/导入");
2022-04-08 19:08:59 +08:00
}
return expressFormulaMap.getOrDefault(salarySobItemPO.getFormulaId(), StringUtils.EMPTY);
});
// 回算公式内容转换
Map<Long, String> customBackCalcParameters = SalaryEntityUtil.convert2Map(salarySobBackItemPOList, SalarySobBackItemPO::getSalaryItemId, salarySobBackItemPO -> {
if (salarySobBackItemPO.getFormulaId() <= 0) {
return SalaryI18nUtil.getI18nLabel(user.getLanguage(),542339, "输入/导入");
}
return expressFormulaMap.getOrDefault(salarySobBackItemPO.getFormulaId(), StringUtils.EMPTY);
});
2022-04-08 19:08:59 +08:00
// 转换成薪资核算结果列表
return SalaryAcctResultBO.buildTableData(salaryItemPOS, salarySobEmpFieldPOS, simpleEmployees, salaryAcctEmployeePOS, salaryAcctResultPOS, taxAgentPOS, salaryAcctEmployeeIds4ConsolidatedTax, customParameters, customBackCalcParameters, isBackCalc, user);
2022-04-08 19:08:59 +08:00
}
@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(user.getLanguage(),542301, "薪资核算人员不存在或已被删除"));
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-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());
salaryAcctRecordPOS = getSalaryAcctRecordService(user).listBySalarySobIdsAndTaxCycle(salarySobIds, taxCycleDateRange);
2022-04-08 19:08:59 +08:00
// 查询当前薪资核算人员所涉及的合并计税的所有薪资核算人员
Set<Long> salaryAcctRecordIds = SalaryEntityUtil.properties(salaryAcctRecordPOS, SalaryAcctRecordPO::getId);
salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listByRecordIdsAndEmpIdAndTaxAgentId(salaryAcctRecordIds, salaryAcctEmployeePO.getEmployeeId(), salaryAcctEmployeePO.getTaxAgentId());
2022-04-08 19:08:59 +08:00
}
// 查询薪资核算人员的薪资核算结果
2023-09-26 14:29:12 +08:00
List<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId, Collectors.toList());
2022-04-08 19:08:59 +08:00
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);
2022-04-08 19:08:59 +08:00
}
@Override
public Map<String, SalaryAcctResultListColumnDTO> getColumnBySalaryAcctRecordId(Long salaryAcctRecordId) {
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryAcctRecordId);
if (Objects.isNull(salaryAcctRecordPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(user.getLanguage(),542300, "薪资核算记录不存在或已被删除"));
}
Map<String, SalaryAcctResultListColumnDTO> resultMap = Maps.newHashMap();
// 查询薪资核算使用的薪资账套下的薪资项目
SalarySobItemAggregateDTO salarySobItemAggregateDTO = getSalarySobItemService(user).getAggregateBySalarySobId(salaryAcctRecordPO.getSalarySobId());
for (SalarySobItemIncomeCategoryDTO incomeCategoryDTO : salarySobItemAggregateDTO.getIncomeCategories()) {
for (SalarySobItemGroupDTO salarySobItemGroupDTO : incomeCategoryDTO.getItemGroups()) {
for (SalarySobItemDTO salarySobItemDTO : salarySobItemGroupDTO.getItems()) {
2023-09-26 17:18:27 +08:00
SalaryAcctResultListColumnDTO salaryAcctResultListColumnDTO = new SalaryAcctResultListColumnDTO().setColumnName(salarySobItemDTO.getName()).setFormulaId(salarySobItemDTO.getFormulaId()).setFormulaContent(salarySobItemDTO.getFormulaContent()).setShowLock((!Objects.equals(salarySobItemDTO.getFormulaId(), NumberUtils.LONG_ZERO) && salarySobItemDTO.isCanEdit()) || Objects.equals(salarySobItemDTO.getUseInEmployeeSalary(), NumberUtils.INTEGER_ONE));
resultMap.put("" + salarySobItemDTO.getSalaryItemId(), salaryAcctResultListColumnDTO);
}
}
for (SalarySobItemDTO salarySobItemDTO : incomeCategoryDTO.getItems()) {
2023-09-26 17:18:27 +08:00
SalaryAcctResultListColumnDTO salaryAcctResultListColumnDTO = new SalaryAcctResultListColumnDTO().setColumnName(salarySobItemDTO.getName()).setFormulaId(salarySobItemDTO.getFormulaId()).setFormulaContent(salarySobItemDTO.getFormulaContent()).setShowLock((!Objects.equals(salarySobItemDTO.getFormulaId(), NumberUtils.LONG_ZERO) && salarySobItemDTO.isCanEdit()) || Objects.equals(salarySobItemDTO.getUseInEmployeeSalary(), NumberUtils.INTEGER_ONE));
resultMap.put("" + salarySobItemDTO.getSalaryItemId(), salaryAcctResultListColumnDTO);
}
}
// 查询回算薪资项目
if (Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), 1)) {
List<SalarySobItemDTO> backCalcItems = salarySobItemAggregateDTO.getBackCalcItems();
for (SalarySobItemDTO backCalcItem : backCalcItems) {
2023-09-26 17:18:27 +08:00
SalaryAcctResultListColumnDTO salaryAcctResultListColumnDTO = new SalaryAcctResultListColumnDTO().setColumnName(backCalcItem.getName()).setFormulaId(backCalcItem.getFormulaId()).setFormulaContent(backCalcItem.getFormulaContent()).setShowLock(true);
resultMap.put("" + backCalcItem.getSalaryItemId(), salaryAcctResultListColumnDTO);
}
}
return resultMap;
}
2022-04-08 19:08:59 +08:00
@Override
public void save(SalaryAcctResultSaveParam saveParam) {
List<DataCollectionEmployee> dataCollectionEmployees = getSalaryEmployeeService(user).listAllForReport();
Map<Long, DataCollectionEmployee> emps = SalaryEntityUtil.convert2Map(dataCollectionEmployees, DataCollectionEmployee::getEmployeeId);
2022-04-08 19:08:59 +08:00
// 查询薪资核算人员
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(user.getLanguage(),542301, "薪资核算人员不存在或已被删除"));
2022-04-08 19:08:59 +08:00
}
// 查询原来的薪资核算结果
List<SalaryAcctResultPO> salaryAcctResultPOSOld = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctEmpId(saveParam.getSalaryAcctEmpId()).build());
// 解密
encryptUtil.decryptList(salaryAcctResultPOSOld, SalaryAcctResultPO.class, user);
2022-04-08 19:08:59 +08:00
// 保存参数转换成薪资核算结果po
List<SalaryAcctResultPO> salaryAcctResultPOS = SalaryAcctResultBO.convert2PO(salaryAcctResultPOSOld, saveParam, salaryAcctEmployeePO, (long) user.getUID());
2023-06-02 15:25:46 +08:00
SalarySysConfPO autoLock = getSalarySysConfService(user).getOneByCode(SalarySysConstant.EDIT_IMPORT_AUTO_LOCK);
2023-09-26 14:29:12 +08:00
if (autoLock != null && StringUtils.equals(autoLock.getConfValue(), "1")) {
2023-06-02 15:25:46 +08:00
// 对比核算结果提取修改了哪些薪资项目
Set<Long> needLockItems = new HashSet<>();
Map<Long, SalaryAcctResultPO> oldResutMap = SalaryEntityUtil.convert2Map(salaryAcctResultPOSOld, SalaryAcctResultPO::getSalaryItemId);
salaryAcctResultPOS.stream().forEach(PO -> {
String oldValue = Optional.ofNullable(oldResutMap.get(PO.getSalaryItemId())).map(SalaryAcctResultPO::getResultValue).orElse("");
2023-09-26 14:29:12 +08:00
if (!StringUtils.equals(oldValue, PO.getResultValue())) {
2023-06-02 15:25:46 +08:00
needLockItems.add(PO.getSalaryItemId());
}
});
// 编辑的列都自动锁定
2023-09-26 17:18:27 +08:00
SalaryAcctResultUpdateLockStatusParam updateLockStatusParam = SalaryAcctResultUpdateLockStatusParam.builder().salaryItemIds(needLockItems).salaryAcctRecordId(salaryAcctEmployeePO.getSalaryAcctRecordId()).lockStatus(LockStatusEnum.LOCK).build();
2023-06-02 15:25:46 +08:00
getSalaryAcctResultService(user).updateLockStatusByParam(updateLockStatusParam);
}
// SalaryAcctRecordPO byId = getSalaryAcctRecordService(user).getById(salaryAcctEmployeePO.getSalaryAcctRecordId());
// 若保存编辑时一同传已发补发,则删除以下代码
// if(byId.getBackCalcStatus() != null && Objects.equals(byId.getBackCalcStatus(),1)){
// // 是回算
// List<Long> salarySobBackItemIds = getSalarySobBackItemService(user).listBySalarySobId(byId.getSalarySobId()).stream().map(SalarySobBackItemPO::getSalaryItemId).collect(Collectors.toList());
// // 获取已发待发的薪资核算结果
// List<SalaryAcctResultPO> salarySobBackItemResultPO = salaryAcctResultPOSOld.stream().filter(po -> salarySobBackItemIds.contains(po.getSalaryItemId())).collect(Collectors.toList());
// salaryAcctResultPOS.addAll(salarySobBackItemResultPO);
// }
2022-04-08 19:08:59 +08:00
// 删除原来的薪资核算结果
List<Long> saveItemIds = saveParam.getItems().stream().map(SalaryAcctResultSaveParam.SalaryAcctResultDetailItemParam::getSalaryItemId).collect(Collectors.toList());
2023-11-20 11:21:58 +08:00
deleteByAcctEmployeeIdsAndSalaryItemIds(Collections.singletonList(saveParam.getSalaryAcctEmpId()), saveItemIds);
2022-04-08 19:08:59 +08:00
// 保存薪资核算结果
if (CollectionUtils.isNotEmpty(salaryAcctResultPOS)) {
2022-06-02 17:01:26 +08:00
// 加密
encryptUtil.encryptList(salaryAcctResultPOS, SalaryAcctResultPO.class, user);
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
}
//报表 todo
2023-11-20 11:21:58 +08:00
getSalaryAcctReportService(user).deleteByAcctEmployeeIdsAndSalaryItemIds(Collections.singletonList(saveParam.getSalaryAcctEmpId()), saveItemIds);
List<SalaryAcctResultReportPO> salaryAcctResultReportPOS = SalaryAcctResultReportBO.convert2PO(saveParam, salaryAcctEmployeePO, (long) user.getUID(), emps);
if (CollectionUtils.isNotEmpty(salaryAcctResultReportPOS)) {
getSalaryAcctReportService(user).batchSave(salaryAcctResultReportPOS);
}
2022-07-04 18:58:49 +08:00
2023-06-15 18:48:31 +08:00
2023-05-15 10:28:17 +08:00
// 存储薪资核算结果数据来源日志
2023-05-18 14:28:31 +08:00
salaryAcctResultPOS = getSalaryAcctRecordService(user).listBySalaryAcctEmpId(saveParam.getSalaryAcctEmpId());
2023-09-26 14:29:12 +08:00
saveSalaryAcctResultLog(salaryAcctResultPOSOld, salaryAcctResultPOS);
2023-05-15 10:28:17 +08:00
2022-04-08 19:08:59 +08:00
// 查询操作日志的targetName
2024-01-24 09:50:58 +08:00
String targetName = getSalaryAcctRecordService(user).getLogTargetNameById(salaryAcctEmployeePO.getSalaryAcctRecordId());
// 查询人员信息
DataCollectionEmployee simpleEmployee = getSalaryEmployeeService(user).getEmployeeById(salaryAcctEmployeePO.getEmployeeId());
// 查询个税扣缴义务人
TaxAgentPO taxAgentPO = getTaxAgentService(user).getById(salaryAcctEmployeePO.getTaxAgentId());
// 记录日志
String operateDesc = simpleEmployee.getUsername() + "(" + Optional.ofNullable(taxAgentPO).map(TaxAgentPO::getName).orElse(StringUtils.EMPTY) + ")";
LoggerContext<SalaryCheckResultPO> loggerContext = new LoggerContext<>();
loggerContext.setUser(user);
loggerContext.setTargetId(String.valueOf(salaryAcctEmployeePO.getSalaryAcctRecordId()));
loggerContext.setTargetName(targetName);
loggerContext.setOperateType(OperateTypeEnum.UPDATE.getValue());
loggerContext.setOperateTypeName(SalaryI18nUtil.getI18nLabel(0, "编辑薪资核算结果") + ": " + operateDesc);
loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel(0, "编辑薪资核算结果") + ": " + operateDesc);
2024-01-24 09:50:58 +08:00
loggerContext.setNewValueList(Lists.newArrayList(salaryAcctResultPOS));
2024-01-30 09:58:13 +08:00
SalaryElogConfig.salaryAcctRecordLoggerTemplate.write(loggerContext);
2022-04-08 19:08:59 +08:00
}
2023-05-15 10:28:17 +08:00
/**
* 存储薪资核算结果数据来源日志
2023-09-26 14:29:12 +08:00
*
2023-05-15 10:28:17 +08:00
* @param salaryAcctResultPOSOld
* @param salaryAcctResultPOS
*/
private void saveSalaryAcctResultLog(List<SalaryAcctResultPO> salaryAcctResultPOSOld, List<SalaryAcctResultPO> salaryAcctResultPOS) {
// 对比核算结果提取修改了哪些薪资项目
List<SalaryAcctResultPO> editItems = new ArrayList<>();
Map<Long, SalaryAcctResultPO> oldResutMap = SalaryEntityUtil.convert2Map(salaryAcctResultPOSOld, SalaryAcctResultPO::getSalaryItemId);
salaryAcctResultPOS.stream().forEach(PO -> {
2023-09-26 14:29:12 +08:00
if (oldResutMap.get(PO.getSalaryItemId()) == null) {
2023-05-15 10:28:17 +08:00
editItems.add(PO);
2023-09-26 14:29:12 +08:00
} else {
String oldValue = oldResutMap.get(PO.getSalaryItemId()).getResultValue();
2023-09-26 14:29:12 +08:00
if (!StringUtils.equals(oldValue, PO.getResultValue())) {
editItems.add(PO);
}
2023-05-15 10:28:17 +08:00
}
});
List<SalaryAcctResultLogPO> needInsertList = SalaryAcctResultLogBO.buildSalaryAcctResultLog(editItems, Long.valueOf(user.getUID()), SalaryAcctResultDataSourceEnum.EDIT);
getSalaryAcctResultLogService(user).batchInsert(needInsertList);
}
2022-04-08 19:08:59 +08:00
@Override
2023-09-26 17:18:27 +08:00
public void batchSave(List<SalaryAcctResultPO> salaryAcctResultPOS) {
2022-04-08 19:08:59 +08:00
if (CollectionUtils.isNotEmpty(salaryAcctResultPOS)) {
2022-06-16 17:55:26 +08:00
// 数据加密
encryptUtil.encryptList(salaryAcctResultPOS, SalaryAcctResultPO.class, user);
2023-09-26 17:18:27 +08:00
List<List<SalaryAcctResultPO>> partition = Lists.partition(salaryAcctResultPOS, 100);
2022-06-16 17:55:26 +08:00
partition.forEach(getSalaryAcctResultMapper()::batchInsert);
2023-06-15 18:48:31 +08:00
2022-04-08 19:08:59 +08:00
}
}
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
}
2022-04-08 19:08:59 +08:00
@Override
public void deleteByAcctEmployeeIdsAndSalaryItemIds(List<Long> salaryAcctEmployeeIds, Collection<Long> salaryItemIds) {
List<List<Long>> partition = Lists.partition(salaryAcctEmployeeIds, 300);
partition.forEach(part -> getSalaryAcctResultMapper().deleteByAcctEmpIdsAndSalaryItemIds(part, 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) {
2023-09-26 17:35:23 +08:00
StopWatch stopWatch = new StopWatch(calculateParam.getSalaryAcctRecordId() + "");
2022-04-11 20:17:47 +08:00
try {
2023-09-26 14:29:12 +08:00
stopWatch.start("核算总耗时数据准备");
2022-04-11 20:17:47 +08:00
// 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(user.getLanguage(),542300, "薪资核算记录不存在或已被删除"));
2022-04-11 20:17:47 +08:00
}
2022-06-15 17:53:12 +08:00
//查询对应账套
SalarySobPO salarySobPO = getSalarySobService(user).getById(salaryAcctRecordPO.getSalarySobId());
if (Objects.isNull(salarySobPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(user.getLanguage(),542303, "薪资账套不存在或已被删除"));
2022-06-15 17:53:12 +08:00
}
2022-04-11 20:17:47 +08:00
// 1.1、如果薪资核算记录已经归档了,就不能继续核算
if (!Objects.equals(salaryAcctRecordPO.getStatus(), SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue())) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(user.getLanguage(),542340, "当前薪资核算记录已归档,请重新打开后再进行核算"));
2022-04-11 20:17:47 +08:00
}
// 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(user.getLanguage(),542341, "当前所用的薪资账套未选择任何薪资项目,无法核算"));
2022-04-11 20:17:47 +08:00
}
// 回算薪资项目
List<SalarySobBackItemPO> salarySobBackItems = Collections.emptyList();
2023-05-04 11:56:34 +08:00
if (Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), 1)) {
salarySobBackItems = getSalarySobBackItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
}
2022-04-11 20:17:47 +08:00
// 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-11-17 09:28:40 +08:00
//核算锁定值
List<Long> lockSalaryItemIds = salaryAcctRecordPO.getLockSalaryItemIds();
2022-11-17 18:53:22 +08:00
Map<String, SalaryAcctResultPO> acctResults = new HashMap<>();
2022-11-17 09:28:40 +08:00
if (CollectionUtils.isNotEmpty(lockSalaryItemIds)) {
List<SalaryAcctResultPO> acctResultPOS = listBySalaryAcctRecordIdsAndSalaryItemIds(Collections.singleton(calculateParam.getSalaryAcctRecordId()), lockSalaryItemIds);
// List<SalaryAcctResultPO> acctResultPOS = listBySalaryAcctRecordIds(Collections.singleton(calculateParam.getSalaryAcctRecordId()));
2023-09-26 17:18:27 +08:00
acctResults = Optional.ofNullable(acctResultPOS).orElse(new ArrayList<>()).stream().filter(po -> lockSalaryItemIds.contains(po.getSalaryItemId())).collect(Collectors.toMap(po -> po.getSalaryItemId() + "_" + po.getSalaryAcctEmpId(), a -> a, (a, b) -> a));
2022-11-17 09:28:40 +08:00
}
2022-04-11 20:17:47 +08:00
// 8、查询公式详情
Set<Long> formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId);
formulaIds.addAll(SalaryEntityUtil.properties(salaryItemPOS, SalaryItemPO::getFormulaId));
2023-05-04 11:56:34 +08:00
formulaIds.addAll(SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getFormulaId));
2022-04-14 10:03:49 +08:00
List<ExpressFormula> expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds);
// 本次运算的回算薪资项目所涉及的变量
Set<String> issuedFieldIds = new HashSet<>();
2022-04-11 20:17:47 +08:00
// 9、计算薪资项目的运算优先级
List<List<Long>> salarySobItemsWithPriority = SalaryAcctCalculatePriorityBO.calculatePriority(salarySobItemPOS, salaryItemPOS, expressFormulas, salarySobBackItems, issuedFieldIds, user);
2022-04-11 20:17:47 +08:00
// 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(user.getLanguage(),542342, "薪资核算人员不能为空"));
2022-04-11 20:17:47 +08:00
}
2023-09-26 14:29:12 +08:00
stopWatch.stop();
stopWatch.start("核算完毕计时");
2022-04-11 20:17:47 +08:00
// 11.1、初始化进度
Merge remote-tracking branch 'remotes/origin/master' into feature/salary_i18 # Conflicts: # src/com/engine/salary/biz/SIAccountBiz.java # src/com/engine/salary/biz/SIArchivesBiz.java # src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java # src/com/engine/salary/entity/salaryBill/param/SalarySendWithdrawParam.java # src/com/engine/salary/entity/salaryBill/param/SalaryTemplateSaveParam.java # src/com/engine/salary/entity/salaryacct/bo/SalaryAcctRecordBO.java # src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java # src/com/engine/salary/entity/salaryitem/bo/SalaryItemBO.java # src/com/engine/salary/entity/taxagent/bo/TaxAgentBO.java # src/com/engine/salary/enums/salaryformula/SalaryFormulaReferenceEnum.java # src/com/engine/salary/maintainer/salaryacct/SalaryAcctManager.java # src/com/engine/salary/report/enums/UnitTypeEnum.java # src/com/engine/salary/report/service/impl/SalaryStatisticsReportServiceImpl.java # src/com/engine/salary/report/wrapper/SalaryStatisticsDimensionWrapper.java # src/com/engine/salary/report/wrapper/SalaryStatisticsReportWrapper.java # src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java # src/com/engine/salary/service/impl/ColumnBuildServiceImpl.java # src/com/engine/salary/service/impl/RecordsBuildServiceImpl.java # src/com/engine/salary/service/impl/SISchemeServiceImpl.java # src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java # src/com/engine/salary/service/impl/SalaryAcctProgressServiceImpl.java # src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java # src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java # src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java # src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java # src/com/engine/salary/service/impl/SalarySendServiceImpl.java # src/com/engine/salary/service/impl/SalaryTemplateServiceImpl.java # src/com/engine/salary/web/SalaryAcctController.java # src/com/engine/salary/web/SalaryFormulaController.java # src/com/engine/salary/web/SalaryProgressController.java # src/com/engine/salary/web/SalarySobController.java # src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java # src/com/engine/salary/wrapper/SalarySobItemWrapper.java
2023-06-30 11:37:39 +08:00
ProgressDTO initProgress = new ProgressDTO().setTitle(SalaryI18nUtil.getI18nLabel(user.getLanguage(),542322, "核算中")).setTitleLabelId(542322L).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-12-20 16:45:09 +08:00
List<List<SalaryAcctEmployeePO>> partition = Lists.partition(salaryAcctEmployeePOS, 5000);
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();
2023-07-04 09:32:12 +08:00
// 12.4、是否采用系统算税
TaxDeclarationFunctionEnum taxDeclarationFunction = getSalarySysConfService(user).getTaxDeclaration();
// 12.5、多线程运算,运算结果存放在临时表中
2022-04-11 20:17:47 +08:00
for (List<SalaryAcctEmployeePO> acctEmployeePOS : partition) {
2023-09-26 17:18:27 +08:00
SalaryAcctCalculateBO salaryAcctCalculateBO = new SalaryAcctCalculateBO().setSalaryAcctRecordPO(salaryAcctRecordPO).setSalarySobPO(salarySobPO).setSalarySobCycleDTO(salarySobCycleDTO).setOtherSalaryAcctRecordPOS(otherSalaryAcctRecordPOS).setSalaryAcctLockResultPOS(MapUtils.emptyIfNull(acctResults)).setLockSalaryItemIds(lockSalaryItemIds).setSalarySobItemPOS(salarySobItemPOS).setSalaryItemIdWithPriorityList(salarySobItemsWithPriority).setExpressFormulas(expressFormulas).setSalaryItemPOS(salaryItemPOS).setSalarySobAdjustRulePOS(salarySobAdjustRulePOS).setWelfareColumns(MapUtils.emptyIfNull(welfareColumns)).setAttendQuoteFieldListDTOS(attendQuoteFieldListDTOS).setSalaryAcctEmployeePOS(acctEmployeePOS).setIssuedFieldIds(issuedFieldIds).setChildMonitor(childMonitor).setResults(calculateResults).setCalculateKey(calculateKey).setTaxDeclarationFunction(taxDeclarationFunction);
List<SalarySobBackItemPO> finalSalarySobBackItems = salarySobBackItems;
2022-04-11 20:17:47 +08:00
LocalRunnable localRunnable = new LocalRunnable() {
@Override
public void execute() {
getSalaryAcctCalculateService(user).calculate(salaryAcctCalculateBO, simpleEmployee, finalSalarySobBackItems);
2022-04-11 20:17:47 +08:00
}
};
ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.HRM, "salaryAcctCalculateV2", localRunnable);
2022-04-11 20:17:47 +08:00
}
// 13、等待所有子线程执行完毕
childMonitor.await();
2023-09-26 14:29:12 +08:00
stopWatch.stop();
stopWatch.start("核算入库计时");
2022-04-11 20:17:47 +08:00
// 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);
2023-05-15 10:28:17 +08:00
2023-09-26 14:29:12 +08:00
stopWatch.stop();
log.info(stopWatch.prettyPrint());
2023-05-15 10:28:17 +08:00
// 存储薪资核算数据来源日志
new Thread() {
public void run() {
List<Long> exceptItemIds = new ArrayList<>();
List<Long> salaryAcctEmployeeIds = salaryAcctEmployeePOS.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
exceptItemIds.addAll(lockSalaryItemIds);
2023-09-26 17:18:27 +08:00
exceptItemIds.addAll(salaryItemPOS.stream().filter(PO -> Objects.equals(PO.getValueType(), NumberUtils.INTEGER_ONE) && Objects.equals(PO.getUseInEmployeeSalary(), 0)).map(SalaryItemPO::getId).collect(Collectors.toList()));
2023-05-15 10:28:17 +08:00
getSalaryAcctResultLogService(user).deleteBySalaryAcctEmpIdExceptItemIds(salaryAcctEmployeeIds, exceptItemIds);
}
}.start();
2022-04-11 20:17:47 +08:00
// 记录日志
// 查询操作日志的targetName
2024-01-24 09:50:58 +08:00
String targetName = getSalaryAcctRecordService(user).getLogTargetNameById(calculateParam.getSalaryAcctRecordId());
LoggerContext<SalaryCheckResultPO> loggerContext = new LoggerContext<>();
loggerContext.setUser(user);
loggerContext.setTargetId(String.valueOf(calculateParam.getSalaryAcctRecordId()));
loggerContext.setTargetName(targetName);
loggerContext.setOperateType(OperateTypeEnum.UPDATE.getValue());
loggerContext.setOperateTypeName(SalaryI18nUtil.getI18nLabel(0, "薪资核算"));
loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel(0, "薪资核算"));
2024-01-30 09:58:13 +08:00
SalaryElogConfig.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(user.getLanguage(),542343, "薪资核算出错") + ": " + 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) {
2023-09-26 17:35:23 +08:00
StopWatch sw = new StopWatch(calculateParam.getSalaryAcctRecordId() + "");
2022-04-29 17:15:22 +08:00
// 查询薪资核算结果的临时存储
2023-09-26 17:18:27 +08:00
sw.start("处理核算数据,查询薪资核算结果的临时存储");
2022-04-29 17:15:22 +08:00
List<SalaryAcctResultTempPO> salaryAcctResultTempPOS = getSalaryAcctResultTempService(user).listByCalculateKey(calculateKey);
2023-09-26 17:18:27 +08:00
sw.stop();
2022-04-29 17:15:22 +08:00
// 删除原来的薪资核算结果
2023-09-26 17:18:27 +08:00
sw.start("处理核算数据,删除原来的薪资核算结果");
2022-04-29 17:15:22 +08:00
if (CollectionUtils.isNotEmpty(calculateParam.getIds())) {
getSalaryAcctResultMapper().deleteBySalaryAcctEmpIds(calculateParam.getIds());
} else {
getSalaryAcctResultMapper().deleteBySalaryAcctRecordIds(Collections.singleton(calculateParam.getSalaryAcctRecordId()));
getSalaryAcctReportService(user).deleteBySalaryAcctRecordId(calculateParam.getSalaryAcctRecordId());
2022-04-29 17:15:22 +08:00
}
2023-09-26 17:18:27 +08:00
sw.stop();
2022-04-29 17:15:22 +08:00
// 保存薪资的薪资核算结果
2023-09-26 17:18:27 +08:00
sw.start("处理核算数据,保存薪资的薪资核算结果");
2022-04-29 17:15:22 +08:00
List<SalaryAcctResultPO> salaryAcctResultPOS = SalaryAcctResultBO.convert2ResultPO(salaryAcctResultTempPOS);
batchSave(salaryAcctResultPOS);
2023-09-26 17:18:27 +08:00
sw.stop();
2023-09-26 17:35:23 +08:00
new Thread() {
public void run() {
//保存核算报表数据
List<SalaryAcctResultReportPO> salaryAcctResultReportPOS = SalaryAcctResultReportBO.convert2ReportPO(salaryAcctResultTempPOS, calculateParam.getEmps());
getSalaryAcctReportService(user).batchSave(salaryAcctResultReportPOS);
}
}.start();
2022-04-29 17:15:22 +08:00
// 删除薪资核算临时存储表中的数据
2023-09-26 17:18:27 +08:00
sw.start("处理核算数据,删除薪资核算临时存储表中的数据");
2022-04-29 17:15:22 +08:00
getSalaryAcctResultTempService(user).deleteByCalculateKey(calculateKey);
2023-09-26 17:18:27 +08:00
sw.stop();
log.info(sw.prettyPrint());
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();
}
return encryptUtil.decryptList(getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctRecordIds(salaryAcctRecordIds).taxAgentIds(taxAgentIds).build()), SalaryAcctResultPO.class, user);
2022-06-07 19:10:40 +08:00
}
2022-11-17 09:28:40 +08:00
// /**
// * 查询薪资核算人员
// *
// * @param queryParam
// * @param salaryAcctRecord
// * @return
// */
// private List<SalaryAcctEmployeePO> querySalaryAcctEmployee(SalaryAcctResultListContext salaryAcctResultListContext, SalaryAcctResultQueryParam queryParam, SalaryAcctRecordPO salaryAcctRecord) {
// // 构建薪资核算人员的查询参数
// SalaryAcctEmployeeQueryParam salaryAcctEmployeeListQueryParam = new SalaryAcctEmployeeQueryParam();
// BeanUtils.copyProperties(queryParam, salaryAcctEmployeeListQueryParam);
// // 查询薪资核算人员
// List<SalaryAcctEmployeePO> salaryAcctEmployees = getSalaryAcctEmployeeService(user).listByParam(salaryAcctEmployeeListQueryParam);
// // 查询相同税款所属期内的薪资核算人员
// List<SalaryAcctEmployeePO> sameTaxCycleSalaryAcctEmployees = salaryAcctEmployeeService
// .listSameTaxCycle(salaryAcctEmployees, SalaryDateUtil.getFormatYearMonth(salaryAcctRecord.getTaxCycle()));
// Set<String> sameTaxCycleKeySet = SalaryEntityUtil.properties(sameTaxCycleSalaryAcctEmployees, o -> o.getEmployeeId() + "-" + o.getTaxAgentId());
// salaryAcctResultListContext.setSameTaxCycleKeySet(sameTaxCycleKeySet);
// // 过滤合并计税的人员
// if (StringUtils.isNotEmpty(queryParam.getConsolidatedTaxation())) {
// salaryAcctEmployees = salaryAcctEmployees.stream()
// .filter(salaryAcctEmployeePO -> sameTaxCycleKeySet.contains(salaryAcctEmployeePO.getEmployeeId() + "-" + salaryAcctEmployeePO.getTaxAgentId()))
// .collect(Collectors.toList());
// }
// // 根据权限过滤
// return salaryAcctEmployeeService.filterByAuthority(salaryAcctEmployees, employeeId);
// }
@Override
public void updateLockStatusByParam(SalaryAcctResultUpdateLockStatusParam updateParam) {
// 查询薪资核算记录
SalaryAcctRecordPO salaryAcctRecord = getSalaryAcctRecordService(user).getById(updateParam.getSalaryAcctRecordId());
2022-11-17 17:04:14 +08:00
if (CollectionUtils.isEmpty(salaryAcctRecord.getLockSalaryItemIds())) {
2022-11-17 09:28:40 +08:00
salaryAcctRecord.setLockSalaryItemIds(new ArrayList<>());
}
List<SalaryAcctEmployeePO> salaryAcctEmployees = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(updateParam.getSalaryAcctRecordId());
if (CollectionUtils.isEmpty(salaryAcctEmployees)) {
return;
}
// 查询薪资核算结果
2023-06-02 14:47:15 +08:00
// List<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployees, SalaryAcctEmployeePO::getId,Collectors.toList());
// List<SalaryAcctResultPO> salaryAcctResultValues = this.listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds);
// Map<Long, SalaryAcctResultPO> salaryAcctResultValueMap = SalaryEntityUtil.convert2Map(salaryAcctResultValues, SalaryAcctResultPO::getSalaryAcctEmpId);
2022-11-17 09:28:40 +08:00
// 值可以锁定的薪资项目
2022-11-17 18:53:22 +08:00
// Set<Long> salaryItemIds = canLockSalaryItemIds(salaryAcctRecord.getSalarySobId());
2022-11-17 09:28:40 +08:00
// if (Objects.nonNull(updateParam.getSalaryItemId())) {
// if (!salaryItemIds.contains(updateParam.getSalaryItemId())) {
// return;
// }
// salaryItemIds = Collections.singleton(updateParam.getSalaryItemId());
// }
2023-05-11 10:51:43 +08:00
Set<Long> salaryItemIds;
2023-09-26 14:29:12 +08:00
if (CollectionUtils.isNotEmpty(updateParam.getSalaryItemIds())) {
2023-05-11 10:51:43 +08:00
salaryItemIds = updateParam.getSalaryItemIds();
2023-09-26 14:29:12 +08:00
} else {
2023-05-11 10:51:43 +08:00
salaryItemIds = Collections.singleton(updateParam.getSalaryItemId());
}
2022-11-17 09:28:40 +08:00
if (updateParam.getLockStatus() == LockStatusEnum.LOCK) {
2023-05-11 10:51:43 +08:00
Set<Long> lockSalaryItemIds = new HashSet<>();
lockSalaryItemIds.addAll(salaryAcctRecord.getLockSalaryItemIds());
lockSalaryItemIds.addAll(salaryItemIds);
salaryAcctRecord.setLockSalaryItemIds(new ArrayList<Long>(lockSalaryItemIds));
2022-11-17 09:28:40 +08:00
} else {
salaryAcctRecord.getLockSalaryItemIds().removeAll(salaryItemIds);
}
getSalaryAcctRecordService(user).updateLockSalaryItemIds(salaryAcctRecord);
}
@Override
public void reCalc(Long id) {
// 无需解密
SalaryAcctResultPO build = SalaryAcctResultPO.builder().salaryAcctRecordId(id).deleteType(0).build();
List<SalaryAcctResultPO> salaryAcctResultPOS = getSalaryAcctResultMapper().listSome(build);
// 回算前的薪资核算结果
2023-09-26 17:18:27 +08:00
salaryAcctResultPOS.forEach(salaryAcctResult -> salaryAcctResult.setOriginResultValue(salaryAcctResult.getResultValue()));
// 批量更新
batchUpdateOriginResultValue(salaryAcctResultPOS);
}
2022-12-06 15:29:08 +08:00
@Override
public List<SalaryAcctResultPO> listBySalaryAcctRecordIdsAndSalaryItemIds(Collection<Long> salaryAcctRecordIds, Collection<Long> salaryItemIds) {
2023-05-04 11:56:34 +08:00
if (CollectionUtils.isEmpty(salaryAcctRecordIds) || CollectionUtils.isEmpty(salaryItemIds)) {
2022-12-06 15:29:08 +08:00
return Collections.emptyList();
}
2023-04-04 17:29:56 +08:00
List<SalaryAcctResultPO> list = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctRecordIds(salaryAcctRecordIds).salaryItemIds(salaryItemIds).build());
return encryptUtil.decryptList(list, SalaryAcctResultPO.class, user);
2022-12-06 15:29:08 +08:00
}
2022-12-26 23:17:32 +08:00
@Override
public List<SalaryAcctResultPO> listByAcctEmployeeIdsAndSalaryItemIds(List<Long> salaryAcctEmployeeIds, Collection<Long> salaryItemIds) {
2023-09-26 14:29:12 +08:00
if (CollectionUtils.isEmpty(salaryAcctEmployeeIds)) {
2023-06-20 17:27:18 +08:00
return Collections.emptyList();
}
2023-09-26 14:29:12 +08:00
List<List<Long>> partition = Lists.partition((List<Long>) salaryAcctEmployeeIds, 200);
2023-06-20 17:27:18 +08:00
List<SalaryAcctResultPO> result = new ArrayList<>();
partition.forEach(empIds -> {
SalaryAcctResultPO build = SalaryAcctResultPO.builder().salaryAcctEmpIds(empIds).salaryItemIds(salaryItemIds).build();
result.addAll(getSalaryAcctResultMapper().listSome(build));
});
2022-12-26 23:17:32 +08:00
// 数据解密
encryptUtil.decryptList(result, SalaryAcctResultPO.class, user);
2023-06-20 17:27:18 +08:00
return result;
2022-12-26 23:17:32 +08:00
}
@Override
public void batchUpdateOriginResultValue(List<SalaryAcctResultPO> salaryAcctResultValues) {
2022-12-15 11:32:32 +08:00
int batchSize = 500;
List<List<SalaryAcctResultPO>> partition = Lists.partition(salaryAcctResultValues, batchSize);
for (List<SalaryAcctResultPO> subSalaryAcctResultValues : partition) {
getSalaryAcctResultMapper().batchUpdateOriginResultValue(subSalaryAcctResultValues);
}
}
2023-06-20 17:27:18 +08:00
@Override
public List<Long> listAcctEmpIdByAcctEmpId(List<Long> salaryAcctEmployeeIds) {
2023-09-26 14:29:12 +08:00
if (CollectionUtils.isEmpty(salaryAcctEmployeeIds)) {
2023-06-20 17:27:18 +08:00
return Collections.emptyList();
}
2023-09-26 14:29:12 +08:00
List<List<Long>> partition = Lists.partition((List<Long>) salaryAcctEmployeeIds, 1000);
2023-06-20 17:27:18 +08:00
List<Long> result = new ArrayList<>();
partition.forEach(empIds -> {
result.addAll(getSalaryAcctResultMapper().getAcctEmpIsExist(empIds));
});
return result;
}
2022-11-17 09:28:40 +08:00
private Set<Long> canLockSalaryItemIds(Long salarySobId) {
// 值可以锁定的薪资项目
Set<Long> salaryItemIds = Sets.newHashSet();
// 查询薪资核算记录所用的薪资账套的薪资项目
List<SalarySobItemDTO> salarySobItems = Lists.newArrayList();
SalarySobItemAggregateDTO salarySobItemAggregate = getSalarySobItemService(user).getAggregateBySalarySobId(salarySobId);
for (SalarySobItemIncomeCategoryDTO incomeCategory : salarySobItemAggregate.getIncomeCategories()) {
for (SalarySobItemGroupDTO itemGroup : incomeCategory.getItemGroups()) {
salarySobItems.addAll(itemGroup.getItems());
}
salarySobItems.addAll(incomeCategory.getItems());
}
for (SalarySobItemDTO salarySobItem : salarySobItems) {
if (Objects.equals(salarySobItem.getValueType(), SalaryValueTypeEnum.FORMULA.getValue()) && salarySobItem.isCanEdit()) {
salaryItemIds.add(salarySobItem.getSalaryItemId());
}
}
// for (SalarySobItemDTO backCalcItem : salarySobItemAggregate.getBackCalcItems()) {
// if (Objects.equals(backCalcItem.getValueType(), SalaryValueTypeEnum.FORMULA.getValue()) && backCalcItem.isCanEdit()) {
// salaryItemIds.add(backCalcItem.getSalaryItemId());
// }
// }
return salaryItemIds;
}
2023-06-27 14:58:33 +08:00
@Override
public Boolean checkAuth(Long salaryAcctRecordId) {
// 获取该核算记录的个税扣缴义务
SalaryAcctRecordPO recordPO = getSalaryAcctRecordService(user).getById(salaryAcctRecordId);
2023-09-26 14:29:12 +08:00
if (Objects.isNull(recordPO)) {
2023-06-27 14:58:33 +08:00
return false;
}
SalarySobPO salarySobPO = getSalarySobService(user).getById(recordPO.getSalarySobId());
Long taxAgentId = salarySobPO.getTaxAgentId();
List<TaxAgentAdminPO> adminTaxAgentList = getTaxAgentAdminService(user).listByEmployeeId(Long.valueOf(user.getUID()));
Optional<TaxAgentAdminPO> canOperate = adminTaxAgentList.stream().filter(po -> NumberUtils.compare(taxAgentId, po.getTaxAgentId()) == 0).findFirst();
2023-09-26 14:29:12 +08:00
if (!canOperate.isPresent()) {
return false;
2023-06-27 14:58:33 +08:00
}
return true;
}
2023-12-11 11:08:30 +08:00
@Override
public Map<String, Object> sumForWorkflow(SalaryAcctResultQueryParam param) {
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(param.getSalaryAcctRecordId());
if (ObjectUtil.isEmpty(salaryAcctRecordPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(user.getLanguage(),542300, "薪资核算记录不存在或已被删除"));
2023-12-11 11:08:30 +08:00
}
BaseBean baseBean = new BaseBean();
String fieldNameStr = baseBean.getPropValue("shgwSalary", "fieldName");
String[] fields = fieldNameStr.split(",");
Map<String, Object> sumMap = new HashMap<>();
Map<String, Long> fieldItemMap = new HashMap<>();
List<Long> salaryItemIds = new ArrayList<>();
for (String field : fields) {
Long salaryItemId = Long.valueOf(StringUtils.isEmpty(baseBean.getPropValue("shgwSalary", field)) ? "0" : baseBean.getPropValue("shgwSalary", field));
salaryItemIds.add(salaryItemId);
fieldItemMap.put(field, salaryItemId);
}
List<SalaryItemPO> itemList = getSalaryItemService(user).listByIds(salaryItemIds);
Map<Long, SalaryItemPO> salaryItemMap = SalaryEntityUtil.convert2Map(itemList, SalaryItemPO::getId);
List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
Map<Long, SalarySobItemPO> sobItemMap = SalaryEntityUtil.convert2Map(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
// 查询薪资核算结果
List<SalaryAcctResultPO> salaryAcctResultList = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctRecordId(param.getSalaryAcctRecordId()).salaryItemIds(salaryItemIds).build());
encryptUtil.decryptList(salaryAcctResultList, SalaryAcctResultPO.class, user);
2023-12-11 11:08:30 +08:00
Map<Long, List<SalaryAcctResultPO>> acctResultMap = SalaryEntityUtil.group2Map(salaryAcctResultList, SalaryAcctResultPO::getSalaryItemId);
fieldItemMap.forEach((field,itemId) -> {
SalaryItemPO salaryItemPO = salaryItemMap.get(itemId);
if (salaryItemPO != null && SalaryDataTypeEnum.NUMBER.getValue().equals(salaryItemPO.getDataType())) {
BigDecimal sum = Optional.ofNullable(acctResultMap.get(salaryItemPO.getId())).orElse(new ArrayList<>()).stream().map(SalaryAcctResultPO::getResultValue).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(BigDecimal.ZERO, BigDecimal::add);
sumMap.put(field, SalaryAcctFormulaBO.roundResultValue(sum.toString(), salaryItemPO, Collections.emptyList(), Collections.emptyMap(), sobItemMap));
}
});
return sumMap;
}
Merge branch 'release/2.12.1.2403.02' into custom/上海港湾-多语言 # Conflicts: # src/com/engine/salary/biz/AddUpDeductionBiz.java # src/com/engine/salary/biz/AddUpSituationBiz.java # src/com/engine/salary/biz/OtherDeductionBiz.java # src/com/engine/salary/biz/SIArchivesBiz.java # src/com/engine/salary/biz/SICategoryBiz.java # src/com/engine/salary/biz/SalaryArchiveItemBiz.java # src/com/engine/salary/biz/SpecialAddDeductionBiz.java # src/com/engine/salary/cmd/siarchives/SIArchivesTipsCmd.java # src/com/engine/salary/entity/datacollection/AddUpDeduction.java # src/com/engine/salary/entity/datacollection/AddUpSituation.java # src/com/engine/salary/entity/datacollection/DataCollectionEmployee.java # src/com/engine/salary/entity/datacollection/dto/AddUpDeductionDTO.java # src/com/engine/salary/entity/datacollection/po/OtherDeductionPO.java # src/com/engine/salary/entity/extemp/po/ExtEmpPO.java # src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateListDTO.java # src/com/engine/salary/entity/salaryBill/param/SalarySendInfoQueryParam.java # src/com/engine/salary/entity/salaryBill/param/SalaryTemplateCopyParam.java # src/com/engine/salary/entity/salaryacct/bo/SalaryAcctRecordBO.java # src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java # src/com/engine/salary/entity/salaryacct/po/SalaryAcctEmployeePO.java # src/com/engine/salary/entity/salaryarchive/dto/SalaryArchiveListDTO.java # src/com/engine/salary/entity/salarysob/dto/SalarySobItemDTO.java # src/com/engine/salary/entity/siaccount/bo/InsuranceComparisonResultBO.java # src/com/engine/salary/entity/sicategory/dto/ICategoryListDTO.java # src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationDetailBO.java # src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationAnnualListDTO.java # src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationLaborListDTO.java # src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationWageListDTO.java # src/com/engine/salary/enums/OperateTypeEnum.java # src/com/engine/salary/enums/salaryarchive/SalaryArchiveItemAdjustReasonEnum.java # src/com/engine/salary/enums/salaryarchive/SalaryArchiveStatusEnum.java # src/com/engine/salary/mapper/datacollection/EmployMapper.java # src/com/engine/salary/mapper/datacollection/EmployMapper.xml # src/com/engine/salary/report/service/impl/SalaryStatisticsItemServiceImpl.java # src/com/engine/salary/report/service/impl/SalaryStatisticsReportServiceImpl.java # src/com/engine/salary/report/wrapper/SalaryStatisticsDimensionWrapper.java # src/com/engine/salary/service/SalaryAcctResultService.java # src/com/engine/salary/service/SalaryEmployeeService.java # src/com/engine/salary/service/SalarySendService.java # src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java # src/com/engine/salary/service/impl/AddUpSituationServiceImpl.java # src/com/engine/salary/service/impl/AttendQuoteDataServiceImpl.java # src/com/engine/salary/service/impl/AttendQuoteServiceImpl.java # src/com/engine/salary/service/impl/ColumnBuildServiceImpl.java # src/com/engine/salary/service/impl/OtherDeductionServiceImpl.java # src/com/engine/salary/service/impl/SIAComparisonResultServiceImpl.java # src/com/engine/salary/service/impl/SIAccountServiceImpl.java # src/com/engine/salary/service/impl/SIArchivesServiceImpl.java # src/com/engine/salary/service/impl/SIBalanceServiceImpl.java # src/com/engine/salary/service/impl/SICategoryServiceImpl.java # src/com/engine/salary/service/impl/SIExportServiceImpl.java # src/com/engine/salary/service/impl/SIImportServiceImpl.java # src/com/engine/salary/service/impl/SISchemeServiceImpl.java # src/com/engine/salary/service/impl/SalaryAcctEmployeeServiceImpl.java # src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java # src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java # src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java # src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java # src/com/engine/salary/service/impl/SalaryArchiveItemServiceImpl.java # src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java # src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java # src/com/engine/salary/service/impl/SalaryItemServiceImpl.java # src/com/engine/salary/service/impl/SalarySendServiceImpl.java # src/com/engine/salary/service/impl/SalarySobAdjustRuleServiceImpl.java # src/com/engine/salary/service/impl/SalarySobCheckRuleServiceImpl.java # src/com/engine/salary/service/impl/SalarySobItemServiceImpl.java # src/com/engine/salary/service/impl/SalarySobRangeServiceImpl.java # src/com/engine/salary/service/impl/SalarySobServiceImpl.java # src/com/engine/salary/service/impl/SalaryTemplateServiceImpl.java # src/com/engine/salary/service/impl/SpecialAddDeductionServiceImpl.java # src/com/engine/salary/service/impl/SysSalaryItemServiceImpl.java # src/com/engine/salary/service/impl/TaxAgentManageRangeServiceImpl.java # src/com/engine/salary/service/impl/TaxAgentServiceImpl.java # src/com/engine/salary/service/impl/TaxDeclarationExcelServiceImpl.java # src/com/engine/salary/sys/service/impl/SalarySysConfServiceImpl.java # src/com/engine/salary/util/SalaryI18nUtil.java # src/com/engine/salary/util/page/SalaryPageUtil.java # src/com/engine/salary/web/SIExportController.java # src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java # src/com/engine/salary/wrapper/SalaryFormulaWrapper.java # src/com/engine/salary/wrapper/SalarySendWrapper.java # src/com/engine/salary/wrapper/SalaryTemplateWrapper.java
2024-03-28 15:47:11 +08:00
2023-12-05 14:57:34 +08:00
@Override
2023-12-06 16:05:08 +08:00
public void batchUpdate(SalaryAcctResultBatchUpdateParam param) {
2023-12-05 14:57:34 +08:00
ValidUtil.doValidator(param);
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(param.getSalaryAcctRecordId());
2024-04-01 20:25:23 +08:00
if (salaryAcctRecordPO == null) {
2023-12-05 14:57:34 +08:00
throw new SalaryRunTimeException("薪资核算记录不存在,或已被删除");
}
List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
// 薪资账套中包含的薪资项目
List<Long> salarySobItemIds = salarySobItemPOS.stream().map(SalarySobItemPO::getSalaryItemId).collect(Collectors.toList());
if (!salarySobItemIds.contains(param.getSalaryItemId())) {
throw new SalaryRunTimeException("该账套不包含该薪资项目或已被删除,请先检查账套");
}
// 获取需要更新的核算人员信息
2023-12-06 16:05:08 +08:00
List<SalaryAcctEmployeePO> salaryAcctEmployeePOList = new ArrayList<>();
if (CollectionUtils.isEmpty(param.getIdList())) {
2023-12-05 14:57:34 +08:00
// 没有选择核算人员,更新核算记录中所有人员
salaryAcctEmployeePOList.addAll(getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salaryAcctRecordPO.getId()));
} else {
2023-12-06 16:05:08 +08:00
salaryAcctEmployeePOList.addAll(getSalaryAcctEmployeeService(user).listByIds(param.getIdList()));
2023-12-05 14:57:34 +08:00
}
if (CollectionUtils.isNotEmpty(salaryAcctEmployeePOList)) {
List<Long> salaryAcctEmployeeIdList = SalaryEntityUtil.properties(salaryAcctEmployeePOList, SalaryAcctEmployeePO::getId, Collectors.toList());
// 查询薪资核算结果
List<SalaryAcctResultPO> resultPOS = listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmployeeIdList, Collections.singleton(param.getSalaryItemId()));
Map<Long, SalaryAcctResultPO> salaryAcctResultPOMap = SalaryEntityUtil.convert2Map(resultPOS, SalaryAcctResultPO::getSalaryAcctEmpId);
2023-12-06 16:05:08 +08:00
List<DataCollectionEmployee> dataCollectionEmployees = getSalaryEmployeeService(user).listAllForReport();
Map<Long, DataCollectionEmployee> emps = SalaryEntityUtil.convert2Map(dataCollectionEmployees, DataCollectionEmployee::getEmployeeId);
2023-12-05 14:57:34 +08:00
List<SalaryAcctResultPO> needUpdateList = new ArrayList<>();
List<SalaryAcctResultPO> needInsertList = new ArrayList<>();
Date now = new Date();
2023-12-06 16:05:08 +08:00
List<SalaryAcctResultReportPO> salaryAcctResultReportPOS = new ArrayList<>();
2023-12-05 14:57:34 +08:00
salaryAcctEmployeePOList.forEach(salaryAcctEmployeePO -> {
if (salaryAcctResultPOMap.containsKey(salaryAcctEmployeePO.getId())) {
// 更新
SalaryAcctResultPO po = salaryAcctResultPOMap.get(salaryAcctEmployeePO.getId());
po.setResultValue(param.getValue());
po.setUpdateTime(now);
needUpdateList.add(po);
} else {
// 新增
needInsertList.add(SalaryAcctResultPO.builder()
.salarySobId(salaryAcctRecordPO.getSalarySobId())
.salaryItemId(param.getSalaryItemId())
.salaryAcctRecordId(param.getSalaryAcctRecordId())
.salaryAcctEmpId(salaryAcctEmployeePO.getId())
.employeeId(salaryAcctEmployeePO.getEmployeeId())
.taxAgentId(salaryAcctEmployeePO.getTaxAgentId())
2023-12-06 16:05:08 +08:00
.resultValue(param.getValue())
2023-12-05 14:57:34 +08:00
.originResultValue("")
.creator(Long.valueOf(user.getUID()))
.createTime(now)
.updateTime(now)
.deleteType(NumberUtils.INTEGER_ZERO)
.tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY)
.build());
}
2023-12-06 16:05:08 +08:00
// 报表
SalaryAcctResultReportPO po = SalaryAcctResultReportPO.builder()
.id(IdGenerator.generate())
.salarySobId(salaryAcctRecordPO.getSalarySobId())
.salaryItemId(param.getSalaryItemId())
.salaryAcctRecordId(param.getSalaryAcctRecordId())
.salaryAcctEmpId(salaryAcctEmployeePO.getId().toString())
.employeeId(salaryAcctEmployeePO.getEmployeeId().toString())
.taxAgentId(salaryAcctEmployeePO.getTaxAgentId())
.resultValue(param.getValue())
.creator(Long.valueOf(user.getUID()))
.createTime(now)
.updateTime(now)
.deleteType(NumberUtils.INTEGER_ZERO)
.tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY)
.build();
DataCollectionEmployee dataCollectionEmployee = emps.get(salaryAcctEmployeePO.getEmployeeId());
if (dataCollectionEmployee != null) {
po.setDepartmentId(dataCollectionEmployee.getDepartmentId());
po.setSubcompanyId(dataCollectionEmployee.getSubcompanyid());
po.setCostcenterId(dataCollectionEmployee.getCostcenterId());
po.setJobtitleId(dataCollectionEmployee.getJobtitleId());
po.setLocationId(dataCollectionEmployee.getLocationId());
}
salaryAcctResultReportPOS.add(po);
2023-12-05 14:57:34 +08:00
});
2023-12-06 16:05:08 +08:00
2023-12-05 14:57:34 +08:00
// 入库
if (CollectionUtils.isNotEmpty(needUpdateList)) {
2023-12-06 15:55:47 +08:00
// 数据加密
2024-04-02 16:25:40 +08:00
encryptUtil.encryptList(needUpdateList, SalaryAcctResultPO.class, user);
2023-12-06 15:55:47 +08:00
List<List<SalaryAcctResultPO>> partition = Lists.partition(needUpdateList, 100);
partition.forEach(getSalaryAcctResultMapper()::batchUpdate);
2023-12-05 14:57:34 +08:00
}
2023-12-06 15:55:47 +08:00
batchSave(needInsertList);
2023-12-06 16:05:08 +08:00
// 报表入库前先删除
2024-01-24 09:50:58 +08:00
getSalaryAcctReportService(user).deleteByAcctEmployeeIdsAndSalaryItemIds(param.getIdList(), Collections.singletonList(param.getSalaryItemId()));
2023-12-06 16:05:08 +08:00
getSalaryAcctReportService(user).batchSave(salaryAcctResultReportPOS);
2023-12-05 14:57:34 +08:00
}
}
2024-07-05 09:24:17 +08:00
@Override
public Map<String, Object> fygsdReport(SalaryAcctRecordQueryParam param) {
if (param.getStartMonth() == null || param.getEndMonth() == null) {
throw new SalaryRunTimeException("报表参数错误");
}
RecordSet rs = new RecordSet();
Map<String, Object> resultMap = new HashMap<>();
// 获取薪资核算记录信息
Collection<TaxAgentPO> taxAgentList = getTaxAgentService(user).listAllTaxAgents(Long.valueOf(user.getUID()));
List<Long> taxAgentIds = taxAgentList.stream().map(TaxAgentPO::getId).collect(Collectors.toList());
List<SalarySobPO> salarySobList = getSalarySobService(user).listByTaxAgentIds(taxAgentIds);
List<Long> salarySobIds = salarySobList.stream().map(SalarySobPO::getId).collect(Collectors.toList());
List<SalaryAcctRecordPO> salaryAcctRecordList= new ArrayList<>();
if (CollectionUtils.isNotEmpty(salarySobIds)) {
// 查询参数
SalaryAcctRecordPO po = SalaryAcctRecordPO.builder().salarySobIds(salarySobIds).build();
LocalDateRange localDateRange = new LocalDateRange();
localDateRange.setFromDate(SalaryDateUtil.localDateToDate(param.getStartMonth().atDay(1)));
localDateRange.setEndDate(SalaryDateUtil.localDateToDate(param.getEndMonth().atEndOfMonth()));
po.setSalaryMonths(localDateRange);
salaryAcctRecordList.addAll(getSalaryAcctRecordService(user).listSome(po));
// 获取薪资核算人员
List<Long> salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
List<SalaryAcctEmployeePO> salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds);
List<Long> employeeIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).distinct().collect(Collectors.toList());
// 获取这些员工的费用类型信息
List<GwFylxInfo> fylbInfoList = getGwEmpFylxInfo(employeeIds, rs, localDateRange);
List<GwFylbDataDTO> gwFylbDataDTOS = buildGwFylbData(fylbInfoList, localDateRange, employeeIds);
// 获取需要查询哪些薪资项目(有序)
List<GwSalaryItemRelation> itemRelationList = getGwReportItems(rs);
// 查询这些员工每个人每个费用类型下的人天数及薪资数据
Map<Long, Map<Integer, Map<String, String>>> salaryAcctEmpReportInfo = getGwReportInfoByAcctEmp(salaryAcctEmployeeList, gwFylbDataDTOS, itemRelationList, localDateRange, rs);
// 获取费用类型下拉框信息
Map<Integer, String> fylxMap = getFylxSelectItemMap(rs);
// 根据薪资账套分组
Map<Long, Set<Long>> acctEmpGroupBySob = SalaryEntityUtil.group2Map(salaryAcctEmployeeList, SalaryAcctEmployeePO::getSalarySobId, SalaryAcctEmployeePO::getId);
// 构建报表信息,计算小计
List<Map<String, String>> dataList = buildReportData(acctEmpGroupBySob, fylxMap, salaryAcctEmpReportInfo, itemRelationList, salarySobList);
// 构建表头
List<WeaTableColumn> columns = new ArrayList<>();
columns.add(new WeaTableColumn("100px", "国家", "gj"));
columns.add(new WeaTableColumn("100px", "费用类型", "fylx1"));
2024-07-09 14:57:06 +08:00
columns.add(new WeaTableColumn("100px", "费用类型", "fylx2"));
2024-07-05 09:24:17 +08:00
columns.add(new WeaTableColumn("100px", "人数", "empNums"));
for (GwSalaryItemRelation itemRelation : itemRelationList) {
columns.add(new WeaTableColumn("100px", itemRelation.getSalaryItemShowName(), itemRelation.getSalaryItemId().toString()));
}
resultMap.put("column", columns);
resultMap.put("dataList", dataList);
}
return resultMap;
}
/**
* 构建报表信息计算小计
*
* @param acctEmpGroupBySob
* @param fylxMap
* @param salaryAcctEmpReportInfo
* @return
*/
private List<Map<String, String>> buildReportData(Map<Long, Set<Long>> acctEmpGroupBySob,
Map<Integer, String> fylxMap,
Map<Long, Map<Integer, Map<String, String>>> salaryAcctEmpReportInfo,
List<GwSalaryItemRelation> itemRelationList,
List<SalarySobPO> salarySobList) {
List<Map<String, String>> resultList = new ArrayList<>();
Set<Integer> fylxIds = fylxMap.keySet();
List<String> itemIdList = itemRelationList.stream().map(item -> item.getSalaryItemId().toString()).collect(Collectors.toList());
Map<Long, String> salarySobNameMap = SalaryEntityUtil.convert2Map(salarySobList, SalarySobPO::getId, SalarySobPO::getName);
// 获取办公室费用、其他关系对应的id
BaseBean baseBean = new BaseBean();
int bgsfySelectId = Integer.valueOf(baseBean.getPropValue("shgwSalaryReport", "fylx_bgsfy_select_id")).intValue();
2024-07-09 14:57:06 +08:00
int qtgxSelectId = Integer.valueOf(baseBean.getPropValue("shgwSalaryReport", "fylx_qtgx_select_id")).intValue();
2024-07-05 09:24:17 +08:00
for (Map.Entry<Long, Set<Long>> entry : acctEmpGroupBySob.entrySet()){
// 该账套下的结果(用于计算小计)
List<Map<String, String>> resultListBySob = new ArrayList<>();
String sobName = salarySobNameMap.getOrDefault(entry.getKey(), "");
// 该分组下的薪资核算人员id
Set<Long> acctEmpIds = entry.getValue();
List<Map<Integer, Map<String, String>>> reportInfoListBySob = new ArrayList<>();
acctEmpIds.stream().forEach(acctEmpId -> {
if (salaryAcctEmpReportInfo.get(acctEmpId) != null) {
reportInfoListBySob.add(salaryAcctEmpReportInfo.get(acctEmpId));
}
});
// 计算每一个费用类型的合计值
2024-07-09 14:57:06 +08:00
double threshold = 1e-10;
2024-07-05 09:24:17 +08:00
for (Integer fylxId : fylxIds) {
String fylxName = fylxMap.getOrDefault(fylxId, "");
// 获取该账套下 该费用类型下所有报表结果
List<Map<String, String>> reportInfoListByFylx = reportInfoListBySob.stream().map(map -> map.get(fylxId))
.filter(m -> m != null)
.collect(Collectors.toList());
// 先获取该费用类型下的人数是否为0
BigDecimal empNums = reportInfoListByFylx.stream()
.map(map -> map.get("empNums"))
.filter(NumberUtils::isCreatable)
.map(BigDecimal::new)
.reduce(BigDecimal.ZERO, BigDecimal::add);
2024-07-09 14:57:06 +08:00
if ( empNums.doubleValue() > threshold ) {
2024-07-05 09:24:17 +08:00
Map<String, String> fylxSumMap = new HashMap<>();
// 薪资项目值
itemIdList.stream().forEach(itemId -> {
BigDecimal sum = reportInfoListByFylx.stream()
.map(map -> map.get(itemId))
.filter(NumberUtils::isCreatable)
.map(BigDecimal::new)
.reduce(BigDecimal.ZERO, BigDecimal::add);
fylxSumMap.put(itemId.toString(), sum.toPlainString());
});
// 人数
fylxSumMap.put("empNums", empNums.toPlainString());
// 国家
fylxSumMap.put("gj", sobName);
// 2个费用类型
if (fylxId.equals(bgsfySelectId)) {
fylxSumMap.put("fylx1","办公室费用");
2024-07-09 14:57:06 +08:00
fylxSumMap.put("fylx2", "办公室费用");
2024-07-05 09:24:17 +08:00
} else if (fylxId.equals(qtgxSelectId)) {
fylxSumMap.put("fylx1", "其他费用");
2024-07-09 14:57:06 +08:00
fylxSumMap.put("fylx2", fylxName);
2024-07-05 09:24:17 +08:00
} else {
fylxSumMap.put("fylx1", "项目费用");
2024-07-09 14:57:06 +08:00
fylxSumMap.put("fylx2", fylxName);
2024-07-05 09:24:17 +08:00
}
resultListBySob.add(fylxSumMap);
}
}
// 该账套下的小计
Map<String, String> xjMap = new HashMap<>();
// 薪资项目值
2024-07-09 14:57:06 +08:00
List<Map<String, String>> finalResultListBySob = resultListBySob;
2024-07-05 09:24:17 +08:00
itemIdList.stream().forEach(itemId -> {
2024-07-09 14:57:06 +08:00
BigDecimal xjSum = finalResultListBySob.stream()
2024-07-05 09:24:17 +08:00
.map(map -> map.get(itemId))
.filter(NumberUtils::isCreatable)
.map(BigDecimal::new)
.reduce(BigDecimal.ZERO, BigDecimal::add);
xjMap.put(itemId.toString(), xjSum.toPlainString());
});
2024-07-09 14:57:06 +08:00
// 排序
resultListBySob = resultListBySob.stream().sorted(Comparator.comparing(map -> map.get("gj") + "-" + map.get("fylx1"))).collect(Collectors.toList());
2024-07-05 09:24:17 +08:00
// 人数
BigDecimal xjEmpNums = resultListBySob.stream()
.map(map -> map.get("empNums"))
.filter(NumberUtils::isCreatable)
.map(BigDecimal::new)
.reduce(BigDecimal.ZERO, BigDecimal::add)
.setScale(0,BigDecimal.ROUND_HALF_UP);
xjMap.put("empNums", xjEmpNums.toPlainString());
// 国家
xjMap.put("gj", sobName);
// 2个费用类型
xjMap.put("fylx1", "小计");
xjMap.put("fylx2", "小计");
resultListBySob.add(xjMap);
resultList.addAll(resultListBySob);
}
return resultList;
}
/**
* 获取港湾费用类型下拉框信息
*
* @return
*/
private Map<Integer, String> getFylxSelectItemMap(RecordSet rs) {
Map<Integer, String> resultMap = new HashMap<>();
BaseBean baseBean = new BaseBean();
String fylxFieldId = baseBean.getPropValue("shgwSalaryReport", "fylx_field_id");
rs.execute("select selectvalue,selectname from workflow_selectitem where fieldid = " + fylxFieldId);
while (rs.next()) {
resultMap.put(rs.getInt(1), Util.formatMultiLang(rs.getString(2)));
}
resultMap.put(-1, "");
return resultMap;
}
/**
* 查询这些员工每个人每个费用类型下的人天数及薪资数据
*
* @param salaryAcctEmployeeList
* @param gwFylbDataDTOS
* @param itemRelationList
* @return
*/
private Map<Long, Map<Integer, Map<String, String>>> getGwReportInfoByAcctEmp(List<SalaryAcctEmployeePO> salaryAcctEmployeeList,
List<GwFylbDataDTO> gwFylbDataDTOS,
List<GwSalaryItemRelation> itemRelationList,
LocalDateRange localDateRange,
RecordSet rs) {
Map<Long, Map<Integer, Map<String, String>>> resultMap = new HashMap<>();
// 查询这个核算人员的薪资核算结果
if (CollectionUtils.isNotEmpty(salaryAcctEmployeeList) && CollectionUtils.isNotEmpty(itemRelationList)) {
List<Long> salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
List<Long> salaryItemIds = itemRelationList.stream().map(GwSalaryItemRelation::getSalaryItemId).collect(Collectors.toList());
List<SalaryAcctResultPO> acctResultList = listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, salaryItemIds);
Map<Long, List<SalaryAcctResultPO>> acctResultMap = SalaryEntityUtil.group2Map(acctResultList, SalaryAcctResultPO::getSalaryAcctEmpId);
// 获取这些员工的项目经历信息
List<GwXmjl> xmjlList = gwGetEmpXmjlInfo(rs, localDateRange, salaryAcctEmployeeList);
Map<Long, List<GwXmjl>> xmjlMapByEmpId = SalaryEntityUtil.group2Map(xmjlList, GwXmjl::getEmployeeId);
// 获取办公室费用、其他关系对应的id
BaseBean baseBean = new BaseBean();
int bgsfySelectId = Integer.valueOf(baseBean.getPropValue("shgwSalaryReport", "fylx_bgsfy_select_id")).intValue();
2024-07-24 13:47:10 +08:00
int qtgxSelectId = Integer.valueOf(baseBean.getPropValue("shgwSalaryReport", "fylx_qtgx_select_id")).intValue();
2024-07-05 09:24:17 +08:00
Map<Long, GwFylbDataDTO> gwFylbDataMap = SalaryEntityUtil.convert2Map(gwFylbDataDTOS, GwFylbDataDTO::getEmployeeId);
for (SalaryAcctEmployeePO salaryAcctEmployeePO : salaryAcctEmployeeList) {
Map<Integer, Map<String, String>> empFylbMap = new HashMap<Integer, Map<String, String>>();
// 获取该员工的费用类型信息
GwFylbDataDTO gwFylbDataDTO = gwFylbDataMap.getOrDefault(salaryAcctEmployeePO.getEmployeeId(), GwFylbDataDTO.builder().fylbItemValues(Collections.emptyList()).build());
List<GwFylbItemDataDTO> fylbItemValues = gwFylbDataDTO.getFylbItemValues();
// 获取该员工薪资核算信息
List<SalaryAcctResultPO> salaryValueList = acctResultMap.get(salaryAcctEmployeePO.getId());
Map<Long, String> acctResultValueMap = SalaryEntityUtil.convert2Map(salaryValueList, SalaryAcctResultPO::getSalaryItemId, SalaryAcctResultPO::getResultValue);
if (CollectionUtils.isNotEmpty(fylbItemValues)) {
// 存在费用类型信息
// 获取该员工的项目经历信息
List<GwXmjl> empXmjlList = xmjlMapByEmpId.getOrDefault(salaryAcctEmployeePO.getEmployeeId(), Collections.emptyList());
if (fylbItemValues.size() == 1) {
// 薪资周期内没有发生过费用类型调整
LocalDateRange effectiveDateRange = fylbItemValues.get(0).getEffectiveDateRange();
int fylx = fylbItemValues.get(0).getValue();
if (fylx == bgsfySelectId || fylx == qtgxSelectId) {
// 费用类型是办公室费用、其他关系则不需要再查询项目经历表,不需要考虑分段计算
Map<String, String> empSalaryMap = new HashMap<String, String>();
empSalaryMap.put("empNums", "1.00");
// 获取薪资数据
for (Long salaryItemId : salaryItemIds) {
empSalaryMap.put(salaryItemId.toString(), acctResultValueMap.getOrDefault(salaryItemId, ""));
}
empFylbMap.put(fylx, empSalaryMap);
} else {
// 费用类型不是办公室费用、其他关系需要查项目经历中项目有几天,其余归类为办公室费用
// 获取薪资周期内有多少天是有项目经历的
Map<String, Integer> xmDaysMap = gwGetDaysInRange(effectiveDateRange.getFromDate(), effectiveDateRange.getEndDate(), empXmjlList);
BigDecimal xmDays = new BigDecimal(xmDaysMap.get("xmDays"));
BigDecimal officeDays = new BigDecimal(xmDaysMap.get("officeDays"));
BigDecimal totalDays = xmDays.add(officeDays);
// 分段计算人数和薪资封装项目天数、办公室天数
BigDecimal baseDay = new BigDecimal(1).divide(totalDays, 15, RoundingMode.HALF_UP);
Map<String, String> empXmSalaryMap = new HashMap<String, String>();
empXmSalaryMap.put("empNums", baseDay.multiply(xmDays).setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
Map<String, String> empOfficeSalaryMap = new HashMap<String, String>();
empOfficeSalaryMap.put("empNums", baseDay.multiply(officeDays).setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
for (Long salaryItemId : salaryItemIds) {
BigDecimal itemValue = NumberUtils.isCreatable(acctResultValueMap.getOrDefault(salaryItemId, "")) ? new BigDecimal(acctResultValueMap.getOrDefault(salaryItemId, ""))
: new BigDecimal("0");
BigDecimal itemValeBase = itemValue.divide(totalDays, 15, RoundingMode.HALF_UP);
empXmSalaryMap.put(salaryItemId.toString(), itemValeBase.multiply(xmDays).setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
empOfficeSalaryMap.put(salaryItemId.toString(), itemValeBase.multiply(officeDays).setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
}
empFylbMap.put(fylx, empXmSalaryMap);
empFylbMap.put(bgsfySelectId, empOfficeSalaryMap);
}
} else {
// 薪资周期内发生过费用类型变更
// 获取费用类型周期
LocalDateRange effectiveDateRange = LocalDateRange.builder()
.fromDate(fylbItemValues.get(fylbItemValues.size()-1).getEffectiveDateRange().getFromDate())
.endDate(fylbItemValues.get(0).getEffectiveDateRange().getEndDate())
.build();
// 获取总计天数
BigDecimal totalDays = new BigDecimal(SalaryDateUtil.getDays(effectiveDateRange.getFromDate(), effectiveDateRange.getEndDate()));
BigDecimal totalXmDays = new BigDecimal(0);
BigDecimal baseDay = new BigDecimal(1).divide(totalDays, 15, RoundingMode.HALF_UP);
for (GwFylbItemDataDTO fylbItemData : fylbItemValues) {
2024-07-09 14:57:06 +08:00
if (fylbItemData.getValue() == bgsfySelectId) {
// 费用类别就是 办公室,则不获取是否有项目经历,该周期内都是办公室
} else {
// 获取此费用类别中有多少天有项目经历(这里不能取计算出来的办公室天数)
Map<String, Integer> xmDaysMap = gwGetDaysInRange(fylbItemData.getEffectiveDateRange().getFromDate(), fylbItemData.getEffectiveDateRange().getEndDate(), empXmjlList);
BigDecimal xmDays = new BigDecimal(xmDaysMap.get("xmDays"));
totalXmDays = totalXmDays.add(xmDays);
// 封装各个项目的天数和薪资(分段计算)
Map<String, String> empXmSalaryMap = new HashMap<String, String>();
empXmSalaryMap.put("empNums", baseDay.multiply(xmDays).setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
for (Long salaryItemId : salaryItemIds) {
BigDecimal itemValue = NumberUtils.isCreatable(acctResultValueMap.getOrDefault(salaryItemId, "")) ? new BigDecimal(acctResultValueMap.getOrDefault(salaryItemId, ""))
: new BigDecimal("0");
empXmSalaryMap.put(salaryItemId.toString(), itemValue.divide(totalDays, 15, RoundingMode.HALF_UP).multiply(xmDays).setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
}
empFylbMap.put(fylbItemData.getValue(), empXmSalaryMap);
2024-07-05 09:24:17 +08:00
}
}
// 封装计算办公室类型
BigDecimal officeDays = totalDays.subtract(totalXmDays);
Map<String, String> empOfficeSalaryMap = new HashMap<String, String>();
empOfficeSalaryMap.put("empNums", baseDay.multiply(officeDays).setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
for (Long salaryItemId : salaryItemIds) {
BigDecimal itemValue = NumberUtils.isCreatable(acctResultValueMap.getOrDefault(salaryItemId, "")) ? new BigDecimal(acctResultValueMap.getOrDefault(salaryItemId, ""))
: new BigDecimal("0");
empOfficeSalaryMap.put(salaryItemId.toString(), itemValue.divide(totalDays, 15, RoundingMode.HALF_UP).multiply(officeDays).setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
}
empFylbMap.put(bgsfySelectId, empOfficeSalaryMap);
}
} else {
// 不存在费用费别信息
Map<String, String> empSalaryMap = new HashMap<String, String>();
empSalaryMap.put("empNums", "1.00");
for (Long salaryItemId : salaryItemIds) {
BigDecimal itemValue = NumberUtils.isCreatable(acctResultValueMap.getOrDefault(salaryItemId, "")) ? new BigDecimal(acctResultValueMap.getOrDefault(salaryItemId, ""))
: new BigDecimal("0");
empSalaryMap.put(salaryItemId.toString(), itemValue.toPlainString());
}
empFylbMap.put(-1, empSalaryMap);
}
resultMap.put(salaryAcctEmployeePO.getId(), empFylbMap);
}
}
return resultMap;
}
/**
* 获取薪资周期内多少天有项目经历
*
* @return
*/
private Map<String, Integer> gwGetDaysInRange(Date startDate, Date endDate, List<GwXmjl> xmjlList) {
Map<String, Integer> resultMap = new HashMap<>();
// 项目天数
int xmDays = 0;
// 办公室天数
int officeDays = 0;
if (CollectionUtils.isEmpty(xmjlList)) {
resultMap.put("xmDays", xmDays);
resultMap.put("officeDays", SalaryDateUtil.getDays(startDate, endDate));
return resultMap;
}
LocalDate startLocalDate = SalaryDateUtil.dateToLocalDate(startDate);
LocalDate endLocalDate = SalaryDateUtil.dateToLocalDate(endDate);
LocalDate tempLocalDate = startLocalDate;
while (!tempLocalDate.isAfter(endLocalDate)) {
// 默认不在范围内
boolean flag = false;
for (int i = 0; i < xmjlList.size(); i++) {
Date xmjlStartDate = xmjlList.get(i).getStartDate();
Date xmjlEndDate = xmjlList.get(i).getEndDate();
if (SalaryDateUtil.dayInRange(tempLocalDate, SalaryDateUtil.dateToLocalDate(xmjlStartDate), SalaryDateUtil.dateToLocalDate(xmjlEndDate))) {
flag = true;
break;
}
}
if (flag == true) {
xmDays++;
} else {
officeDays++;
}
tempLocalDate = tempLocalDate.plusDays(1);
}
resultMap.put("xmDays", xmDays);
resultMap.put("officeDays", officeDays);
return resultMap;
}
/**
* 获取需要查询哪些薪资项目(有序)
*
* @return
*/
private List<GwSalaryItemRelation> getGwReportItems(RecordSet rs) {
List<GwSalaryItemRelation> resultList = new ArrayList<>();
2024-07-10 16:51:26 +08:00
List<SalaryItemPO> salaryItemPOList = getSalaryItemService(user).listAll();
Map<String, Long> salaryItemMap = SalaryEntityUtil.convert2Map(salaryItemPOList, item -> Util.formatMultiLang(item.getName(), "7"), item -> item.getId());
rs.execute("select xzxm,xsmc,px from uf_fygsdxzxm a order by px");
2024-07-05 09:24:17 +08:00
while (rs.next()) {
2024-07-10 16:51:26 +08:00
String itemName = rs.getString(1);
Long itemId = salaryItemMap.get(itemName);
if (itemId != null) {
2024-07-05 09:24:17 +08:00
GwSalaryItemRelation itemRelation = new GwSalaryItemRelation();
2024-07-10 16:51:26 +08:00
itemRelation.setSalaryItemName(rs.getString(1));
2024-07-05 09:24:17 +08:00
itemRelation.setSalaryItemShowName(rs.getString("xsmc"));
itemRelation.setSortedId(rs.getInt("px"));
2024-07-10 16:51:26 +08:00
itemRelation.setSalaryItemId(itemId);
2024-07-05 09:24:17 +08:00
resultList.add(itemRelation);
}
}
return resultList;
}
/**
* 获取港湾员工项目经历信息
* @param localDateRange
* @param salaryAcctEmployeeList
* @return
*/
private List<GwXmjl> gwGetEmpXmjlInfo(RecordSet rs, LocalDateRange localDateRange, List<SalaryAcctEmployeePO> salaryAcctEmployeeList) {
String startDate = SalaryDateUtil.getFormatDate(localDateRange.getFromDate());
String endDate = SalaryDateUtil.getFormatDate(localDateRange.getEndDate());
List<Long> empIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).distinct().collect(Collectors.toList());
List<List<Long>> partition = Lists.partition(empIds, 800);
List<GwXmjl> xmjlList = new ArrayList<>();
partition.forEach(part -> {
String empStr = "(" + StringUtils.join(part, ",") + ")";
rs.execute("select ygxm,xxmbdrq,lkrq from uf_xmjlgljmb where CAST(xxmbdrq as DATE) <= CAST('"+ endDate +"' as DATE) and (lkrq is null or lkrq = '' or CAST(lkrq as DATE) >= CAST('"+ startDate +"' as DATE)) and ygxm in " + empStr);
while (rs.next()) {
GwXmjl gwXmjl = new GwXmjl();
gwXmjl.setEmployeeId(Long.valueOf(rs.getInt(1)));
gwXmjl.setStartDate(SalaryDateUtil.stringToDate(rs.getString(2)));
gwXmjl.setEndDate(SalaryDateUtil.stringToDate(rs.getString(3)));
xmjlList.add(gwXmjl);
}
});
return xmjlList;
}
/**
* 获取港湾员工费用类型信息
* @param employeeIds
* @return
*/
private List<GwFylxInfo> getGwEmpFylxInfo(List<Long> employeeIds, RecordSet rs, LocalDateRange localDateRange) {
List<GwFylxInfo> resultList = new ArrayList<>();
if (CollectionUtils.isEmpty(employeeIds)) {
return resultList;
}
List<List<Long>> partition = Lists.partition(employeeIds, 500);
partition.forEach(part -> {
String sql = "select xm,sxrq,fylx from uf_fylxgx where cast(sxrq as DATE) <= cast('"+ SalaryDateUtil.getFormatDate(localDateRange.getEndDate()) +"' as date) and xm in (" + StringUtils.join(part, ",") + ")";
rs.execute(sql);
while (rs.next()) {
Date sxrqDate = SalaryDateUtil.dateStrToLocalDate(rs.getString("sxrq"));
int fylx = rs.getInt("fylx");
if (sxrqDate != null) {
resultList.add(GwFylxInfo.builder().employeeId(Long.valueOf(rs.getInt("xm"))).sxrq(sxrqDate).fylxId(fylx).build());
}
}
});
return resultList;
}
/**
* 构建港湾费用类别数据
*
* @return
*/
public List<GwFylbDataDTO> buildGwFylbData(List<GwFylxInfo> fylbInfoList,
LocalDateRange localDateRange,
List<Long> allEmployeeIds) {
// 获取离职员工的离职日期
List<DataCollectionEmployee> dismissEmpList = getSalaryEmployeeService(user).listDismissEmpByIds(allEmployeeIds);
Map<Long, String> dismissDateMap = SalaryEntityUtil.convert2Map(dismissEmpList, DataCollectionEmployee::getEmployeeId, DataCollectionEmployee::getDismissdate);
Map<Long, List<GwFylxInfo>> fylbInfoMap = SalaryEntityUtil.group2Map(fylbInfoList, GwFylxInfo::getEmployeeId);
List<GwFylbDataDTO> list = new ArrayList<>();
allEmployeeIds.forEach(e -> {
GwFylbDataDTO gwFylbData = new GwFylbDataDTO();
gwFylbData.setEmployeeId(e);
// 获取该员工的费用类别信息
List<GwFylxInfo> gwFylxInfos = fylbInfoMap.getOrDefault(e, Collections.emptyList());
// 费用类型信息降序排序
gwFylxInfos = gwFylxInfos.stream().sorted(Comparator.comparing(GwFylxInfo::getSxrq).reversed()).collect(Collectors.toList());
// 开始日期
Date startItem = localDateRange.getFromDate();
// 结束日期
Date endItem = localDateRange.getEndDate();
// 对于离职的员工,结束日期就是离职日期
if (dismissDateMap.containsKey(e)) {
endItem = SalaryDateUtil.dateStrToLocalDate(dismissDateMap.get(e));
}
Date endTempItem = endItem;
List<GwFylbItemDataDTO> gwFylbItemDataValues = new ArrayList<>();
boolean flag = false;
for (GwFylxInfo gwFylxInfo : gwFylxInfos) {
Date fromDateItem = gwFylxInfo.getSxrq();
if (fromDateItem.after(endTempItem) || endTempItem.before(startItem)) {
continue;
}
if (endTempItem.equals(startItem) && flag) {
continue;
}
GwFylbItemDataDTO gwFylbItemDataValue = new GwFylbItemDataDTO();
LocalDateRange dateRange = LocalDateRange.builder().fromDate((fromDateItem.before(startItem) ? startItem : fromDateItem)).endDate(endTempItem).build();
if (flag == true) {
// 不是第一条结束日期都要减1天
dateRange.setEndDate(SalaryDateUtil.localDateToDate(SalaryDateUtil.dateToLocalDate(dateRange.getEndDate()).minusDays(1)));
}
gwFylbItemDataValue.setEffectiveDateRange(dateRange);
gwFylbItemDataValue.setValue(gwFylxInfo.getFylxId());
gwFylbItemDataValues.add(gwFylbItemDataValue);
flag = true;
endTempItem = fromDateItem;
}
gwFylbData.setFylbItemValues(gwFylbItemDataValues);
list.add(gwFylbData);
});
return list;
}
2024-09-10 18:09:33 +08:00
@Override
public void pltxSaveDetails(List<gwPltxSaveParam> saveParam) {
if (CollectionUtils.isEmpty(saveParam)) {
return;
}
Optional<gwPltxSaveParam> mainIdNull = saveParam.stream().filter(param -> param.getMainid() == null).findFirst();
if (mainIdNull.isPresent()) {
throw new SalaryRunTimeException("流程id不能为空");
}
boolean isCreateNode = saveParam.get(0).isCreateNode();
Long mainId = saveParam.get(0).getMainid();
// 保存的明细数据
List<gwPltxSaveParam> needSaveList = saveParam.stream().filter(param -> param.getId() == null).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(needSaveList)) {
// 封装调薪后基本工资
needSaveList.stream().forEach( param -> {
param.setId(IdGenerator.generate());
param.setDeleteType(0);
BigDecimal dxValue = param.getDx() == null ? new BigDecimal(0) : param.getDx();
BigDecimal jbgzValue = (param.getJbgz() == null || param.getJbgz().equals(BigDecimal.ZERO)) ? new BigDecimal("0") : param.getJbgz();
param.setDxhjbgz(jbgzValue.add(dxValue));
});
getGwPltxDt1Service(user).batchInsert(needSaveList);
}
// 修改的明细数据
List<gwPltxSaveParam> needUpdateList = saveParam.stream().filter(param -> param.getId() != null).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(needUpdateList)) {
// 获取现有数据
List<GwPltxDt1PO> gwPltxDt1POS = getGwPltxDt1Service(user).listSome(GwPltxDt1PO.builder().mainid(needUpdateList.get(0).getMainid()).build());
Map<Long, GwPltxDt1PO> oldPOMap = SalaryEntityUtil.convert2Map(gwPltxDt1POS, GwPltxDt1PO::getId);
needUpdateList.stream().forEach( param -> {
GwPltxDt1PO oldValue = oldPOMap.get(param.getId());
oldValue.setXm(param.getXm());
oldValue.setBm(param.getBm());
oldValue.setGw(param.getGw());
oldValue.setQnjxfs(param.getQnjxfs());
oldValue.setJbgz(param.getJbgz());
oldValue.setDx(param.getDx());
oldValue.setDxbl(param.getDxbl());
oldValue.setGskjywr(param.getGskjywr());
oldValue.setHjxz(param.getHjxz());
oldValue.setDzhhjxz(param.getDzhhjxz());
oldValue.setHjxzdzbl(param.getHjxzdzbl());
oldValue.setBz(param.getBz());
oldValue.setNzjj(param.getNzjj());
oldValue.setDeleteType(0);
BigDecimal dxValue = param.getDx() == null ? new BigDecimal(0) : param.getDx();
BigDecimal jbgzValue = (param.getJbgz() == null || param.getJbgz().equals(BigDecimal.ZERO)) ? new BigDecimal("0") : param.getJbgz();
oldValue.setDxhjbgz(jbgzValue.add(dxValue));
getGwPltxDt1Service(user).update(oldValue);
});
}
if (isCreateNode) {
// 创建节点处理需要删除的数据
List<GwPltxDt1PO> gwPltxDt1POS = getGwPltxDt1Service(user).listSome(GwPltxDt1PO.builder().mainid(mainId).build());
if (CollectionUtils.isNotEmpty(gwPltxDt1POS)) {
List<Long> existIds = gwPltxDt1POS.stream().map(GwPltxDt1PO::getId).collect(Collectors.toList());
if (CollectionUtils.isEmpty(needUpdateList)) {
// 删除所有数据
getGwPltxDt1Service(user).deleteByIds(existIds);
} else {
List<Long> updateIds = needUpdateList.stream().map(gwPltxSaveParam::getId).collect(Collectors.toList());
List<Long> needDeleteIds = existIds.stream().filter(id -> !updateIds.contains(id)).collect(Collectors.toList());
getGwPltxDt1Service(user).deleteByIds(needDeleteIds);
}
}
}
}
@Override
public List<pltxEmployeeDTO> pltxDetailsList(PltxInitEmployeeParam param) {
if (param.getTxcj() == null || param.getSpr() == null) {
throw new SalaryRunTimeException("参数错误,调薪层级不存在");
}
if (param.getRequestId() == null ) {
throw new SalaryRunTimeException("参数错误requestid不存在");
}
// 如果是创建人,则可以查看所有数据
RecordSet rs = new RecordSet();
rs.execute("select creater from workflow_requestbase where requestid = " + param.getRequestId());
boolean isCreator = false;
if (rs.next()) {
int creater = rs.getInt("creater");
if (creater == param.getSpr()) {
isCreator = true;
}
}
List<GwPltxDt1PO> gwPltxDt1POS = getGwPltxDt1Service(user).listSome(GwPltxDt1PO.builder().mainid(param.getRequestId()).build());
// 获取能够管理的权限
List<pltxEmployeeDTO> pltxEmployeeDTOS = getSalaryAcctExcelService(user).pltxFilterData(PltxInitEmployeeParam.builder().txcj(param.getTxcj()).spr(param.getSpr()).build());
// List<String> canManageEmps = pltxEmployeeDTOS.stream().map(DTO -> DTO.getGskjywr()+"_split"+DTO.getEmployee()).collect(Collectors.toList());
// 20250206逻辑变更 不再根据义务人过滤
List<String> canManageEmps = pltxEmployeeDTOS.stream().map(DTO -> DTO.getEmployee().toString()).collect(Collectors.toList());
2025-01-05 15:40:50 +08:00
if (!isCreator && CollectionUtils.isEmpty(canManageEmps)) {
2024-09-10 18:09:33 +08:00
// 不是创建人也没有管理权限
return Collections.emptyList();
}
if (!isCreator) {
// 不是创建人,要分权
// gwPltxDt1POS = gwPltxDt1POS.stream().filter(po -> canManageEmps.contains(po.getGskjywr()+"_split"+po.getXm().toString())).collect(Collectors.toList());
gwPltxDt1POS = gwPltxDt1POS.stream().filter(po -> canManageEmps.contains(po.getXm().toString())).collect(Collectors.toList());
2024-09-10 18:09:33 +08:00
}
Map<Long, DataCollectionEmployee> empMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).listAll(UseEmployeeTypeEnum.ORG), DataCollectionEmployee::getEmployeeId);
2025-01-03 10:09:45 +08:00
// 查询港湾职位信息
Map<String, String> gwEmpGwMap = new HashMap<>();
Map<String, Long> gwEmpGwIdMap = new HashMap<>();
BaseBean baseBean = new BaseBean();
String gwFieldId = baseBean.getPropValue("shgwSalary", "gw_field_id");
List<Integer> empIdList = gwPltxDt1POS.stream().map(GwPltxDt1PO::getXm).collect(Collectors.toList());
List<List<Integer>> partition = Lists.partition(empIdList, 500);
partition.forEach(part -> {
// 查询港湾职位信息
String empIdStr = StringUtils.join(part, ",");
rs.execute("SELECT a.id as id,zwmc,b.id as zwid FROM cus_fielddata a left join uf_zwxxjmb b on a.field"+gwFieldId+"=b.id where a.scopeid=3 and a.id in (" +empIdStr+")");
while (rs.next()) {
String empId = rs.getString("id");
int zwId = rs.getInt("zwid");
String zwmc = rs.getString("zwmc");
gwEmpGwMap.put(empId, zwmc);
gwEmpGwIdMap.put(empId, Long.valueOf(zwId));
}
});
2025-01-04 23:25:45 +08:00
// 获取调薪预算比例
String pltxTxysbl = getPltxTxysbl(param.getRequestId());
2025-01-03 10:09:45 +08:00
2025-01-21 15:23:30 +08:00
List<pltxEmployeeDTO> resultList = gwPltxDt1POS.stream()
2024-09-10 18:09:33 +08:00
.map(po -> {
Long empId = Long.valueOf(po.getXm());
DataCollectionEmployee emp = empMap.getOrDefault(empId, DataCollectionEmployee.builder().username("").departmentName("").departmentId(0L).build());
return pltxEmployeeDTO.builder()
.id(po.getId())
.employee(empId)
.employeeName(emp.getUsername())
.bmId(emp.getDepartmentId())
.bmName(emp.getDepartmentName())
2025-01-03 10:09:45 +08:00
.jobTitleId(gwEmpGwIdMap.getOrDefault(Util.null2String(empId), 0L))
.jobTitleName(gwEmpGwMap.getOrDefault(Util.null2String(empId), ""))
2024-09-10 18:09:33 +08:00
.gskjywr(po.getGskjywr())
2025-01-21 15:23:30 +08:00
.qnjxfs(po.getQnjxfs() == null ? null : po.getQnjxfs().doubleValue())
.jbgz(po.getJbgz() == null ? null : po.getJbgz().doubleValue())
.dx(po.getDx() == null ? null : po.getDx().doubleValue())
.dxhjbgz(po.getDxhjbgz() == null ? null : po.getDxhjbgz().doubleValue())
.dxbl(po.getDxbl() == null ? null : po.getDxbl().doubleValue())
.hjgz(po.getHjxz() == null ? null : po.getHjxz().doubleValue())
.nzjj(po.getNzjj() == null ? null : po.getNzjj().doubleValue())
2024-09-10 18:09:33 +08:00
.bz(po.getBz())
2025-01-04 23:25:45 +08:00
.txysbl(pltxTxysbl)
2024-09-10 18:09:33 +08:00
.build();
}).collect(Collectors.toList());
2025-01-21 15:23:30 +08:00
// 处理 币种和汇率信息
// 获取人民币对应的义务人
Long rmbTaxAgentId = NumberUtils.isCreatable(baseBean.getPropValue("shgwSalaryBz", "rmb_tax_agent_id")) ? Long.valueOf(baseBean.getPropValue("shgwSalaryBz", "rmb_tax_agent_id")) : null;
TaxAgentPO rmbTaxAgent = getTaxAgentService(user).getById(rmbTaxAgentId);
String rmbTaxAgentName = rmbTaxAgent == null ? "" : rmbTaxAgent.getName();
// 处理汇率币种信息
if (param.getBzSxrq() != null && StringUtils.isNotBlank(rmbTaxAgentName)) {
Map<String, UfXzhlbPO> taxAgentHlMap = new HashMap<>();
// 获取所有币种信息
Map<Integer, String> bzMap = SalaryEntityUtil.convert2Map(getSalaryArchiveService(user).listAllBzInfo(), GwBzDTO::getId, GwBzDTO::getBz);
resultList.stream().map(pltxEmployeeDTO::getGskjywr).distinct().forEach(ywr -> {
List<UfXzhlbPO> ufXzhlbList = getUfXzhlbService(user).listByTaxAgentName(ywr, rmbTaxAgentName, param.getBzSxrq());
if (CollectionUtils.isNotEmpty(ufXzhlbList)) {
UfXzhlbPO ufXzhlbPO = ufXzhlbList.get(0);
ufXzhlbPO.setYbzName(bzMap.getOrDefault(ufXzhlbPO.getYbz(), ""));
taxAgentHlMap.put(ywr, ufXzhlbPO);
}
});
for (pltxEmployeeDTO dto : resultList) {
UfXzhlbPO ufXzhlbPO = taxAgentHlMap.get(dto.getGskjywr());
if (ufXzhlbPO != null) {
dto.setHl(ufXzhlbPO.getHl().doubleValue());
dto.setBiZhong(ufXzhlbPO.getYbz());
dto.setBiZhongName(ufXzhlbPO.getYbzName());
}
}
}
return resultList;
2024-09-10 18:09:33 +08:00
}
/**
* 批量调薪历史数据迁移接口
* @param
*/
@Override
public void pltxHistoryDataHandle() {
BaseBean baseBean = new BaseBean();
String mainTableName = baseBean.getPropValue("shgwSalary", "pltx_formtable_main_name");
RecordSet rs = new RecordSet();
rs.execute("select id,requestid from " +mainTableName);
HashMap<Integer, Integer> oldRequestMap = new HashMap<>();
while (rs.next()) {
oldRequestMap.put(rs.getInt("id"), rs.getInt("requestid"));
}
// 获取对应的明细表1数据
for (Map.Entry<Integer, Integer> entry : oldRequestMap.entrySet()) {
Integer mainId = entry.getKey();
Integer requestId = entry.getValue();
// 先删除
getGwPltxDt1Service(user).deleteByRequestId(requestId);
rs.execute("select xm,bm,gw,qnjxfs,jbgz,dx,dxhjbgz,dxbl,gskjywr,dxbl1,hjxz,dzhhjxz,hjxzdzbl,bz,nzjj from " + mainTableName + "_dt1 where mainid=" + mainId);
while (rs.next()) {
// 封装对象
GwPltxDt1PO gwPltxDt1PO = new GwPltxDt1PO();
gwPltxDt1PO.setId(IdGenerator.generate());
gwPltxDt1PO.setMainid(Long.valueOf(requestId));
gwPltxDt1PO.setXm(rs.getInt("xm"));
gwPltxDt1PO.setBm(rs.getInt("bm"));
gwPltxDt1PO.setGw(rs.getString("gw"));
gwPltxDt1PO.setQnjxfs(NumberUtils.isCreatable(rs.getString("qnjxfs")) ? new BigDecimal(rs.getString("qnjxfs")) : null);
gwPltxDt1PO.setJbgz(NumberUtils.isCreatable(rs.getString("jbgz")) ? new BigDecimal(rs.getString("jbgz")) : null);
gwPltxDt1PO.setDx(NumberUtils.isCreatable(rs.getString("dx")) ? new BigDecimal(rs.getString("dx")) : null);
gwPltxDt1PO.setDxhjbgz(NumberUtils.isCreatable(rs.getString("dxhjbgz")) ? new BigDecimal(rs.getString("dxhjbgz")) : null);
gwPltxDt1PO.setDxbl(NumberUtils.isCreatable(rs.getString("dxbl1")) ? new BigDecimal(rs.getString("dxbl1")) : null);
gwPltxDt1PO.setGskjywr(rs.getString("gskjywr"));
gwPltxDt1PO.setHjxz(NumberUtils.isCreatable(rs.getString("hjxz")) ? new BigDecimal(rs.getString("hjxz")) : null);
gwPltxDt1PO.setDzhhjxz(NumberUtils.isCreatable(rs.getString("dzhhjxz")) ? new BigDecimal(rs.getString("dzhhjxz")) : null);
gwPltxDt1PO.setHjxzdzbl(NumberUtils.isCreatable(rs.getString("hjxzdzbl")) ? new BigDecimal(rs.getString("hjxzdzbl")) : null);
gwPltxDt1PO.setBz(rs.getString("bz"));
gwPltxDt1PO.setNzjj(NumberUtils.isCreatable(rs.getString("nzjj")) ? new BigDecimal(rs.getString("nzjj")) : null);
gwPltxDt1PO.setDeleteType(0);
getGwPltxDt1Service(user).insertIgnoreNull(gwPltxDt1PO);
}
}
}
2024-09-10 18:09:33 +08:00
@Override
public void pltxDetailsToMode(pltxDetailsToModeSaveParam saveParam) {
// 处理主表, 先根据年度查询是否存在,若存在则更新
Integer nd = saveParam.getTxjlgljmb().getNd();
List<UfTxjlgljmbPO> ufTxjlgljmbPOS = getUfTxjlgljmbMapper().listSome(UfTxjlgljmbPO.builder().nd(nd).build());
Integer mainId = 0;
BaseBean baseBean = new BaseBean();
Integer fieldValue = Integer.valueOf( baseBean.getPropValue("shgwSalary", "pltx_mode_field_id"));
String currDate = TimeUtil.getCurrentDateString();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String currTime = sdf.format(new Date());
if (CollectionUtils.isNotEmpty(ufTxjlgljmbPOS)) {
// 更新
UfTxjlgljmbPO txjlgljmb = saveParam.getTxjlgljmb();
UfTxjlgljmbPO ufTxjlgljmbPO = ufTxjlgljmbPOS.get(0);
ufTxjlgljmbPO.setFqrxm(txjlgljmb.getFqrxm());
ufTxjlgljmbPO.setFqrq(txjlgljmb.getFqrq());
ufTxjlgljmbPO.setFqrbm(txjlgljmb.getFqrbm());
ufTxjlgljmbPO.setFqrgs(txjlgljmb.getFqrgs());
ufTxjlgljmbPO.setSxrq(txjlgljmb.getSxrq());
ufTxjlgljmbPO.setSpr(txjlgljmb.getSpr());
ufTxjlgljmbPO.setDxcj(txjlgljmb.getDxcj());
ufTxjlgljmbPO.setDxdycjspr(txjlgljmb.getDxdycjspr());
ufTxjlgljmbPO.setDxdecjspr(txjlgljmb.getDxdecjspr());
ufTxjlgljmbPO.setDxdsacjspr(txjlgljmb.getDxdsacjspr());
ufTxjlgljmbPO.setDxdsicjspr(txjlgljmb.getDxdsicjspr());
ufTxjlgljmbPO.setDxdwcjspr(txjlgljmb.getDxdwcjspr());
ufTxjlgljmbPO.setDxdlcjspr(txjlgljmb.getDxdlcjspr());
ufTxjlgljmbPO.setNd(txjlgljmb.getNd());
getUfTxjlgljmbMapper().update(ufTxjlgljmbPO);
mainId = ufTxjlgljmbPO.getId();
} else {
// 新增
UfTxjlgljmbPO txjlgljmb = saveParam.getTxjlgljmb();
UfTxjlgljmbPO ufTxjlgljmbPO = new UfTxjlgljmbPO();
ufTxjlgljmbPO.setFqrxm(txjlgljmb.getFqrxm());
ufTxjlgljmbPO.setFqrq(txjlgljmb.getFqrq());
ufTxjlgljmbPO.setFqrbm(txjlgljmb.getFqrbm());
ufTxjlgljmbPO.setFqrgs(txjlgljmb.getFqrgs());
ufTxjlgljmbPO.setSxrq(txjlgljmb.getSxrq());
ufTxjlgljmbPO.setSpr(txjlgljmb.getSpr());
ufTxjlgljmbPO.setDxcj(txjlgljmb.getDxcj());
ufTxjlgljmbPO.setDxdycjspr(txjlgljmb.getDxdycjspr());
ufTxjlgljmbPO.setDxdecjspr(txjlgljmb.getDxdecjspr());
ufTxjlgljmbPO.setDxdsacjspr(txjlgljmb.getDxdsacjspr());
ufTxjlgljmbPO.setDxdsicjspr(txjlgljmb.getDxdsicjspr());
ufTxjlgljmbPO.setDxdwcjspr(txjlgljmb.getDxdwcjspr());
ufTxjlgljmbPO.setDxdlcjspr(txjlgljmb.getDxdlcjspr());
ufTxjlgljmbPO.setNd(txjlgljmb.getNd());
ufTxjlgljmbPO.setFormmodeid(fieldValue);
ufTxjlgljmbPO.setModedatacreater(1);
ufTxjlgljmbPO.setModedatacreatertype(0);
ufTxjlgljmbPO.setModedatacreatedate(currDate);
ufTxjlgljmbPO.setModedatacreatetime(currTime);
getUfTxjlgljmbMapper().insertIgnoreNull(ufTxjlgljmbPO);
mainId = ufTxjlgljmbPO.getId();
}
ModeRightInfo ModeRightInfo = new ModeRightInfo();
ModeRightInfo.setNewRight(true);
ModeRightInfo.editModeDataShare(1, fieldValue,mainId);
Integer finalMainId = mainId;
// 处理明细表1,先根据主表id查,再根据姓名更新
List<UfTxjlgljmbDt1PO> dt1POS = getUfTxjlgljmbDt1Mapper().listSome(UfTxjlgljmbDt1PO.builder().mainid(mainId).build());
2025-01-05 15:40:50 +08:00
Map<String, UfTxjlgljmbDt1PO> dt1MapByXm = SalaryEntityUtil.convert2Map(dt1POS, po -> po.getGskjywr() + "_split" + po.getXm());
2024-09-10 18:09:33 +08:00
saveParam.getDt1().stream().forEach(dt1 -> {
2025-01-05 15:40:50 +08:00
UfTxjlgljmbDt1PO dt1PO = dt1MapByXm.get(dt1.getGskjywr() + "_split" + dt1.getXm());
2024-09-10 18:09:33 +08:00
BigDecimal jbgzValue = (dt1.getJbgz() == null) ? new BigDecimal("0") : dt1.getJbgz();
BigDecimal dxValue = (dt1.getDx() == null) ? new BigDecimal("0") : dt1.getDx();
if (dt1PO == null) {
// 新增
UfTxjlgljmbDt1PO ufTxjlgljmbDt1PO = new UfTxjlgljmbDt1PO();
ufTxjlgljmbDt1PO.setMainid(finalMainId);
ufTxjlgljmbDt1PO.setXm(dt1.getXm());
ufTxjlgljmbDt1PO.setBm(dt1.getBm());
ufTxjlgljmbDt1PO.setGw(dt1.getGw());
ufTxjlgljmbDt1PO.setQnjxfs(dt1.getQnjxfs());
ufTxjlgljmbDt1PO.setJbgz(dt1.getJbgz());
ufTxjlgljmbDt1PO.setDx(dt1.getDx());
ufTxjlgljmbDt1PO.setDxhjbgz(jbgzValue.add(dxValue));
ufTxjlgljmbDt1PO.setDxbl(dt1.getDxbl());
ufTxjlgljmbDt1PO.setGskjywr(dt1.getGskjywr());
ufTxjlgljmbDt1PO.setDzhhjxz(dt1.getDzhhjxz());
ufTxjlgljmbDt1PO.setHjxzdzbl(dt1.getHjxzdzbl());
ufTxjlgljmbDt1PO.setBz(dt1.getBz());
ufTxjlgljmbDt1PO.setHjgz(dt1.getHjgz());
ufTxjlgljmbDt1PO.setNzjj(dt1.getNzjj());
getUfTxjlgljmbDt1Mapper().insertIgnoreNull(ufTxjlgljmbDt1PO);
} else {
// 更新
dt1PO.setXm(dt1.getXm());
dt1PO.setBm(dt1.getBm());
dt1PO.setGw(dt1.getGw());
dt1PO.setQnjxfs(dt1.getQnjxfs());
dt1PO.setJbgz(dt1.getJbgz());
dt1PO.setDx(dt1.getDx());
dt1PO.setDxhjbgz(jbgzValue.add(dxValue));
dt1PO.setDxbl(dt1.getDxbl());
dt1PO.setGskjywr(dt1.getGskjywr());
dt1PO.setDzhhjxz(dt1.getDzhhjxz());
dt1PO.setHjxzdzbl(dt1.getHjxzdzbl());
dt1PO.setBz(dt1.getBz());
dt1PO.setHjgz(dt1.getHjgz());
dt1PO.setNzjj(dt1.getNzjj());
getUfTxjlgljmbDt1Mapper().update(dt1PO);
}
});
// 处理明细表2,覆盖,先删除后添加
if (saveParam.getDt2() != null) {
getUfTxjlgljmbDt2Mapper().deleteByMainId(mainId);
saveParam.getDt2().stream().forEach(dt2 -> {
UfTxjlgljmbDt2PO ufTxjlgljmbDt2PO = new UfTxjlgljmbDt2PO();
ufTxjlgljmbDt2PO.setMainid(finalMainId);
ufTxjlgljmbDt2PO.setBm(dt2.getBm());
ufTxjlgljmbDt2PO.setRs(dt2.getRs());
ufTxjlgljmbDt2PO.setDxze(dt2.getDxze());
ufTxjlgljmbDt2PO.setHjxzze(dt2.getHjxzze());
getUfTxjlgljmbDt2Mapper().insertIgnoreNull(ufTxjlgljmbDt2PO);
});
}
// 处理明细表3,覆盖,先删除后添加
if (saveParam.getDt3() != null) {
getUfTxjlgljmbDt3Mapper().deleteByMainId(mainId);
if (saveParam.getDt3() != null) {
saveParam.getDt3().setMainid(finalMainId);
getUfTxjlgljmbDt3Mapper().insertIgnoreNull(saveParam.getDt3());
}
}
}
2025-01-04 23:25:45 +08:00
@Override
public void pltxSaveTxysbl(gwPltxSaveParam saveParam) {
if (saveParam.getMainid() == null) {
return;
}
// 获取该流程是否已有数据
GwPltxDt3PO dt3PO = getGwPltxDt3Service(user).getByRequestId(saveParam.getMainid());
if (dt3PO != null) {
dt3PO.setTxysbl(saveParam.getTxysbl());
getGwPltxDt3Service(user).updateIgnoreNull(dt3PO);
} else {
GwPltxDt3PO build = GwPltxDt3PO.builder()
.id(IdGenerator.generate())
.mainid(saveParam.getMainid())
.txysbl(saveParam.getTxysbl())
.build();
getGwPltxDt3Service(user).insertIgnoreNull(build);
}
}
@Override
public String getPltxTxysbl(Long requestId) {
GwPltxDt3PO dt3PO = getGwPltxDt3Service(user).getByRequestId(requestId);
if (dt3PO == null) {
return null;
}
return dt3PO.getTxysbl();
}
/**
* 获临时取建模中的调薪预算
* @param requestId
* @return
*/
@Override
public String getPltxTxysblFromModel(Long requestId) {
if (requestId == null) {
return null;
}
return getUfTxjlgljmbDt3Mapper().getByMainId(requestId.intValue()).toString();
}
2025-01-21 15:23:30 +08:00
/**
* 港湾 海外部门薪资汇总表
* @param param
* @return
*/
@Override
public Map<String, Object> hwxzhzReport(SalaryAcctRecordQueryParam param) {
if (param.getStartMonth() == null || param.getEndMonth() == null) {
throw new SalaryRunTimeException("报表参数错误");
}
BaseBean baseBean = new BaseBean();
Long fylxSalaryItemId = NumberUtils.isCreatable(baseBean.getPropValue("shgwSalaryBz", "fylx_salary_item_id")) ? Long.valueOf(baseBean.getPropValue("shgwSalaryBz", "fylx_salary_item_id")) : 0L;
// 查询标准的义务人id(上海港湾) 以该义务人配置的为报表标准
Long rmbTaxAgentId = NumberUtils.isCreatable(baseBean.getPropValue("shgwSalaryBz", "rmb_tax_agent_id")) ? Long.valueOf(baseBean.getPropValue("shgwSalaryBz", "rmb_tax_agent_id")) : 0L;
TaxAgentPO taxAgentPO = getTaxAgentService(user).getById(rmbTaxAgentId);
if (taxAgentPO == null) {
return Collections.emptyMap();
}
// 获取报表配置信息
List<UfHwxcbbpzPO> ufHwxcbbpzList = getUfHwxcbbpzMapper().listAll();
// 过滤出标准的报表配置信息
List<UfHwxcbbpzPO> gwReportConfigList = ufHwxcbbpzList.stream().filter(po -> Arrays.asList(po.getGskjywr().split(",")).contains(taxAgentPO.getName()))
.map(po -> {
if (po.getPx() == null) {
po.setPx(0);
return po;
}
return po;
})
.sorted(Comparator.comparing(UfHwxcbbpzPO::getPx)).collect(Collectors.toList());
Map<String, Object> resultMap = new HashMap<>();
// 获取薪资核算记录信息
List<TaxAgentPO> taxAgentList = getTaxAgentService(user).listAll();
List<Long> taxAgentIds = taxAgentList.stream().map(TaxAgentPO::getId).collect(Collectors.toList());
List<SalarySobPO> salarySobList = getSalarySobService(user).listByTaxAgentIds(taxAgentIds);
List<Long> salarySobIds = salarySobList.stream().map(SalarySobPO::getId).collect(Collectors.toList());
List<SalaryAcctRecordPO> salaryAcctRecordList= new ArrayList<>();
if (CollectionUtils.isNotEmpty(salarySobIds)) {
// 查询参数
SalaryAcctRecordPO po = SalaryAcctRecordPO.builder().salarySobIds(salarySobIds).build();
LocalDateRange localDateRange = new LocalDateRange();
localDateRange.setFromDate(SalaryDateUtil.localDateToDate(param.getStartMonth().atDay(1)));
localDateRange.setEndDate(SalaryDateUtil.localDateToDate(param.getEndMonth().atEndOfMonth()));
po.setSalaryMonths(localDateRange);
salaryAcctRecordList.addAll(getSalaryAcctRecordService(user).listSome(po));
// 获取薪资核算人员
List<Long> salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
List<SalaryAcctEmployeePO> salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds);
List<Long> salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
List<DataCollectionEmployee> employeeList = getSalaryEmployeeService(user).listByIds(salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).collect(Collectors.toList()));
// 获取薪资核算数据
List<Long> salaryItemIds = new ArrayList<>();
salaryItemIds.add(fylxSalaryItemId);
salaryItemIds.addAll(ufHwxcbbpzList.stream().map(UfHwxcbbpzPO::getXzxm).filter(NumberUtils::isCreatable).distinct().map(Long::valueOf).collect(Collectors.toList()));
List<SalaryItemPO> salaryItemPOList = getSalaryItemService(user).listByIds(salaryItemIds);
List<SalaryAcctResultPO> acctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, salaryItemIds);
List<Map<String, Object>> acctResultMap = SalaryAcctResultBO.buildData4Shgw(salaryItemPOList, Collections.emptyList(), employeeList, salaryAcctEmployeeList, acctResultList, taxAgentList, user);
// 根据部门和部门编号分组
Map<String, List<Map<String, Object>>> acctResultGroupMap = SalaryEntityUtil.group2Map(acctResultMap, result -> result.getOrDefault("taxAgentName", "") + "_split" + resultMap.getOrDefault(fylxSalaryItemId, ""));
List<SalaryItemPO> numberItems = salaryItemPOList.stream().filter(item -> item.getDataType().equals(SalaryDataTypeEnum.NUMBER.getValue())).collect(Collectors.toList());
LinkedHashMap<String, Map<String, Object>> sumResultByGroup = getSumResultByGroup(acctResultGroupMap, Collections.emptyList(), numberItems, gwReportConfigList, ufHwxcbbpzList, taxAgentPO, SalaryDateUtil.dateStrToLocalYearMonth(param.getStartMonthStr()));
// 构建表头
List<WeaTableColumn> columns = new ArrayList<>();
columns.add(new WeaTableColumn("100px", "个税扣缴义务人", "taxAgentName"));
columns.add(new WeaTableColumn("100px", "费用类型\nType of Expenses", "fylx"));
columns.add(new WeaTableColumn("100px", "人数\nHC", "empNums"));
for (UfHwxcbbpzPO config : gwReportConfigList) {
columns.add(new WeaTableColumn("100px", config.getBbbtm(), config.getBtbs()));
}
columns.add(new WeaTableColumn("100px", "币种", "bz"));
columns.add(new WeaTableColumn("100px", "汇率", "hl"));
resultMap.put("column", columns);
List<Map<String, Object>> values = sumResultByGroup.values().stream().collect(Collectors.toList());
resultMap.put("dataList", values);
if (param.isExport()) {
// 合计或导出需要合计行
Map<String, Object> sumResultMap = new HashMap<>();
sumResultMap.put("taxAgentName", "合计");
for (UfHwxcbbpzPO config : gwReportConfigList) {
BigDecimal sumValue = sumResultByGroup.values().stream()
.map(m -> m.get(config.getBtbs()))
.filter(value -> value != null && NumberUtils.isCreatable(value.toString()))
.map(e -> SalaryEntityUtil.empty2Zero(e.toString()))
.reduce(BigDecimal.ZERO, BigDecimal::add);
sumResultMap.put(config.getBtbs().toString(),sumValue);
}
BigDecimal totalEmpNum = sumResultByGroup.values().stream()
.map(m -> m.get("empNums"))
.filter(value -> value != null && NumberUtils.isCreatable(value.toString()))
.map(e -> SalaryEntityUtil.empty2Zero(e.toString()))
.reduce(BigDecimal.ZERO, BigDecimal::add);
sumResultMap.put("empNums",totalEmpNum);
resultMap.put("sumRow", sumResultMap);
}
}
return resultMap;
}
private LinkedHashMap<String, Map<String, Object>> getSumResultByGroup(Map<String, List<Map<String, Object>>> groupBy,
List<SalarySobItemPO> salarySobItemPOS,
List<SalaryItemPO> numberItems,
List<UfHwxcbbpzPO> gwReportConfigList,
List<UfHwxcbbpzPO> ufHwxcbbpzList,
TaxAgentPO rmbTaxAgentPO,
Date salaryMonth) {
LinkedHashMap<String, List<Map<String, Object>>> sortedGroupBy = new LinkedHashMap<>();
groupBy.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.forEachOrdered(x -> sortedGroupBy.put(x.getKey(), x.getValue()));
LinkedHashMap<String, Map<String, Object>> result = new LinkedHashMap<>();
Map<String, SalaryItemPO> numberItemMap = SalaryEntityUtil.convert2Map(numberItems, item -> item.getId().toString());
// 本次薪资核算所用的薪资账套下的薪资项目
Map<Long, SalarySobItemPO> salaryItemIdKeySalarySobItemPOMap = SalaryEntityUtil.convert2Map(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
Map<String, UfHwxcbbpzPO> configMap = SalaryEntityUtil.convert2Map(ufHwxcbbpzList, po -> po.getGskjywr() + "_split" + po.getBtbs());
Map<Integer, String> gwBzMap = SalaryEntityUtil.convert2Map(getSalaryArchiveService(user).listAllBzInfo(), GwBzDTO::getId, GwBzDTO::getBz);
for(Map.Entry<String, List<Map<String, Object>>> entrySet : sortedGroupBy.entrySet()){
// 每个分类中的核算数据
List<Map<String, Object>> value = entrySet.getValue();
String[] split = entrySet.getKey().split("_split");
String taxAgentName = split != null && split.length > 0 ? split[0] : "";
String fylx = split != null && split.length > 1 ? split[1] : "";
Map<String, Object> itemSum = new HashMap<>();
for (UfHwxcbbpzPO config : gwReportConfigList) {
SalaryItemPO item = numberItemMap.get(config.getXzxm());
if (item != null) {
// 确定该表头对应的薪资项目
String itemId = config.getXzxm();
UfHwxcbbpzPO ufHwxcbbpzPO = configMap.get(taxAgentName + "_split" + config.getBtbs());
if (ufHwxcbbpzPO != null && NumberUtils.isCreatable(ufHwxcbbpzPO.getXzxm())) {
itemId = ufHwxcbbpzPO.getXzxm();
}
String finalItemId = itemId;
List<String> itemValue = value.stream().filter(v -> v.get(finalItemId) != null).map(v -> (String)v.get(finalItemId)).collect(Collectors.toList());
BigDecimal sum = itemValue
.stream()
.filter(NumberUtils::isCreatable)
.map(BigDecimal::new)
.reduce(BigDecimal.ZERO, BigDecimal::add);
itemSum.put(config.getBtbs(), SalaryAcctFormulaBO.roundResultValue(sum.toString(), item, Collections.emptyList(), Collections.emptyMap(), salaryItemIdKeySalarySobItemPOMap) );
}
}
itemSum.put("empNums", entrySet.getValue().size());
itemSum.put("fylx", fylx);
itemSum.put("taxAgentName",taxAgentName);
// 获取币种和汇率信息
List<UfXzhlbPO> ufXzhlbLIst = getUfXzhlbService(user).listByTaxAgentName(taxAgentName, rmbTaxAgentPO.getName(), salaryMonth);
if (CollectionUtils.isNotEmpty(ufXzhlbLIst)) {
UfXzhlbPO ufXzhlbPO = ufXzhlbLIst.get(0);
itemSum.put("bz", gwBzMap.getOrDefault(ufXzhlbPO.getYbz(), ""));
itemSum.put("hl", ufXzhlbPO.getHl());
}
result.put(entrySet.getKey(), itemSum);
}
return result;
}
@Override
public Map<String, Object> hwxzhzReportSum(SalaryAcctRecordQueryParam param) {
Map<String, Object> resultMap = hwxzhzReport(param);
List<Map<String, Object>> resultList = (List<Map<String, Object>>)resultMap.get("dataList");
BaseBean baseBean = new BaseBean();
// 查询标准的义务人id(上海港湾) 以该义务人配置的为报表标准
Long rmbTaxAgentId = NumberUtils.isCreatable(baseBean.getPropValue("shgwSalaryBz", "rmb_tax_agent_id")) ? Long.valueOf(baseBean.getPropValue("shgwSalaryBz", "rmb_tax_agent_id")) : 0L;
TaxAgentPO taxAgentPO = getTaxAgentService(user).getById(rmbTaxAgentId);
if (taxAgentPO == null) {
return Collections.emptyMap();
}
// 获取报表配置信息
List<UfHwxcbbpzPO> ufHwxcbbpzList = getUfHwxcbbpzMapper().listAll();
// 过滤出标准的报表配置信息
List<UfHwxcbbpzPO> gwReportConfigList = ufHwxcbbpzList.stream().filter(po -> Arrays.asList(po.getGskjywr().split(",")).contains(taxAgentPO.getName()))
.map(po -> {
if (po.getPx() == null) {
po.setPx(0);
return po;
}
return po;
}).sorted(Comparator.comparing(UfHwxcbbpzPO::getPx)).collect(Collectors.toList());
Map<String, Object> sumResultMap = new HashMap<>();
for (UfHwxcbbpzPO config : gwReportConfigList) {
BigDecimal sumValue = resultList.stream()
.map(map -> map.get(config.getBtbs()))
.filter(value -> value != null && NumberUtils.isCreatable(value.toString()))
.map(e -> SalaryEntityUtil.empty2Zero(e.toString()))
.reduce(BigDecimal.ZERO, BigDecimal::add);
sumResultMap.put(config.getBtbs(),sumValue);
}
BigDecimal totalEmpNum = resultList.stream()
.map(map -> map.get("empNums"))
.filter(value -> value != null && NumberUtils.isCreatable(value.toString()))
.map(e -> SalaryEntityUtil.empty2Zero(e.toString()))
.reduce(BigDecimal.ZERO, BigDecimal::add);
sumResultMap.put("empNums",totalEmpNum);
Map<String, Object> map = new HashMap<>();
map.put("sumRow", sumResultMap);
return map;
}
@Override
public XSSFWorkbook hwxzhzReportExport(SalaryAcctRecordQueryParam param) {
param.setExport(true);
Map<String, Object> resultMap = hwxzhzReport(param);
List<Map<String, Object>> resultList = (List<Map<String, Object>>)resultMap.get("dataList");
BaseBean baseBean = new BaseBean();
// 查询标准的义务人id(上海港湾) 以该义务人配置的为报表标准
Long rmbTaxAgentId = NumberUtils.isCreatable(baseBean.getPropValue("shgwSalaryBz", "rmb_tax_agent_id")) ? Long.valueOf(baseBean.getPropValue("shgwSalaryBz", "rmb_tax_agent_id")) : 0L;
TaxAgentPO taxAgentPO = getTaxAgentService(user).getById(rmbTaxAgentId);
if (taxAgentPO == null) {
return null;
}
// 获取报表配置信息
List<UfHwxcbbpzPO> ufHwxcbbpzList = getUfHwxcbbpzMapper().listAll();
// 过滤出标准的报表配置信息
List<UfHwxcbbpzPO> gwReportConfigList = ufHwxcbbpzList.stream().filter(po -> Arrays.asList(po.getGskjywr().split(",")).contains(taxAgentPO.getName()))
.map(po -> {
if (po.getPx() == null) {
po.setPx(0);
return po;
}
return po;
}).sorted(Comparator.comparing(UfHwxcbbpzPO::getPx)).collect(Collectors.toList());
Map<String, Object> sumResultMap = (Map<String, Object>)resultMap.get("sumRow");
// 1.工作簿名称
String sheetName = SalaryI18nUtil.getI18nLabel(0, "部门工资汇总表");
// 2.表头
List<Object> headerList = new ArrayList<>();
headerList.add("个税扣缴义务人");
headerList.add("费用类型\nType of Expenses");
headerList.add("人数\nHC");
headerList.addAll(gwReportConfigList.stream().map(UfHwxcbbpzPO::getBbbtm).collect(Collectors.toList()));
headerList.add("币种");
headerList.add("汇率");
// 组装数据
List<List<Object>> rows = new ArrayList<>();
rows.add(headerList);
// 3.表数据
resultList.add(sumResultMap);
for (Map<String, Object> map : resultList) {
List<Object> row = new ArrayList<>();
row.add(map.getOrDefault("taxAgentName", ""));
row.add(map.getOrDefault("fylx", ""));
row.add(map.getOrDefault("empNums", ""));
for (UfHwxcbbpzPO config : gwReportConfigList) {
row.add(map.getOrDefault(config.getBtbs(), ""));
}
row.add(map.getOrDefault("bz", ""));
row.add(map.getOrDefault("hl", ""));
rows.add(row);
}
return ExcelUtilPlus.genWorkbookV2(rows, sheetName);
}
}