4377 lines
284 KiB
Java
4377 lines
284 KiB
Java
package com.engine.salary.service.impl;
|
||
|
||
import cn.hutool.core.collection.CollUtil;
|
||
import com.engine.common.util.ServiceUtil;
|
||
import com.engine.core.impl.Service;
|
||
import com.engine.hrmelog.entity.dto.LoggerContext;
|
||
import com.engine.salary.cache.SalaryCacheKey;
|
||
import com.engine.salary.common.LocalDateRange;
|
||
import com.engine.salary.config.SalaryElogConfig;
|
||
import com.engine.salary.constant.SalaryDefaultTenantConstant;
|
||
import com.engine.salary.encrypt.EncryptUtil;
|
||
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
|
||
import com.engine.salary.entity.datacollection.dto.AttendQuoteFieldListDTO;
|
||
import com.engine.salary.entity.datacollection.po.VariableItemPO;
|
||
import com.engine.salary.entity.hrm.DeptInfo;
|
||
import com.engine.salary.entity.hrm.JobCallInfo;
|
||
import com.engine.salary.entity.hrm.PositionInfo;
|
||
import com.engine.salary.entity.hrm.SubCompanyInfo;
|
||
import com.engine.salary.entity.progress.ProgressDTO;
|
||
import com.engine.salary.entity.report.po.SalaryAcctResultReportPO;
|
||
import com.engine.salary.entity.salaryacct.bo.*;
|
||
import com.engine.salary.entity.salaryacct.dto.*;
|
||
import com.engine.salary.entity.salaryacct.param.*;
|
||
import com.engine.salary.entity.salaryacct.po.*;
|
||
import com.engine.salary.entity.salaryarchive.po.SalaryArchiveItemPO;
|
||
import com.engine.salary.entity.salaryarchive.po.SalaryArchivePO;
|
||
import com.engine.salary.entity.salaryformula.ExpressFormula;
|
||
import com.engine.salary.entity.salaryformula.po.FormulaVar;
|
||
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
|
||
import com.engine.salary.entity.salarysob.dto.*;
|
||
import com.engine.salary.entity.salarysob.po.*;
|
||
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
|
||
import com.engine.salary.enums.OperateTypeEnum;
|
||
import com.engine.salary.enums.UserStatusEnum;
|
||
import com.engine.salary.enums.common.FilterEnum;
|
||
import com.engine.salary.enums.common.SalaryLogGroupTypeEnum;
|
||
import com.engine.salary.enums.common.SalaryLogOperateTypeEnum;
|
||
import com.engine.salary.enums.salaryaccounting.LockStatusEnum;
|
||
import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum;
|
||
import com.engine.salary.enums.salaryaccounting.SalaryAcctResultDataSourceEnum;
|
||
import com.engine.salary.enums.salaryformula.SalaryFormulaReferenceEnum;
|
||
import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum;
|
||
import com.engine.salary.enums.salarysob.IncomeCategoryEnum;
|
||
import com.engine.salary.exception.SalaryRunTimeException;
|
||
import com.engine.salary.mapper.hrm.HrmSnapshotMapper;
|
||
import com.engine.salary.mapper.salaryacct.SalaryAcctResultMapper;
|
||
import com.engine.salary.report.service.SalaryStatisticsReportService;
|
||
import com.engine.salary.report.service.impl.SalaryStatisticsReportServiceImpl;
|
||
import com.engine.salary.service.*;
|
||
import com.engine.salary.sys.constant.SalarySysConstant;
|
||
import com.engine.salary.sys.entity.po.SalarySysConfPO;
|
||
import com.engine.salary.sys.enums.TaxDeclarationFunctionEnum;
|
||
import com.engine.salary.sys.service.SalarySysConfService;
|
||
import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl;
|
||
import com.engine.salary.util.JsonUtil;
|
||
import com.engine.salary.util.SalaryDateUtil;
|
||
import com.engine.salary.util.SalaryEntityUtil;
|
||
import com.engine.salary.util.SalaryI18nUtil;
|
||
import com.engine.salary.util.db.MapperProxyFactory;
|
||
import com.engine.salary.util.page.Column;
|
||
import com.engine.salary.util.page.PageInfo;
|
||
import com.engine.salary.util.page.SalaryPageUtil;
|
||
import com.engine.salary.util.valid.ValidUtil;
|
||
import com.google.common.collect.Lists;
|
||
import com.google.common.collect.Maps;
|
||
import com.weaver.util.threadPool.ThreadPoolUtil;
|
||
import com.weaver.util.threadPool.constant.ModulePoolEnum;
|
||
import com.weaver.util.threadPool.entity.LocalRunnable;
|
||
import lombok.extern.slf4j.Slf4j;
|
||
import org.apache.commons.collections4.CollectionUtils;
|
||
import org.apache.commons.collections4.MapUtils;
|
||
import org.apache.commons.lang3.StringUtils;
|
||
import org.apache.commons.lang3.math.NumberUtils;
|
||
import org.jetbrains.annotations.NotNull;
|
||
import org.springframework.beans.BeanUtils;
|
||
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
|
||
import org.springframework.util.StopWatch;
|
||
import weaver.conn.RecordSet;
|
||
import weaver.conn.RecordSetDataSource;
|
||
import weaver.formmode.setup.ModeRightInfo;
|
||
import weaver.general.BaseBean;
|
||
import weaver.general.TimeUtil;
|
||
import weaver.hrm.User;
|
||
import weaver.wechat.util.Utils;
|
||
|
||
import java.math.BigDecimal;
|
||
import java.math.RoundingMode;
|
||
import java.text.SimpleDateFormat;
|
||
import java.time.YearMonth;
|
||
import java.util.*;
|
||
import java.util.concurrent.BlockingDeque;
|
||
import java.util.concurrent.CountDownLatch;
|
||
import java.util.concurrent.LinkedBlockingDeque;
|
||
import java.util.regex.Matcher;
|
||
import java.util.stream.Collectors;
|
||
import java.util.stream.IntStream;
|
||
|
||
import static com.engine.salary.constant.SalaryFormulaFieldConstant.SALARY_PATTERN;
|
||
import static com.engine.salary.sys.constant.SalarySysConstant.SALARY_ACCT_SYNC_TYPE;
|
||
|
||
/**
|
||
* 薪资核算结果
|
||
* <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();
|
||
|
||
private SalaryAcctResultMapper getSalaryAcctResultMapper() {
|
||
return MapperProxyFactory.getProxy(SalaryAcctResultMapper.class);
|
||
}
|
||
|
||
private SalaryAcctEmployeeService getSalaryAcctEmployeeService(User user) {
|
||
return ServiceUtil.getService(SalaryAcctEmployeeServiceImpl.class, user);
|
||
}
|
||
|
||
private SalarySobItemService getSalarySobItemService(User user) {
|
||
return ServiceUtil.getService(SalarySobItemServiceImpl.class, user);
|
||
}
|
||
|
||
private SalaryItemService getSalaryItemService(User user) {
|
||
return ServiceUtil.getService(SalaryItemServiceImpl.class, user);
|
||
}
|
||
|
||
private SalarySobEmpFieldService getSalarySobEmpFieldService(User user) {
|
||
return ServiceUtil.getService(SalarySobEmpFieldServiceImpl.class, user);
|
||
}
|
||
|
||
private SalarySobService getSalarySobService(User user) {
|
||
return ServiceUtil.getService(SalarySobServiceImpl.class, user);
|
||
}
|
||
|
||
private SalaryAcctRecordService getSalaryAcctRecordService(User user) {
|
||
return ServiceUtil.getService(SalaryAcctRecordServiceImpl.class, user);
|
||
}
|
||
|
||
private TaxAgentService getTaxAgentService(User user) {
|
||
return ServiceUtil.getService(TaxAgentServiceImpl.class, user);
|
||
}
|
||
|
||
private SalaryEmployeeService getSalaryEmployeeService(User user) {
|
||
return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user);
|
||
}
|
||
|
||
private SalaryFormulaService getSalaryFormulaService(User user) {
|
||
return ServiceUtil.getService(SalaryFormulaServiceImpl.class, user);
|
||
}
|
||
|
||
private SalarySobAdjustRuleService getSalarySobAdjustRuleService(User user) {
|
||
return ServiceUtil.getService(SalarySobAdjustRuleServiceImpl.class, user);
|
||
}
|
||
|
||
private SalarySobItemHideService getSalarySobItemHideService(User user) {
|
||
return (SalarySobItemHideService) ServiceUtil.getService(SalarySobItemHideServiceImpl.class, user);
|
||
}
|
||
|
||
private SalaryAcctCalculateService getSalaryAcctCalculateService(User user) {
|
||
return ServiceUtil.getService(SalaryAcctCalculateServiceImpl.class, user);
|
||
}
|
||
|
||
private ProgressService getSalaryAcctProgressService(User user) {
|
||
return ServiceUtil.getService(ProgressServiceImpl.class, user);
|
||
}
|
||
|
||
private DataSourceTransactionManager dataSourceTransactionManager;
|
||
|
||
private SalaryAcctResultTempService getSalaryAcctResultTempService(User user) {
|
||
return ServiceUtil.getService(SalaryAcctResultTempServiceImpl.class, user);
|
||
}
|
||
|
||
private SIAccountService getSIAccountService(User user) {
|
||
return ServiceUtil.getService(SIAccountServiceImpl.class, user);
|
||
}
|
||
|
||
private AttendQuoteFieldService getAttendQuoteFieldService(User user) {
|
||
return ServiceUtil.getService(AttendQuoteFieldServiceImpl.class, user);
|
||
}
|
||
|
||
private SalaryAcctReportService getSalaryAcctReportService(User user) {
|
||
return ServiceUtil.getService(SalaryAcctReportServiceImpl.class, user);
|
||
}
|
||
|
||
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);
|
||
}
|
||
|
||
private SalaryAcctResultLogService getSalaryAcctResultLogService(User user) {
|
||
return ServiceUtil.getService(SalaryAcctResultLogServiceImpl.class, user);
|
||
}
|
||
|
||
private SalarySysConfService getSalarySysConfService(User user) {
|
||
return ServiceUtil.getService(SalarySysConfServiceImpl.class, user);
|
||
}
|
||
|
||
private SalaryStatisticsReportService getSalaryStatisticsReportService(User user) {
|
||
return ServiceUtil.getService(SalaryStatisticsReportServiceImpl.class, user);
|
||
}
|
||
|
||
private TaxAgentAdminService getTaxAgentAdminService(User user) {
|
||
return ServiceUtil.getService(TaxAgentAdminServiceImpl.class, user);
|
||
}
|
||
|
||
private VariableItemService getVariableItemService(User user) {
|
||
return ServiceUtil.getService(VariableItemServiceImpl.class, user);
|
||
}
|
||
|
||
private SalaryApprovalRuleService getSalaryApprovalRuleService(User user) {
|
||
return ServiceUtil.getService(SalaryApprovalRuleServiceImpl.class, user);
|
||
}
|
||
|
||
|
||
private SalaryCheckResultService salaryCheckResultService;
|
||
|
||
private SalaryAcctSobConfigService getSalaryAcctSobConfigService(User user) {
|
||
return ServiceUtil.getService(SalaryAcctSobConfigServiceImpl.class, user);
|
||
}
|
||
|
||
private SalarySobTaxRuleService getSalarySobTaxRuleService(User user) {
|
||
return ServiceUtil.getService(SalarySobTaxRuleServiceImpl.class, user);
|
||
}
|
||
|
||
|
||
private VariableArchiveService getVariableArchiveService(User user) {
|
||
return ServiceUtil.getService(VariableArchiveServiceImpl.class, user);
|
||
}
|
||
|
||
private VariableArchiveItemService getVariableArchiveItemService(User user) {
|
||
return ServiceUtil.getService(VariableArchiveItemServiceImpl.class, user);
|
||
}
|
||
|
||
private SalaryArchiveService getSalaryArchiveService(User user) {
|
||
return ServiceUtil.getService(SalaryArchiveServiceImpl.class, user);
|
||
}
|
||
|
||
private SalaryArchiveItemService getSalaryArchiveItemService(User user) {
|
||
return ServiceUtil.getService(SalaryArchiveItemServiceImpl.class, user);
|
||
}
|
||
|
||
private HrmSnapshotMapper getHrmSnapshotMapper() {
|
||
return MapperProxyFactory.getProxy(HrmSnapshotMapper.class);
|
||
}
|
||
|
||
@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);
|
||
return salaryAcctResultPOS;
|
||
}
|
||
|
||
@Override
|
||
public List<SalaryAcctResultPO> listBySalaryAcctEmployeeId(Long salaryAcctEmployeeId) {
|
||
List<SalaryAcctResultPO> salaryAcctResultPOS = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctEmpId(salaryAcctEmployeeId).build());
|
||
encryptUtil.decryptList(salaryAcctResultPOS, SalaryAcctResultPO.class);
|
||
// 解密
|
||
return salaryAcctResultPOS;
|
||
}
|
||
|
||
@Override
|
||
public List<SalaryAcctResultPO> listBySalaryAcctEmployeeIds(Collection<Long> salaryAcctEmployeeIds) {
|
||
if (CollectionUtils.isEmpty(salaryAcctEmployeeIds)) {
|
||
return Collections.emptyList();
|
||
}
|
||
List<List<Long>> partition = Lists.partition((List<Long>) salaryAcctEmployeeIds, 500);
|
||
List<SalaryAcctResultPO> salaryAcctResultPOS = new ArrayList<>();
|
||
partition.forEach(empIds -> {
|
||
List<SalaryAcctResultPO> resultPOS = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctEmpIds(empIds).build());
|
||
encryptUtil.decryptList(resultPOS, SalaryAcctResultPO.class);
|
||
salaryAcctResultPOS.addAll(resultPOS);
|
||
});
|
||
// 解密
|
||
return salaryAcctResultPOS;
|
||
}
|
||
|
||
@Override
|
||
public List<SalaryAcctResultPO> listBySalaryAcctRecordIdsAndEmployeeIds(Collection<Long> salaryAcctRecordIds, Collection<Long> employeeIds) {
|
||
if (CollectionUtils.isEmpty(salaryAcctRecordIds) || CollectionUtils.isEmpty(employeeIds)) {
|
||
return Collections.emptyList();
|
||
}
|
||
List<List<Long>> partition = Lists.partition((List<Long>) employeeIds, 500);
|
||
List<SalaryAcctResultPO> salaryAcctResultPOS = new ArrayList<>();
|
||
partition.forEach(empIds -> {
|
||
salaryAcctResultPOS.addAll(getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctRecordIds(salaryAcctRecordIds).employeeIds(empIds).build()));
|
||
});
|
||
encryptUtil.decryptList(salaryAcctResultPOS, SalaryAcctResultPO.class);
|
||
return salaryAcctResultPOS;
|
||
}
|
||
|
||
@Override
|
||
public SalaryAcctResultDetailDTO getBySalaryAcctEmployeeId(Long salaryAcctEmployeeId) {
|
||
// 查询薪资核算人员
|
||
SalaryAcctEmployeePO salaryAcctEmployeePO = getSalaryAcctEmployeeService(user).getById(salaryAcctEmployeeId);
|
||
if (Objects.isNull(salaryAcctEmployeePO)) {
|
||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98831, "薪资核算人员不存在或已被删除"));
|
||
}
|
||
// 查询是否是回算
|
||
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryAcctEmployeePO.getSalaryAcctRecordId());
|
||
boolean isBackCal = Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), 1);
|
||
|
||
SalaryAcctConfig salaryAcctConfig = getSalaryAcctSobConfigService(user).getSalaryAcctConfig(salaryAcctRecordPO.getId());
|
||
// 查询薪资账套的薪资项目分类
|
||
List<SalarySobItemGroupPO> salarySobItemGroupPOS = salaryAcctConfig.getSalarySobItemGroups();
|
||
// 过滤关闭显示的薪资项目分类
|
||
salarySobItemGroupPOS = salarySobItemGroupPOS.stream().filter(group -> group.getItemHide() == null || group.getItemHide().equals(0L)).collect(Collectors.toList());
|
||
// 获取薪资项目分类ID
|
||
List<Long> salarySobItemGroupIds = salarySobItemGroupPOS.stream().map(SalarySobItemGroupPO::getId).collect(Collectors.toList());
|
||
//加上未分类
|
||
salarySobItemGroupIds.add(0L);
|
||
|
||
// 查询薪资账套的薪资项目副本(已经过滤关闭分类显示按钮的薪资项目)
|
||
List<SalarySobItemPO> salarySobItemPOS = salaryAcctConfig.getSalarySobItems();
|
||
// 过滤薪资项目
|
||
salarySobItemPOS = salarySobItemPOS.stream().filter(item -> item.getItemHide() == null || item.getItemHide().equals(0L)).collect(Collectors.toList());
|
||
|
||
// 查询已发补发薪资项目
|
||
List<SalarySobBackItemPO> salarySobBackItemPOList = Collections.emptyList();
|
||
List<SalaryItemPO> salaryBackItemPOS = Collections.emptyList();
|
||
// key:账套中回算薪资项目的薪资项目id value:账套中回算薪资项目所对应的公式内容
|
||
Map<Long, String> salaryBackItemFormula = new HashMap<>();
|
||
if (isBackCal) {
|
||
salarySobBackItemPOList = salaryAcctConfig.getSalarySobBackItems();
|
||
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) ? "输入" : expressFormulaMap.get(salarySobBackItemPO.getFormulaId());
|
||
salaryBackItemFormula.put(salarySobBackItemPO.getSalaryItemId(), exp);
|
||
}
|
||
}
|
||
|
||
// 查询薪资项目
|
||
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
|
||
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds);
|
||
// 查询薪资核算所用薪资账套的人员信息字段
|
||
List<SalarySobEmpFieldPO> salarySobEmpFieldPOS = salaryAcctConfig.getSalarySobEmpFields();
|
||
// 查询人员信息
|
||
DataCollectionEmployee simpleEmployee = getSalaryEmployeeService(user).getEmployeeById(salaryAcctEmployeePO.getEmployeeId());
|
||
// 查询薪资核算结果
|
||
List<SalaryAcctResultPO> salaryAcctResultPOS = listBySalaryAcctEmployeeId(salaryAcctEmployeeId);
|
||
// 查询个税扣缴义务人
|
||
TaxAgentPO taxAgent = getTaxAgentService(user).getById(salaryAcctEmployeePO.getTaxAgentId());
|
||
// 查询公式
|
||
Map<String, SalaryAcctResultListColumnDTO> formulaContentMap = getSalaryAcctResultService(user).getColumnBySalaryAcctRecordId(salaryAcctEmployeePO.getSalaryAcctRecordId());
|
||
List<Long> lockItems = salaryAcctRecordPO.getLockSalaryItemIds() == null ? Collections.emptyList() : salaryAcctRecordPO.getLockSalaryItemIds();
|
||
|
||
// 转换成薪资核算结果详情dto
|
||
return SalaryAcctResultBO.convert2DetailDTO(simpleEmployee, taxAgent, salaryAcctEmployeePO, salarySobEmpFieldPOS, salarySobItemGroupPOS, salarySobItemPOS, salaryItemPOS, salaryAcctResultPOS, salarySobBackItemPOList, salaryBackItemPOS, salaryBackItemFormula, formulaContentMap, lockItems);
|
||
}
|
||
|
||
@Override
|
||
public PageInfo<Map<String, Object>> listPageByParam(SalaryAcctResultQueryParam queryParam) {
|
||
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);
|
||
}
|
||
|
||
|
||
// 查询薪资核算结果
|
||
List<Map<String, Object>> data = listBySalaryAcctEmployees(page.getList(), queryParam);
|
||
// 薪资核算结果的分页结果
|
||
PageInfo<Map<String, Object>> resultPage = new PageInfo<>();
|
||
resultPage.setList(data);
|
||
resultPage.setTotal(page.getTotal());
|
||
resultPage.setPageNum(page.getPageNum());
|
||
resultPage.setPageSize(page.getPageSize());
|
||
return resultPage;
|
||
}
|
||
|
||
@Override
|
||
public Map<String, Object> sumRow(SalaryAcctResultQueryParam queryParam) {
|
||
|
||
//其他条件
|
||
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)) {
|
||
//条件不满足直接返回空列表
|
||
return new HashMap<>();
|
||
} else {
|
||
queryParam.setIds(salaryAcctEmpId);
|
||
}
|
||
}
|
||
|
||
|
||
// 查询薪资核算人员
|
||
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(98747, "薪资核算记录不存在或已被删除"));
|
||
}
|
||
// 查询薪资核算所用薪资账套的薪资项目
|
||
List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
|
||
Map<Long, SalarySobItemPO> salaryItemIdKeySalarySobItemPOMap = SalaryEntityUtil.convert2Map(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
|
||
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
|
||
if (Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), NumberUtils.INTEGER_ONE)) {
|
||
// 是回算,获取回算项
|
||
List<SalarySobBackItemPO> salarySobBackItemPOS = getSalarySobBackItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
|
||
salaryItemIds.addAll(salarySobBackItemPOS.stream().map(SalarySobBackItemPO::getSalaryItemId).collect(Collectors.toList()));
|
||
}
|
||
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds);
|
||
|
||
// 查询薪资核算结果
|
||
List<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId, Collectors.toList());
|
||
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 -> {
|
||
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);
|
||
map.put(item.getId().toString(), SalaryAcctFormulaBO.roundResultValue(sum.toString(), item, Collections.emptyList(), Collections.emptyMap(), salaryItemIdKeySalarySobItemPOMap));
|
||
});
|
||
return map;
|
||
}
|
||
|
||
@Override
|
||
public List<Map<String, Object>> listByParam(SalaryAcctResultQueryParam queryParam) {
|
||
// 查询薪资核算人员
|
||
List<SalaryAcctEmployeePO> salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listByResultQueryParam(queryParam);
|
||
// 查询薪资核算结果
|
||
return listBySalaryAcctEmployees(salaryAcctEmployeePOS, queryParam);
|
||
}
|
||
|
||
/**
|
||
* 根据薪资核算人员查询薪资核算结果
|
||
*
|
||
* @param salaryAcctEmployeePOS 薪资核算人员
|
||
* @param queryParam 列表查询条件
|
||
* @return
|
||
*/
|
||
private List<Map<String, Object>> listBySalaryAcctEmployees(List<SalaryAcctEmployeePO> salaryAcctEmployeePOS, SalaryAcctResultQueryParam queryParam) {
|
||
if (CollectionUtils.isEmpty(salaryAcctEmployeePOS)) {
|
||
return Collections.emptyList();
|
||
}
|
||
// 查询薪资核算记录
|
||
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(queryParam.getSalaryAcctRecordId());
|
||
if (Objects.isNull(salaryAcctRecordPO)) {
|
||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
|
||
}
|
||
boolean isBackCalc = Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), 1);
|
||
|
||
SalaryAcctConfig salaryAcctConfig = getSalaryAcctSobConfigService(user).getSalaryAcctConfig(queryParam.getSalaryAcctRecordId());
|
||
|
||
// 查询薪资核算所用的薪资账套的员工信息字段
|
||
List<SalarySobEmpFieldPO> salarySobEmpFieldPOS = salaryAcctConfig.getSalarySobEmpFields();
|
||
// 查询薪资核算所用薪资账套的薪资项目
|
||
List<SalarySobItemPO> salarySobItemPOS = salaryAcctConfig.getSalarySobItems();
|
||
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()));
|
||
}
|
||
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds);
|
||
// 查询薪资核算结果
|
||
List<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId, Collectors.toList());
|
||
List<SalaryAcctResultPO> salaryAcctResultPOS = listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds);
|
||
// 查询人员信息
|
||
List<Long> employeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getEmployeeId, Collectors.toList());
|
||
List<DataCollectionEmployee> simpleEmployees = getSalaryEmployeeService(user).getEmployeeByIdsAll(employeeIds);
|
||
simpleEmployees.forEach(e -> {
|
||
UserStatusEnum userStatusEnum = UserStatusEnum.parseByValue(Integer.parseInt(e.getStatus()));
|
||
if (userStatusEnum != null) {
|
||
e.setStatusName(userStatusEnum.getDefaultLabel());
|
||
}
|
||
});
|
||
// 查询个税扣缴义务人
|
||
Set<Long> taxAgentIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getTaxAgentId);
|
||
List<TaxAgentPO> taxAgentPOS = getTaxAgentService(user).listByIds(taxAgentIds);
|
||
// 判断是否存在合并计税
|
||
Set<Long> salaryAcctEmployeeIds4ConsolidatedTax;
|
||
if (StringUtils.isNotEmpty(queryParam.getConsolidatedTaxation())) {
|
||
// 如果查询条件中含有"合并计税",那么在入参中的salaryAcctEmployeePOS就已经全部都是存在合并计税的人员了(前面已经过滤了),无需再次查询合并计税的人员
|
||
salaryAcctEmployeeIds4ConsolidatedTax = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId);
|
||
} else {
|
||
// 如果查询条件中没有包含"合并计税",那么就需要查询出存在合并计税的人,标记给前端
|
||
SalaryAcctEmployeeQueryParam accEmployeeQueryParam = SalaryAcctEmployeeQueryParam.builder().salaryAcctRecordId(queryParam.getSalaryAcctRecordId()).ids(SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId, Collectors.toList())).build();
|
||
List<SalaryAcctEmployeePO> salaryAcctEmployeePOS4ConsolidatedTax = getSalaryAcctEmployeeService(user).listByParam4ConsolidatedTax(accEmployeeQueryParam);
|
||
salaryAcctEmployeeIds4ConsolidatedTax = SalaryEntityUtil.properties(salaryAcctEmployeePOS4ConsolidatedTax, SalaryAcctEmployeePO::getId);
|
||
}
|
||
// 查询公式详情
|
||
Set<Long> formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId);
|
||
// 获取回算公式
|
||
if (isBackCalc) {
|
||
formulaIds.addAll(salarySobBackItemPOList.stream().map(SalarySobBackItemPO::getFormulaId).collect(Collectors.toList()));
|
||
}
|
||
List<ExpressFormula> expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds);
|
||
Map<Long, String> expressFormulaMap = SalaryEntityUtil.convert2Map(expressFormulas, ExpressFormula::getId, ExpressFormula::getFormula);
|
||
Map<Long, String> customParameters = SalaryEntityUtil.convert2Map(salarySobItemPOS, SalarySobItemPO::getSalaryItemId, salarySobItemPO -> {
|
||
if (salarySobItemPO.getFormulaId() <= 0) {
|
||
return SalaryI18nUtil.getI18nLabel(92004, "输入/导入");
|
||
}
|
||
return expressFormulaMap.getOrDefault(salarySobItemPO.getFormulaId(), StringUtils.EMPTY);
|
||
});
|
||
// 回算公式内容转换
|
||
Map<Long, String> customBackCalcParameters = SalaryEntityUtil.convert2Map(salarySobBackItemPOList, SalarySobBackItemPO::getSalaryItemId, salarySobBackItemPO -> {
|
||
if (salarySobBackItemPO.getFormulaId() <= 0) {
|
||
return SalaryI18nUtil.getI18nLabel(92004, "输入/导入");
|
||
}
|
||
return expressFormulaMap.getOrDefault(salarySobBackItemPO.getFormulaId(), StringUtils.EMPTY);
|
||
});
|
||
|
||
// 转换成薪资核算结果列表
|
||
return SalaryAcctResultBO.buildTableData(salaryItemPOS, salarySobEmpFieldPOS, simpleEmployees, salaryAcctEmployeePOS, salaryAcctResultPOS, taxAgentPOS, salaryAcctEmployeeIds4ConsolidatedTax, customParameters, customBackCalcParameters, queryParam.isDynamicEmpInfo());
|
||
|
||
}
|
||
|
||
@Override
|
||
public ConsolidatedTaxDetailDTO getConsolidatedTaxDetail(Long salaryAcctEmployeeId) {
|
||
// 查询当前的薪资核算人员
|
||
SalaryAcctEmployeePO salaryAcctEmployeePO = getSalaryAcctEmployeeService(user).getById(salaryAcctEmployeeId);
|
||
if (Objects.isNull(salaryAcctEmployeePO)) {
|
||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98831, "薪资核算人员不存在或已被删除"));
|
||
}
|
||
// 查询当前的薪资核算人员的个税扣缴义务人
|
||
TaxAgentPO taxAgentPO = getTaxAgentService(user).getById(salaryAcctEmployeePO.getTaxAgentId());
|
||
// 查询当前的薪资核算人员的人员信息
|
||
DataCollectionEmployee simpleEmployee = getSalaryEmployeeService(user).getEmployeeById(salaryAcctEmployeePO.getEmployeeId());
|
||
// 查询当前的薪资核算记录
|
||
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryAcctEmployeePO.getSalaryAcctRecordId());
|
||
// 查询当前薪资核算记录所用的薪资账套
|
||
SalarySobPO salarySobPO = getSalarySobService(user).getById(salaryAcctRecordPO.getSalarySobId());
|
||
// 当前薪资核算记录所用的薪资账套的员工信息字段
|
||
List<SalarySobEmpFieldPO> salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salarySobPO.getId());
|
||
|
||
List<SalaryAcctRecordPO> salaryAcctRecordPOS = Collections.singletonList(salaryAcctRecordPO);
|
||
List<SalaryAcctEmployeePO> salaryAcctEmployeePOS = Collections.singletonList(salaryAcctEmployeePO);
|
||
|
||
// 如果当前薪资核算记录所用的薪资账套的薪资类型是工资薪金,代表可能存在合并计税
|
||
if (Objects.equals(salarySobPO.getIncomeCategory(), IncomeCategoryEnum.WAGES_AND_SALARIES.getValue())) {
|
||
// 查询所有薪资类型为工资薪金的账套
|
||
List<SalarySobPO> salarySobPOS = getSalarySobService(user).listByIncomeCategory(IncomeCategoryEnum.WAGES_AND_SALARIES);
|
||
// 查询相同税款所属期内的薪资类型为工资薪金的账套的所有核算记录
|
||
Set<Long> salarySobIds = SalaryEntityUtil.properties(salarySobPOS, SalarySobPO::getId);
|
||
LocalDateRange taxCycleDateRange = SalaryDateUtil.localDate2Range(salaryAcctRecordPO.getTaxCycle());
|
||
salaryAcctRecordPOS = getSalaryAcctRecordService(user).listBySalarySobIdsAndTaxCycle(salarySobIds, taxCycleDateRange);
|
||
// 查询当前薪资核算人员所涉及的合并计税的所有薪资核算人员
|
||
Set<Long> salaryAcctRecordIds = SalaryEntityUtil.properties(salaryAcctRecordPOS, SalaryAcctRecordPO::getId);
|
||
salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listByRecordIdsAndEmpIdAndTaxAgentId(salaryAcctRecordIds, salaryAcctEmployeePO.getEmployeeId(), salaryAcctEmployeePO.getTaxAgentId());
|
||
}
|
||
// 查询薪资核算人员的薪资核算结果
|
||
List<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId, Collectors.toList());
|
||
List<SalaryAcctResultPO> salaryAcctResultPOS = listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds);
|
||
// 查询薪资核算人员所有合并计税的薪资核算记录所用的账套
|
||
Set<Long> salarySobIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getSalarySobId);
|
||
List<SalarySobPO> salarySobPOS = getSalarySobService(user).listByIds(salarySobIds);
|
||
// 查询薪资项目所引用的薪资项目
|
||
List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemService(user).listBySalarySobIds(salarySobIds);
|
||
// 查询薪资项目
|
||
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
|
||
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds);
|
||
// 转换成合并计税详情dto
|
||
return SalaryAcctResultBO.convert2ConsolidatedTaxDetailDTO(simpleEmployee, taxAgentPO, salarySobEmpFieldPOS, salaryItemPOS, salaryAcctEmployeePOS, salarySobPOS, salaryAcctRecordPOS, salaryAcctResultPOS);
|
||
}
|
||
|
||
@Override
|
||
public Map<String, SalaryAcctResultListColumnDTO> getColumnBySalaryAcctRecordId(Long salaryAcctRecordId) {
|
||
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryAcctRecordId);
|
||
if (Objects.isNull(salaryAcctRecordPO)) {
|
||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
|
||
}
|
||
Map<String, SalaryAcctResultListColumnDTO> resultMap = Maps.newHashMap();
|
||
// 查询薪资核算使用的薪资账套下的薪资项目
|
||
SalarySobItemAggregateDTO salarySobItemAggregateDTO = getSalarySobItemService(user).getAggregateByRecordId(salaryAcctRecordId, true);
|
||
for (SalarySobItemIncomeCategoryDTO incomeCategoryDTO : salarySobItemAggregateDTO.getIncomeCategories()) {
|
||
for (SalarySobItemGroupDTO salarySobItemGroupDTO : incomeCategoryDTO.getItemGroups()) {
|
||
for (SalarySobItemDTO salarySobItemDTO : salarySobItemGroupDTO.getItems()) {
|
||
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()) {
|
||
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) {
|
||
SalaryAcctResultListColumnDTO salaryAcctResultListColumnDTO = new SalaryAcctResultListColumnDTO().setColumnName(backCalcItem.getName()).setFormulaId(backCalcItem.getFormulaId()).setFormulaContent(backCalcItem.getFormulaContent()).setShowLock(true);
|
||
resultMap.put("" + backCalcItem.getSalaryItemId(), salaryAcctResultListColumnDTO);
|
||
}
|
||
}
|
||
return resultMap;
|
||
}
|
||
|
||
@Override
|
||
public void save(SalaryAcctResultSaveParam saveParam) {
|
||
|
||
List<DataCollectionEmployee> dataCollectionEmployees = getSalaryEmployeeService(user).listAllForReport();
|
||
Map<Long, DataCollectionEmployee> emps = SalaryEntityUtil.convert2Map(dataCollectionEmployees, DataCollectionEmployee::getEmployeeId);
|
||
|
||
// 查询薪资核算人员
|
||
SalaryAcctEmployeePO salaryAcctEmployeePO = getSalaryAcctEmployeeService(user).getById(saveParam.getSalaryAcctEmpId());
|
||
if (Objects.isNull(salaryAcctEmployeePO)) {
|
||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98831, "薪资核算人员不存在或已被删除"));
|
||
}
|
||
// 更新员工基本信息值
|
||
saveParam.getEmployeeInfos().stream().forEach(info -> {
|
||
if (info.getFieldValue() != null && StringUtils.isNotBlank(info.getFieldValue().toString())) {
|
||
if (info.getFieldCode().equals("departmentName") || info.getFieldCode().equals("departmentId")) {
|
||
// 修改部门信息
|
||
DeptInfo deptInfo = getSalaryEmployeeService(user).getDeptInfoById(NumberUtils.isCreatable(info.getFieldValue().toString())
|
||
? Long.valueOf(info.getFieldValue().toString()) : 0L);
|
||
if (Objects.nonNull(deptInfo)) {
|
||
salaryAcctEmployeePO.setDepartmentName(deptInfo.getName());
|
||
salaryAcctEmployeePO.setDepartmentId(deptInfo.getId());
|
||
}
|
||
} else if (info.getFieldCode().equals("subcompanyName") || info.getFieldCode().equals("subcompanyId")) {
|
||
// 修改分部信息
|
||
SubCompanyInfo subCompanyInfo = getSalaryEmployeeService(user).getSubCompanyInfoById(NumberUtils.isCreatable(info.getFieldValue().toString())
|
||
? Long.valueOf(info.getFieldValue().toString()) : 0L);
|
||
if (Objects.nonNull(subCompanyInfo)) {
|
||
salaryAcctEmployeePO.setSubcompanyName(subCompanyInfo.getName());
|
||
salaryAcctEmployeePO.setSubcompanyId(subCompanyInfo.getId());
|
||
}
|
||
} else if (info.getFieldCode().equals("jobtitleName") || info.getFieldCode().equals("jobtitleId")) {
|
||
// 修改岗位信息
|
||
PositionInfo positionInfo = getSalaryEmployeeService(user).getPositionInfoById(NumberUtils.isCreatable(info.getFieldValue().toString())
|
||
? Long.valueOf(info.getFieldValue().toString()) : 0L);
|
||
if (Objects.nonNull(positionInfo)) {
|
||
salaryAcctEmployeePO.setJobtitleName(positionInfo.getName());
|
||
salaryAcctEmployeePO.setJobtitleId(positionInfo.getId());
|
||
}
|
||
} else if (info.getFieldCode().equals("jobcall") || info.getFieldCode().equals("jobcallId")) {
|
||
// 修改职称信息
|
||
JobCallInfo jobCallInfo = getSalaryEmployeeService(user).getJobCallInfoById(NumberUtils.isCreatable(info.getFieldValue().toString())
|
||
? Long.valueOf(info.getFieldValue().toString()) : 0L);
|
||
if (Objects.nonNull(jobCallInfo)) {
|
||
salaryAcctEmployeePO.setJobcall(jobCallInfo.getName());
|
||
salaryAcctEmployeePO.setJobcallId(jobCallInfo.getId());
|
||
}
|
||
}
|
||
}
|
||
});
|
||
getSalaryAcctEmployeeService(user).updateIgnoreNull(salaryAcctEmployeePO);
|
||
|
||
// 校验是否可以编辑
|
||
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryAcctEmployeePO.getSalaryAcctRecordId());
|
||
boolean recordIsCanEdit = getSalaryApprovalRuleService(user).getRecordIsCanEdit(salaryAcctRecordPO);
|
||
if (!recordIsCanEdit) {
|
||
throw new SalaryRunTimeException("该核算记录已经发起审批,无法编辑或核算,请先删除审批流程");
|
||
}
|
||
// 查询原来的薪资核算结果
|
||
List<SalaryAcctResultPO> salaryAcctResultPOSOld = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctEmpId(saveParam.getSalaryAcctEmpId()).build());
|
||
// 解密
|
||
encryptUtil.decryptList(salaryAcctResultPOSOld, SalaryAcctResultPO.class);
|
||
// 保存参数转换成薪资核算结果po
|
||
List<SalaryAcctResultPO> salaryAcctResultPOS = SalaryAcctResultBO.convert2PO(salaryAcctResultPOSOld, saveParam, salaryAcctEmployeePO, (long) user.getUID());
|
||
SalarySysConfPO autoLock = getSalarySysConfService(user).getOneByCode(SalarySysConstant.EDIT_IMPORT_AUTO_LOCK);
|
||
if (autoLock != null && StringUtils.equals(autoLock.getConfValue(), "1")) {
|
||
// 对比核算结果提取修改了哪些薪资项目
|
||
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("");
|
||
if (!StringUtils.equals(oldValue, PO.getResultValue())) {
|
||
needLockItems.add(PO.getSalaryItemId());
|
||
}
|
||
});
|
||
|
||
// 编辑的列都自动锁定
|
||
SalaryAcctResultUpdateLockStatusParam updateLockStatusParam = SalaryAcctResultUpdateLockStatusParam.builder().salaryItemIds(needLockItems).salaryAcctRecordId(salaryAcctEmployeePO.getSalaryAcctRecordId()).lockStatus(LockStatusEnum.LOCK).build();
|
||
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);
|
||
// }
|
||
// 删除原来的薪资核算结果
|
||
List<Long> saveItemIds = saveParam.getItems().stream().map(SalaryAcctResultSaveParam.SalaryAcctResultDetailItemParam::getSalaryItemId).collect(Collectors.toList());
|
||
deleteByAcctEmployeeIdsAndSalaryItemIds(Collections.singletonList(saveParam.getSalaryAcctEmpId()), saveItemIds);
|
||
// 保存薪资核算结果
|
||
if (CollectionUtils.isNotEmpty(salaryAcctResultPOS)) {
|
||
// 加密
|
||
encryptUtil.encryptList(salaryAcctResultPOS, SalaryAcctResultPO.class);
|
||
List<List<SalaryAcctResultPO>> partition = Lists.partition(salaryAcctResultPOS, 100);
|
||
partition.forEach(getSalaryAcctResultMapper()::batchInsert);
|
||
}
|
||
//报表
|
||
// 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);
|
||
// }
|
||
|
||
|
||
// 存储薪资核算结果数据来源日志
|
||
salaryAcctResultPOS = getSalaryAcctRecordService(user).listBySalaryAcctEmpId(saveParam.getSalaryAcctEmpId());
|
||
|
||
// 查询操作日志的targetName
|
||
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);
|
||
loggerContext.setNewValueList(Lists.newArrayList(salaryAcctResultPOS));
|
||
SalaryElogConfig.salaryAcctRecordLoggerTemplate.write(loggerContext);
|
||
}
|
||
|
||
/**
|
||
* 存储薪资核算结果数据来源日志
|
||
*
|
||
* @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 -> {
|
||
if (oldResutMap.get(PO.getSalaryItemId()) == null) {
|
||
editItems.add(PO);
|
||
} else {
|
||
String oldValue = oldResutMap.get(PO.getSalaryItemId()).getResultValue();
|
||
if (!StringUtils.equals(oldValue, PO.getResultValue())) {
|
||
editItems.add(PO);
|
||
}
|
||
}
|
||
});
|
||
List<SalaryAcctResultLogPO> needInsertList = SalaryAcctResultLogBO.buildSalaryAcctResultLog(editItems, Long.valueOf(user.getUID()), SalaryAcctResultDataSourceEnum.EDIT);
|
||
getSalaryAcctResultLogService(user).batchInsert(needInsertList);
|
||
}
|
||
|
||
|
||
@Override
|
||
public void batchSave(List<SalaryAcctResultPO> salaryAcctResultPOS) {
|
||
if (CollectionUtils.isNotEmpty(salaryAcctResultPOS)) {
|
||
// 数据加密
|
||
encryptUtil.encryptList(salaryAcctResultPOS, SalaryAcctResultPO.class);
|
||
List<List<SalaryAcctResultPO>> partition = Lists.partition(salaryAcctResultPOS, 100);
|
||
partition.forEach(getSalaryAcctResultMapper()::batchInsert);
|
||
|
||
}
|
||
}
|
||
|
||
public void batchUpdate(List<SalaryAcctResultPO> salaryAcctResultPOS) {
|
||
if (CollectionUtils.isNotEmpty(salaryAcctResultPOS)) {
|
||
// 数据加密
|
||
encryptUtil.encryptList(salaryAcctResultPOS, SalaryAcctResultPO.class);
|
||
List<List<SalaryAcctResultPO>> partition = Lists.partition(salaryAcctResultPOS, 100);
|
||
partition.forEach(getSalaryAcctResultMapper()::batchUpdate);
|
||
}
|
||
}
|
||
|
||
|
||
@Override
|
||
public void deleteBySalaryAcctEmployeeIds(Collection<Long> salaryAcctEmployeeIds) {
|
||
getSalaryAcctResultMapper().deleteBySalaryAcctEmpIds(salaryAcctEmployeeIds);
|
||
}
|
||
|
||
|
||
@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));
|
||
}
|
||
|
||
@Override
|
||
public void deleteBySalaryAcctRecordIds(Collection<Long> salaryAcctRecordIds) {
|
||
getSalaryAcctResultMapper().deleteBySalaryAcctRecordIds(salaryAcctRecordIds);
|
||
}
|
||
|
||
@Override
|
||
public void calculate(SalaryAcctCalculateParam calculateParam, DataCollectionEmployee simpleEmployee) {
|
||
try {
|
||
log.info("开始核算V2 {}", calculateParam);
|
||
StopWatch stopWatch = new StopWatch("总核算耗时,id:" + calculateParam.getSalaryAcctRecordId());
|
||
stopWatch.start("数据准备");
|
||
// 1、查询薪资核算记录
|
||
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(calculateParam.getSalaryAcctRecordId());
|
||
if (Objects.isNull(salaryAcctRecordPO)) {
|
||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
|
||
}
|
||
//查询对应账套
|
||
SalarySobPO salarySobPO = getSalarySobService(user).getById(salaryAcctRecordPO.getSalarySobId());
|
||
if (Objects.isNull(salarySobPO)) {
|
||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资账套不存在或已被删除"));
|
||
}
|
||
|
||
// 不是查询薪资账套下实时的薪资项目,而是查询发起薪资核算时存储的薪资项目快照
|
||
SalaryAcctConfig salaryAcctSobConfig = getSalaryAcctSobConfigService(user).getSalaryAcctConfig(calculateParam.getSalaryAcctRecordId());
|
||
|
||
// 1.1、如果薪资核算记录已经归档了,就不能继续核算
|
||
if (!Objects.equals(salaryAcctRecordPO.getStatus(), SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue())) {
|
||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99148, "当前薪资核算记录已归档,请重新打开后再进行核算"));
|
||
}
|
||
// 2、查询薪资核算记录的薪资周期、考勤周期等
|
||
SalarySobCycleDTO salarySobCycleDTO = getSalaryAcctRecordService(user).getSalarySobCycleById(calculateParam.getSalaryAcctRecordId());
|
||
// 3、查询薪资核算记录所用薪资账套的薪资项目副本
|
||
List<SalarySobItemPO> salarySobItemPOS = salaryAcctSobConfig.getSalarySobItems();
|
||
if (CollectionUtils.isEmpty(salarySobItemPOS)) {
|
||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99151, "当前所用的薪资账套未选择任何薪资项目,无法核算"));
|
||
}
|
||
// 回算薪资项目
|
||
List<SalarySobBackItemPO> salarySobBackItems = Collections.emptyList();
|
||
if (Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), 1)) {
|
||
salarySobBackItems = salaryAcctSobConfig.getSalarySobBackItems();
|
||
}
|
||
// 4、查询当前租户的所有薪资项目
|
||
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listAll();
|
||
// 5、查询薪资核算记录所用薪资账套的调薪计薪规则
|
||
List<SalarySobAdjustRulePO> salarySobAdjustRulePOS = getSalarySobAdjustRuleService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
|
||
// 6、查询社保福利的所有字段
|
||
Map<String, String> welfareColumns = getSIAccountService(user).welfareColumns();
|
||
// 7、查询考勤引用的所有字段
|
||
List<AttendQuoteFieldListDTO> attendQuoteFieldListDTOS = getAttendQuoteFieldService(user).listAll();
|
||
List<VariableItemPO> variableItemPOS = getVariableItemService(user).listAll();
|
||
|
||
// 8、查询公式详情
|
||
Set<Long> formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId);
|
||
formulaIds.addAll(SalaryEntityUtil.properties(salaryItemPOS, SalaryItemPO::getFormulaId));
|
||
formulaIds.addAll(SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getFormulaId));
|
||
List<ExpressFormula> expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds);
|
||
// 本次运算的回算薪资项目所涉及的变量
|
||
Set<String> issuedFieldIds = getIssuedFieldIds(salarySobBackItems);
|
||
// 9、计算薪资项目的运算优先级
|
||
List<Long> salarySobItemsWithPriority = sortItems(salarySobItemPOS, salarySobBackItems, salaryItemPOS, expressFormulas);
|
||
//账套中配置的个税字段,不需要系统算
|
||
List<SalarySobTaxRulePO> salarySobTaxRulePOS = getSalarySobTaxRuleService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
|
||
List<Long> taxIds = SalaryEntityUtil.properties(salarySobTaxRulePOS, SalarySobTaxRulePO::getSalaryItemId, Collectors.toList());
|
||
|
||
// 10、根据id查询其他合并计税的薪资核算记录
|
||
List<SalaryAcctRecordPO> otherSalaryAcctRecordPOS = getSalaryAcctRecordService(user).listById4OtherConsolidatedTax(salaryAcctRecordPO.getId());
|
||
// 11、查询本次核算人员
|
||
List<SalaryAcctEmployeePO> salaryAcctEmployeePOS;
|
||
if (CollectionUtils.isEmpty(calculateParam.getIds())) {
|
||
salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salaryAcctRecordPO.getId());
|
||
} else {
|
||
salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listByIds(calculateParam.getIds());
|
||
}
|
||
if (CollectionUtils.isEmpty(salaryAcctEmployeePOS)) {
|
||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(103378, "薪资核算人员不能为空"));
|
||
}
|
||
stopWatch.stop();
|
||
stopWatch.start("核算耗时");
|
||
|
||
// 11.1、初始化进度
|
||
ProgressDTO initProgress = new ProgressDTO().setTitle(SalaryI18nUtil.getI18nLabel(97515, "核算中")).setTitleLabelId(97515L).setTotalQuantity(salaryAcctEmployeePOS.size() * 2 + 1).setCalculatedQuantity(0).setProgress(BigDecimal.ZERO).setStatus(true).setMessage(StringUtils.EMPTY);
|
||
getSalaryAcctProgressService(user).initProgress(SalaryCacheKey.ACCT_PROGRESS + calculateParam.getSalaryAcctRecordId(), initProgress);
|
||
// 12、对薪资核算人员进行拆分
|
||
String personNumberInOneThread = new BaseBean().getPropValue("hrmSalaryCustom", "personNumberInOneThread");
|
||
int size = 100;
|
||
if (StringUtils.isNotBlank(personNumberInOneThread)) {
|
||
size = Integer.parseInt(personNumberInOneThread);
|
||
}
|
||
List<List<SalaryAcctEmployeePO>> partition = Lists.partition(salaryAcctEmployeePOS, size);
|
||
// 12.1、监控子线程的任务执行
|
||
CountDownLatch childMonitor = new CountDownLatch(partition.size());
|
||
// 12.2、记录子线程的执行结果
|
||
BlockingDeque<SalaryAcctCalculateBO.Result> calculateResults = new LinkedBlockingDeque<>(partition.size());
|
||
// 12.3、生成本次运算的key
|
||
String calculateKey = UUID.randomUUID().toString();
|
||
// 12.4、是否采用系统算税
|
||
TaxDeclarationFunctionEnum taxDeclarationFunction = getSalarySysConfService(user).getTaxDeclaration();
|
||
// 12.5、多线程运算,运算结果存放在临时表中
|
||
//是否同步计算
|
||
boolean isSync = "0".equals(getSalarySysConfService(user).getValueByCode(SALARY_ACCT_SYNC_TYPE));
|
||
for (List<SalaryAcctEmployeePO> acctEmployeePOS : partition) {
|
||
SalaryAcctCalculateBO salaryAcctCalculateBO = new SalaryAcctCalculateBO()
|
||
.setSalaryAcctRecordPO(salaryAcctRecordPO)
|
||
.setSalarySobPO(salarySobPO)
|
||
.setSalarySobCycleDTO(salarySobCycleDTO)
|
||
.setOtherSalaryAcctRecordPOS(otherSalaryAcctRecordPOS)
|
||
.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)
|
||
.setVariableItems(variableItemPOS)
|
||
.setTaxDeclarationFunction(taxDeclarationFunction)
|
||
.setTaxIds(taxIds);
|
||
List<SalarySobBackItemPO> finalSalarySobBackItems = salarySobBackItems;
|
||
if (isSync) {
|
||
getSalaryAcctCalculateService(user).calculate(salaryAcctCalculateBO, simpleEmployee, finalSalarySobBackItems);
|
||
} else {
|
||
LocalRunnable localRunnable = new LocalRunnable() {
|
||
@Override
|
||
public void execute() {
|
||
getSalaryAcctCalculateService(user).calculate(salaryAcctCalculateBO, simpleEmployee, finalSalarySobBackItems);
|
||
}
|
||
};
|
||
ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.HRM, "salaryAcctCalculate", localRunnable);
|
||
}
|
||
}
|
||
// 13、等待所有子线程执行完毕
|
||
childMonitor.await();
|
||
|
||
stopWatch.stop();
|
||
stopWatch.start("数据写入耗时");
|
||
|
||
// 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("|"));
|
||
getSalaryAcctProgressService(user).fail(SalaryCacheKey.ACCT_PROGRESS + calculateParam.getSalaryAcctRecordId(), errorMsg);
|
||
// 删除薪资核算临时存储表中的数据
|
||
getSalaryAcctResultTempService(user).deleteByCalculateKey(calculateKey);
|
||
return;
|
||
}
|
||
// 15、处理核算结果临时表数据
|
||
handleSalaryAcctResultTemp(calculateParam, calculateKey);
|
||
// 16、开始运行校验规则
|
||
// SalaryAcctCheckParam salaryAcctCheckParam = new SalaryAcctCheckParam()
|
||
// .setSalaryAcctRecordId(calculateParam.getSalaryAcctRecordId())
|
||
// .setIds(calculateParam.getIds());
|
||
// salaryCheckResultService.check(salaryAcctCheckParam, true, simpleEmployee);
|
||
// Thread.sleep(10);
|
||
getSalaryAcctProgressService(user).finish(SalaryCacheKey.ACCT_PROGRESS + calculateParam.getSalaryAcctRecordId(), true);
|
||
|
||
//更新薪资核算记录最后操作日期
|
||
getSalaryAcctRecordService(user).updateDate(salaryAcctRecordPO.getId(), new Date());
|
||
|
||
stopWatch.stop();
|
||
log.info(stopWatch.prettyPrint());
|
||
|
||
// 记录日志
|
||
// 查询操作日志的targetName
|
||
String targetName = getSalaryAcctRecordService(user).getLogTargetNameById(calculateParam.getSalaryAcctRecordId());
|
||
Collection<Long> ids = calculateParam.getIds();
|
||
if (CollectionUtils.isNotEmpty(ids)) {
|
||
targetName += ids;
|
||
}
|
||
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, "薪资核算"));
|
||
SalaryElogConfig.salaryAcctRecordLoggerTemplate.write(loggerContext);
|
||
} catch (Exception e) {
|
||
log.info("薪资核算出错:{}", e.getMessage(), e);
|
||
// throw new SalaryRunTimeException(e);
|
||
getSalaryAcctProgressService(user).fail(SalaryCacheKey.ACCT_PROGRESS + calculateParam.getSalaryAcctRecordId(), SalaryI18nUtil.getI18nLabel(99642, "薪资核算出错") + ": " + e.getMessage());
|
||
} finally {
|
||
// 数据库字段加密用
|
||
}
|
||
}
|
||
|
||
|
||
@Override
|
||
public void afterTaxAccounting(SalaryAfterTaxAcctCalculateParam calculateParam, DataCollectionEmployee simpleEmployee) {
|
||
Long salaryAcctRecordId = calculateParam.getSalaryAcctRecordId();
|
||
try {
|
||
// 1、查询薪资核算记录
|
||
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryAcctRecordId);
|
||
if (Objects.isNull(salaryAcctRecordPO)) {
|
||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
|
||
}
|
||
//查询对应账套
|
||
SalarySobPO salarySobPO = getSalarySobService(user).getById(salaryAcctRecordPO.getSalarySobId());
|
||
if (Objects.isNull(salarySobPO)) {
|
||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资账套不存在或已被删除"));
|
||
}
|
||
|
||
// 不是查询薪资账套下实时的薪资项目,而是查询发起薪资核算时存储的薪资项目快照
|
||
SalaryAcctConfig salaryAcctSobConfig = getSalaryAcctSobConfigService(user).getSalaryAcctConfig(salaryAcctRecordId);
|
||
|
||
// 1.1、如果薪资核算记录已经归档了,就不能继续核算
|
||
if (!Objects.equals(salaryAcctRecordPO.getStatus(), SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue())) {
|
||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99148, "当前薪资核算记录已归档,请重新打开后再进行核算"));
|
||
}
|
||
// 2、查询薪资核算记录的薪资周期、考勤周期等
|
||
SalarySobCycleDTO salarySobCycleDTO = getSalaryAcctRecordService(user).getSalarySobCycleById(salaryAcctRecordId);
|
||
// 3、查询薪资核算记录所用薪资账套的薪资项目副本
|
||
List<SalarySobItemPO> salarySobItemPOS = salaryAcctSobConfig.getSalarySobItems();
|
||
if (CollectionUtils.isEmpty(salarySobItemPOS)) {
|
||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99151, "当前所用的薪资账套未选择任何薪资项目,无法核算"));
|
||
}
|
||
// 回算薪资项目
|
||
List<SalarySobBackItemPO> salarySobBackItems = Collections.emptyList();
|
||
if (Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), 1)) {
|
||
salarySobBackItems = salaryAcctSobConfig.getSalarySobBackItems();
|
||
}
|
||
// 4、查询当前租户的所有薪资项目
|
||
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listAll();
|
||
// 5、查询薪资核算记录所用薪资账套的调薪计薪规则
|
||
List<SalarySobAdjustRulePO> salarySobAdjustRulePOS = getSalarySobAdjustRuleService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
|
||
// 6、查询社保福利的所有字段
|
||
Map<String, String> welfareColumns = getSIAccountService(user).welfareColumns();
|
||
// 7、查询考勤引用的所有字段
|
||
List<AttendQuoteFieldListDTO> attendQuoteFieldListDTOS = getAttendQuoteFieldService(user).listAll();
|
||
List<VariableItemPO> variableItemPOS = getVariableItemService(user).listAll();
|
||
|
||
// 8、查询公式详情
|
||
Set<Long> formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId);
|
||
formulaIds.addAll(SalaryEntityUtil.properties(salaryItemPOS, SalaryItemPO::getFormulaId));
|
||
formulaIds.addAll(SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getFormulaId));
|
||
List<ExpressFormula> expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds);
|
||
// 本次运算的回算薪资项目所涉及的变量
|
||
Set<String> issuedFieldIds = getIssuedFieldIds(salarySobBackItems);
|
||
// 9、计算薪资项目的运算优先级
|
||
List<Long> salarySobItemsWithPriority = sortItems(salarySobItemPOS, salarySobBackItems, salaryItemPOS, expressFormulas);
|
||
|
||
//账套中配置的个税字段,不需要系统算
|
||
List<SalarySobTaxRulePO> salarySobTaxRulePOS = getSalarySobTaxRuleService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
|
||
List<Long> taxIds = SalaryEntityUtil.properties(salarySobTaxRulePOS, SalarySobTaxRulePO::getSalaryItemId, Collectors.toList());
|
||
|
||
/**
|
||
* 计算税后薪资
|
||
*/
|
||
int index = salarySobItemsWithPriority.size() - 1;
|
||
for (Long id : taxIds) {
|
||
int i = salarySobItemsWithPriority.indexOf(id);
|
||
if (i != -1 && i < index) {
|
||
index = i;
|
||
}
|
||
}
|
||
salarySobItemsWithPriority = salarySobItemsWithPriority.subList(index, salarySobItemsWithPriority.size());
|
||
|
||
// 10、根据id查询其他合并计税的薪资核算记录
|
||
List<SalaryAcctRecordPO> otherSalaryAcctRecordPOS = getSalaryAcctRecordService(user).listById4OtherConsolidatedTax(salaryAcctRecordPO.getId());
|
||
// 11、查询本次核算人员
|
||
List<SalaryAcctEmployeePO> salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salaryAcctRecordPO.getId());
|
||
if (CollectionUtils.isEmpty(salaryAcctEmployeePOS)) {
|
||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(103378, "薪资核算人员不能为空"));
|
||
}
|
||
|
||
// 11.1、初始化进度
|
||
ProgressDTO initProgress = new ProgressDTO().setTitle(SalaryI18nUtil.getI18nLabel(97515, "核算中")).setTitleLabelId(97515L).setTotalQuantity(salaryAcctEmployeePOS.size() * 2 + 1).setCalculatedQuantity(0).setProgress(BigDecimal.ZERO).setStatus(true).setMessage(StringUtils.EMPTY);
|
||
getSalaryAcctProgressService(user).initProgress(SalaryCacheKey.AFTER_TAXA_CCT_PROGRESS + salaryAcctRecordId, initProgress);
|
||
// 12、对薪资核算人员进行拆分
|
||
List<List<SalaryAcctEmployeePO>> partition = Lists.partition(salaryAcctEmployeePOS, 100);
|
||
// 12.1、监控子线程的任务执行
|
||
CountDownLatch childMonitor = new CountDownLatch(partition.size());
|
||
// 12.2、记录子线程的执行结果
|
||
BlockingDeque<SalaryAcctCalculateBO.Result> calculateResults = new LinkedBlockingDeque<>(partition.size());
|
||
// 12.3、生成本次运算的key
|
||
String calculateKey = UUID.randomUUID().toString();
|
||
// 12.4、是否采用系统算税
|
||
TaxDeclarationFunctionEnum taxDeclarationFunction = getSalarySysConfService(user).getTaxDeclaration();
|
||
// 12.5、多线程运算,运算结果存放在临时表中
|
||
for (List<SalaryAcctEmployeePO> acctEmployeePOS : partition) {
|
||
SalaryAcctCalculateBO salaryAcctCalculateBO = new SalaryAcctCalculateBO()
|
||
.setSalaryAcctRecordPO(salaryAcctRecordPO)
|
||
.setSalarySobPO(salarySobPO)
|
||
.setSalarySobCycleDTO(salarySobCycleDTO)
|
||
.setOtherSalaryAcctRecordPOS(otherSalaryAcctRecordPOS)
|
||
.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)
|
||
.setVariableItems(variableItemPOS)
|
||
.setTaxDeclarationFunction(taxDeclarationFunction)
|
||
.setTaxIds(taxIds);
|
||
List<SalarySobBackItemPO> finalSalarySobBackItems = salarySobBackItems;
|
||
LocalRunnable localRunnable = new LocalRunnable() {
|
||
@Override
|
||
public void execute() {
|
||
getSalaryAcctCalculateService(user).calculate(salaryAcctCalculateBO, simpleEmployee, finalSalarySobBackItems);
|
||
}
|
||
};
|
||
ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.HRM, "salaryAcctCalculate", localRunnable);
|
||
}
|
||
// 13、等待所有子线程执行完毕
|
||
childMonitor.await();
|
||
|
||
|
||
// 14、判断子线程执行结果
|
||
boolean allSuccess = calculateResults.stream().allMatch(SalaryAcctCalculateBO.Result::isStatus);
|
||
if (!allSuccess) {
|
||
// 薪资核算实现的线程的错误信息
|
||
String errorMsg = calculateResults.stream().filter(result -> !result.isStatus()).map(SalaryAcctCalculateBO.Result::getErrMsg).collect(Collectors.joining("|"));
|
||
getSalaryAcctProgressService(user).fail(SalaryCacheKey.AFTER_TAXA_CCT_PROGRESS + salaryAcctRecordId, errorMsg);
|
||
// 删除薪资核算临时存储表中的数据
|
||
getSalaryAcctResultTempService(user).deleteByCalculateKey(calculateKey);
|
||
return;
|
||
}
|
||
// 15、处理核算结果临时表数据
|
||
handleSalaryAfterTaxAcctResultTemp(salaryAcctRecordId, calculateKey,salarySobItemsWithPriority);
|
||
// 16、开始运行校验规则
|
||
// SalaryAcctCheckParam salaryAcctCheckParam = new SalaryAcctCheckParam()
|
||
// .setSalaryAcctRecordId(calculateParam.getSalaryAcctRecordId())
|
||
// .setIds(calculateParam.getIds());
|
||
// salaryCheckResultService.check(salaryAcctCheckParam, true, simpleEmployee);
|
||
// Thread.sleep(10);
|
||
getSalaryAcctProgressService(user).finish(SalaryCacheKey.AFTER_TAXA_CCT_PROGRESS + salaryAcctRecordId, true);
|
||
|
||
|
||
// 记录日志
|
||
// 查询操作日志的targetName
|
||
String targetName = getSalaryAcctRecordService(user).getLogTargetNameById(salaryAcctRecordId);
|
||
LoggerContext<SalaryCheckResultPO> loggerContext = new LoggerContext<>();
|
||
loggerContext.setUser(user);
|
||
loggerContext.setTargetId(String.valueOf(salaryAcctRecordId));
|
||
loggerContext.setTargetName(targetName);
|
||
loggerContext.setOperateType(OperateTypeEnum.UPDATE.getValue());
|
||
loggerContext.setOperateTypeName(SalaryI18nUtil.getI18nLabel(0, "核算税后薪资"));
|
||
loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel(0, "核算税后薪资"));
|
||
SalaryElogConfig.salaryAcctRecordLoggerTemplate.write(loggerContext);
|
||
} catch (Exception e) {
|
||
log.info("核算税后薪资出错:{}", e.getMessage(), e);
|
||
getSalaryAcctProgressService(user).fail(SalaryCacheKey.AFTER_TAXA_CCT_PROGRESS + salaryAcctRecordId, SalaryI18nUtil.getI18nLabel(99642, "薪资核算出错") + ": " + e.getMessage());
|
||
} finally {
|
||
// 数据库字段加密用
|
||
}
|
||
}
|
||
|
||
@NotNull
|
||
private List<Long> sortItems(List<SalarySobItemPO> salarySobItemPOS, List<SalarySobBackItemPO> salarySobBackItems, List<SalaryItemPO> salaryItemPOS, List<ExpressFormula> expressFormulas) {
|
||
|
||
List<SalarySobItemPO> temp = salarySobBackItems.stream()
|
||
.map(e -> {
|
||
SalarySobItemPO salarySobItem = new SalarySobItemPO();
|
||
BeanUtils.copyProperties(e, salarySobItem);
|
||
return salarySobItem;
|
||
}).collect(Collectors.toList());
|
||
salarySobItemPOS.addAll(temp);
|
||
|
||
SalaryCalcItemGraph salaryCalcItemGraph = new SalaryCalcItemGraph(salarySobItemPOS, salaryItemPOS, expressFormulas);
|
||
List<SalaryCalcItem> salaryCalcItems = salaryCalcItemGraph.sort();
|
||
return SalaryEntityUtil.properties(salaryCalcItems, SalaryCalcItem::getSalaryItemId, Collectors.toList());
|
||
}
|
||
|
||
/**
|
||
* 获取回算变量
|
||
*
|
||
* @param salarySobBackItems
|
||
* @return
|
||
*/
|
||
@NotNull
|
||
private Set<String> getIssuedFieldIds(List<SalarySobBackItemPO> salarySobBackItems) {
|
||
Set<String> issuedFieldIds;
|
||
Set<Long> issuedFormulaIds = SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getFormulaId);
|
||
List<ExpressFormula> expressFormulas1 = getSalaryFormulaService(user).listExpressFormula(issuedFormulaIds);
|
||
List<FormulaVar> issuedFormulaVars = new ArrayList<>();
|
||
expressFormulas1.forEach(f -> issuedFormulaVars.addAll(f.getParameters()));
|
||
issuedFieldIds = issuedFormulaVars.stream()
|
||
.map(FormulaVar::getFieldId)
|
||
.filter(StringUtils::isNotBlank)
|
||
.filter(v -> v.startsWith(SalaryFormulaReferenceEnum.ISSUED.getValue() + "_"))
|
||
.map(SALARY_PATTERN::matcher)
|
||
.filter(Matcher::find)
|
||
.map(m -> m.group(2))
|
||
.collect(Collectors.toSet());
|
||
return issuedFieldIds;
|
||
}
|
||
|
||
/**
|
||
* 处理薪资核算临时存储表中的数据
|
||
*
|
||
* @param calculateParam
|
||
* @param calculateKey
|
||
*/
|
||
private void handleSalaryAcctResultTemp(SalaryAcctCalculateParam calculateParam, String calculateKey) {
|
||
StopWatch sw = new StopWatch(calculateParam.getSalaryAcctRecordId() + "");
|
||
// 查询薪资核算结果的临时存储
|
||
sw.start("处理核算数据,查询薪资核算结果的临时存储");
|
||
List<SalaryAcctResultTempPO> salaryAcctResultTempPOS = getSalaryAcctResultTempService(user).listByCalculateKey(calculateKey);
|
||
sw.stop();
|
||
// 删除原来的薪资核算结果
|
||
sw.start("处理核算数据,删除原来的薪资核算结果");
|
||
if (CollectionUtils.isNotEmpty(calculateParam.getIds())) {
|
||
getSalaryAcctResultMapper().deleteBySalaryAcctEmpIds(calculateParam.getIds());
|
||
} else {
|
||
getSalaryAcctResultMapper().deleteBySalaryAcctRecordIds(Collections.singleton(calculateParam.getSalaryAcctRecordId()));
|
||
getSalaryAcctReportService(user).deleteBySalaryAcctRecordId(calculateParam.getSalaryAcctRecordId());
|
||
}
|
||
sw.stop();
|
||
// 保存薪资的薪资核算结果
|
||
sw.start("处理核算数据,保存薪资的薪资核算结果");
|
||
List<SalaryAcctResultPO> salaryAcctResultPOS = SalaryAcctResultBO.convert2ResultPO(salaryAcctResultTempPOS);
|
||
batchSave(salaryAcctResultPOS);
|
||
sw.stop();
|
||
// 删除薪资核算临时存储表中的数据
|
||
sw.start("处理核算数据,删除薪资核算临时存储表中的数据");
|
||
getSalaryAcctResultTempService(user).deleteByCalculateKey(calculateKey);
|
||
sw.stop();
|
||
log.info(sw.prettyPrint());
|
||
}
|
||
|
||
|
||
private void handleSalaryAfterTaxAcctResultTemp(Long salaryAcctRecordId, String calculateKey, List<Long> afterTaxItemIds) {
|
||
// 查询薪资核算结果的临时存储
|
||
List<SalaryAcctResultTempPO> salaryAcctResultTempPOS = getSalaryAcctResultTempService(user).listByCalculateKey(calculateKey);
|
||
// 删除原来的薪资核算结果
|
||
getSalaryAcctResultMapper().deleteBySalaryAcctRecordIdAndSalaryItemIds(salaryAcctRecordId, afterTaxItemIds);
|
||
// 保存薪资的薪资核算结果
|
||
List<SalaryAcctResultPO> salaryAcctResultPOS = SalaryAcctResultBO.convert2ResultPO(salaryAcctResultTempPOS);
|
||
batchSave(salaryAcctResultPOS);
|
||
// 删除薪资核算临时存储表中的数据
|
||
getSalaryAcctResultTempService(user).deleteByCalculateKey(calculateKey);
|
||
}
|
||
|
||
@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);
|
||
}
|
||
|
||
|
||
// /**
|
||
// * 查询薪资核算人员
|
||
// *
|
||
// * @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 lock(SalaryAcctResultLockParam param) {
|
||
ValidUtil.doValidator(param);
|
||
|
||
SalaryAcctEmployeePO salaryAcctEmployeePO = getSalaryAcctEmployeeService(user).getById(param.getAcctEmpId());
|
||
if (salaryAcctEmployeePO == null) {
|
||
return;
|
||
}
|
||
|
||
List<Long> lockItemIds = salaryAcctEmployeePO.getLockItems() == null ? new ArrayList<>() : salaryAcctEmployeePO.getLockItems();
|
||
Long salaryItemId = param.getSalaryItemId();
|
||
|
||
if (param.getLockStatus() == LockStatusEnum.LOCK) {
|
||
lockItemIds.add(salaryItemId);
|
||
} else {
|
||
lockItemIds.removeIf(salaryItemId::equals);
|
||
}
|
||
|
||
salaryAcctEmployeePO.setLockItems(Lists.newArrayList(new HashSet(lockItemIds)));
|
||
|
||
getSalaryAcctEmployeeService(user).lock(salaryAcctEmployeePO);
|
||
}
|
||
|
||
@Override
|
||
public void updateLockStatusByParam(SalaryAcctResultUpdateLockStatusParam updateParam) {
|
||
List<SalaryAcctEmployeePO> salaryAcctEmployees = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(updateParam.getSalaryAcctRecordId());
|
||
if (CollectionUtils.isEmpty(salaryAcctEmployees)) {
|
||
return;
|
||
}
|
||
|
||
Set<Long> salaryItemIds;
|
||
if (CollectionUtils.isNotEmpty(updateParam.getSalaryItemIds())) {
|
||
salaryItemIds = updateParam.getSalaryItemIds();
|
||
} else {
|
||
salaryItemIds = Collections.singleton(updateParam.getSalaryItemId());
|
||
}
|
||
|
||
salaryAcctEmployees.forEach(salaryAcctEmployeePO -> {
|
||
List<Long> lockItemIds = salaryAcctEmployeePO.getLockItems() == null ? new ArrayList<>() : salaryAcctEmployeePO.getLockItems();
|
||
|
||
if (updateParam.getLockStatus() == LockStatusEnum.LOCK) {
|
||
lockItemIds.addAll(salaryItemIds);
|
||
} else {
|
||
lockItemIds.removeAll(salaryItemIds);
|
||
}
|
||
salaryAcctEmployeePO.setLockItems(Lists.newArrayList(new HashSet(lockItemIds)));
|
||
getSalaryAcctEmployeeService(user).lock(salaryAcctEmployeePO);
|
||
});
|
||
|
||
}
|
||
|
||
@Override
|
||
public void reCalc(Long id) {
|
||
// 无需解密
|
||
SalaryAcctResultPO build = SalaryAcctResultPO.builder().salaryAcctRecordId(id).deleteType(0).build();
|
||
List<SalaryAcctResultPO> salaryAcctResultPOS = getSalaryAcctResultMapper().listSome(build);
|
||
// 回算前的薪资核算结果
|
||
salaryAcctResultPOS.forEach(salaryAcctResult -> salaryAcctResult.setOriginResultValue(salaryAcctResult.getResultValue()));
|
||
// 批量更新
|
||
batchUpdateOriginResultValue(salaryAcctResultPOS);
|
||
}
|
||
|
||
@Override
|
||
public List<SalaryAcctResultPO> listBySalaryAcctRecordIdsAndSalaryItemIds(Collection<Long> salaryAcctRecordIds, Collection<Long> salaryItemIds) {
|
||
if (CollectionUtils.isEmpty(salaryAcctRecordIds) || CollectionUtils.isEmpty(salaryItemIds)) {
|
||
return Collections.emptyList();
|
||
}
|
||
List<SalaryAcctResultPO> list = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctRecordIds(salaryAcctRecordIds).salaryItemIds(salaryItemIds).build());
|
||
return encryptUtil.decryptList(list, SalaryAcctResultPO.class);
|
||
|
||
}
|
||
|
||
@Override
|
||
public List<SalaryAcctResultPO> listByAcctEmployeeIdsAndSalaryItemIds(List<Long> salaryAcctEmployeeIds, Collection<Long> salaryItemIds) {
|
||
if (CollectionUtils.isEmpty(salaryAcctEmployeeIds)) {
|
||
return Collections.emptyList();
|
||
}
|
||
List<List<Long>> partition = Lists.partition(salaryAcctEmployeeIds, 200);
|
||
List<SalaryAcctResultPO> result = new ArrayList<>();
|
||
partition.forEach(empIds -> {
|
||
SalaryAcctResultPO build = SalaryAcctResultPO.builder().salaryAcctEmpIds(empIds).salaryItemIds(salaryItemIds).build();
|
||
result.addAll(getSalaryAcctResultMapper().listSome(build));
|
||
});
|
||
|
||
// 数据解密
|
||
encryptUtil.decryptList(result, SalaryAcctResultPO.class);
|
||
return result;
|
||
}
|
||
|
||
@Override
|
||
public void batchUpdateOriginResultValue(List<SalaryAcctResultPO> salaryAcctResultValues) {
|
||
int batchSize = 500;
|
||
List<List<SalaryAcctResultPO>> partition = Lists.partition(salaryAcctResultValues, batchSize);
|
||
for (List<SalaryAcctResultPO> subSalaryAcctResultValues : partition) {
|
||
getSalaryAcctResultMapper().batchUpdateOriginResultValue(subSalaryAcctResultValues);
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public List<Long> listAcctEmpIdByAcctEmpId(List<Long> salaryAcctEmployeeIds) {
|
||
if (CollectionUtils.isEmpty(salaryAcctEmployeeIds)) {
|
||
return Collections.emptyList();
|
||
}
|
||
List<List<Long>> partition = Lists.partition((List<Long>) salaryAcctEmployeeIds, 1000);
|
||
List<Long> result = new ArrayList<>();
|
||
partition.forEach(empIds -> {
|
||
result.addAll(getSalaryAcctResultMapper().getAcctEmpIsExist(empIds));
|
||
});
|
||
return result;
|
||
}
|
||
|
||
|
||
@Override
|
||
public Boolean checkAuth(Long salaryAcctRecordId) {
|
||
// 获取该核算记录的个税扣缴义务
|
||
// SalaryAcctRecordPO recordPO = getSalaryAcctRecordService(user).getById(salaryAcctRecordId);
|
||
// if (Objects.isNull(recordPO)) {
|
||
// return false;
|
||
// }
|
||
// SalarySobPO salarySobPO = getSalarySobService(user).getById(recordPO.getSalarySobId());
|
||
// Long taxAgentId = salarySobPO.getTaxAgentId();
|
||
// List<TaxAgentAdminPO> adminTaxAgentList = getTaxAgentAdminService(user).listByEmployeeId((long) user.getUID());
|
||
// Optional<TaxAgentAdminPO> canOperate = adminTaxAgentList.stream().filter(po -> NumberUtils.compare(taxAgentId, po.getTaxAgentId()) == 0).findFirst();
|
||
// if (!canOperate.isPresent()) {
|
||
// return false;
|
||
// }
|
||
return true;
|
||
}
|
||
|
||
@Override
|
||
public void batchUpdate(SalaryAcctResultBatchUpdateParam param) {
|
||
ValidUtil.doValidator(param);
|
||
|
||
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(param.getSalaryAcctRecordId());
|
||
if (salaryAcctRecordPO == null) {
|
||
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("该账套不包含该薪资项目或已被删除,请先检查账套");
|
||
}
|
||
// 获取需要更新的核算人员信息
|
||
List<SalaryAcctEmployeePO> salaryAcctEmployeePOList = new ArrayList<>();
|
||
if (CollectionUtils.isEmpty(param.getIdList())) {
|
||
// 没有选择核算人员,更新核算记录中所有人员
|
||
salaryAcctEmployeePOList.addAll(getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salaryAcctRecordPO.getId()));
|
||
} else {
|
||
salaryAcctEmployeePOList.addAll(getSalaryAcctEmployeeService(user).listByIds(param.getIdList()));
|
||
}
|
||
|
||
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);
|
||
List<DataCollectionEmployee> dataCollectionEmployees = getSalaryEmployeeService(user).listAllForReport();
|
||
Map<Long, DataCollectionEmployee> emps = SalaryEntityUtil.convert2Map(dataCollectionEmployees, DataCollectionEmployee::getEmployeeId);
|
||
List<SalaryAcctResultPO> needUpdateList = new ArrayList<>();
|
||
List<SalaryAcctResultPO> needInsertList = new ArrayList<>();
|
||
Date now = new Date();
|
||
List<SalaryAcctResultReportPO> salaryAcctResultReportPOS = new ArrayList<>();
|
||
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())
|
||
.resultValue(param.getValue())
|
||
.originResultValue("")
|
||
.creator(Long.valueOf(user.getUID()))
|
||
.createTime(now)
|
||
.updateTime(now)
|
||
.deleteType(NumberUtils.INTEGER_ZERO)
|
||
.tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY)
|
||
.build());
|
||
}
|
||
|
||
// 报表
|
||
// 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);
|
||
});
|
||
|
||
// 入库
|
||
if (CollectionUtils.isNotEmpty(needUpdateList)) {
|
||
// 数据加密
|
||
encryptUtil.encryptList(needUpdateList, SalaryAcctResultPO.class);
|
||
List<List<SalaryAcctResultPO>> partition = Lists.partition(needUpdateList, 100);
|
||
partition.forEach(getSalaryAcctResultMapper()::batchUpdate);
|
||
}
|
||
batchSave(needInsertList);
|
||
|
||
// 报表入库前先删除
|
||
// getSalaryAcctReportService(user).deleteByAcctEmployeeIdsAndSalaryItemIds(param.getIdList(), Collections.singletonList(param.getSalaryItemId()));
|
||
// getSalaryAcctReportService(user).batchSave(salaryAcctResultReportPOS);
|
||
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public List<SalaryAcctResultPO> listBySobSalaryMonth(Date salaryMonth, Long salarySobId, List<Long> employeeIds) {
|
||
List<SalaryAcctRecordPO> salaryAcctRecordPOS = getSalaryAcctRecordService(user).listSome(SalaryAcctRecordPO.builder().salarySobId(salarySobId).salaryMonth(salaryMonth).build());
|
||
List<Long> recordIds = SalaryEntityUtil.properties(salaryAcctRecordPOS, SalaryAcctRecordPO::getId, Collectors.toList());
|
||
|
||
if (CollUtil.isEmpty(recordIds)) {
|
||
return new ArrayList<>();
|
||
}
|
||
List<SalaryAcctResultPO> salaryAcctResultPOS = new ArrayList<>();
|
||
SalaryAcctResultPO resultParam = SalaryAcctResultPO.builder().salaryAcctRecordIds(recordIds).build();
|
||
if (CollUtil.isNotEmpty(employeeIds)) {
|
||
List<List<Long>> partition = Lists.partition(employeeIds, 500);
|
||
for (List<Long> ids : partition){
|
||
resultParam.setEmployeeIds(ids);
|
||
List<SalaryAcctResultPO> acctResultPOS = getSalaryAcctResultMapper().listSome(resultParam);
|
||
salaryAcctResultPOS.addAll(acctResultPOS);
|
||
}
|
||
} else {
|
||
salaryAcctResultPOS = getSalaryAcctResultMapper().listSome(resultParam);
|
||
}
|
||
|
||
encryptUtil.decryptList(salaryAcctResultPOS, SalaryAcctResultPO.class);
|
||
return salaryAcctResultPOS;
|
||
}
|
||
|
||
@Override
|
||
public void writeBatchLog(SalaryAcctRecordPO salaryAcctRecord,
|
||
Map<String, String> newResultValueMap,
|
||
SalaryLogOperateTypeEnum operateType) {
|
||
LoggerContext<Map<String, String>> context = new LoggerContext<>();
|
||
context.setUser(user);
|
||
context.setTargetId(salaryAcctRecord.getId().toString());
|
||
context.setTargetName(SalaryI18nUtil.getI18nLabel(268573, "全部人员"));
|
||
context.setOperator(user.getUID() + "");
|
||
context.setOperateType(operateType.getValue());
|
||
context.setOperateTypeName(operateType.getDefaultLabel());
|
||
context.setGroupId(SalaryLogGroupTypeEnum.SALARY_ACCT_RESULT_VALUE.getValue());
|
||
context.setGroupNameLabel(SalaryLogGroupTypeEnum.SALARY_ACCT_RESULT_VALUE.getLabelId().toString());
|
||
context.setNewValues(newResultValueMap);
|
||
SalaryElogConfig.salaryAcctRecordLoggerTemplate.write(context);
|
||
}
|
||
|
||
/**
|
||
* 联特 - 生成部门社保明细表
|
||
* @param salaryMonth
|
||
* @return
|
||
*/
|
||
@Override
|
||
public String ltGenBmsbmxb(String salaryMonth) {
|
||
if (!SalaryDateUtil.checkYearMonth(salaryMonth)) {
|
||
throw new SalaryRunTimeException("年月错误");
|
||
}
|
||
YearMonth yearMonth = SalaryDateUtil.String2YearMonth(salaryMonth);
|
||
// 查询需要生成哪些浮动薪资项目
|
||
BaseBean baseBean = new BaseBean();
|
||
String configStr = baseBean.getPropValue("ltSalaryReport", "bmsbmxb_ys_config");
|
||
List<LtSalaryReportConfigDTO> configs = JsonUtil.parseList(configStr, LtSalaryReportConfigDTO.class);
|
||
List<Long> variableItemIds = configs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList());
|
||
// 获取浮动档案
|
||
List<Map<String, Object>> variableMapList = getVariableArchiveService(user).listBySalaryMonthAndItems(yearMonth, variableItemIds);
|
||
// 过滤数据,不能所有值为0或空
|
||
List<String> keyList = configs.stream().map(dto -> dto.getItem() + "_variableItem").collect(Collectors.toList());
|
||
variableMapList = variableMapList.stream().filter(map -> {
|
||
for (String key : keyList) {
|
||
String val = Utils.null2String(map.get(key));
|
||
if (StringUtils.isNotBlank(val) && NumberUtils.isCreatable(val) && new BigDecimal(val).compareTo(BigDecimal.ZERO) != 0 ) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}).collect(Collectors.toList());
|
||
if (CollectionUtils.isEmpty(variableMapList)) {
|
||
return null;
|
||
}
|
||
log.info("部门社保明细表size{} ",variableMapList.size());
|
||
// 获取人员信息
|
||
List<Long> empIds = variableMapList.stream().map(map -> Utils.null2String(map.get("employeeId"))).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
// Map<Long, DataCollectionEmployee> employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).listByIds(empIds), DataCollectionEmployee::getEmployeeId);
|
||
// 查询快照表中人员信息
|
||
Map<Long, DataCollectionEmployee> employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).snapshot(empIds, SalaryDateUtil.localDateToDate(yearMonth.atDay(1))), DataCollectionEmployee::getEmployeeId);
|
||
// 删除建模数据
|
||
RecordSet rs = new RecordSet();
|
||
rs.execute("delete from uf_bmsbmxb where xzszy = '" + salaryMonth+ "'");
|
||
// 插入建模
|
||
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
|
||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||
String currTime = String.format("'%s'", sdf.format(new Date()));
|
||
// 获取建模模块id
|
||
String modeId = baseBean.getPropValue("ltSalaryReport", "bmsbmxb_mode_id");
|
||
// 先插入一条数据
|
||
Map<String, Object> firstData = variableMapList.get(0);
|
||
StringBuilder firstSb = new StringBuilder();
|
||
String fieldStr = configs.stream().map(LtSalaryReportConfigDTO::getField).collect(Collectors.joining(","));
|
||
DataCollectionEmployee employee = employeeMap.getOrDefault(firstData.get("employeeId"), DataCollectionEmployee.builder().build());
|
||
firstSb.append("insert into uf_bmsbmxb(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,bm,gw,xzszy,cbzx,"+fieldStr+") values (");
|
||
firstSb.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
|
||
.append(employee.getWorkcode()).append("',")
|
||
.append(employee.getEmployeeId()).append(",")
|
||
.append(employee.getDepartmentId()).append(",")
|
||
.append(employee.getJobtitleId()).append(",'")
|
||
.append(salaryMonth).append("','")
|
||
.append(Utils.null2String(employee.getLtCbzx())).append("'");
|
||
|
||
for (LtSalaryReportConfigDTO dto : configs) {
|
||
String val = Utils.null2String(firstData.get(Utils.null2String(dto.getItem()) + "_variableItem" ));
|
||
firstSb.append(",").append(NumberUtils.isCreatable(val) ? val : 0);
|
||
}
|
||
firstSb.append(")");
|
||
rs.execute(firstSb.toString());
|
||
variableMapList.remove(0);
|
||
// 获取最大值 作为权限重构的起始id
|
||
rs.execute("select max(id) from uf_bmsbmxb");
|
||
int minId = 0;
|
||
if (rs.next()) {
|
||
minId = rs.getInt(1);
|
||
}
|
||
int maxId = minId + variableMapList.size();
|
||
|
||
|
||
|
||
List<List<Map<String, Object>>> partition = Lists.partition(variableMapList, 500);
|
||
partition.forEach(part -> {
|
||
StringBuilder sb = new StringBuilder();
|
||
sb.append("insert into uf_bmsbmxb(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,bm,gw,xzszy,cbzx,"+fieldStr+") values ");
|
||
for (Map<String, Object> data : part) {
|
||
DataCollectionEmployee employeePo = employeeMap.getOrDefault(data.get("employeeId"), DataCollectionEmployee.builder().build());
|
||
sb.append("(")
|
||
.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
|
||
.append(employeePo.getWorkcode()).append("',")
|
||
.append(employeePo.getEmployeeId()).append(",")
|
||
.append(employeePo.getDepartmentId()).append(",")
|
||
.append(employeePo.getJobtitleId()).append(",'")
|
||
.append(salaryMonth).append("','")
|
||
.append(Utils.null2String(employeePo.getLtCbzx())).append("'");
|
||
for (LtSalaryReportConfigDTO dto : configs) {
|
||
String val = Utils.null2String(data.getOrDefault(Utils.null2String(dto.getItem()) + "_variableItem", ""));
|
||
sb.append(",").append(NumberUtils.isCreatable(val) ? val : 0);
|
||
}
|
||
sb.append("),");
|
||
}
|
||
rs.execute(sb.substring(0,sb.length()-1).toString());
|
||
});
|
||
// 权限重构
|
||
log.info("部门社保明细表min{} max{} ",minId,maxId);
|
||
if (modeId != null && NumberUtils.isCreatable(modeId)) {
|
||
Integer modeIdValue = Integer.valueOf(modeId);
|
||
for (int i = minId; i <= maxId; i++) {
|
||
ModeRightInfo ModeRightInfo = new ModeRightInfo();
|
||
ModeRightInfo.setNewRight(true);
|
||
ModeRightInfo.editModeDataShare(1, modeIdValue, i);
|
||
}
|
||
}
|
||
|
||
return "success";
|
||
}
|
||
|
||
@Override
|
||
public String ltGenBmgjjmxb(String salaryMonth) {
|
||
if (!SalaryDateUtil.checkYearMonth(salaryMonth)) {
|
||
throw new SalaryRunTimeException("年月错误");
|
||
}
|
||
YearMonth yearMonth = SalaryDateUtil.String2YearMonth(salaryMonth);
|
||
// 查询需要生成哪些浮动薪资项目
|
||
BaseBean baseBean = new BaseBean();
|
||
String configStr = baseBean.getPropValue("ltSalaryReport", "bmgjjmxb_ys_config");
|
||
List<LtSalaryReportConfigDTO> configs = JsonUtil.parseList(configStr, LtSalaryReportConfigDTO.class);
|
||
List<Long> variableItemIds = configs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList());
|
||
// 获取浮动档案
|
||
List<Map<String, Object>> variableMapList = getVariableArchiveService(user).listBySalaryMonthAndItems(yearMonth, variableItemIds);
|
||
// 过滤数据,不能所有值为0或空
|
||
List<String> keyList = configs.stream().map(dto -> dto.getItem() + "_variableItem").collect(Collectors.toList());
|
||
variableMapList = variableMapList.stream().filter(map -> {
|
||
for (String key : keyList) {
|
||
String val = Utils.null2String(map.get(key));
|
||
if (StringUtils.isNotBlank(val) && NumberUtils.isCreatable(val) && new BigDecimal(val).compareTo(BigDecimal.ZERO) != 0 ) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}).collect(Collectors.toList());
|
||
if (CollectionUtils.isEmpty(variableMapList)) {
|
||
return null;
|
||
}
|
||
log.info("部门公积金明细size{} ",variableMapList.size());
|
||
// 获取人员信息
|
||
List<Long> empIds = variableMapList.stream().map(map -> Utils.null2String(map.get("employeeId"))).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
// Map<Long, DataCollectionEmployee> employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).listByIds(empIds), DataCollectionEmployee::getEmployeeId);
|
||
// 查询快照表中人员信息
|
||
Map<Long, DataCollectionEmployee> employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).snapshot(empIds, SalaryDateUtil.localDateToDate(yearMonth.atDay(1))), DataCollectionEmployee::getEmployeeId);
|
||
// 删除建模数据
|
||
RecordSet rs = new RecordSet();
|
||
rs.execute("delete from uf_bmgjjmxb where xzszy = '" + salaryMonth+ "'");
|
||
// 插入建模
|
||
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
|
||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||
String currTime = String.format("'%s'", sdf.format(new Date()));
|
||
// 获取建模模块id
|
||
String modeId = baseBean.getPropValue("ltSalaryReport", "bmgjjmxb_mode_id");
|
||
// 先插入一条数据
|
||
Map<String, Object> firstData = variableMapList.get(0);
|
||
StringBuilder firstSb = new StringBuilder();
|
||
String fieldStr = configs.stream().map(LtSalaryReportConfigDTO::getField).collect(Collectors.joining(","));
|
||
DataCollectionEmployee employee = employeeMap.getOrDefault(firstData.get("employeeId"), DataCollectionEmployee.builder().build());
|
||
firstSb.append("insert into uf_bmgjjmxb(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,bm,gw,xzszy,cbzx,"+fieldStr+") values (");
|
||
firstSb.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
|
||
.append(employee.getWorkcode()).append("',")
|
||
.append(employee.getEmployeeId()).append(",")
|
||
.append(employee.getDepartmentId()).append(",")
|
||
.append(employee.getJobtitleId()).append(",'")
|
||
.append(salaryMonth).append("','")
|
||
.append(Utils.null2String(employee.getLtCbzx())).append("'");
|
||
|
||
for (LtSalaryReportConfigDTO dto : configs) {
|
||
String val = Utils.null2String(firstData.getOrDefault(Utils.null2String(dto.getItem()) + "_variableItem", ""));
|
||
firstSb.append(",").append(NumberUtils.isCreatable(val) ? val : 0);
|
||
}
|
||
firstSb.append(")");
|
||
rs.execute(firstSb.toString());
|
||
variableMapList.remove(0);
|
||
// 获取最大值 作为权限重构的起始id
|
||
rs.execute("select max(id) from uf_bmgjjmxb");
|
||
int minId = 0;
|
||
if (rs.next()) {
|
||
minId = rs.getInt(1);
|
||
}
|
||
int maxId = minId + variableMapList.size();
|
||
|
||
|
||
|
||
List<List<Map<String, Object>>> partition = Lists.partition(variableMapList, 500);
|
||
partition.forEach(part -> {
|
||
StringBuilder sb = new StringBuilder();
|
||
sb.append("insert into uf_bmgjjmxb(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,bm,gw,xzszy,cbzx,"+fieldStr+") values ");
|
||
for (Map<String, Object> data : part) {
|
||
DataCollectionEmployee employeePo = employeeMap.getOrDefault(data.get("employeeId"), DataCollectionEmployee.builder().build());
|
||
sb.append("(")
|
||
.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
|
||
.append(employeePo.getWorkcode()).append("',")
|
||
.append(employeePo.getEmployeeId()).append(",")
|
||
.append(employeePo.getDepartmentId()).append(",")
|
||
.append(employeePo.getJobtitleId()).append(",'")
|
||
.append(salaryMonth).append("','")
|
||
.append(Utils.null2String(employeePo.getLtCbzx())).append("'");
|
||
for (LtSalaryReportConfigDTO dto : configs) {
|
||
String val = Utils.null2String(data.getOrDefault(Utils.null2String(dto.getItem()) + "_variableItem", ""));
|
||
sb.append(",").append(NumberUtils.isCreatable(val) ? val : 0);
|
||
}
|
||
sb.append("),");
|
||
}
|
||
rs.execute(sb.substring(0,sb.length()-1).toString());
|
||
});
|
||
// 权限重构
|
||
log.info("部门公积金明细min{} max{} ",minId,maxId);
|
||
if (modeId != null && NumberUtils.isCreatable(modeId)) {
|
||
Integer modeIdValue = Integer.valueOf(modeId);
|
||
for (int i = minId; i <= maxId; i++) {
|
||
ModeRightInfo ModeRightInfo = new ModeRightInfo();
|
||
ModeRightInfo.setNewRight(true);
|
||
ModeRightInfo.editModeDataShare(1, modeIdValue, i);
|
||
}
|
||
}
|
||
|
||
return "success";
|
||
}
|
||
|
||
@Override
|
||
public String ltGenBmgzjjmxJt(String salaryMonth) {
|
||
if (!SalaryDateUtil.checkYearMonth(salaryMonth)) {
|
||
throw new SalaryRunTimeException("年月错误");
|
||
}
|
||
YearMonth yearMonth = SalaryDateUtil.String2YearMonth(salaryMonth);
|
||
// 查询需要生成哪些浮动薪资项目
|
||
BaseBean baseBean = new BaseBean();
|
||
String configStr = baseBean.getPropValue("ltSalaryReport", "bmsbmxb_ys_config");
|
||
List<LtSalaryReportConfigDTO> configs = JsonUtil.parseList(configStr, LtSalaryReportConfigDTO.class);
|
||
String gjjConfigStr = baseBean.getPropValue("ltSalaryReport", "bmgjjmxb_ys_config");
|
||
configs.addAll(JsonUtil.parseList(gjjConfigStr, LtSalaryReportConfigDTO.class));
|
||
List<Long> variableItemIds = configs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList());
|
||
// 获取浮动档案
|
||
List<Map<String, Object>> variableMapList = getVariableArchiveService(user).listBySalaryMonthAndItems(yearMonth, variableItemIds);
|
||
log.info("部门工资奖金明细表计提size{} ",variableMapList == null ? 0 :variableMapList.size());
|
||
// 获取直接人工工资分摊表的人
|
||
String dataSourceId = baseBean.getPropValue("ltSalaryReport", "zjrycqgsft_data_source_id");
|
||
RecordSetDataSource extRs = new RecordSetDataSource(dataSourceId);
|
||
extRs.execute(" select month, user_code from dws_oa.work_hour_apportion_report where month='"+salaryMonth+"'");
|
||
List<String> needExcludeWorkCodeList = new ArrayList<>();
|
||
while (extRs.next()) {
|
||
needExcludeWorkCodeList.add(extRs.getString("user_code"));
|
||
}
|
||
if (CollectionUtils.isNotEmpty(needExcludeWorkCodeList)) {
|
||
// 获取需要去除的人员id
|
||
List<String> excludeEmpIds = getSalaryEmployeeService(user).listByWorkCodes(needExcludeWorkCodeList).stream().map(emp -> Utils.null2String(emp.getEmployeeId())).collect(Collectors.toList());
|
||
variableMapList = variableMapList.stream().filter(map -> !excludeEmpIds.contains(Utils.null2String(map.get("employeeId")))).collect(Collectors.toList());
|
||
}
|
||
log.info("部门工资奖金明细表计提size afterexclude{} ", variableMapList == null ? 0 : variableMapList.size());
|
||
|
||
// 过滤数据,不能所有值为0或空
|
||
List<String> keyList = configs.stream().map(dto -> dto.getItem() + "_variableItem").collect(Collectors.toList());
|
||
variableMapList = variableMapList.stream().filter(map -> {
|
||
for (String key : keyList) {
|
||
String val = Utils.null2String(map.get(key));
|
||
if (StringUtils.isNotBlank(val) && NumberUtils.isCreatable(val) && new BigDecimal(val).compareTo(BigDecimal.ZERO) != 0) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}).collect(Collectors.toList());
|
||
if (CollectionUtils.isEmpty(variableMapList)) {
|
||
return null;
|
||
}
|
||
log.info("部门工资奖金明细表实发size afterexclude2{} ",variableMapList.size());
|
||
List<Long> employeeIdList = variableMapList.stream().map(m -> Utils.null2String(m.get("employeeId")))
|
||
.filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
|
||
|
||
// 查询生成的报表映射关系
|
||
String reportConfigStr = baseBean.getPropValue("ltSalaryReport", "bmgzjjmxbjt_ys_config");
|
||
List<LtSalaryReportConfigDTO> reportConfigs = JsonUtil.parseList(reportConfigStr, LtSalaryReportConfigDTO.class);
|
||
List<Long> salaryItemIds = reportConfigs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList());
|
||
List<SalaryItemPO> salaryItemList = getSalaryItemService(user).listByIds(salaryItemIds);
|
||
// 查询薪资核算结果(包含未归档)
|
||
Date salaryMonthDate = SalaryDateUtil.localDateToDate(yearMonth.atDay(1));
|
||
List<SalaryAcctRecordPO> salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalaryMonth(LocalDateRange.builder().fromDate(salaryMonthDate).endDate(salaryMonthDate).build());
|
||
// 账套范围
|
||
List<Long> sobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "bmgzjjmxbjt_sob_ids").split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
salaryAcctRecordList = salaryAcctRecordList.stream().filter(record -> sobIds.contains(record.getSalarySobId())).collect(Collectors.toList());
|
||
if (CollectionUtils.isEmpty(salaryAcctRecordList)) {
|
||
return "success";
|
||
}
|
||
List<Long> salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||
List<SalaryAcctEmployeePO> salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIdsAndEmployeeIds(salaryAcctRecordIds, employeeIdList);
|
||
List<DataCollectionEmployee> employeeList = getSalaryEmployeeService(user).listByIds(employeeIdList);
|
||
// 查询薪资核算结果
|
||
List<Long> salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
|
||
List<SalaryAcctResultPO> acctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, salaryItemIds);
|
||
List<TaxAgentPO> taxAgentPOS = getTaxAgentService(user).listAll();
|
||
List<Map<String, Object>> acctResultMap = SalaryAcctResultBO.buildTableData(salaryItemList, Collections.emptyList(), employeeList, salaryAcctEmployeeList,
|
||
acctResultList, taxAgentPOS, Collections.emptySet(), Collections.emptyMap(), Collections.emptyMap(), false);
|
||
Map<String, Map<String, Object>> acctResultMapByEmpId = SalaryEntityUtil.convert2Map(acctResultMap, m -> Utils.null2String(m.get("employeeId")));
|
||
|
||
// 查询员工薪资档案
|
||
List<SalaryArchivePO> salaryArchiveList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().employeeIds(employeeIdList).build());
|
||
Map<String, Long> archiveIdMap = SalaryEntityUtil.convert2Map(salaryArchiveList, archive -> archive.getTaxAgentId() + "_" + archive.getEmployeeId(), archive -> archive.getId());
|
||
List<Long> salaryArchiveIds = salaryArchiveList.stream().map(SalaryArchivePO::getId).collect(Collectors.toList());
|
||
// 查询档案中对应的绩效工资
|
||
Long jdjxItemId = NumberUtils.isCreatable(baseBean.getPropValue("ltSalaryReport", "jdjx_item_id")) ? Long.valueOf(baseBean.getPropValue("ltSalaryReport", "jdjx_item_id")) : 0L;
|
||
Date lastDayOfMonth = SalaryDateUtil.getLastDayOfMonth(salaryMonthDate);
|
||
List<SalaryArchiveItemPO> salaryArchiveItemCurrentList = getSalaryArchiveItemService(user).getEffectiveItemListBySalaryMonth(salaryArchiveIds, Collections.singletonList(jdjxItemId), lastDayOfMonth);
|
||
Map<Long, SalaryArchiveItemPO> archiveItemByArchiveId = SalaryEntityUtil.convert2Map(salaryArchiveItemCurrentList, archive -> archive.getSalaryArchiveId());
|
||
|
||
// 查询快照表中人员信息
|
||
Map<Long, DataCollectionEmployee> employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).snapshot(employeeIdList, SalaryDateUtil.localDateToDate(yearMonth.atDay(1))), DataCollectionEmployee::getEmployeeId);
|
||
|
||
// 入库
|
||
// 删除建模数据
|
||
RecordSet rs = new RecordSet();
|
||
rs.execute("delete from uf_bmjjjt where xzszy = '" + salaryMonth+ "'");
|
||
// 插入建模
|
||
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
|
||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||
String currTime = String.format("'%s'", sdf.format(new Date()));
|
||
// 获取建模模块id
|
||
String modeId = baseBean.getPropValue("ltSalaryReport", "bmgzjjmxbjt_mode_id");
|
||
// 先插入一条数据
|
||
Map<String, Object> firstData = variableMapList.get(0);
|
||
StringBuilder firstSb = new StringBuilder();
|
||
String fieldStr = reportConfigs.stream().map(LtSalaryReportConfigDTO::getField).collect(Collectors.joining(","));
|
||
DataCollectionEmployee employee = employeeMap.getOrDefault(firstData.get("employeeId"), DataCollectionEmployee.builder().build());
|
||
// 获取员工档案绩效工资
|
||
Long archiveId = archiveIdMap.get(Utils.null2String(firstData.get("taxAgentId")) + "_" + employee.getEmployeeId());
|
||
SalaryArchiveItemPO salaryArchiveItemPO = archiveItemByArchiveId.get(archiveId == null ? 0L : archiveId);
|
||
String jxgz = (salaryArchiveItemPO == null || !NumberUtils.isCreatable(salaryArchiveItemPO.getItemValue())) ? "0" : new BigDecimal(salaryArchiveItemPO.getItemValue()).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP).toString();
|
||
// 获取薪资核算结果
|
||
Map<String, Object> singleAcctResultMap = acctResultMapByEmpId.get(Utils.null2String(employee.getEmployeeId()));
|
||
firstSb.append("insert into uf_bmjjjt(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,bm,gw,xzszy,cbzx,jdjxgzbz3,"+fieldStr+") values (");
|
||
firstSb.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
|
||
.append(employee.getWorkcode()).append("',")
|
||
.append(employee.getEmployeeId()).append(",")
|
||
.append(employee.getDepartmentId()).append(",")
|
||
.append(employee.getJobtitleId()).append(",'")
|
||
.append(salaryMonth).append("','")
|
||
.append(Utils.null2String(employee.getLtCbzx())).append("',")
|
||
.append(jxgz);
|
||
|
||
for (LtSalaryReportConfigDTO dto : reportConfigs) {
|
||
BigDecimal val = new BigDecimal("0");
|
||
if (singleAcctResultMap != null) {
|
||
String valStr = Utils.null2String(singleAcctResultMap.getOrDefault(Utils.null2String(dto.getItem()), "0"));
|
||
if (NumberUtils.isCreatable(valStr)) {
|
||
val = new BigDecimal(valStr);
|
||
}
|
||
}
|
||
firstSb.append(",").append(val.toPlainString());
|
||
}
|
||
firstSb.append(")");
|
||
rs.execute(firstSb.toString());
|
||
variableMapList.remove(0);
|
||
// 获取最大值 作为权限重构的起始id
|
||
rs.execute("select max(id) from uf_bmjjjt");
|
||
int minId = 0;
|
||
if (rs.next()) {
|
||
minId = rs.getInt(1);
|
||
}
|
||
int maxId = minId + variableMapList.size();
|
||
|
||
|
||
List<List<Map<String, Object>>> partition = Lists.partition(variableMapList, 500);
|
||
for (List<Map<String, Object>> part : partition) {
|
||
StringBuilder sb = new StringBuilder();
|
||
sb.append("insert into uf_bmjjjt(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,bm,gw,xzszy,cbzx,jdjxgzbz3,"+fieldStr+") values ");
|
||
for (Map<String, Object> data : part) {
|
||
employee = employeeMap.getOrDefault(data.get("employeeId"), DataCollectionEmployee.builder().build());
|
||
// 获取员工档案绩效工资
|
||
// 获取员工档案绩效工资
|
||
archiveId = archiveIdMap.get(Utils.null2String(data.get("taxAgentId")) + "_" + employee.getEmployeeId());
|
||
salaryArchiveItemPO = archiveItemByArchiveId.get(archiveId == null ? 0L : archiveId);
|
||
jxgz = (salaryArchiveItemPO == null || !NumberUtils.isCreatable(salaryArchiveItemPO.getItemValue())) ? "0" : new BigDecimal(salaryArchiveItemPO.getItemValue()).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP).toString();
|
||
// 获取薪资核算结果
|
||
singleAcctResultMap = acctResultMapByEmpId.get(Utils.null2String(employee.getEmployeeId()));
|
||
|
||
sb.append("(")
|
||
.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
|
||
.append(employee.getWorkcode()).append("',")
|
||
.append(employee.getEmployeeId()).append(",")
|
||
.append(employee.getDepartmentId()).append(",")
|
||
.append(employee.getJobtitleId()).append(",'")
|
||
.append(salaryMonth).append("','")
|
||
.append(Utils.null2String(employee.getLtCbzx())).append("',")
|
||
.append(jxgz);
|
||
for (LtSalaryReportConfigDTO dto : reportConfigs) {
|
||
BigDecimal val = new BigDecimal("0");
|
||
if (singleAcctResultMap != null) {
|
||
String valStr = Utils.null2String(singleAcctResultMap.getOrDefault(Utils.null2String(dto.getItem()), "0"));
|
||
if (NumberUtils.isCreatable(valStr)) {
|
||
val = new BigDecimal(valStr);
|
||
}
|
||
}
|
||
sb.append(",").append(val.toPlainString());
|
||
}
|
||
sb.append("),");
|
||
}
|
||
rs.execute(sb.substring(0,sb.length()-1).toString());
|
||
}
|
||
// 权限重构
|
||
log.info("部门工资奖金明细表计提min{} max{} ",minId,maxId);
|
||
if (modeId != null && NumberUtils.isCreatable(modeId)) {
|
||
Integer modeIdValue = Integer.valueOf(modeId);
|
||
for (int i = minId; i <= maxId; i++) {
|
||
ModeRightInfo ModeRightInfo = new ModeRightInfo();
|
||
ModeRightInfo.setNewRight(true);
|
||
ModeRightInfo.editModeDataShare(1, modeIdValue, i);
|
||
}
|
||
}
|
||
return "success";
|
||
}
|
||
|
||
@Override
|
||
public String ltGenBmgzjjmxSf(String salaryMonth) {
|
||
if (!SalaryDateUtil.checkYearMonth(salaryMonth)) {
|
||
throw new SalaryRunTimeException("年月错误");
|
||
}
|
||
YearMonth yearMonth = SalaryDateUtil.String2YearMonth(salaryMonth);
|
||
// 查询需要生成哪些浮动薪资项目
|
||
BaseBean baseBean = new BaseBean();
|
||
String configStr = baseBean.getPropValue("ltSalaryReport", "bmsbmxb_ys_config");
|
||
List<LtSalaryReportConfigDTO> configs = JsonUtil.parseList(configStr, LtSalaryReportConfigDTO.class);
|
||
String gjjConfigStr = baseBean.getPropValue("ltSalaryReport", "bmgjjmxb_ys_config");
|
||
configs.addAll(JsonUtil.parseList(gjjConfigStr, LtSalaryReportConfigDTO.class));
|
||
List<Long> variableItemIds = configs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList());
|
||
// 获取浮动档案
|
||
List<Map<String, Object>> variableMapList = getVariableArchiveService(user).listBySalaryMonthAndItems(yearMonth, variableItemIds);
|
||
log.info("部门工资奖金明细表实发size{} ",variableMapList == null ? 0 : variableMapList.size());
|
||
// 获取直接人工工资分摊表的人
|
||
String dataSourceId = baseBean.getPropValue("ltSalaryReport", "zjrycqgsft_data_source_id");
|
||
RecordSetDataSource extRs = new RecordSetDataSource(dataSourceId);
|
||
extRs.execute(" select month, user_code from dws_oa.work_hour_apportion_report where month='"+salaryMonth+"'");
|
||
List<String> needExcludeWorkCodeList = new ArrayList<>();
|
||
while (extRs.next()) {
|
||
needExcludeWorkCodeList.add(extRs.getString("user_code"));
|
||
}
|
||
if (CollectionUtils.isNotEmpty(needExcludeWorkCodeList)) {
|
||
// 获取需要去除的人员id
|
||
List<String> excludeEmpIds = getSalaryEmployeeService(user).listByWorkCodes(needExcludeWorkCodeList).stream().map(emp -> Utils.null2String(emp.getEmployeeId())).collect(Collectors.toList());
|
||
variableMapList = variableMapList.stream().filter(map -> !excludeEmpIds.contains(Utils.null2String(map.get("employeeId")))).collect(Collectors.toList());
|
||
}
|
||
log.info("部门工资奖金明细表实发size afterexclude{} ",variableMapList == null ? 0 : variableMapList.size());
|
||
|
||
// 过滤数据,不能所有值为0或空
|
||
List<String> keyList = configs.stream().map(dto -> dto.getItem() + "_variableItem").collect(Collectors.toList());
|
||
variableMapList = variableMapList.stream().filter(map -> {
|
||
for (String key : keyList) {
|
||
String val = Utils.null2String(map.get(key));
|
||
if (StringUtils.isNotBlank(val) && NumberUtils.isCreatable(val) && new BigDecimal(val).compareTo(BigDecimal.ZERO) != 0) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}).collect(Collectors.toList());
|
||
if (CollectionUtils.isEmpty(variableMapList)) {
|
||
return null;
|
||
}
|
||
log.info("部门工资奖金明细表实发size afterexclude2{} ",variableMapList.size());
|
||
List<Long> employeeIdList = variableMapList.stream().map(m -> Utils.null2String(m.get("employeeId")))
|
||
.filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
|
||
|
||
// 查询生成的报表映射关系
|
||
String reportConfigStr = baseBean.getPropValue("ltSalaryReport", "bmgzjjmxbsf_ys_config");
|
||
List<LtSalaryReportConfigDTO> reportConfigs = JsonUtil.parseList(reportConfigStr, LtSalaryReportConfigDTO.class);
|
||
List<Long> salaryItemIds = reportConfigs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList());
|
||
List<SalaryItemPO> salaryItemList = getSalaryItemService(user).listByIds(salaryItemIds);
|
||
// 查询薪资核算结果(包含未归档)
|
||
Date salaryMonthDate = SalaryDateUtil.localDateToDate(yearMonth.atDay(1));
|
||
List<SalaryAcctRecordPO> salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalaryMonth(LocalDateRange.builder().fromDate(salaryMonthDate).endDate(salaryMonthDate).build());
|
||
// 账套范围
|
||
List<Long> sobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "bmgzjjmxbsf_sob_ids").split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
salaryAcctRecordList = salaryAcctRecordList.stream().filter(record -> sobIds.contains(record.getSalarySobId())).collect(Collectors.toList());
|
||
if (CollectionUtils.isEmpty(salaryAcctRecordList)) {
|
||
return "success";
|
||
}
|
||
List<Long> salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||
List<SalaryAcctEmployeePO> salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIdsAndEmployeeIds(salaryAcctRecordIds, employeeIdList);
|
||
List<DataCollectionEmployee> employeeList = getSalaryEmployeeService(user).listByIds(employeeIdList);
|
||
// 查询薪资核算结果
|
||
List<Long> salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
|
||
List<SalaryAcctResultPO> acctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, salaryItemIds);
|
||
List<TaxAgentPO> taxAgentPOS = getTaxAgentService(user).listAll();
|
||
List<Map<String, Object>> acctResultMap = SalaryAcctResultBO.buildTableData(salaryItemList, Collections.emptyList(), employeeList, salaryAcctEmployeeList,
|
||
acctResultList, taxAgentPOS, Collections.emptySet(), Collections.emptyMap(), Collections.emptyMap(), false);
|
||
Map<String, Map<String, Object>> acctResultMapByEmpId = SalaryEntityUtil.convert2Map(acctResultMap, m -> Utils.null2String(m.get("employeeId")));
|
||
|
||
// 查询员工薪资档案
|
||
List<SalaryArchivePO> salaryArchiveList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().employeeIds(employeeIdList).build());
|
||
Map<String, Long> archiveIdMap = SalaryEntityUtil.convert2Map(salaryArchiveList, archive -> archive.getTaxAgentId() + "_" + archive.getEmployeeId(), archive -> archive.getId());
|
||
List<Long> salaryArchiveIds = salaryArchiveList.stream().map(SalaryArchivePO::getId).collect(Collectors.toList());
|
||
// 查询档案中对应的绩效工资
|
||
Long jdjxItemId = NumberUtils.isCreatable(baseBean.getPropValue("ltSalaryReport", "jdjx_item_id")) ? Long.valueOf(baseBean.getPropValue("ltSalaryReport", "jdjx_item_id")) : 0L;
|
||
Date lastDayOfMonth = SalaryDateUtil.getLastDayOfMonth(salaryMonthDate);
|
||
List<SalaryArchiveItemPO> salaryArchiveItemCurrentList = getSalaryArchiveItemService(user).getEffectiveItemListBySalaryMonth(salaryArchiveIds, Collections.singletonList(jdjxItemId), lastDayOfMonth);
|
||
Map<Long, SalaryArchiveItemPO> archiveItemByArchiveId = SalaryEntityUtil.convert2Map(salaryArchiveItemCurrentList, archive -> archive.getSalaryArchiveId());
|
||
|
||
// 查询快照表中人员信息
|
||
Map<Long, DataCollectionEmployee> employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).snapshot(employeeIdList, SalaryDateUtil.localDateToDate(yearMonth.atDay(1))), DataCollectionEmployee::getEmployeeId);
|
||
|
||
// 入库
|
||
// 删除建模数据
|
||
RecordSet rs = new RecordSet();
|
||
rs.execute("delete from uf_bmjjjt where xzszy = '" + salaryMonth+ "'");
|
||
// 插入建模
|
||
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
|
||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||
String currTime = String.format("'%s'", sdf.format(new Date()));
|
||
// 获取建模模块id
|
||
String modeId = baseBean.getPropValue("ltSalaryReport", "bmgzjjmxbsf_mode_id");
|
||
// 先插入一条数据
|
||
Map<String, Object> firstData = variableMapList.get(0);
|
||
StringBuilder firstSb = new StringBuilder();
|
||
String fieldStr = reportConfigs.stream().map(LtSalaryReportConfigDTO::getField).collect(Collectors.joining(","));
|
||
DataCollectionEmployee employee = employeeMap.getOrDefault(firstData.get("employeeId"), DataCollectionEmployee.builder().build());
|
||
// 获取员工档案绩效工资
|
||
Long archiveId = archiveIdMap.get(Utils.null2String(firstData.get("taxAgentId")) + "_" + employee.getEmployeeId());
|
||
SalaryArchiveItemPO salaryArchiveItemPO = archiveItemByArchiveId.get(archiveId == null ? 0L : archiveId);
|
||
String jxgz = (salaryArchiveItemPO == null || !NumberUtils.isCreatable(salaryArchiveItemPO.getItemValue())) ? "0" : new BigDecimal(salaryArchiveItemPO.getItemValue()).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP).toString();
|
||
// 获取薪资核算结果
|
||
Map<String, Object> singleAcctResultMap = acctResultMapByEmpId.get(Utils.null2String(employee.getEmployeeId()));
|
||
firstSb.append("insert into uf_bmjjsf(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,bm,gw,xzszy,cbzx,jdjxgzbz3,"+fieldStr+") values (");
|
||
firstSb.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
|
||
.append(employee.getWorkcode()).append("',")
|
||
.append(employee.getEmployeeId()).append(",")
|
||
.append(employee.getDepartmentId()).append(",")
|
||
.append(employee.getJobtitleId()).append(",'")
|
||
.append(salaryMonth).append("','")
|
||
.append(Utils.null2String(employee.getLtCbzx())).append("',")
|
||
.append(jxgz);
|
||
|
||
for (LtSalaryReportConfigDTO dto : reportConfigs) {
|
||
BigDecimal val = new BigDecimal("0");
|
||
if (singleAcctResultMap != null) {
|
||
String valStr = Utils.null2String(singleAcctResultMap.getOrDefault(Utils.null2String(dto.getItem()), "0"));
|
||
if (NumberUtils.isCreatable(valStr)) {
|
||
val = new BigDecimal(valStr);
|
||
}
|
||
}
|
||
firstSb.append(",").append(val.toPlainString());
|
||
}
|
||
firstSb.append(")");
|
||
rs.execute(firstSb.toString());
|
||
variableMapList.remove(0);
|
||
// 获取最大值 作为权限重构的起始id
|
||
rs.execute("select max(id) from uf_bmjjsf");
|
||
int minId = 0;
|
||
if (rs.next()) {
|
||
minId = rs.getInt(1);
|
||
}
|
||
int maxId = minId + variableMapList.size();
|
||
|
||
|
||
List<List<Map<String, Object>>> partition = Lists.partition(variableMapList, 500);
|
||
for (List<Map<String, Object>> part : partition) {
|
||
StringBuilder sb = new StringBuilder();
|
||
sb.append("insert into uf_bmjjsf(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,bm,gw,xzszy,cbzx,jdjxgzbz3,"+fieldStr+") values ");
|
||
for (Map<String, Object> data : part) {
|
||
employee = employeeMap.getOrDefault(data.get("employeeId"), DataCollectionEmployee.builder().build());
|
||
// 获取员工档案绩效工资
|
||
archiveId = archiveIdMap.get(Utils.null2String(data.get("taxAgentId")) + "_" + employee.getEmployeeId());
|
||
salaryArchiveItemPO = archiveItemByArchiveId.get(archiveId == null ? 0L : archiveId);
|
||
jxgz = (salaryArchiveItemPO == null || !NumberUtils.isCreatable(salaryArchiveItemPO.getItemValue())) ? "0" : new BigDecimal(salaryArchiveItemPO.getItemValue()).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP).toString();
|
||
// 获取薪资核算结果
|
||
singleAcctResultMap = acctResultMapByEmpId.get(Utils.null2String(employee.getEmployeeId()));
|
||
|
||
sb.append("(")
|
||
.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
|
||
.append(employee.getWorkcode()).append("',")
|
||
.append(employee.getEmployeeId()).append(",")
|
||
.append(employee.getDepartmentId()).append(",")
|
||
.append(employee.getJobtitleId()).append(",'")
|
||
.append(salaryMonth).append("','")
|
||
.append(Utils.null2String(employee.getLtCbzx())).append("',")
|
||
.append(jxgz);
|
||
for (LtSalaryReportConfigDTO dto : reportConfigs) {
|
||
BigDecimal val = new BigDecimal("0");
|
||
if (singleAcctResultMap != null) {
|
||
String valStr = Utils.null2String(singleAcctResultMap.getOrDefault(Utils.null2String(dto.getItem()), "0"));
|
||
if (NumberUtils.isCreatable(valStr)) {
|
||
val = new BigDecimal(valStr);
|
||
}
|
||
}
|
||
sb.append(",").append(val.toPlainString());
|
||
}
|
||
sb.append("),");
|
||
}
|
||
rs.execute(sb.substring(0,sb.length()-1).toString());
|
||
}
|
||
// 权限重构
|
||
log.info("部门工资奖金明细表实发min{} max{} ",minId,maxId);
|
||
if (modeId != null && NumberUtils.isCreatable(modeId)) {
|
||
Integer modeIdValue = Integer.valueOf(modeId);
|
||
for (int i = minId; i <= maxId; i++) {
|
||
ModeRightInfo ModeRightInfo = new ModeRightInfo();
|
||
ModeRightInfo.setNewRight(true);
|
||
ModeRightInfo.editModeDataShare(1, modeIdValue, i);
|
||
}
|
||
}
|
||
return "success";
|
||
}
|
||
|
||
/**
|
||
* 联特表5 - 生成人员明细工资计提表
|
||
* @param salaryMonth
|
||
* @return
|
||
*/
|
||
@Override
|
||
public String ltGenRymxgzjt(String salaryMonth) {
|
||
if (!SalaryDateUtil.checkYearMonth(salaryMonth)) {
|
||
throw new SalaryRunTimeException("年月错误");
|
||
}
|
||
YearMonth yearMonth = SalaryDateUtil.String2YearMonth(salaryMonth);
|
||
BaseBean baseBean = new BaseBean();
|
||
// 查询生成的报表映射关系
|
||
String reportConfigStr = baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_ys_config");
|
||
List<LtSalaryReportConfigDTO> reportConfigs = JsonUtil.parseList(reportConfigStr, LtSalaryReportConfigDTO.class);
|
||
List<Long> salaryItemIds = reportConfigs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList());
|
||
List<SalaryItemPO> salaryItemList = getSalaryItemService(user).listByIds(salaryItemIds);
|
||
// 查询薪资核算结果(包含未归档)
|
||
Date salaryMonthDate = SalaryDateUtil.localDateToDate(yearMonth.atDay(1));
|
||
List<SalaryAcctRecordPO> salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalaryMonth(LocalDateRange.builder().fromDate(salaryMonthDate).endDate(salaryMonthDate).build());
|
||
// 账套范围
|
||
List<Long> sobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_sob_ids").split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
salaryAcctRecordList = salaryAcctRecordList.stream().filter(sob -> sobIds.contains(sob.getSalarySobId())).collect(Collectors.toList());
|
||
if (CollectionUtils.isEmpty(salaryAcctRecordList)) {
|
||
return "success";
|
||
}
|
||
List<Long> salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||
List<SalaryAcctEmployeePO> salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds);
|
||
List<Long> employeeIdList = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).distinct().collect(Collectors.toList());
|
||
List<DataCollectionEmployee> employeeList = getSalaryEmployeeService(user).listByIds(employeeIdList);
|
||
// 查询薪资核算结果
|
||
List<Long> salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
|
||
List<SalaryAcctResultPO> acctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, salaryItemIds);
|
||
List<TaxAgentPO> taxAgentPOS = getTaxAgentService(user).listAll();
|
||
List<Map<String, Object>> acctResultMap = SalaryAcctResultBO.buildTableData(salaryItemList, Collections.emptyList(), employeeList, salaryAcctEmployeeList,
|
||
acctResultList, taxAgentPOS, Collections.emptySet(), Collections.emptyMap(), Collections.emptyMap(), false);
|
||
Map<String, Map<String, Object>> acctResultMapByAcctEmpId = SalaryEntityUtil.convert2Map(acctResultMap, m -> Utils.null2String(m.get("id")));
|
||
|
||
// 查询员工薪资档案
|
||
List<SalaryArchivePO> salaryArchiveList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().employeeIds(employeeIdList).build());
|
||
Map<String, Long> archiveIdMap = SalaryEntityUtil.convert2Map(salaryArchiveList, archive -> archive.getTaxAgentId() + "_" + archive.getEmployeeId(), archive -> archive.getId());
|
||
List<Long> salaryArchiveIds = salaryArchiveList.stream().map(SalaryArchivePO::getId).collect(Collectors.toList());
|
||
// 查询档案中对应的绩效值
|
||
Long jdItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_jdjxgzbz_item_id"));
|
||
Long bndItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_bndjxgzbz_item_id"));
|
||
Long nzjItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_nzjbz_item_id"));
|
||
List<Long> archiveItemIds = Arrays.asList(jdItemId, bndItemId, nzjItemId);
|
||
Date lastDayOfMonth = SalaryDateUtil.getLastDayOfMonth(salaryMonthDate);
|
||
List<SalaryArchiveItemPO> salaryArchiveItemCurrentList = getSalaryArchiveItemService(user).getEffectiveItemListBySalaryMonth(salaryArchiveIds, archiveItemIds, lastDayOfMonth);
|
||
Map<Long, List<SalaryArchiveItemPO>> archiveItemGroupByArchiveId = SalaryEntityUtil.group2Map(salaryArchiveItemCurrentList, archive -> archive.getSalaryArchiveId());
|
||
|
||
// 查询快照表中人员信息
|
||
Map<Long, DataCollectionEmployee> employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).snapshot(employeeIdList, SalaryDateUtil.localDateToDate(yearMonth.atDay(1))), DataCollectionEmployee::getEmployeeId);
|
||
|
||
|
||
// 入库
|
||
// 删除建模数据
|
||
RecordSet rs = new RecordSet();
|
||
rs.execute("delete from uf_mxgzbjt where qj = '" + salaryMonth+ "'");
|
||
// 插入建模
|
||
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
|
||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||
String currTime = String.format("'%s'", sdf.format(new Date()));
|
||
// 获取建模模块id
|
||
String modeId = baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_mode_id");
|
||
// 先插入一条数据
|
||
SalaryAcctEmployeePO salaryAcctEmp = salaryAcctEmployeeList.get(0);
|
||
StringBuilder firstSb = new StringBuilder();
|
||
String fieldStr = reportConfigs.stream().map(LtSalaryReportConfigDTO::getField).collect(Collectors.joining(","));
|
||
DataCollectionEmployee employee = employeeMap.getOrDefault(salaryAcctEmp.getEmployeeId(), DataCollectionEmployee.builder().build());
|
||
// 获取员工档案绩效工资
|
||
Long archiveId = archiveIdMap.get(salaryAcctEmp.getTaxAgentId()+ "_" + salaryAcctEmp.getEmployeeId());
|
||
List<SalaryArchiveItemPO> salaryArchiveItemList = archiveItemGroupByArchiveId.get(archiveId == null ? 0L : archiveId);
|
||
String jx = "0";
|
||
String jdjx = "0";
|
||
String bndjx = "0";
|
||
String nzj = "0";
|
||
if (CollectionUtils.isNotEmpty(salaryArchiveItemList)) {
|
||
Map<Long, String> archiveValueMap = SalaryEntityUtil.convert2Map(salaryArchiveItemList, SalaryArchiveItemPO::getSalaryItemId, SalaryArchiveItemPO::getItemValue);
|
||
BigDecimal jdBzValue = SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId));
|
||
BigDecimal bndBzValue = SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(bndItemId));
|
||
int monthValue = yearMonth.getMonthValue();
|
||
// 绩效
|
||
if (monthValue >=1 && monthValue <= 6) {
|
||
// 1-6月,季度绩效工资标准/3+半年度绩效工资标准/6 档案
|
||
jx = jdBzValue.divide(new BigDecimal("3"), 15, RoundingMode.HALF_UP)
|
||
.add(bndBzValue.divide(new BigDecimal("6"), 15, RoundingMode.HALF_UP))
|
||
.setScale(2, RoundingMode.HALF_UP).toPlainString();
|
||
} else if (monthValue >=7 && monthValue <= 9) {
|
||
// 7-9月,季度绩效工资标准/3 档案
|
||
jx = jdBzValue.divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP).toPlainString();
|
||
}
|
||
// 季度绩效
|
||
if (monthValue == 3 || monthValue == 6 || monthValue == 9) {
|
||
jdjx = jdBzValue.toString();
|
||
// 半年度绩效
|
||
if (monthValue == 6) {
|
||
bndjx = bndBzValue.toString();
|
||
}
|
||
}
|
||
// 年终奖
|
||
if (monthValue == 12) {
|
||
nzj = bndBzValue.toString();
|
||
}
|
||
}
|
||
// 获取薪资核算结果
|
||
Map<String, Object> singleAcctResultMap = acctResultMapByAcctEmpId.get(Utils.null2String(salaryAcctEmp.getId()));
|
||
firstSb.append("insert into uf_mxgzbjt(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,szfb,szbm,szgw,rylx,qj,cbzx,ydjx,jdjx,bndjx,nzj,"+fieldStr+") values (");
|
||
firstSb.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
|
||
.append(employee.getWorkcode()).append("',")
|
||
.append(employee.getEmployeeId()).append(",")
|
||
.append(employee.getSubcompanyid()).append(",")
|
||
.append(employee.getDepartmentId()).append(",")
|
||
.append(employee.getJobtitleId()).append(",")
|
||
.append(employee.getLtRylb()).append(",'")
|
||
.append(salaryMonth).append("','")
|
||
.append(Utils.null2String(employee.getLtCbzx())).append("',")
|
||
.append(jx).append(",").append(jdjx).append(",").append(bndjx).append(",").append(nzj);
|
||
|
||
for (LtSalaryReportConfigDTO dto : reportConfigs) {
|
||
BigDecimal val = new BigDecimal("0");
|
||
String textVal = "";
|
||
if (singleAcctResultMap != null) {
|
||
String valStr = Utils.null2String(singleAcctResultMap.getOrDefault(Utils.null2String(dto.getItem()), "0"));
|
||
if (dto.getText() == null || !dto.getText().equals(1)) {
|
||
if (NumberUtils.isCreatable(valStr)) {
|
||
val = new BigDecimal(valStr);
|
||
}
|
||
} else {
|
||
textVal = valStr;
|
||
}
|
||
|
||
}
|
||
if (dto.getText() == null || !dto.getText().equals(1)) {
|
||
firstSb.append(",").append(val.toPlainString());
|
||
} else {
|
||
firstSb.append(",'").append(textVal).append("'");
|
||
}
|
||
}
|
||
firstSb.append(")");
|
||
rs.execute(firstSb.toString());
|
||
salaryAcctEmployeeList.remove(0);
|
||
// 获取最大值 作为权限重构的起始id
|
||
rs.execute("select max(id) from uf_mxgzbjt");
|
||
int minId = 0;
|
||
if (rs.next()) {
|
||
minId = rs.getInt(1);
|
||
}
|
||
int maxId = minId + salaryAcctEmployeeList.size();
|
||
|
||
|
||
List<List<SalaryAcctEmployeePO>> partition = Lists.partition(salaryAcctEmployeeList, 500);
|
||
for (List<SalaryAcctEmployeePO> part : partition) {
|
||
StringBuilder sb = new StringBuilder();
|
||
sb.append("insert into uf_mxgzbjt(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,szfb,szbm,szgw,rylx,qj,cbzx,ydjx,jdjx,bndjx,nzj,"+fieldStr+") values ");
|
||
for (SalaryAcctEmployeePO salaryAcctEmployeePO : part) {
|
||
employee = employeeMap.getOrDefault(salaryAcctEmployeePO.getEmployeeId(), DataCollectionEmployee.builder().build());
|
||
singleAcctResultMap = acctResultMapByAcctEmpId.get(Utils.null2String(salaryAcctEmployeePO.getId()));
|
||
// 获取员工档案绩效工资
|
||
archiveId = archiveIdMap.get(salaryAcctEmployeePO.getTaxAgentId()+ "_" + salaryAcctEmployeePO.getEmployeeId());
|
||
salaryArchiveItemList = archiveItemGroupByArchiveId.get(archiveId == null ? 0L : archiveId);
|
||
jx = "0";
|
||
jdjx = "0";
|
||
bndjx = "0";
|
||
nzj = "0";
|
||
if (CollectionUtils.isNotEmpty(salaryArchiveItemList)) {
|
||
Map<Long, String> archiveValueMap = SalaryEntityUtil.convert2Map(salaryArchiveItemList, SalaryArchiveItemPO::getSalaryItemId, SalaryArchiveItemPO::getItemValue);
|
||
BigDecimal jdBzValue = SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId));
|
||
BigDecimal bndBzValue = SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(bndItemId));
|
||
int monthValue = yearMonth.getMonthValue();
|
||
// 绩效
|
||
if (monthValue >=1 && monthValue <= 6) {
|
||
// 1-6月,季度绩效工资标准/3+半年度绩效工资标准/6 档案
|
||
jx = jdBzValue.divide(new BigDecimal("3"), 15, RoundingMode.HALF_UP)
|
||
.add(bndBzValue.divide(new BigDecimal("6"), 15, RoundingMode.HALF_UP))
|
||
.setScale(2, RoundingMode.HALF_UP).toPlainString();
|
||
} else if (monthValue >=7 && monthValue <= 9) {
|
||
// 7-9月,季度绩效工资标准/3 档案
|
||
jx = jdBzValue.divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP).toPlainString();
|
||
}
|
||
// 季度绩效
|
||
if (monthValue == 3 || monthValue == 6 || monthValue == 9) {
|
||
jdjx = jdBzValue.toString();
|
||
// 半年度绩效
|
||
if (monthValue == 6) {
|
||
bndjx = bndBzValue.toString();
|
||
}
|
||
}
|
||
// 年终奖
|
||
if (monthValue == 12) {
|
||
nzj = bndBzValue.toString();
|
||
}
|
||
}
|
||
|
||
sb.append("(").append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
|
||
.append(employee.getWorkcode()).append("',")
|
||
.append(employee.getEmployeeId()).append(",")
|
||
.append(employee.getSubcompanyid()).append(",")
|
||
.append(employee.getDepartmentId()).append(",")
|
||
.append(employee.getJobtitleId()).append(",")
|
||
.append(employee.getLtRylb()).append(",'")
|
||
.append(salaryMonth).append("','")
|
||
.append(Utils.null2String(employee.getLtCbzx())).append("',")
|
||
.append(jx).append(",").append(jdjx).append(",").append(bndjx).append(",").append(nzj);
|
||
|
||
for (LtSalaryReportConfigDTO dto : reportConfigs) {
|
||
BigDecimal val = new BigDecimal("0");
|
||
String textVal = "";
|
||
if (singleAcctResultMap != null) {
|
||
String valStr = Utils.null2String(singleAcctResultMap.getOrDefault(Utils.null2String(dto.getItem()), "0"));
|
||
if (dto.getText() == null || !dto.getText().equals(1)) {
|
||
if (NumberUtils.isCreatable(valStr)) {
|
||
val = new BigDecimal(valStr);
|
||
}
|
||
} else {
|
||
textVal = valStr;
|
||
}
|
||
}
|
||
if (dto.getText() == null || !dto.getText().equals(1)) {
|
||
sb.append(",").append(val.toPlainString());
|
||
} else {
|
||
sb.append(",'").append(textVal).append("'");
|
||
}
|
||
}
|
||
sb.append("),");
|
||
}
|
||
rs.execute(sb.substring(0,sb.length()-1).toString());
|
||
}
|
||
// 权限重构
|
||
log.info("人员明细工资计提min{} max{} ",minId,maxId);
|
||
if (modeId != null && NumberUtils.isCreatable(modeId)) {
|
||
Integer modeIdValue = Integer.valueOf(modeId);
|
||
for (int i = minId; i <= maxId; i++) {
|
||
ModeRightInfo ModeRightInfo = new ModeRightInfo();
|
||
ModeRightInfo.setNewRight(true);
|
||
ModeRightInfo.editModeDataShare(1, modeIdValue, i);
|
||
}
|
||
}
|
||
return "success";
|
||
}
|
||
|
||
/**
|
||
* 联特表6 - 生成人员明细工资实发表
|
||
* @param salaryMonth
|
||
* @return
|
||
*/
|
||
@Override
|
||
public String ltGenRymxgzsf(String salaryMonth) {
|
||
if (!SalaryDateUtil.checkYearMonth(salaryMonth)) {
|
||
throw new SalaryRunTimeException("年月错误");
|
||
}
|
||
YearMonth yearMonth = SalaryDateUtil.String2YearMonth(salaryMonth);
|
||
BaseBean baseBean = new BaseBean();
|
||
// 查询生成的报表映射关系
|
||
String reportConfigStr = baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_ys_config");
|
||
List<LtSalaryReportConfigDTO> reportConfigs = JsonUtil.parseList(reportConfigStr, LtSalaryReportConfigDTO.class);
|
||
List<Long> salaryItemIds = reportConfigs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList());
|
||
List<SalaryItemPO> salaryItemList = getSalaryItemService(user).listByIds(salaryItemIds);
|
||
// 查询薪资核算结果(包含未归档)
|
||
Date salaryMonthDate = SalaryDateUtil.localDateToDate(yearMonth.atDay(1));
|
||
List<SalaryAcctRecordPO> salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalaryMonth(LocalDateRange.builder().fromDate(salaryMonthDate).endDate(salaryMonthDate).build());
|
||
// 月薪账套范围
|
||
List<Long> sobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_sob_ids").split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
salaryAcctRecordList = salaryAcctRecordList.stream().filter(sob -> sobIds.contains(sob.getSalarySobId())).collect(Collectors.toList());
|
||
if (CollectionUtils.isEmpty(salaryAcctRecordList)) {
|
||
return "success";
|
||
}
|
||
List<Long> salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||
List<SalaryAcctEmployeePO> salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds);
|
||
List<Long> employeeIdList = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).distinct().collect(Collectors.toList());
|
||
List<DataCollectionEmployee> employeeList = getSalaryEmployeeService(user).listByIds(employeeIdList);
|
||
// 查询薪资核算结果
|
||
List<Long> salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
|
||
List<SalaryAcctResultPO> acctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, salaryItemIds);
|
||
List<TaxAgentPO> taxAgentPOS = getTaxAgentService(user).listAll();
|
||
List<Map<String, Object>> acctResultMap = SalaryAcctResultBO.buildTableData(salaryItemList, Collections.emptyList(), employeeList, salaryAcctEmployeeList,
|
||
acctResultList, taxAgentPOS, Collections.emptySet(), Collections.emptyMap(), Collections.emptyMap(), false);
|
||
Map<String, Map<String, Object>> acctResultMapByKey = SalaryEntityUtil.convert2Map(acctResultMap, m -> Utils.null2String(m.get("taxAgentId")) + "_split" +Utils.null2String(m.get("employeeId")));
|
||
|
||
List<String> keyList = new ArrayList<>();
|
||
Set<Long> totalEmpIds = new HashSet<>();
|
||
keyList.addAll(acctResultMapByKey.keySet());
|
||
totalEmpIds.addAll(employeeIdList);
|
||
int monthValue = yearMonth.getMonthValue();
|
||
List<SalaryAcctRecordPO> allRecordList = getSalaryAcctRecordService(user).listBySalaryMonth(LocalDateRange.builder().fromDate(salaryMonthDate).endDate(salaryMonthDate).build());
|
||
// 处理季度绩效账套
|
||
Map<String, Map<String, Object>> jdAcctResultMapByKey = new HashMap<>();
|
||
Long jdjxItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_jdjxgz_item_id"));
|
||
if (monthValue == 3 || monthValue == 6 || monthValue == 9) {
|
||
List<Long> jdSobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_jdjx_sob_ids").split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
List<SalaryAcctRecordPO> jdRecordList = allRecordList.stream().filter(sob -> jdSobIds.contains(sob.getSalarySobId())).collect(Collectors.toList());
|
||
if (CollectionUtils.isNotEmpty(jdRecordList)) {
|
||
SalaryItemPO jdSalaryItemPO = getSalaryItemService(user).getById(jdjxItemId);
|
||
List<Long> jdRecordIds = jdRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||
List<SalaryAcctEmployeePO> jdAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(jdRecordIds);
|
||
List<Long> jdEmployeeIdList = jdAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).distinct().collect(Collectors.toList());
|
||
List<DataCollectionEmployee> jdEmployeeList = getSalaryEmployeeService(user).listByIds(jdEmployeeIdList);
|
||
// 查询薪资核算结果
|
||
List<Long> jdSalaryAcctEmpIds = jdAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
|
||
List<SalaryAcctResultPO> jdAcctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(jdSalaryAcctEmpIds, Collections.singletonList(jdjxItemId));
|
||
List<Map<String, Object>> jdAcctResultMap = SalaryAcctResultBO.buildTableData(Collections.singletonList(jdSalaryItemPO), Collections.emptyList(), jdEmployeeList, jdAcctEmployeeList,
|
||
jdAcctResultList, taxAgentPOS, Collections.emptySet(), Collections.emptyMap(), Collections.emptyMap(), false);
|
||
jdAcctResultMapByKey = SalaryEntityUtil.convert2Map(jdAcctResultMap, m -> Utils.null2String(m.get("taxAgentId")) + "_split" + Utils.null2String(m.get("employeeId")));
|
||
keyList.addAll(jdAcctResultMapByKey.keySet());
|
||
totalEmpIds.addAll(jdEmployeeIdList);
|
||
}
|
||
}
|
||
|
||
// 处理半年度绩效账套
|
||
Map<String, Map<String, Object>> bndAcctResultMapByKey = new HashMap<>();
|
||
Long bndItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_bndjxgz_item_id"));
|
||
if (monthValue == 6) {
|
||
List<Long> bndSobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_bndjx_sob_ids").split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
List<SalaryAcctRecordPO> bndRecordList = allRecordList.stream().filter(sob -> bndSobIds.contains(sob.getSalarySobId())).collect(Collectors.toList());
|
||
if (CollectionUtils.isNotEmpty(bndRecordList)) {
|
||
|
||
SalaryItemPO bndSalaryItemPO = getSalaryItemService(user).getById(bndItemId);
|
||
List<Long> bndRecordIds = bndRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||
List<SalaryAcctEmployeePO> bndAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(bndRecordIds);
|
||
List<Long> bndEmployeeIdList = bndAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).distinct().collect(Collectors.toList());
|
||
List<DataCollectionEmployee> bndEmployeeList = getSalaryEmployeeService(user).listByIds(bndEmployeeIdList);
|
||
// 查询薪资核算结果
|
||
List<Long> bndSalaryAcctEmpIds = bndAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
|
||
List<SalaryAcctResultPO> bndAcctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(bndSalaryAcctEmpIds, Collections.singletonList(bndItemId));
|
||
List<Map<String, Object>> bndAcctResultMap = SalaryAcctResultBO.buildTableData(Collections.singletonList(bndSalaryItemPO), Collections.emptyList(), bndEmployeeList, bndAcctEmployeeList,
|
||
bndAcctResultList, taxAgentPOS, Collections.emptySet(), Collections.emptyMap(), Collections.emptyMap(), false);
|
||
bndAcctResultMapByKey = SalaryEntityUtil.convert2Map(bndAcctResultMap, m -> Utils.null2String(m.get("taxAgentId")) + "_split" + Utils.null2String(m.get("employeeId")));
|
||
keyList.addAll(bndAcctResultMapByKey.keySet());
|
||
totalEmpIds.addAll(bndEmployeeIdList);
|
||
}
|
||
}
|
||
// 处理年终奖账套
|
||
Map<String, Map<String, Object>> nzjAcctResultMapByKey = new HashMap<>();
|
||
List<Long> nzjSobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_nz_sob_ids").split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
List<SalaryAcctRecordPO> nzjRecordList = allRecordList.stream().filter(sob -> nzjSobIds.contains(sob.getSalarySobId())).collect(Collectors.toList());
|
||
Long nzjItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_nzj_item_id"));
|
||
if (CollectionUtils.isNotEmpty(nzjRecordList)) {
|
||
SalaryItemPO nzjSalaryItemPO = getSalaryItemService(user).getById(nzjItemId);
|
||
List<Long> nzjRecordIds = nzjRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||
List<SalaryAcctEmployeePO> nzjAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(nzjRecordIds);
|
||
List<Long> nzjEmployeeIdList = nzjAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).distinct().collect(Collectors.toList());
|
||
List<DataCollectionEmployee> nzjEmployeeList = getSalaryEmployeeService(user).listByIds(nzjEmployeeIdList);
|
||
// 查询薪资核算结果
|
||
List<Long> nzjSalaryAcctEmpIds = nzjAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
|
||
List<SalaryAcctResultPO> nzjAcctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(nzjSalaryAcctEmpIds, Collections.singletonList(nzjItemId));
|
||
List<Map<String, Object>> nzjAcctResultMap = SalaryAcctResultBO.buildTableData(Collections.singletonList(nzjSalaryItemPO), Collections.emptyList(), nzjEmployeeList, nzjAcctEmployeeList,
|
||
nzjAcctResultList, taxAgentPOS, Collections.emptySet(), Collections.emptyMap(), Collections.emptyMap(), false);
|
||
nzjAcctResultMapByKey = SalaryEntityUtil.convert2Map(nzjAcctResultMap, m -> Utils.null2String(m.get("taxAgentId")) + "_split" + Utils.null2String(m.get("employeeId")));
|
||
keyList.addAll(nzjAcctResultMapByKey.keySet());
|
||
totalEmpIds.addAll(nzjEmployeeIdList);
|
||
}
|
||
// 去重
|
||
keyList = keyList.stream().distinct().collect(Collectors.toList());
|
||
|
||
// 查询快照表中人员信息
|
||
Map<Long, DataCollectionEmployee> employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).snapshot(totalEmpIds.stream().collect(Collectors.toList()), SalaryDateUtil.localDateToDate(yearMonth.atDay(1))), DataCollectionEmployee::getEmployeeId);
|
||
|
||
// 入库
|
||
// 删除建模数据
|
||
RecordSet rs = new RecordSet();
|
||
rs.execute("delete from uf_rymxgzsf where qj = '" + salaryMonth+ "'");
|
||
// 插入建模
|
||
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
|
||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||
String currTime = String.format("'%s'", sdf.format(new Date()));
|
||
// 获取建模模块id
|
||
String modeId = baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_mode_id");
|
||
// 先插入一条数据
|
||
String key = keyList.get(0);
|
||
StringBuilder firstSb = new StringBuilder();
|
||
String fieldStr = reportConfigs.stream().map(LtSalaryReportConfigDTO::getField).collect(Collectors.joining(","));
|
||
String[] split = key.split("_split");
|
||
Long empId = split != null && split.length > 1 ? SalaryEntityUtil.string2LongDefault0(split[1]) : 0L;
|
||
DataCollectionEmployee employee = employeeMap.getOrDefault(empId, DataCollectionEmployee.builder().build());
|
||
|
||
// 获取薪资核算结果
|
||
Map<String, Object> singleAcctResultMap = acctResultMapByKey.getOrDefault(key, new HashMap<>());
|
||
Map<String, Object> singleJdAcctResultMap = jdAcctResultMapByKey.getOrDefault(key, new HashMap<>());
|
||
String jdjx = NumberUtils.isCreatable(Utils.null2String(singleJdAcctResultMap.get(jdjxItemId.toString()))) ? Utils.null2String(singleJdAcctResultMap.get(jdjxItemId.toString())) : "0";
|
||
Map<String, Object> singleBndAcctResultMap = bndAcctResultMapByKey.getOrDefault(key, new HashMap<>());
|
||
String bndjx = NumberUtils.isCreatable(Utils.null2String(singleBndAcctResultMap.get(bndItemId.toString()))) ? Utils.null2String(singleBndAcctResultMap.get(bndItemId.toString())) : "0";
|
||
Map<String, Object> singleNzjAcctResultMap = nzjAcctResultMapByKey.getOrDefault(key, new HashMap<>());
|
||
String nzj = NumberUtils.isCreatable(Utils.null2String(singleNzjAcctResultMap.get(nzjItemId.toString()))) ? Utils.null2String(singleNzjAcctResultMap.get(nzjItemId.toString())) : "0";
|
||
firstSb.append("insert into uf_rymxgzsf(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,szfb,szbm,szgw,rylx,qj,cbzx,ydjx,jdjx,bndjx,nzj,"+fieldStr+") values (");
|
||
firstSb.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
|
||
.append(employee.getWorkcode()).append("',")
|
||
.append(employee.getEmployeeId()).append(",")
|
||
.append(employee.getSubcompanyid()).append(",")
|
||
.append(employee.getDepartmentId()).append(",")
|
||
.append(employee.getJobtitleId()).append(",")
|
||
.append(employee.getLtRylb()).append(",'")
|
||
.append(salaryMonth).append("','")
|
||
.append(Utils.null2String(employee.getLtCbzx())).append("',")
|
||
.append(0).append(",").append(jdjx).append(",").append(bndjx).append(",").append(nzj);
|
||
|
||
for (LtSalaryReportConfigDTO dto : reportConfigs) {
|
||
BigDecimal val = new BigDecimal("0");
|
||
String textVal = "";
|
||
if (singleAcctResultMap != null) {
|
||
String valStr = Utils.null2String(singleAcctResultMap.getOrDefault(Utils.null2String(dto.getItem()), "0"));
|
||
if (dto.getText() == null || !dto.getText().equals(1)) {
|
||
if (NumberUtils.isCreatable(valStr)) {
|
||
val = new BigDecimal(valStr);
|
||
}
|
||
} else {
|
||
textVal = valStr;
|
||
}
|
||
|
||
}
|
||
if (dto.getText() == null || !dto.getText().equals(1)) {
|
||
firstSb.append(",").append(val.toPlainString());
|
||
} else {
|
||
firstSb.append(",'").append(textVal).append("'");
|
||
}
|
||
}
|
||
firstSb.append(")");
|
||
rs.execute(firstSb.toString());
|
||
keyList.remove(0);
|
||
// 获取最大值 作为权限重构的起始id
|
||
rs.execute("select max(id) from uf_rymxgzsf");
|
||
int minId = 0;
|
||
if (rs.next()) {
|
||
minId = rs.getInt(1);
|
||
}
|
||
int maxId = minId + keyList.size();
|
||
|
||
|
||
List<List<String>> partition = Lists.partition(keyList, 500);
|
||
for (List<String> part : partition) {
|
||
StringBuilder sb = new StringBuilder();
|
||
sb.append("insert into uf_rymxgzsf(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,szfb,szbm,szgw,rylx,qj,cbzx,ydjx,jdjx,bndjx,nzj,"+fieldStr+") values ");
|
||
for (String keyStr : part) {
|
||
split = keyStr.split("_split");
|
||
empId = split != null && split.length > 1 ? SalaryEntityUtil.string2LongDefault0(split[1]) : 0L;
|
||
employee = employeeMap.getOrDefault(empId, DataCollectionEmployee.builder().build());
|
||
|
||
// 获取薪资核算结果
|
||
singleAcctResultMap = acctResultMapByKey.getOrDefault(keyStr, new HashMap<>());
|
||
singleJdAcctResultMap = jdAcctResultMapByKey.getOrDefault(keyStr, new HashMap<>());
|
||
jdjx = NumberUtils.isCreatable(Utils.null2String(singleJdAcctResultMap.get(jdjxItemId.toString()))) ? Utils.null2String(singleJdAcctResultMap.get(jdjxItemId.toString())) : "0";
|
||
singleBndAcctResultMap = bndAcctResultMapByKey.getOrDefault(keyStr, new HashMap<>());
|
||
bndjx = NumberUtils.isCreatable(Utils.null2String(singleBndAcctResultMap.get(bndItemId.toString()))) ? Utils.null2String(singleBndAcctResultMap.get(bndItemId.toString())) : "0";
|
||
singleNzjAcctResultMap = nzjAcctResultMapByKey.getOrDefault(keyStr, new HashMap<>());
|
||
nzj = NumberUtils.isCreatable(Utils.null2String(singleNzjAcctResultMap.get(nzjItemId.toString()))) ? Utils.null2String(singleNzjAcctResultMap.get(nzjItemId.toString())) : "0";
|
||
|
||
sb.append("(").append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
|
||
.append(employee.getWorkcode()).append("',")
|
||
.append(employee.getEmployeeId()).append(",")
|
||
.append(employee.getSubcompanyid()).append(",")
|
||
.append(employee.getDepartmentId()).append(",")
|
||
.append(employee.getJobtitleId()).append(",")
|
||
.append(employee.getLtRylb()).append(",'")
|
||
.append(salaryMonth).append("','")
|
||
.append(Utils.null2String(employee.getLtCbzx())).append("',")
|
||
.append(0).append(",").append(jdjx).append(",").append(bndjx).append(",").append(nzj);
|
||
|
||
for (LtSalaryReportConfigDTO dto : reportConfigs) {
|
||
BigDecimal val = new BigDecimal("0");
|
||
String textVal = "";
|
||
if (singleAcctResultMap != null) {
|
||
String valStr = Utils.null2String(singleAcctResultMap.getOrDefault(Utils.null2String(dto.getItem()), "0"));
|
||
if (dto.getText() == null || !dto.getText().equals(1)) {
|
||
if (NumberUtils.isCreatable(valStr)) {
|
||
val = new BigDecimal(valStr);
|
||
}
|
||
} else {
|
||
textVal = valStr;
|
||
}
|
||
|
||
}
|
||
if (dto.getText() == null || !dto.getText().equals(1)) {
|
||
sb.append(",").append(val.toPlainString());
|
||
} else {
|
||
sb.append(",'").append(textVal).append("'");
|
||
}
|
||
|
||
}
|
||
sb.append("),");
|
||
}
|
||
rs.execute(sb.substring(0,sb.length()-1).toString());
|
||
}
|
||
// 权限重构
|
||
log.info("人员明细工资发放min{} max{} ",minId,maxId);
|
||
if (modeId != null && NumberUtils.isCreatable(modeId)) {
|
||
Integer modeIdValue = Integer.valueOf(modeId);
|
||
for (int i = minId; i <= maxId; i++) {
|
||
ModeRightInfo ModeRightInfo = new ModeRightInfo();
|
||
ModeRightInfo.setNewRight(true);
|
||
ModeRightInfo.editModeDataShare(1, modeIdValue, i);
|
||
}
|
||
}
|
||
return "success";
|
||
}
|
||
|
||
/**
|
||
* 联特人事口径 - 生成旗下人力成本分析
|
||
* @param yearStr
|
||
*/
|
||
@Override
|
||
public String ltGenQxrlcbfx(String yearStr) {
|
||
if (!NumberUtils.isCreatable(yearStr)) {
|
||
throw new SalaryRunTimeException("参数错误错误");
|
||
}
|
||
Integer year = Integer.valueOf(yearStr);
|
||
// 获取需要生成哪个分部下的数据
|
||
BaseBean baseBean = new BaseBean();
|
||
List<Long> subcompanyIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_subcompany_ids").split(","))
|
||
.filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
for (Long subcompanyId : subcompanyIds) {
|
||
// 获取对应的预算数据
|
||
BigDecimal[] fdSum = {new BigDecimal("0")};
|
||
List<List<String>> ltYsList = getLtYsList(year, Collections.singletonList(subcompanyId), fdSum);
|
||
// 获取对应的还原预算数据
|
||
List<List<String>> ltHyysList = getLtBmhyysList(year, Collections.singletonList(subcompanyId));
|
||
|
||
// 获取旗下人力成本分析对应薪酬数据
|
||
List<List<String>> ltSalaryList = new ArrayList<>();
|
||
// 循环yearMonth当年1月到12月
|
||
List<YearMonth> yearMonths = IntStream.rangeClosed(1, 12)
|
||
.mapToObj(month -> YearMonth.of(year, month))
|
||
.collect(Collectors.toList());
|
||
for (YearMonth date : yearMonths) {
|
||
// 获取薪资核算数据
|
||
List<String> salaryDataList = getSalaryData4Qxrlcbfx(date, Collections.singletonList(subcompanyId));
|
||
ltSalaryList.add(salaryDataList);
|
||
}
|
||
// 获取建模模块id
|
||
String modeId = baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_mode_id");
|
||
// 获取建模中是否已有数据
|
||
String sql = "select id from uf_jtqxrlcbfx where fb =? and ysnf =?";
|
||
RecordSet rs = new RecordSet();
|
||
rs.executeQuery(sql, Arrays.asList(subcompanyId, year));
|
||
List<String> insertFields = Arrays.asList("yrlcbys1", "yhyys1", "ysjys1", "yycrs1", "ysjrs1", "yrlcbys2", "yhyys2", "ysjys2", "yycrs2", "ysjrs2",
|
||
"yrlcbys3", "yhyys3", "ysjys3", "yycrs3", "ysjrs3", "yrlcbys4", "yhyys4", "ysjys4", "yycrs4", "ysjrs4", "yrlcbys5", "yhyys5", "ysjys5", "yycrs5", "ysjrs5", "yrlcbys6", "yhyys6", "ysjys6", "yycrs6", "ysjrs6",
|
||
"yrlcbys7", "yhyys7", "ysjys7", "yycrs7", "ysjrs7", "yrlcbys8", "yhyys8", "ysjys8", "yycrs8", "ysjrs8", "yrlcbys9", "yhyys9", "ysjys9", "yycrs9", "ysjrs9", "yrlcbys10", "yhyys10", "ysjys10", "yycrs10", "ysjrs10",
|
||
"yrlcbys11", "yhyys11", "ysjys11", "yycrs11", "ysjrs11", "yrlcbys12", "yhyys12", "ysjys12", "yycrs12", "ysjrs12");
|
||
if (rs.next()) {
|
||
String id = rs.getString("id");
|
||
// 更新
|
||
StringBuilder updateSqlSb = new StringBuilder("update uf_jtqxrlcbfx set ");
|
||
for (int i =0; i < 12; i++) {
|
||
int finalI = i;
|
||
String ysSum = ltYsList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString();
|
||
if (i >= 3) {
|
||
ysSum = new BigDecimal(ysSum).add(fdSum[0]).toString();
|
||
}
|
||
String hySum = ltHyysList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString();
|
||
List<String> salaryResultList = ltSalaryList.get(finalI);
|
||
String salaryResultSum = salaryResultList.stream().filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString();
|
||
updateSqlSb.append(insertFields.get(i*5)).append("=").append(ysSum).append(",")
|
||
.append(insertFields.get(i*5+1)).append("=").append(hySum).append(",")
|
||
.append(insertFields.get(i*5+2)).append("=").append(salaryResultSum).append(",")
|
||
.append(insertFields.get(i*5+3)).append("=").append(ltYsList.size()).append(",")
|
||
.append(insertFields.get(i*5+4)).append("=").append(salaryResultList.size()).append(",");
|
||
}
|
||
updateSqlSb.deleteCharAt(updateSqlSb.lastIndexOf(","));
|
||
updateSqlSb.append(" where id =").append(id);
|
||
rs.execute(updateSqlSb.toString());
|
||
if (modeId != null && NumberUtils.isCreatable(modeId)) {
|
||
ModeRightInfo ModeRightInfo = new ModeRightInfo();
|
||
ModeRightInfo.setNewRight(true);
|
||
ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), Integer.valueOf(id));
|
||
}
|
||
} else {
|
||
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
|
||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||
String currTime = String.format("'%s'", sdf.format(new Date()));
|
||
|
||
// 新增
|
||
StringBuilder insertSqlSb = new StringBuilder("insert into uf_jtqxrlcbfx (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,fb,ysnf,"+StringUtils.join(insertFields, ",")+")VALUES(")
|
||
.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",").append(subcompanyId).append(",").append(year).append(",");
|
||
for (int i =0; i < 12; i++) {
|
||
int finalI = i;
|
||
String ysSum = ltYsList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"), BigDecimal::add).toString();
|
||
if (i >= 3) {
|
||
ysSum = new BigDecimal(ysSum).add(fdSum[0]).toString();
|
||
}
|
||
String hySum = ltHyysList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString();
|
||
List<String> salaryResultList = ltSalaryList.get(finalI);
|
||
String salaryResultSum = salaryResultList.stream().filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString();
|
||
insertSqlSb.append(ysSum).append(",").append(hySum).append(",").append(salaryResultSum).append(",").append(ltYsList.size()).append(",").append(salaryResultList.size()).append(",");
|
||
}
|
||
insertSqlSb.append(")");
|
||
insertSqlSb.deleteCharAt(insertSqlSb.lastIndexOf(","));
|
||
rs.execute(insertSqlSb.toString());
|
||
|
||
// 权限重构
|
||
// 获取最大值 作为权限重构的起始id
|
||
rs.execute("select max(id) from uf_jtqxrlcbfx");
|
||
int maxId = 0;
|
||
if (rs.next()) {
|
||
maxId = rs.getInt(1);
|
||
}
|
||
if (modeId != null && NumberUtils.isCreatable(modeId)) {
|
||
ModeRightInfo ModeRightInfo = new ModeRightInfo();
|
||
ModeRightInfo.setNewRight(true);
|
||
ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), maxId);
|
||
}
|
||
}
|
||
}
|
||
|
||
return "";
|
||
}
|
||
|
||
/**
|
||
* 获取旗下人力成本分析对应薪酬数据
|
||
*/
|
||
private List<String> getSalaryData4Qxrlcbfx(YearMonth yearMonth, List<Long> subcompanyIds) {
|
||
BaseBean baseBean = new BaseBean();
|
||
List<Long> salarySobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_sob_ids").split(","))
|
||
.filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
// 获取核算记录
|
||
LocalDateRange dateRange = LocalDateRange.builder().fromDate(SalaryDateUtil.toDate(yearMonth, 1)).endDate(SalaryDateUtil.toDate(yearMonth, 1)).build();
|
||
List<SalaryAcctRecordPO> salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(salarySobIds, dateRange);
|
||
List<Long> salaryAcctRecordIds = salaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||
// 获取薪资核算人员
|
||
List<SalaryAcctEmployeePO> salaryAcctEmployeeList = new ArrayList<>();
|
||
if (CollectionUtils.isNotEmpty(salaryAcctRecordIds)) {
|
||
salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds);
|
||
}
|
||
salaryAcctEmployeeList = salaryAcctEmployeeList.stream().filter(salaryAcctEmp -> subcompanyIds.contains(salaryAcctEmp.getSubcompanyId())).collect(Collectors.toList());
|
||
List<Long> salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
|
||
// 获取薪资核算结果
|
||
List<Long> needSumSalaryItemIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_sum_salary_item_ids").split(","))
|
||
.filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
List<SalaryAcctResultPO> acctResultPOList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, needSumSalaryItemIds);
|
||
Map<Long, List<SalaryAcctResultPO>> acctResultMap = SalaryEntityUtil.group2Map(acctResultPOList, SalaryAcctResultPO::getSalaryAcctEmpId);
|
||
|
||
|
||
// 查询员工薪资档案
|
||
List<Long> employeeIdList = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).collect(Collectors.toList());
|
||
List<SalaryArchivePO> salaryArchiveList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().employeeIds(employeeIdList).build());
|
||
Map<String, Long> archiveIdMap = SalaryEntityUtil.convert2Map(salaryArchiveList, archive -> archive.getTaxAgentId() + "_" + archive.getEmployeeId(), archive -> archive.getId());
|
||
List<Long> salaryArchiveIds = salaryArchiveList.stream().map(SalaryArchivePO::getId).collect(Collectors.toList());
|
||
// 查询档案中对应的绩效值
|
||
Long jdItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_jdjxgzbz_item_id"));
|
||
Long bndItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_bndjxgzbz_item_id"));
|
||
Long nzjItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_nzjbz_item_id"));
|
||
List<Long> archiveItemIds = Arrays.asList(jdItemId, bndItemId, nzjItemId);
|
||
Date lastDayOfMonth = SalaryDateUtil.getLastDayOfMonth(SalaryDateUtil.toDate(yearMonth, 1));
|
||
List<SalaryArchiveItemPO> salaryArchiveItemCurrentList = getSalaryArchiveItemService(user).getEffectiveItemListBySalaryMonth(salaryArchiveIds, archiveItemIds, lastDayOfMonth);
|
||
Map<Long, List<SalaryArchiveItemPO>> archiveItemGroupByArchiveId = SalaryEntityUtil.group2Map(salaryArchiveItemCurrentList, archive -> archive.getSalaryArchiveId());
|
||
|
||
// 如果是12月还要获取年终奖账套数据
|
||
Map<Long, List<SalaryAcctResultPO>> nzAcctResultMap = new HashMap<>();
|
||
if (yearMonth.getMonthValue() == 12) {
|
||
List<Long> nzjSobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_nz_sob_ids").split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
// 获取今年6月-明年6月之前的年终奖账套只获取一个
|
||
// 获取核算记录
|
||
LocalDateRange yearDateRange = LocalDateRange.builder().fromDate(SalaryDateUtil.toDate(yearMonth.minusMonths(6), 1)).endDate(SalaryDateUtil.toDate(yearMonth.plusMonths(6), 1)).build();
|
||
List<SalaryAcctRecordPO> nzSalaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(nzjSobIds, yearDateRange);
|
||
List<Long> nzSalaryAcctRecordIds = nzSalaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||
if (CollectionUtils.isNotEmpty(nzSalaryAcctRecordIds)) {
|
||
Long nzSalaryAcctRecordId = nzSalaryAcctRecordIds.get(0);
|
||
// 获取薪资核算人员
|
||
List<SalaryAcctEmployeePO> nzSalaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(Collections.singletonList(nzSalaryAcctRecordId));
|
||
nzSalaryAcctEmployeeList = nzSalaryAcctEmployeeList.stream().filter(salaryAcctEmp -> subcompanyIds.contains(salaryAcctEmp.getSubcompanyId())).collect(Collectors.toList());
|
||
List<Long> nzSalaryAcctEmpIds = nzSalaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
|
||
// 获取薪资核算结果
|
||
List<Long> nzNeedSumSalaryItemIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_nz_sum_salary_item_ids").split(","))
|
||
.filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
List<SalaryAcctResultPO> nzScctResultPOList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(nzSalaryAcctEmpIds, nzNeedSumSalaryItemIds);
|
||
|
||
salaryAcctEmployeeList.addAll(nzSalaryAcctEmployeeList.stream().filter(salaryAcctEmp -> !salaryAcctEmpIds.contains(salaryAcctEmp.getId())).collect(Collectors.toList()));
|
||
nzAcctResultMap = SalaryEntityUtil.group2Map(nzScctResultPOList, SalaryAcctResultPO::getSalaryAcctEmpId);
|
||
}
|
||
|
||
|
||
}
|
||
List<String> resultList = new ArrayList<>();
|
||
for (SalaryAcctEmployeePO salaryAcctEmp : salaryAcctEmployeeList) {
|
||
BigDecimal sumVal = new BigDecimal("0");
|
||
List<SalaryAcctResultPO> acctResult = acctResultMap.get(salaryAcctEmp.getId());
|
||
if (CollectionUtils.isNotEmpty(acctResult)) {
|
||
sumVal = sumVal.add(acctResult.stream().map(SalaryAcctResultPO::getResultValue)
|
||
.filter(NumberUtils::isCreatable)
|
||
.map(BigDecimal::new)
|
||
.reduce(new BigDecimal("0"), BigDecimal::add));
|
||
}
|
||
|
||
List<SalaryAcctResultPO> nzAcctResult = nzAcctResultMap.get(salaryAcctEmp.getId());
|
||
if (CollectionUtils.isNotEmpty(nzAcctResult)) {
|
||
sumVal = sumVal.add(nzAcctResult.stream().map(SalaryAcctResultPO::getResultValue)
|
||
.filter(NumberUtils::isCreatable)
|
||
.map(BigDecimal::new)
|
||
.reduce(new BigDecimal("0"), BigDecimal::add));
|
||
}
|
||
Long archiveId = archiveIdMap.get(salaryAcctEmp.getTaxAgentId() + "_" + salaryAcctEmp.getEmployeeId());
|
||
List<SalaryArchiveItemPO> salaryArchiveItemPOList = archiveItemGroupByArchiveId.get(archiveId);
|
||
if (CollectionUtils.isNotEmpty(salaryArchiveItemPOList)) {
|
||
Map<Long, String> archiveValueMap = SalaryEntityUtil.convert2Map(salaryArchiveItemPOList, SalaryArchiveItemPO::getSalaryItemId, SalaryArchiveItemPO::getItemValue);
|
||
if (yearMonth.getMonthValue() >=1 && yearMonth.getMonthValue() <= 6) {
|
||
// 季度基础/3 + 半年度基数/6
|
||
sumVal = sumVal.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId)).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP)
|
||
.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(bndItemId)).divide(new BigDecimal("6"), 2, RoundingMode.HALF_UP)));
|
||
} else if (yearMonth.getMonthValue() <= 9) {
|
||
// 季度基础/3
|
||
sumVal = sumVal.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId)).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP));
|
||
} else if (yearMonth.getMonthValue() <= 11) {
|
||
|
||
} else {
|
||
// 季度基础/3 + 半年度基数/6 +
|
||
sumVal = sumVal.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId)).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP)
|
||
.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(bndItemId)).divide(new BigDecimal("6"), 2, RoundingMode.HALF_UP)));
|
||
}
|
||
}
|
||
resultList.add(sumVal.toPlainString());
|
||
}
|
||
return resultList;
|
||
}
|
||
private Map<Long, List<String>> getSalaryData4QxrlcbfxGroupByDept(YearMonth yearMonth, List<Long> subcompanyIds) {
|
||
BaseBean baseBean = new BaseBean();
|
||
List<Long> salarySobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_sob_ids").split(","))
|
||
.filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
// 获取核算记录
|
||
LocalDateRange dateRange = LocalDateRange.builder().fromDate(SalaryDateUtil.toDate(yearMonth, 1)).endDate(SalaryDateUtil.toDate(yearMonth, 1)).build();
|
||
List<SalaryAcctRecordPO> salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(salarySobIds, dateRange);
|
||
List<Long> salaryAcctRecordIds = salaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||
// 获取薪资核算人员
|
||
List<SalaryAcctEmployeePO> salaryAcctEmployeeList = new ArrayList<>();
|
||
if (CollectionUtils.isNotEmpty(salaryAcctRecordIds)) {
|
||
salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds);
|
||
}
|
||
salaryAcctEmployeeList = salaryAcctEmployeeList.stream().filter(salaryAcctEmp -> subcompanyIds.contains(salaryAcctEmp.getSubcompanyId())).collect(Collectors.toList());
|
||
List<Long> salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
|
||
// 获取薪资核算结果
|
||
List<Long> needSumSalaryItemIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_sum_salary_item_ids").split(","))
|
||
.filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
List<SalaryAcctResultPO> acctResultPOList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, needSumSalaryItemIds);
|
||
Map<Long, List<SalaryAcctResultPO>> acctResultMap = SalaryEntityUtil.group2Map(acctResultPOList, SalaryAcctResultPO::getSalaryAcctEmpId);
|
||
|
||
|
||
// 查询员工薪资档案
|
||
List<Long> employeeIdList = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).collect(Collectors.toList());
|
||
List<SalaryArchivePO> salaryArchiveList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().employeeIds(employeeIdList).build());
|
||
Map<String, Long> archiveIdMap = SalaryEntityUtil.convert2Map(salaryArchiveList, archive -> archive.getTaxAgentId() + "_" + archive.getEmployeeId(), archive -> archive.getId());
|
||
List<Long> salaryArchiveIds = salaryArchiveList.stream().map(SalaryArchivePO::getId).collect(Collectors.toList());
|
||
// 查询档案中对应的绩效值
|
||
Long jdItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_jdjxgzbz_item_id"));
|
||
Long bndItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_bndjxgzbz_item_id"));
|
||
Long nzjItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_nzjbz_item_id"));
|
||
List<Long> archiveItemIds = Arrays.asList(jdItemId, bndItemId, nzjItemId);
|
||
Date lastDayOfMonth = SalaryDateUtil.getLastDayOfMonth(SalaryDateUtil.toDate(yearMonth, 1));
|
||
List<SalaryArchiveItemPO> salaryArchiveItemCurrentList = getSalaryArchiveItemService(user).getEffectiveItemListBySalaryMonth(salaryArchiveIds, archiveItemIds, lastDayOfMonth);
|
||
Map<Long, List<SalaryArchiveItemPO>> archiveItemGroupByArchiveId = SalaryEntityUtil.group2Map(salaryArchiveItemCurrentList, archive -> archive.getSalaryArchiveId());
|
||
|
||
// 如果是12月还要获取年终奖账套数据
|
||
Map<Long, List<SalaryAcctResultPO>> nzAcctResultMap = new HashMap<>();
|
||
if (yearMonth.getMonthValue() == 12) {
|
||
List<Long> nzjSobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_nz_sob_ids").split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
// 获取今年6月-明年6月之前的年终奖账套只获取一个
|
||
// 获取核算记录
|
||
LocalDateRange yearDateRange = LocalDateRange.builder().fromDate(SalaryDateUtil.toDate(yearMonth.minusMonths(6), 1)).endDate(SalaryDateUtil.toDate(yearMonth.plusMonths(6), 1)).build();
|
||
List<SalaryAcctRecordPO> nzSalaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(nzjSobIds, yearDateRange);
|
||
List<Long> nzSalaryAcctRecordIds = nzSalaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||
if (CollectionUtils.isNotEmpty(nzSalaryAcctRecordIds)) {
|
||
Long nzSalaryAcctRecordId = nzSalaryAcctRecordIds.get(0);
|
||
// 获取薪资核算人员
|
||
List<SalaryAcctEmployeePO> nzSalaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(Collections.singletonList(nzSalaryAcctRecordId));
|
||
nzSalaryAcctEmployeeList = nzSalaryAcctEmployeeList.stream().filter(salaryAcctEmp -> subcompanyIds.contains(salaryAcctEmp.getSubcompanyId())).collect(Collectors.toList());
|
||
List<Long> nzSalaryAcctEmpIds = nzSalaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
|
||
// 获取薪资核算结果
|
||
List<Long> nzNeedSumSalaryItemIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_nz_sum_salary_item_ids").split(","))
|
||
.filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
List<SalaryAcctResultPO> nzScctResultPOList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(nzSalaryAcctEmpIds, nzNeedSumSalaryItemIds);
|
||
|
||
salaryAcctEmployeeList.addAll(nzSalaryAcctEmployeeList.stream().filter(salaryAcctEmp -> !salaryAcctEmpIds.contains(salaryAcctEmp.getId())).collect(Collectors.toList()));
|
||
nzAcctResultMap = SalaryEntityUtil.group2Map(nzScctResultPOList, SalaryAcctResultPO::getSalaryAcctEmpId);
|
||
}
|
||
|
||
|
||
}
|
||
// List<String> resultList = new ArrayList<>();
|
||
Map<Long, List<String>> resultMap = new HashMap<>();
|
||
for (SalaryAcctEmployeePO salaryAcctEmp : salaryAcctEmployeeList) {
|
||
BigDecimal sumVal = new BigDecimal("0");
|
||
List<SalaryAcctResultPO> acctResult = acctResultMap.get(salaryAcctEmp.getId());
|
||
if (CollectionUtils.isNotEmpty(acctResult)) {
|
||
sumVal = sumVal.add(acctResult.stream().map(SalaryAcctResultPO::getResultValue)
|
||
.filter(NumberUtils::isCreatable)
|
||
.map(BigDecimal::new)
|
||
.reduce(new BigDecimal("0"), BigDecimal::add));
|
||
}
|
||
|
||
List<SalaryAcctResultPO> nzAcctResult = nzAcctResultMap.get(salaryAcctEmp.getId());
|
||
if (CollectionUtils.isNotEmpty(nzAcctResult)) {
|
||
sumVal = sumVal.add(nzAcctResult.stream().map(SalaryAcctResultPO::getResultValue)
|
||
.filter(NumberUtils::isCreatable)
|
||
.map(BigDecimal::new)
|
||
.reduce(new BigDecimal("0"), BigDecimal::add));
|
||
}
|
||
Long archiveId = archiveIdMap.get(salaryAcctEmp.getTaxAgentId() + "_" + salaryAcctEmp.getEmployeeId());
|
||
List<SalaryArchiveItemPO> salaryArchiveItemPOList = archiveItemGroupByArchiveId.get(archiveId);
|
||
if (CollectionUtils.isNotEmpty(salaryArchiveItemPOList)) {
|
||
Map<Long, String> archiveValueMap = SalaryEntityUtil.convert2Map(salaryArchiveItemPOList, SalaryArchiveItemPO::getSalaryItemId, SalaryArchiveItemPO::getItemValue);
|
||
if (yearMonth.getMonthValue() >=1 && yearMonth.getMonthValue() <= 6) {
|
||
// 季度基础/3 + 半年度基数/6
|
||
sumVal = sumVal.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId)).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP)
|
||
.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(bndItemId)).divide(new BigDecimal("6"), 2, RoundingMode.HALF_UP)));
|
||
} else if (yearMonth.getMonthValue() <= 9) {
|
||
// 季度基础/3
|
||
sumVal = sumVal.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId)).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP));
|
||
} else if (yearMonth.getMonthValue() <= 11) {
|
||
|
||
} else {
|
||
// 季度基础/3 + 半年度基数/6 +
|
||
sumVal = sumVal.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId)).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP)
|
||
.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(bndItemId)).divide(new BigDecimal("6"), 2, RoundingMode.HALF_UP)));
|
||
}
|
||
}
|
||
List<String> resultList = resultMap.computeIfAbsent(salaryAcctEmp.getDepartmentId(), k -> new ArrayList<>());
|
||
resultList.add(sumVal.toPlainString());
|
||
}
|
||
return resultMap;
|
||
}
|
||
private Map<String, List<String>> getSalaryData4QxrlcbfxGroupByFylx(YearMonth yearMonth, List<Long> subcompanyIds, Map<Long, String> fylxMap) {
|
||
BaseBean baseBean = new BaseBean();
|
||
List<Long> salarySobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_sob_ids").split(","))
|
||
.filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
// 获取核算记录
|
||
LocalDateRange dateRange = LocalDateRange.builder().fromDate(SalaryDateUtil.toDate(yearMonth, 1)).endDate(SalaryDateUtil.toDate(yearMonth, 1)).build();
|
||
List<SalaryAcctRecordPO> salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(salarySobIds, dateRange);
|
||
List<Long> salaryAcctRecordIds = salaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||
// 获取薪资核算人员
|
||
List<SalaryAcctEmployeePO> salaryAcctEmployeeList = new ArrayList<>();
|
||
if (CollectionUtils.isNotEmpty(salaryAcctRecordIds)) {
|
||
salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds);
|
||
}
|
||
salaryAcctEmployeeList = salaryAcctEmployeeList.stream().filter(salaryAcctEmp -> subcompanyIds.contains(salaryAcctEmp.getSubcompanyId())).collect(Collectors.toList());
|
||
List<Long> salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
|
||
// 获取薪资核算结果
|
||
List<Long> needSumSalaryItemIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_sum_salary_item_ids").split(","))
|
||
.filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
List<SalaryAcctResultPO> acctResultPOList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, needSumSalaryItemIds);
|
||
Map<Long, List<SalaryAcctResultPO>> acctResultMap = SalaryEntityUtil.group2Map(acctResultPOList, SalaryAcctResultPO::getSalaryAcctEmpId);
|
||
|
||
// 获取直接人员名单
|
||
List<String> zjEmpCodes = new ArrayList<>();
|
||
List<Long> zjEmpIds = new ArrayList<>();
|
||
String dataSourceId = baseBean.getPropValue("ltSalaryReport", "zjrycqgsft_data_source_id");
|
||
RecordSetDataSource extRs = new RecordSetDataSource(dataSourceId);
|
||
extRs.execute(" select month, user_code from dws_oa.work_hour_apportion_report where month='"+SalaryDateUtil.getFormatYearMonth(yearMonth)+"'");
|
||
while (extRs.next()){
|
||
zjEmpCodes.add(extRs.getString("user_code"));
|
||
}
|
||
if (CollectionUtils.isNotEmpty(zjEmpCodes)) {
|
||
zjEmpIds = getSalaryEmployeeService(user).listByWorkCodes(zjEmpCodes).stream().map(DataCollectionEmployee::getEmployeeId).collect(Collectors.toList());
|
||
}
|
||
|
||
// 查询员工薪资档案
|
||
List<Long> employeeIdList = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).collect(Collectors.toList());
|
||
List<SalaryArchivePO> salaryArchiveList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().employeeIds(employeeIdList).build());
|
||
Map<String, Long> archiveIdMap = SalaryEntityUtil.convert2Map(salaryArchiveList, archive -> archive.getTaxAgentId() + "_" + archive.getEmployeeId(), archive -> archive.getId());
|
||
List<Long> salaryArchiveIds = salaryArchiveList.stream().map(SalaryArchivePO::getId).collect(Collectors.toList());
|
||
// 查询档案中对应的绩效值
|
||
Long jdItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_jdjxgzbz_item_id"));
|
||
Long bndItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_bndjxgzbz_item_id"));
|
||
Long nzjItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_nzjbz_item_id"));
|
||
List<Long> archiveItemIds = Arrays.asList(jdItemId, bndItemId, nzjItemId);
|
||
Date lastDayOfMonth = SalaryDateUtil.getLastDayOfMonth(SalaryDateUtil.toDate(yearMonth, 1));
|
||
List<SalaryArchiveItemPO> salaryArchiveItemCurrentList = getSalaryArchiveItemService(user).getEffectiveItemListBySalaryMonth(salaryArchiveIds, archiveItemIds, lastDayOfMonth);
|
||
Map<Long, List<SalaryArchiveItemPO>> archiveItemGroupByArchiveId = SalaryEntityUtil.group2Map(salaryArchiveItemCurrentList, archive -> archive.getSalaryArchiveId());
|
||
|
||
|
||
// 如果是12月还要获取年终奖账套数据
|
||
Map<Long, List<SalaryAcctResultPO>> nzAcctResultMap = new HashMap<>();
|
||
if (yearMonth.getMonthValue() == 12) {
|
||
List<Long> nzjSobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_nz_sob_ids").split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
// 获取今年6月-明年6月之前的年终奖账套只获取一个
|
||
// 获取核算记录
|
||
LocalDateRange yearDateRange = LocalDateRange.builder().fromDate(SalaryDateUtil.toDate(yearMonth.minusMonths(6), 1)).endDate(SalaryDateUtil.toDate(yearMonth.plusMonths(6), 1)).build();
|
||
List<SalaryAcctRecordPO> nzSalaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(nzjSobIds, yearDateRange);
|
||
List<Long> nzSalaryAcctRecordIds = nzSalaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
|
||
if (CollectionUtils.isNotEmpty(nzSalaryAcctRecordIds)) {
|
||
Long nzSalaryAcctRecordId = nzSalaryAcctRecordIds.get(0);
|
||
// 获取薪资核算人员
|
||
List<SalaryAcctEmployeePO> nzSalaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(Collections.singletonList(nzSalaryAcctRecordId));
|
||
nzSalaryAcctEmployeeList = nzSalaryAcctEmployeeList.stream().filter(salaryAcctEmp -> subcompanyIds.contains(salaryAcctEmp.getSubcompanyId())).collect(Collectors.toList());
|
||
List<Long> nzSalaryAcctEmpIds = nzSalaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
|
||
// 获取薪资核算结果
|
||
List<Long> nzNeedSumSalaryItemIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_nz_sum_salary_item_ids").split(","))
|
||
.filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
List<SalaryAcctResultPO> nzScctResultPOList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(nzSalaryAcctEmpIds, nzNeedSumSalaryItemIds);
|
||
|
||
salaryAcctEmployeeList.addAll(nzSalaryAcctEmployeeList.stream().filter(salaryAcctEmp -> !salaryAcctEmpIds.contains(salaryAcctEmp.getId())).collect(Collectors.toList()));
|
||
nzAcctResultMap = SalaryEntityUtil.group2Map(nzScctResultPOList, SalaryAcctResultPO::getSalaryAcctEmpId);
|
||
}
|
||
|
||
|
||
}
|
||
// List<String> resultList = new ArrayList<>();
|
||
Map<String, List<String>> resultMap = new HashMap<>();
|
||
for (SalaryAcctEmployeePO salaryAcctEmp : salaryAcctEmployeeList) {
|
||
BigDecimal sumVal = new BigDecimal("0");
|
||
List<SalaryAcctResultPO> acctResult = acctResultMap.get(salaryAcctEmp.getId());
|
||
if (CollectionUtils.isNotEmpty(acctResult)) {
|
||
sumVal = sumVal.add(acctResult.stream().map(SalaryAcctResultPO::getResultValue)
|
||
.filter(NumberUtils::isCreatable)
|
||
.map(BigDecimal::new)
|
||
.reduce(new BigDecimal("0"), BigDecimal::add));
|
||
}
|
||
|
||
List<SalaryAcctResultPO> nzAcctResult = nzAcctResultMap.get(salaryAcctEmp.getId());
|
||
if (CollectionUtils.isNotEmpty(nzAcctResult)) {
|
||
sumVal = sumVal.add(nzAcctResult.stream().map(SalaryAcctResultPO::getResultValue)
|
||
.filter(NumberUtils::isCreatable)
|
||
.map(BigDecimal::new)
|
||
.reduce(new BigDecimal("0"), BigDecimal::add));
|
||
}
|
||
Long archiveId = archiveIdMap.get(salaryAcctEmp.getTaxAgentId() + "_" + salaryAcctEmp.getEmployeeId());
|
||
List<SalaryArchiveItemPO> salaryArchiveItemPOList = archiveItemGroupByArchiveId.get(archiveId);
|
||
if (CollectionUtils.isNotEmpty(salaryArchiveItemPOList)) {
|
||
Map<Long, String> archiveValueMap = SalaryEntityUtil.convert2Map(salaryArchiveItemPOList, SalaryArchiveItemPO::getSalaryItemId, SalaryArchiveItemPO::getItemValue);
|
||
if (yearMonth.getMonthValue() >=1 && yearMonth.getMonthValue() <= 6) {
|
||
// 季度基础/3 + 半年度基数/6
|
||
sumVal = sumVal.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId)).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP)
|
||
.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(bndItemId)).divide(new BigDecimal("6"), 2, RoundingMode.HALF_UP)));
|
||
} else if (yearMonth.getMonthValue() <= 9) {
|
||
// 季度基础/3
|
||
sumVal = sumVal.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId)).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP));
|
||
} else if (yearMonth.getMonthValue() <= 11) {
|
||
|
||
} else {
|
||
// 季度基础/3 + 半年度基数/6 +
|
||
sumVal = sumVal.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId)).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP)
|
||
.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(bndItemId)).divide(new BigDecimal("6"), 2, RoundingMode.HALF_UP)));
|
||
}
|
||
}
|
||
// 根据费用类型-部门-员工类型汇总
|
||
String yglx = zjEmpIds.contains(salaryAcctEmp.getEmployeeId()) ? "0" : "1";
|
||
String fylx = Utils.null2String(fylxMap.get(salaryAcctEmp.getDepartmentId()));
|
||
List<String> resultList = resultMap.computeIfAbsent(fylx + "_split" + salaryAcctEmp.getDepartmentId() + "_split" + yglx, k -> new ArrayList<>());
|
||
resultList.add(sumVal.toPlainString());
|
||
}
|
||
return resultMap;
|
||
}
|
||
|
||
/**
|
||
* 联特人事口径 - 生成旗下人力成本分析 获取部门还原预算数据
|
||
*/
|
||
private List<List<String>> getLtBmhyysList(int year, List<Long> subcompanyIds) {
|
||
RecordSet rs = new RecordSet();
|
||
BaseBean baseBean = new BaseBean();
|
||
List<List<String>> resultList = new ArrayList<>();
|
||
if (CollectionUtils.isEmpty(subcompanyIds)) {
|
||
return resultList;
|
||
}
|
||
// 获取分部下有哪些部门
|
||
List<Integer> departmentIds = getSalaryEmployeeService(user).listDepartmentIdBySubcompanyIds(subcompanyIds);
|
||
List<String> ysMonthFields = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_bmhyys_fields").split(",")).collect(Collectors.toList());
|
||
String sql ="select "+StringUtils.join(ysMonthFields,",")+" from uf_bmhyys where nf=? and bm in (?)";
|
||
rs.executeQuery(sql, Arrays.asList(year,StringUtils.join(departmentIds, ",")));
|
||
while (rs.next()) {
|
||
List<String> singleList = new ArrayList<>();
|
||
for (String field : ysMonthFields) {
|
||
singleList.add(rs.getString(field));
|
||
}
|
||
resultList.add(singleList);
|
||
}
|
||
return resultList;
|
||
}
|
||
private Map<Long, List<List<String>>> getLtBmhyysListGroupByDept(int year, List<Long> subcompanyIds) {
|
||
RecordSet rs = new RecordSet();
|
||
BaseBean baseBean = new BaseBean();
|
||
Map<Long, List<List<String>>> resultMap = new HashMap<>();
|
||
if (CollectionUtils.isEmpty(subcompanyIds)) {
|
||
return resultMap;
|
||
}
|
||
// 获取分部下有哪些部门
|
||
List<Integer> departmentIds = getSalaryEmployeeService(user).listDepartmentIdBySubcompanyIds(subcompanyIds);
|
||
List<String> ysMonthFields = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_bmhyys_fields").split(",")).collect(Collectors.toList());
|
||
String sql ="select bm,"+StringUtils.join(ysMonthFields,",")+" from uf_bmhyys where nf=? and bm in (?)";
|
||
rs.executeQuery(sql, Arrays.asList(year,StringUtils.join(departmentIds, ",")));
|
||
while (rs.next()) {
|
||
List<String> singleList = new ArrayList<>();
|
||
List<List<String>> singleMonthList = resultMap.computeIfAbsent(Long.valueOf(rs.getInt("bm")), k -> new ArrayList<>());
|
||
for (String field : ysMonthFields) {
|
||
singleList.add(rs.getString(field));
|
||
}
|
||
singleMonthList.add(singleList);
|
||
}
|
||
return resultMap;
|
||
}
|
||
private Map<String, List<List<String>>> getLtBmhyysListGroupByFylx(int year, List<Long> subcompanyIds) {
|
||
RecordSet rs = new RecordSet();
|
||
BaseBean baseBean = new BaseBean();
|
||
Map<String, List<List<String>>> resultMap = new HashMap<>();
|
||
if (CollectionUtils.isEmpty(subcompanyIds)) {
|
||
return resultMap;
|
||
}
|
||
// 获取分部下有哪些部门
|
||
List<Integer> departmentIds = getSalaryEmployeeService(user).listDepartmentIdBySubcompanyIds(subcompanyIds);
|
||
List<String> ysMonthFields = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_bmhyys_fields").split(",")).collect(Collectors.toList());
|
||
String sql ="select u.fylx,a.bm,a.yglx,"+StringUtils.join(ysMonthFields,",")+" from uf_bmhyys a left join uf_bmfylx u on a.bm=u.bm where a.nf=? and a.bm in (?)";
|
||
rs.executeQuery(sql, Arrays.asList(year,StringUtils.join(departmentIds, ",")));
|
||
// 根据费用类型-部门-员工类型汇总
|
||
while (rs.next()) {
|
||
List<String> singleList = new ArrayList<>();
|
||
List<List<String>> singleGroupList = resultMap.computeIfAbsent(rs.getString("fylx") + "_split" + rs.getInt("bm") + "_split" + rs.getString("yglx"), k -> new ArrayList<>());
|
||
for (String field : ysMonthFields) {
|
||
singleList.add(rs.getString(field));
|
||
}
|
||
singleGroupList.add(singleList);
|
||
}
|
||
return resultMap;
|
||
}
|
||
|
||
/**
|
||
* 联特人事口径 - 生成旗下人力成本分析 获取预算数据
|
||
*/
|
||
private List<List<String>> getLtYsList(int year, List<Long> subcompanyIds, BigDecimal[] fdbSum ) {
|
||
RecordSet rs = new RecordSet();
|
||
BaseBean baseBean = new BaseBean();
|
||
List<List<String>> resultList = new ArrayList<>();
|
||
if (CollectionUtils.isEmpty(subcompanyIds)) {
|
||
return resultList;
|
||
}
|
||
List<String> ysMonthFields = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_ys_fields").split(",")).collect(Collectors.toList());
|
||
String filedKeyStr = baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_ys_fields").replace(",", ",b.");
|
||
String sql ="SELECT b."+ filedKeyStr +" FROM uf_xcys a left join uf_xcys_dt1 b on a.id=b.mainid where a.ysnf =? and b.szfb in(?)";
|
||
rs.executeQuery(sql, Arrays.asList(year, StringUtils.join(subcompanyIds, ",")));
|
||
while (rs.next()) {
|
||
List<String> singleList = new ArrayList<>();
|
||
for (String field : ysMonthFields) {
|
||
singleList.add(rs.getString(field));
|
||
}
|
||
resultList.add(singleList);
|
||
}
|
||
|
||
// 获取分部下有哪些部门
|
||
List<Integer> departmentIds = getSalaryEmployeeService(user).listDepartmentIdBySubcompanyIds(subcompanyIds);
|
||
rs.executeQuery("select fdxcb from uf_xcys where ysnf=? and ysbm in(?)", Arrays.asList(year, StringUtils.join(departmentIds, ",")));
|
||
BigDecimal fdb = new BigDecimal("0");
|
||
while (rs.next()) {
|
||
String fdxcb = rs.getString("fdxcb");
|
||
if (NumberUtils.isCreatable(fdxcb)) {
|
||
fdb = fdb.add(new BigDecimal(fdxcb));
|
||
}
|
||
}
|
||
fdbSum[0] = fdb.divide(new BigDecimal("8"), 2, RoundingMode.HALF_UP);
|
||
|
||
return resultList;
|
||
}
|
||
private Map<Long, List<List<String>>> getLtYsListGroupByDept(int year, List<Long> subcompanyIds, BigDecimal[] fdbSum ) {
|
||
RecordSet rs = new RecordSet();
|
||
BaseBean baseBean = new BaseBean();
|
||
Map<Long, List<List<String>>> resultMap = new HashMap<>();
|
||
if (CollectionUtils.isEmpty(subcompanyIds)) {
|
||
return resultMap;
|
||
}
|
||
List<String> ysMonthFields = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_ys_fields").split(",")).collect(Collectors.toList());
|
||
String filedKeyStr = baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_ys_fields").replace(",", ",b.");
|
||
String sql ="SELECT b.bm,b."+ filedKeyStr +" FROM uf_xcys a left join uf_xcys_dt1 b on a.id=b.mainid where a.ysnf =? and b.szfb in(?)";
|
||
rs.executeQuery(sql, Arrays.asList(year, StringUtils.join(subcompanyIds, ",")));
|
||
while (rs.next()) {
|
||
List<String> singleList = new ArrayList<>();
|
||
List<List<String>> singleMonthList = resultMap.computeIfAbsent(Long.valueOf(rs.getInt("bm")), k -> new ArrayList<>());
|
||
for (String field : ysMonthFields) {
|
||
singleList.add(rs.getString(field));
|
||
}
|
||
singleMonthList.add(singleList);
|
||
}
|
||
|
||
// 获取分部下有哪些部门
|
||
List<Integer> departmentIds = getSalaryEmployeeService(user).listDepartmentIdBySubcompanyIds(subcompanyIds);
|
||
rs.executeQuery("select fdxcb from uf_xcys where ysnf=? and ysbm in(?)", Arrays.asList(year, StringUtils.join(departmentIds, ",")));
|
||
BigDecimal fdb = new BigDecimal("0");
|
||
while (rs.next()) {
|
||
String fdxcb = rs.getString("fdxcb");
|
||
if (NumberUtils.isCreatable(fdxcb)) {
|
||
fdb = fdb.add(new BigDecimal(fdxcb));
|
||
}
|
||
}
|
||
fdbSum[0] = fdb.divide(new BigDecimal("8"), 2, RoundingMode.HALF_UP);
|
||
|
||
return resultMap;
|
||
}
|
||
private Map<String, List<List<String>>> getLtYsListGroupByFylx(int year, List<Long> subcompanyIds, BigDecimal[] fdbSum ) {
|
||
RecordSet rs = new RecordSet();
|
||
BaseBean baseBean = new BaseBean();
|
||
Map<String, List<List<String>>> resultMap = new HashMap<>();
|
||
if (CollectionUtils.isEmpty(subcompanyIds)) {
|
||
return resultMap;
|
||
}
|
||
List<String> ysMonthFields = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_ys_fields").split(",")).collect(Collectors.toList());
|
||
String filedKeyStr = baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_ys_fields").replace(",", ",b.");
|
||
String sql ="SELECT b.fylx,b.ygzx,b.bm,b."+ filedKeyStr +" FROM uf_xcys a left join uf_xcys_dt1 b on a.id=b.mainid where a.ysnf =? and b.szfb in(?)";
|
||
rs.executeQuery(sql, Arrays.asList(year, StringUtils.join(subcompanyIds, ",")));
|
||
// 根据费用类型-部门-员工类型汇总
|
||
while (rs.next()) {
|
||
List<String> singleList = new ArrayList<>();
|
||
List<List<String>> singleGroupList = resultMap.computeIfAbsent(rs.getString("fylx") + "_split" + Long.valueOf(rs.getInt("bm") )+ "_split" + rs.getString("ygzx"), k -> new ArrayList<>());
|
||
for (String field : ysMonthFields) {
|
||
singleList.add(rs.getString(field));
|
||
}
|
||
singleGroupList.add(singleList);
|
||
}
|
||
|
||
// 获取分部下有哪些部门
|
||
List<Integer> departmentIds = getSalaryEmployeeService(user).listDepartmentIdBySubcompanyIds(subcompanyIds);
|
||
rs.executeQuery("select fdxcb from uf_xcys where ysnf=? and ysbm in(?)", Arrays.asList(year, StringUtils.join(departmentIds, ",")));
|
||
BigDecimal fdb = new BigDecimal("0");
|
||
while (rs.next()) {
|
||
String fdxcb = rs.getString("fdxcb");
|
||
if (NumberUtils.isCreatable(fdxcb)) {
|
||
fdb = fdb.add(new BigDecimal(fdxcb));
|
||
}
|
||
}
|
||
fdbSum[0] = fdb.divide(new BigDecimal("8"), 2, RoundingMode.HALF_UP);
|
||
|
||
return resultMap;
|
||
}
|
||
|
||
/**
|
||
* 联特人事口径 - 生成部门为单位人力成本分析
|
||
* @param yearStr
|
||
* @return
|
||
*/
|
||
@Override
|
||
public String ltGenBmwdwrlcbfx(String yearStr) {
|
||
if (!NumberUtils.isCreatable(yearStr)) {
|
||
throw new SalaryRunTimeException("参数错误错误");
|
||
}
|
||
Integer year = Integer.valueOf(yearStr);
|
||
// 获取需要生成哪个分部下的数据
|
||
BaseBean baseBean = new BaseBean();
|
||
List<Long> subcompanyIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_subcompany_ids").split(","))
|
||
.filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
for (Long subcompanyId : subcompanyIds) {
|
||
// 获取对应的预算数据
|
||
BigDecimal[] fdSum = {new BigDecimal("0")};
|
||
Map<Long, List<List<String>>> ltYsMap = getLtYsListGroupByDept(year, Collections.singletonList(subcompanyId), fdSum);
|
||
// 获取对应的还原预算数据
|
||
Map<Long, List<List<String>>> ltHyysMap = getLtBmhyysListGroupByDept(year, Collections.singletonList(subcompanyId));
|
||
|
||
// 获取旗下人力成本分析对应薪酬数据
|
||
List<Map<Long, List<String>>> ltSalaryList = new ArrayList<>();
|
||
// 循环yearMonth当年1月到12月
|
||
List<YearMonth> yearMonths = IntStream.rangeClosed(1, 12)
|
||
.mapToObj(month -> YearMonth.of(year, month))
|
||
.collect(Collectors.toList());
|
||
for (YearMonth date : yearMonths) {
|
||
// 获取薪资核算数据
|
||
Map<Long, List<String>> salaryDataMap = getSalaryData4QxrlcbfxGroupByDept(date, Collections.singletonList(subcompanyId));
|
||
ltSalaryList.add(salaryDataMap);
|
||
}
|
||
|
||
// 一共有多少部门
|
||
List<Long> departmentIds = new ArrayList<>();
|
||
departmentIds.addAll(ltYsMap.keySet());
|
||
departmentIds.addAll(ltHyysMap.keySet());
|
||
departmentIds.addAll(ltSalaryList.stream().map(m -> m.keySet()).flatMap(Collection::stream).collect(Collectors.toList()));
|
||
departmentIds = departmentIds.stream().distinct().collect(Collectors.toList());
|
||
// 获取建模模块id
|
||
String modeId = baseBean.getPropValue("ltSalaryReport", "bmwdwrlcbfx_mode_id");
|
||
// 获取建模中是否已有数据
|
||
String sql = "select id,bm from uf_bmrlcbfx where ysnf=? and bm in ("+StringUtils.join(departmentIds, ",")+")";
|
||
RecordSet rs = new RecordSet();
|
||
rs.executeQuery(sql, Arrays.asList(year));
|
||
Map<Long, Integer> existDataMap = new HashMap<>();
|
||
while (rs.next()) {
|
||
existDataMap.put(Long.valueOf(rs.getInt("bm")), rs.getInt("id"));
|
||
}
|
||
List<String> insertFields = Arrays.asList("yrlcbys1", "yhyys1", "ysjys1", "yycrs1", "ysjrs1", "yrlcbys2", "yhyys2", "ysjys2", "yycrs2", "ysjrs2",
|
||
"yrlcbys3", "yhyys3", "ysjys3", "yycrs3", "ysjrs3", "yrlcbys4", "yhyys4", "ysjys4", "yycrs4", "ysjrs4", "yrlcbys5", "yhyys5", "ysjys5", "yycrs5", "ysjrs5", "yrlcbys6", "yhyys6", "ysjys6", "yycrs6", "ysjrs6",
|
||
"yrlcbys7", "yhyys7", "ysjys7", "yycrs7", "ysjrs7", "yrlcbys8", "yhyys8", "ysjys8", "yycrs8", "ysjrs8", "yrlcbys9", "yhyys9", "ysjys9", "yycrs9", "ysjrs9", "yrlcbys10", "yhyys10", "ysjys10", "yycrs10", "ysjrs10",
|
||
"yrlcbys11", "yhyys11", "ysjys11", "yycrs11", "ysjrs11", "yrlcbys12", "yhyys12", "ysjys12", "yycrs12", "ysjrs12");
|
||
|
||
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
|
||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||
String currTime = String.format("'%s'", sdf.format(new Date()));
|
||
for (Long departmentId : departmentIds) {
|
||
Integer mianId = existDataMap.get(departmentId);
|
||
if (mianId != null) {
|
||
// 更新
|
||
StringBuilder updateSqlSb = new StringBuilder("update uf_bmrlcbfx set ");
|
||
for (int i =0; i < 12; i++) {
|
||
int finalI = i;
|
||
List<List<String>> ltYsList = ltYsMap.get(departmentId) == null ? Collections.emptyList() : ltYsMap.get(departmentId);
|
||
String ysSum = ltYsList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString();
|
||
if (i >= 3) {
|
||
ysSum = new BigDecimal(ysSum).add(fdSum[0]).toString();
|
||
}
|
||
List<List<String>> ltHyysList = ltHyysMap.get(departmentId) == null ? Collections.emptyList() : ltHyysMap.get(departmentId);
|
||
String hySum = ltHyysList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString();
|
||
|
||
Map<Long, List<String>> salaryResultListMap = ltSalaryList.get(finalI);
|
||
List<String> salaryResultList = salaryResultListMap.get(departmentId) == null ? Collections.emptyList() : salaryResultListMap.get(departmentId);
|
||
String salaryResultSum = salaryResultList.stream().filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString();
|
||
updateSqlSb.append(insertFields.get(i*5)).append("=").append(ysSum).append(",")
|
||
.append(insertFields.get(i*5+1)).append("=").append(hySum).append(",")
|
||
.append(insertFields.get(i*5+2)).append("=").append(salaryResultSum).append(",")
|
||
.append(insertFields.get(i*5+3)).append("=").append(ltYsList.size()).append(",")
|
||
.append(insertFields.get(i*5+4)).append("=").append(salaryResultList.size()).append(",");
|
||
}
|
||
updateSqlSb.deleteCharAt(updateSqlSb.lastIndexOf(","));
|
||
updateSqlSb.append(" where id =").append(mianId);
|
||
rs.execute(updateSqlSb.toString());
|
||
if (modeId != null && NumberUtils.isCreatable(modeId)) {
|
||
ModeRightInfo ModeRightInfo = new ModeRightInfo();
|
||
ModeRightInfo.setNewRight(true);
|
||
ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), Integer.valueOf(mianId));
|
||
}
|
||
} else{
|
||
// 插入
|
||
StringBuilder insertSqlSb = new StringBuilder("insert into uf_bmrlcbfx (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,bm,ysnf,"+StringUtils.join(insertFields, ",")+")VALUES(")
|
||
.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",").append(departmentId).append(",").append(year).append(",");
|
||
for (int i =0; i < 12; i++) {
|
||
int finalI = i;
|
||
List<List<String>> ltYsList = ltYsMap.get(departmentId) == null ? Collections.emptyList() : ltYsMap.get(departmentId);
|
||
String ysSum = ltYsList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString();
|
||
if (i >= 3) {
|
||
ysSum = new BigDecimal(ysSum).add(fdSum[0]).toString();
|
||
}
|
||
List<List<String>> ltHyysList = ltHyysMap.get(departmentId) == null ? Collections.emptyList() : ltHyysMap.get(departmentId);
|
||
String hySum = ltHyysList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString();
|
||
Map<Long, List<String>> salaryResultListMap = ltSalaryList.get(finalI);
|
||
List<String> salaryResultList = salaryResultListMap.get(departmentId) == null ? Collections.emptyList() : salaryResultListMap.get(departmentId);
|
||
String salaryResultSum = salaryResultList.stream().filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString();
|
||
|
||
insertSqlSb.append(ysSum).append(",").append(hySum).append(",").append(salaryResultSum).append(",").append(ltYsList.size()).append(",").append(salaryResultList.size()).append(",");
|
||
}
|
||
insertSqlSb.append(")");
|
||
insertSqlSb.deleteCharAt(insertSqlSb.lastIndexOf(","));
|
||
rs.execute(insertSqlSb.toString());
|
||
// 权限重构
|
||
// 获取最大值 作为权限重构的起始id
|
||
rs.execute("select max(id) from uf_bmrlcbfx");
|
||
int maxId = 0;
|
||
if (rs.next()) {
|
||
maxId = rs.getInt(1);
|
||
}
|
||
if (modeId != null && NumberUtils.isCreatable(modeId)) {
|
||
ModeRightInfo ModeRightInfo = new ModeRightInfo();
|
||
ModeRightInfo.setNewRight(true);
|
||
ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), maxId);
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
return "";
|
||
}
|
||
|
||
/**
|
||
* 联特人事口径 - 生成费用类型人力成本分析
|
||
* @param yearStr
|
||
* @return
|
||
*/
|
||
@Override
|
||
public String ltGenFylxlcbfx(String yearStr) {
|
||
if (!NumberUtils.isCreatable(yearStr)) {
|
||
throw new SalaryRunTimeException("参数错误错误");
|
||
}
|
||
Integer year = Integer.valueOf(yearStr);
|
||
// 获取需要生成哪个分部下的数据
|
||
BaseBean baseBean = new BaseBean();
|
||
List<Long> subcompanyIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_subcompany_ids").split(","))
|
||
.filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
|
||
for (Long subcompanyId : subcompanyIds) {
|
||
// 获取对应的预算数据
|
||
BigDecimal[] fdSum = {new BigDecimal("0")};
|
||
Map<String, List<List<String>>> ltYsMap = getLtYsListGroupByFylx(year, Collections.singletonList(subcompanyId), fdSum);
|
||
// 获取对应的还原预算数据
|
||
Map<String, List<List<String>>> ltHyysMap = getLtBmhyysListGroupByFylx(year, Collections.singletonList(subcompanyId));
|
||
|
||
// 获取旗下人力成本分析对应薪酬数据
|
||
List<Map<String, List<String>>> ltSalaryList = new ArrayList<>();
|
||
// 循环yearMonth当年1月到12月
|
||
List<YearMonth> yearMonths = IntStream.rangeClosed(1, 12)
|
||
.mapToObj(month -> YearMonth.of(year, month))
|
||
.collect(Collectors.toList());
|
||
// 获取部门和费用类型的关系
|
||
Map<Long, String> fylxMap = new HashMap<>();
|
||
RecordSet rs = new RecordSet();
|
||
rs.execute("select bm,fylx from uf_bmfylx");
|
||
while (rs.next()) {
|
||
fylxMap.put(Long.valueOf(rs.getInt("bm")), rs.getString("fylx"));
|
||
}
|
||
|
||
for (YearMonth date : yearMonths) {
|
||
// 获取薪资核算数据
|
||
Map<String, List<String>> salaryDataMap = getSalaryData4QxrlcbfxGroupByFylx(date, Collections.singletonList(subcompanyId), fylxMap);
|
||
ltSalaryList.add(salaryDataMap);
|
||
}
|
||
|
||
// 一共有哪些key
|
||
List<String> keyList = new ArrayList<>();
|
||
keyList.addAll(ltYsMap.keySet());
|
||
keyList.addAll(ltHyysMap.keySet());
|
||
keyList.addAll(ltSalaryList.stream().map(m -> m.keySet()).flatMap(Collection::stream).collect(Collectors.toList()));
|
||
keyList = keyList.stream().distinct().collect(Collectors.toList());
|
||
// 获取建模模块id
|
||
String modeId = baseBean.getPropValue("ltSalaryReport", "fylxrlcbfx_mode_id");
|
||
// 获取建模中是否已有数据
|
||
String sql = "select yglx,fylx,id,bm from uf_fylxrlcbfx where ysnf=?";
|
||
rs.executeQuery(sql, Arrays.asList(year));
|
||
Map<String, Integer> existDataMap = new HashMap<>();
|
||
while (rs.next()) {
|
||
existDataMap.put(rs.getString("fylx") + "_split" + rs.getString("bm")+ "_split" + rs.getString("yglx"), rs.getInt("id"));
|
||
}
|
||
List<String> insertFields = Arrays.asList("yrlcbys1", "yhyys1", "ysjys1", "yycrs1", "ysjrs1", "yrlcbys2", "yhyys2", "ysjys2", "yycrs2", "ysjrs2",
|
||
"yrlcbys3", "yhyys3", "ysjys3", "yycrs3", "ysjrs3", "yrlcbys4", "yhyys4", "ysjys4", "yycrs4", "ysjrs4", "yrlcbys5", "yhyys5", "ysjys5", "yycrs5", "ysjrs5", "yrlcbys6", "yhyys6", "ysjys6", "yycrs6", "ysjrs6",
|
||
"yrlcbys7", "yhyys7", "ysjys7", "yycrs7", "ysjrs7", "yrlcbys8", "yhyys8", "ysjys8", "yycrs8", "ysjrs8", "yrlcbys9", "yhyys9", "ysjys9", "yycrs9", "ysjrs9", "yrlcbys10", "yhyys10", "ysjys10", "yycrs10", "ysjrs10",
|
||
"yrlcbys11", "yhyys11", "ysjys11", "yycrs11", "ysjrs11", "yrlcbys12", "yhyys12", "ysjys12", "yycrs12", "ysjrs12");
|
||
|
||
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
|
||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||
String currTime = String.format("'%s'", sdf.format(new Date()));
|
||
for (String key : keyList) {
|
||
Integer mianId = existDataMap.get(key);
|
||
String[] split = key.split("_split");
|
||
String fylx = split != null && split.length > 0 ? split[0] : "";
|
||
Long departmentId = split != null && split.length > 1 ? SalaryEntityUtil.string2LongDefault0(split[1]) : 0L;
|
||
int yglx = split != null && split.length > 2 ? SalaryEntityUtil.string2LongDefault0(split[2]).intValue() : -1;
|
||
if (mianId != null) {
|
||
// 更新
|
||
StringBuilder updateSqlSb = new StringBuilder("update uf_fylxrlcbfx set ");
|
||
for (int i =0; i < 12; i++) {
|
||
int finalI = i;
|
||
List<List<String>> ltYsList = ltYsMap.get(key) == null ? Collections.emptyList() : ltYsMap.get(key);
|
||
String ysSum = ltYsList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString();
|
||
if (i >= 3) {
|
||
ysSum = new BigDecimal(ysSum).add(fdSum[0]).toString();
|
||
}
|
||
List<List<String>> ltHyysList = ltHyysMap.get(key) == null ? Collections.emptyList() : ltHyysMap.get(key);
|
||
String hySum = ltHyysList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString();
|
||
|
||
Map<String, List<String>> salaryResultListMap = ltSalaryList.get(finalI);
|
||
List<String> salaryResultList = salaryResultListMap.get(key) == null ? Collections.emptyList() : salaryResultListMap.get(key);
|
||
String salaryResultSum = salaryResultList.stream().filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString();
|
||
updateSqlSb.append(insertFields.get(i*5)).append("=").append(ysSum).append(",")
|
||
.append(insertFields.get(i*5+1)).append("=").append(hySum).append(",")
|
||
.append(insertFields.get(i*5+2)).append("=").append(salaryResultSum).append(",")
|
||
.append(insertFields.get(i*5+3)).append("=").append(ltYsList.size()).append(",")
|
||
.append(insertFields.get(i*5+4)).append("=").append(salaryResultList.size()).append(",");
|
||
}
|
||
updateSqlSb.deleteCharAt(updateSqlSb.lastIndexOf(","));
|
||
updateSqlSb.append(" where id =").append(mianId);
|
||
rs.execute(updateSqlSb.toString());
|
||
if (modeId != null && NumberUtils.isCreatable(modeId)) {
|
||
ModeRightInfo ModeRightInfo = new ModeRightInfo();
|
||
ModeRightInfo.setNewRight(true);
|
||
ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), Integer.valueOf(mianId));
|
||
}
|
||
} else{
|
||
// 插入
|
||
StringBuilder insertSqlSb = new StringBuilder("insert into uf_fylxrlcbfx (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,fylx,yglx,bm,ysnf,"+StringUtils.join(insertFields, ",")+")VALUES(")
|
||
.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'").append(fylx).append("',").append(yglx).append(",").append(departmentId).append(",").append(year).append(",");
|
||
for (int i =0; i < 12; i++) {
|
||
int finalI = i;
|
||
List<List<String>> ltYsList = ltYsMap.get(key) == null ? Collections.emptyList() : ltYsMap.get(key);
|
||
String ysSum = ltYsList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString();
|
||
if (i >= 3) {
|
||
ysSum = new BigDecimal(ysSum).add(fdSum[0]).toString();
|
||
}
|
||
List<List<String>> ltHyysList = ltHyysMap.get(key) == null ? Collections.emptyList() : ltHyysMap.get(key);
|
||
String hySum = ltHyysList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString();
|
||
Map<String, List<String>> salaryResultListMap = ltSalaryList.get(finalI);
|
||
List<String> salaryResultList = salaryResultListMap.get(key) == null ? Collections.emptyList() : salaryResultListMap.get(key);
|
||
String salaryResultSum = salaryResultList.stream().filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString();
|
||
|
||
insertSqlSb.append(ysSum).append(",").append(hySum).append(",").append(salaryResultSum).append(",").append(ltYsList.size()).append(",").append(salaryResultList.size()).append(",");
|
||
}
|
||
insertSqlSb.append(")");
|
||
insertSqlSb.deleteCharAt(insertSqlSb.lastIndexOf(","));
|
||
rs.execute(insertSqlSb.toString());
|
||
// 权限重构
|
||
// 获取最大值 作为权限重构的起始id
|
||
rs.execute("select max(id) from uf_fylxrlcbfx");
|
||
int maxId = 0;
|
||
if (rs.next()) {
|
||
maxId = rs.getInt(1);
|
||
}
|
||
if (modeId != null && NumberUtils.isCreatable(modeId)) {
|
||
ModeRightInfo ModeRightInfo = new ModeRightInfo();
|
||
ModeRightInfo.setNewRight(true);
|
||
ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), maxId);
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
return "";
|
||
}
|
||
|
||
@Override
|
||
public Map<String, Object> ltNdhzReport() {
|
||
// 获取部门为单位的人力成本分析数据
|
||
RecordSet rs = new RecordSet();
|
||
rs.execute("select bm,ysnf,ysjys1,ysjys2,ysjys3,ysjys4,ysjys5,ysjys6,ysjys7,ysjys8,ysjys9,ysjys10,ysjys11,ysjys12 from uf_bmrlcbfx ");
|
||
List<LtNdhzReportDTO> ltNdhzReportDTOS = new ArrayList<>();
|
||
while (rs.next()) {
|
||
BigDecimal sumVal = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys1")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys2")))
|
||
.add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys3"))).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys4")))
|
||
.add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys5"))).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys6")))
|
||
.add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys7"))).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys8")))
|
||
.add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys9"))).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys10")))
|
||
.add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys11"))).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys12")));
|
||
ltNdhzReportDTOS.add(LtNdhzReportDTO.builder().departmentId(Long.valueOf(rs.getInt("bm"))).year(rs.getInt("ysnf")).value(sumVal).build());
|
||
}
|
||
|
||
List<Integer> yearList = ltNdhzReportDTOS.stream().map(dto -> dto.getYear()).filter(y -> y != null).distinct().sorted().collect(Collectors.toList());
|
||
Map<Long, List<LtNdhzReportDTO>> group2Map = SalaryEntityUtil.group2Map(ltNdhzReportDTOS, LtNdhzReportDTO::getDepartmentId);
|
||
// 获取部门信息
|
||
List<Long> departmentIds = ltNdhzReportDTOS.stream().map(dto -> dto.getDepartmentId()).distinct().sorted().collect(Collectors.toList());
|
||
List<DeptInfo> deptInfoList = getSalaryEmployeeService(user).getDeptInfoList(departmentIds);
|
||
List<Map<String, Object>> resultList = new ArrayList<>();
|
||
Map<String, Object> sumValueMap = new HashMap<>();
|
||
for (DeptInfo deptInfo: deptInfoList) {
|
||
List<LtNdhzReportDTO> list = group2Map.get(deptInfo.getId());
|
||
if (CollectionUtils.isNotEmpty(list)) {
|
||
Map<String, Object> singleDeptMap = new HashMap<>();
|
||
for (Integer year : yearList) {
|
||
BigDecimal sumVal = list.stream().filter(dto -> dto.getYear().equals(year))
|
||
.map(LtNdhzReportDTO::getValue)
|
||
.filter(val -> val != null)
|
||
.reduce(new BigDecimal("0"), BigDecimal::add);
|
||
singleDeptMap.put(year.toString(), sumVal.toPlainString());
|
||
|
||
BigDecimal yearSumVal = SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(sumValueMap.get(year.toString())));
|
||
sumValueMap.put(year.toString(), yearSumVal.add(sumVal));
|
||
}
|
||
singleDeptMap.put("departmentName", deptInfo.getName());
|
||
resultList.add(singleDeptMap);
|
||
}
|
||
}
|
||
|
||
List<Column> columns = new ArrayList<>();
|
||
columns.add(new Column("项目","departmentName","departmentName"));
|
||
for (Integer year : yearList) {
|
||
columns.add(new Column(year+"年",year.toString(),year.toString()));
|
||
}
|
||
Map<String, Object> resultMap = new HashMap<>();
|
||
sumValueMap.put("departmentName", "总年度");
|
||
resultList.add(0, sumValueMap);
|
||
resultMap.put("data", resultList);
|
||
resultMap.put("columns", columns);
|
||
return resultMap;
|
||
}
|
||
|
||
/**
|
||
* 联特人事口径 - 看板
|
||
* @param year
|
||
* @return
|
||
*/
|
||
@Override
|
||
public String ltGenKb(String year) {
|
||
if (!NumberUtils.isCreatable(year)){
|
||
throw new SalaryRunTimeException("参数错误");
|
||
}
|
||
BaseBean baseBean = new BaseBean();
|
||
// 获取公司销售额数据
|
||
RecordSet rs = new RecordSet();
|
||
rs.execute("select gsxse from uf_gsxsedr where nf = " + year.substring(0, 4));
|
||
BigDecimal gsxse = new BigDecimal("0");
|
||
while (rs.next()) {
|
||
gsxse = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gsxse"));
|
||
}
|
||
// 获取对应年份快照数据
|
||
Date startDate = SalaryDateUtil.dateStrToLocalDate(year + "-12-01");
|
||
Date endDate = SalaryDateUtil.dateStrToLocalDate(year + "-12-31");
|
||
List<Date> snapshotTime = getHrmSnapshotMapper().getSnapshotTime(startDate, endDate);
|
||
BigDecimal empNums = new BigDecimal("0");
|
||
if (CollectionUtils.isNotEmpty(snapshotTime)) {
|
||
Date date = snapshotTime.get(0);
|
||
// 需要统计哪些人事状态的
|
||
List<Integer> empStatusList = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "kb_emp_status")
|
||
.split(",")).filter(NumberUtils::isCreatable)
|
||
.map(Integer::valueOf).collect(Collectors.toList());
|
||
empNums = SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(getHrmSnapshotMapper().countByStatusAndSnapshotTime(empStatusList, date)));
|
||
}
|
||
// 删除对应年份看板数据
|
||
rs.execute("delete from uf_kb where nf =" + year);
|
||
// 获取建模模块id
|
||
String modeId = baseBean.getPropValue("ltSalaryReport", "kb_mode_id");
|
||
// 插入数据
|
||
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
|
||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||
String currTime = String.format("'%s'", sdf.format(new Date()));
|
||
|
||
StringBuilder insertSql = new StringBuilder("insert into uf_kb (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,nf,rjcz,xse,zndrts) values (")
|
||
.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",")
|
||
.append(year).append(",").append(gsxse.divide(empNums, 2, RoundingMode.HALF_UP).toPlainString())
|
||
.append(",").append(gsxse).append(",").append(empNums.toString()).append(")");
|
||
rs.execute(insertSql.toString());
|
||
// 权限重构
|
||
// 获取最大值 作为权限重构的起始id
|
||
rs.execute("select max(id) from uf_kb");
|
||
int maxId = 0;
|
||
if (rs.next()) {
|
||
maxId = rs.getInt(1);
|
||
}
|
||
if (modeId != null && NumberUtils.isCreatable(modeId)) {
|
||
ModeRightInfo ModeRightInfo = new ModeRightInfo();
|
||
ModeRightInfo.setNewRight(true);
|
||
ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), maxId);
|
||
}
|
||
|
||
return "";
|
||
}
|
||
|
||
/**
|
||
* 联特表5 - 研发项目工资分摊表-当月计提
|
||
* @param salaryMonth
|
||
* @return
|
||
*/
|
||
@Override
|
||
public String ltGenYfxmgzftbdyjt(String salaryMonth) {
|
||
if (!SalaryDateUtil.checkYearMonth(salaryMonth)) {
|
||
throw new SalaryRunTimeException("年月错误");
|
||
}
|
||
Date salaryMonthDate = SalaryDateUtil.dateStrToLocalYearMonth(salaryMonth);
|
||
BaseBean baseBean = new BaseBean();
|
||
RecordSet rs = new RecordSet();
|
||
// 获取研发工时表对应数据
|
||
List<LtYfgsPO> yfgsList = getLtYfgsList(salaryMonthDate);
|
||
Map<Long, String> xmhMap = SalaryEntityUtil.convert2Map(yfgsList, LtYfgsPO::getXm, LtYfgsPO::getXmh);
|
||
// 获取需要统计赋值哪些字段(人员明细工资计提表 和 研发项目工资分摊表-当月计提 这些字段的数据库字段名需保持一致)
|
||
List<String> fieldList = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "yfxmgzftbdyjt_sum_fields").split(",")).filter(key -> StringUtils.isNotBlank(key)).collect(Collectors.toList());
|
||
List<String> selectFieldList = new ArrayList<>();
|
||
selectFieldList.addAll(fieldList);
|
||
selectFieldList.add("yldw");
|
||
selectFieldList.add("yldwbj");
|
||
selectFieldList.add("gsdw");
|
||
selectFieldList.add("gsdwbj");
|
||
selectFieldList.add("sydw");
|
||
selectFieldList.add("sydwbj");
|
||
selectFieldList.add("yldw1");
|
||
selectFieldList.add("yldwbj1");
|
||
selectFieldList.add("gjjdw");
|
||
selectFieldList.add("gjjdwbj");
|
||
// 获取对应期间人员明细工资计提表
|
||
rs.execute("select xm,"+ StringUtils.join(selectFieldList,",")+" from uf_mxgzbjt where qj ='" + SalaryDateUtil.getFormatYearMonth(salaryMonthDate) +"'");
|
||
HashMap<String, List<Map<String, String>>> listGroupByXmh = new HashMap<>();
|
||
while (rs.next()) {
|
||
Long xm = SalaryEntityUtil.string2LongDefault0(rs.getString("xm"));
|
||
String xmh = SalaryEntityUtil.null2String(xmhMap.get(xm));
|
||
List<Map<String, String>> xmhList = listGroupByXmh.computeIfAbsent(xmh, k -> new ArrayList<>());
|
||
Map<String, String> singleEmpValueMap = new HashMap<>();
|
||
for (String field : fieldList) {
|
||
singleEmpValueMap.put(field, Utils.null2String(rs.getString(field)));
|
||
}
|
||
// 5个写死的逻辑
|
||
BigDecimal yldw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldwbj")));
|
||
singleEmpValueMap.put("ylbxdw", yldw.toPlainString());
|
||
BigDecimal gsdw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gsdw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gsdwbj")));
|
||
singleEmpValueMap.put("gsbxdw", gsdw.toPlainString());
|
||
BigDecimal sydw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("sydw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("sydwbj")));
|
||
singleEmpValueMap.put("sybxdw", sydw.toPlainString());
|
||
BigDecimal yldw1 = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldw1")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldwbj1")));
|
||
singleEmpValueMap.put("ylbxdw1", yldw1.toPlainString());
|
||
BigDecimal gjjdw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gjjdw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gjjdwbj")));
|
||
singleEmpValueMap.put("zfgjjdw", gjjdw.toPlainString());
|
||
xmhList.add(singleEmpValueMap);
|
||
}
|
||
|
||
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
|
||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||
String currTime = String.format("'%s'", sdf.format(new Date()));
|
||
// 获取建模模块id
|
||
String modeId = baseBean.getPropValue("ltSalaryReport", "yfxmgzftbdyjt_mode_id");
|
||
// 入库前先删除
|
||
rs.execute("delete from uf_yfxmgzftbjt where qj ='" + salaryMonth +"'");
|
||
fieldList.add("ylbxdw");
|
||
fieldList.add("gsbxdw");
|
||
fieldList.add("sybxdw");
|
||
fieldList.add("ylbxdw1");
|
||
fieldList.add("zfgjjdw");
|
||
for (Map.Entry<String, List<Map<String, String>>> entry : listGroupByXmh.entrySet()) {
|
||
List<Map<String, String>> valueList = entry.getValue();
|
||
Map<String, String> sumValueMap = new HashMap<>();
|
||
for(String fieldKey : fieldList) {
|
||
BigDecimal sumVal = valueList.stream().map(valueMap -> valueMap.get(fieldKey))
|
||
.filter(NumberUtils::isCreatable)
|
||
.map(BigDecimal::new)
|
||
.reduce(new BigDecimal("0"), BigDecimal::add);
|
||
sumValueMap.put(fieldKey, sumVal.toPlainString());
|
||
}
|
||
|
||
// 入库
|
||
StringBuilder insertSqlSb = new StringBuilder("insert into uf_yfxmgzftbjt (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,qj,xmh,"+StringUtils.join(fieldList, ",")+")VALUES(")
|
||
.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'").append(salaryMonth).append("','").append(entry.getKey()).append("',");
|
||
for (String fieldKey : fieldList) {
|
||
insertSqlSb.append(SalaryEntityUtil.string2BigDecimalDefault0(sumValueMap.get(fieldKey)).toPlainString()).append(",");
|
||
}
|
||
insertSqlSb.append(")");
|
||
insertSqlSb.deleteCharAt(insertSqlSb.lastIndexOf(","));
|
||
rs.execute(insertSqlSb.toString());
|
||
// 权限重构
|
||
// 获取最大值 作为权限重构的起始id
|
||
rs.execute("select max(id) from uf_yfxmgzftbjt");
|
||
int maxId = 0;
|
||
if (rs.next()) {
|
||
maxId = rs.getInt(1);
|
||
}
|
||
if (modeId != null && NumberUtils.isCreatable(modeId)) {
|
||
ModeRightInfo ModeRightInfo = new ModeRightInfo();
|
||
ModeRightInfo.setNewRight(true);
|
||
ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), maxId);
|
||
}
|
||
}
|
||
return "";
|
||
}
|
||
|
||
/**
|
||
* 获取研发工时表对应数据
|
||
* @param salaryMonthDate
|
||
* @return
|
||
*/
|
||
private List<LtYfgsPO> getLtYfgsList(Date salaryMonthDate) {
|
||
if (salaryMonthDate == null) {
|
||
return Collections.emptyList();
|
||
}
|
||
RecordSet rs = new RecordSet();
|
||
rs.execute("select xm,xmh,xmszsyb,szfb,szbm,cbzx from uf_yfgs where qj='"+SalaryDateUtil.getFormatYearMonth(salaryMonthDate)+"'");
|
||
List<LtYfgsPO> resultList = new ArrayList<>();
|
||
while (rs.next()) {
|
||
LtYfgsPO po = new LtYfgsPO();
|
||
po.setXm(SalaryEntityUtil.string2LongDefault0(rs.getString("xm")));
|
||
po.setXmh(Utils.null2String(rs.getString("xmh")));
|
||
po.setXmszsyb(Utils.null2String(rs.getString("xmszsyb")));
|
||
po.setSzfb(SalaryEntityUtil.string2LongDefault0(rs.getString("szfb")));
|
||
po.setSzbm(SalaryEntityUtil.string2LongDefault0(rs.getString("szbm")));
|
||
po.setCbzx(Utils.null2String(rs.getString("cbzx")));
|
||
resultList.add(po);
|
||
}
|
||
return resultList;
|
||
}
|
||
|
||
/**
|
||
* 联特表5 - 研发项目工资分摊表-当月实发
|
||
* @param salaryMonth
|
||
* @return
|
||
*/
|
||
@Override
|
||
public String ltGenYfxmgzftbdysf(String salaryMonth) {
|
||
if (!SalaryDateUtil.checkYearMonth(salaryMonth)) {
|
||
throw new SalaryRunTimeException("年月错误");
|
||
}
|
||
Date salaryMonthDate = SalaryDateUtil.dateStrToLocalYearMonth(salaryMonth);
|
||
BaseBean baseBean = new BaseBean();
|
||
RecordSet rs = new RecordSet();
|
||
// 获取研发工时表对应数据
|
||
List<LtYfgsPO> yfgsList = getLtYfgsList(salaryMonthDate);
|
||
Map<Long, String> xmhMap = SalaryEntityUtil.convert2Map(yfgsList, LtYfgsPO::getXm, LtYfgsPO::getXmh);
|
||
// 获取需要统计赋值哪些字段(人员明细工资实发表 和 研发项目工资分摊表-当月实发 这些字段的数据库字段名需保持一致)
|
||
List<String> fieldList = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "yfxmgzftbdysf_sum_fields").split(",")).filter(key -> StringUtils.isNotBlank(key)).collect(Collectors.toList());
|
||
List<String> selectFieldList = new ArrayList<>();
|
||
selectFieldList.addAll(fieldList);
|
||
selectFieldList.add("yldw");
|
||
selectFieldList.add("yldwbj");
|
||
selectFieldList.add("gsdw");
|
||
selectFieldList.add("gsdwbj");
|
||
selectFieldList.add("sydw");
|
||
selectFieldList.add("sydwbj");
|
||
selectFieldList.add("yldw1");
|
||
selectFieldList.add("yldwbj1");
|
||
selectFieldList.add("gjjdw");
|
||
selectFieldList.add("gjjdwbj");
|
||
// 获取对应期间人员明细工资实发表
|
||
rs.execute("select xm,"+ StringUtils.join(selectFieldList,",")+" from uf_rymxgzsf where qj ='" + SalaryDateUtil.getFormatYearMonth(salaryMonthDate) +"'");
|
||
HashMap<String, List<Map<String, String>>> listGroupByXmh = new HashMap<>();
|
||
while (rs.next()) {
|
||
Long xm = SalaryEntityUtil.string2LongDefault0(rs.getString("xm"));
|
||
String xmh = SalaryEntityUtil.null2String(xmhMap.get(xm));
|
||
List<Map<String, String>> xmhList = listGroupByXmh.computeIfAbsent(xmh, k -> new ArrayList<>());
|
||
Map<String, String> singleEmpValueMap = new HashMap<>();
|
||
for (String field : fieldList) {
|
||
singleEmpValueMap.put(field, Utils.null2String(rs.getString(field)));
|
||
}
|
||
// 5个写死的逻辑
|
||
BigDecimal yldw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldwbj")));
|
||
singleEmpValueMap.put("ylbxdw", yldw.toPlainString());
|
||
BigDecimal gsdw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gsdw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gsdwbj")));
|
||
singleEmpValueMap.put("gsbxdw", gsdw.toPlainString());
|
||
BigDecimal sydw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("sydw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("sydwbj")));
|
||
singleEmpValueMap.put("sybxdw", sydw.toPlainString());
|
||
BigDecimal yldw1 = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldw1")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldwbj1")));
|
||
singleEmpValueMap.put("ylbxdw1", yldw1.toPlainString());
|
||
BigDecimal gjjdw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gjjdw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gjjdwbj")));
|
||
singleEmpValueMap.put("zfgjjdw", gjjdw.toPlainString());
|
||
xmhList.add(singleEmpValueMap);
|
||
}
|
||
|
||
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
|
||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||
String currTime = String.format("'%s'", sdf.format(new Date()));
|
||
// 获取建模模块id
|
||
String modeId = baseBean.getPropValue("ltSalaryReport", "yfxmgzftbdysf_mode_id");
|
||
// 入库前先删除
|
||
rs.execute("delete from uf_yfxmgzftbsf where qj ='" + salaryMonth +"'");
|
||
fieldList.add("ylbxdw");
|
||
fieldList.add("gsbxdw");
|
||
fieldList.add("sybxdw");
|
||
fieldList.add("ylbxdw1");
|
||
fieldList.add("zfgjjdw");
|
||
for (Map.Entry<String, List<Map<String, String>>> entry : listGroupByXmh.entrySet()) {
|
||
List<Map<String, String>> valueList = entry.getValue();
|
||
Map<String, String> sumValueMap = new HashMap<>();
|
||
for(String fieldKey : fieldList) {
|
||
BigDecimal sumVal = valueList.stream().map(valueMap -> valueMap.get(fieldKey))
|
||
.filter(NumberUtils::isCreatable)
|
||
.map(BigDecimal::new)
|
||
.reduce(new BigDecimal("0"), BigDecimal::add);
|
||
sumValueMap.put(fieldKey, sumVal.toPlainString());
|
||
}
|
||
|
||
// 入库
|
||
StringBuilder insertSqlSb = new StringBuilder("insert into uf_yfxmgzftbsf (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,qj,xmh,"+StringUtils.join(fieldList, ",")+")VALUES(")
|
||
.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'").append(salaryMonth).append("','").append(entry.getKey()).append("',");
|
||
for (String fieldKey : fieldList) {
|
||
insertSqlSb.append(SalaryEntityUtil.string2BigDecimalDefault0(sumValueMap.get(fieldKey)).toPlainString()).append(",");
|
||
}
|
||
insertSqlSb.append(")");
|
||
insertSqlSb.deleteCharAt(insertSqlSb.lastIndexOf(","));
|
||
rs.execute(insertSqlSb.toString());
|
||
// 权限重构
|
||
// 获取最大值 作为权限重构的起始id
|
||
rs.execute("select max(id) from uf_yfxmgzftbsf");
|
||
int maxId = 0;
|
||
if (rs.next()) {
|
||
maxId = rs.getInt(1);
|
||
}
|
||
if (modeId != null && NumberUtils.isCreatable(modeId)) {
|
||
ModeRightInfo ModeRightInfo = new ModeRightInfo();
|
||
ModeRightInfo.setNewRight(true);
|
||
ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), maxId);
|
||
}
|
||
}
|
||
return "";
|
||
}
|
||
|
||
/**
|
||
* 联特表5 - 研发项目工资分摊表
|
||
* @param salaryMonth
|
||
* @return
|
||
*/
|
||
@Override
|
||
public String ltGenYfxmgzftb(String salaryMonth) {
|
||
if (!SalaryDateUtil.checkYearMonth(salaryMonth)) {
|
||
throw new SalaryRunTimeException("年月错误");
|
||
}
|
||
Date salaryMonthDate = SalaryDateUtil.dateStrToLocalYearMonth(salaryMonth);
|
||
BaseBean baseBean = new BaseBean();
|
||
RecordSet rs = new RecordSet();
|
||
// 获取研发工时表对应数据
|
||
List<LtYfgsPO> yfgsList = getLtYfgsList(salaryMonthDate);
|
||
Map<Long, String> xmhMap = SalaryEntityUtil.convert2Map(yfgsList, LtYfgsPO::getXm, LtYfgsPO::getXmh);
|
||
|
||
// 获取对应的上月、当月对应的计提、实发 的人员明细工资表数据
|
||
Date lastMonthDate = SalaryDateUtil.localDateToDate(SalaryDateUtil.dateToLocalDate(salaryMonthDate).minusMonths(1));
|
||
// 本月计提数据
|
||
List<LtRymxgzDTO> thisMonthJtInfo = listLtRymxgzInfo(salaryMonthDate, true, xmhMap);
|
||
Map<String, List<LtRymxgzDTO>> thisMonthJtInfoMap = SalaryEntityUtil.group2Map(thisMonthJtInfo, LtRymxgzDTO::getXmh);
|
||
// 上月计提数据
|
||
List<LtRymxgzDTO> lastMonthJtInfo = listLtRymxgzInfo(lastMonthDate, true, xmhMap);
|
||
Map<String, List<LtRymxgzDTO>> lastMonthJtInfoMap = SalaryEntityUtil.group2Map(lastMonthJtInfo, LtRymxgzDTO::getXmh);
|
||
// 本月实发数据
|
||
List<LtRymxgzDTO> thisMonthSfInfo = listLtRymxgzInfo(salaryMonthDate, false, xmhMap);
|
||
Map<String, List<LtRymxgzDTO>> thisMonthSfInfoMap = SalaryEntityUtil.group2Map(thisMonthSfInfo, LtRymxgzDTO::getXmh);
|
||
// 上月实发数据
|
||
List<LtRymxgzDTO> lastMonthSfInfo = listLtRymxgzInfo(lastMonthDate, false, xmhMap);
|
||
Map<String, List<LtRymxgzDTO>> lastMonthSfInfoMap = SalaryEntityUtil.group2Map(lastMonthSfInfo, LtRymxgzDTO::getXmh);
|
||
|
||
// 获取所有的项目号
|
||
Set<String> xmhList = new HashSet<>();
|
||
xmhList.addAll(thisMonthJtInfoMap.keySet());
|
||
xmhList.addAll(lastMonthJtInfoMap.keySet());
|
||
xmhList.addAll(thisMonthSfInfoMap.keySet());
|
||
xmhList.addAll(lastMonthSfInfoMap.keySet());
|
||
|
||
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
|
||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||
String currTime = String.format("'%s'", sdf.format(new Date()));
|
||
// 获取建模模块id
|
||
String modeId = baseBean.getPropValue("ltSalaryReport", "yfxmgzftb_mode_id");
|
||
// 入库前先删除
|
||
rs.execute("delete from uf_yfxmgzftb where qj ='" + salaryMonth +"'");
|
||
YearMonth yearMonth = SalaryDateUtil.String2YearMonth(salaryMonth);
|
||
int monthValue = yearMonth.getMonthValue();
|
||
for (String xmh : xmhList) {
|
||
BigDecimal gz = new BigDecimal("0");
|
||
List<LtRymxgzDTO> thisMonthJtList = CollectionUtils.isEmpty(thisMonthJtInfoMap.get(xmh)) ? new ArrayList<>() : thisMonthJtInfoMap.get(xmh) ;
|
||
List<LtRymxgzDTO> lastMonthJtList = CollectionUtils.isEmpty(lastMonthJtInfoMap.get(xmh)) ? new ArrayList<>() : lastMonthJtInfoMap.get(xmh) ;
|
||
List<LtRymxgzDTO> thisMonthSfList = CollectionUtils.isEmpty(thisMonthSfInfoMap.get(xmh)) ? new ArrayList<>() : thisMonthSfInfoMap.get(xmh) ;
|
||
List<LtRymxgzDTO> lastMonthSfList = CollectionUtils.isEmpty(lastMonthSfInfoMap.get(xmh)) ? new ArrayList<>() : lastMonthSfInfoMap.get(xmh) ;
|
||
if (monthValue == 2 || monthValue == 3 || monthValue == 5 || monthValue == 6 || monthValue == 8 || monthValue == 9 || monthValue == 11) {
|
||
gz = gz.add(lastMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(lastMonthSfList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(thisMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getJx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
} else if (monthValue == 4 || monthValue == 7 || monthValue == 10) {
|
||
gz = gz.add(lastMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(lastMonthSfList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(thisMonthJtList.stream().map(LtRymxgzDTO::getJdjx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(thisMonthSfList.stream().map(LtRymxgzDTO::getJdjx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getJx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
} else if (monthValue == 12) {
|
||
gz = gz.add(lastMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(lastMonthSfList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(thisMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.subtract(thisMonthSfList.stream().map(LtRymxgzDTO::getNzj).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
} else {
|
||
gz = gz.add(lastMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(lastMonthSfList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(thisMonthJtList.stream().map(LtRymxgzDTO::getNzj).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(thisMonthSfList.stream().map(LtRymxgzDTO::getNzj).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getJx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
}
|
||
// 入库
|
||
StringBuilder insertSqlSb = new StringBuilder("insert into uf_yfxmgzftb (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,qj,xmh,yfgz)VALUES(")
|
||
.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'").append(salaryMonth).append("','").append(xmh).append("',").append(gz.toPlainString()).append(")");
|
||
rs.execute(insertSqlSb.toString());
|
||
// 权限重构
|
||
// 获取最大值 作为权限重构的起始id
|
||
rs.execute("select max(id) from uf_yfxmgzftb");
|
||
int maxId = 0;
|
||
if (rs.next()) {
|
||
maxId = rs.getInt(1);
|
||
}
|
||
if (modeId != null && NumberUtils.isCreatable(modeId)) {
|
||
ModeRightInfo ModeRightInfo = new ModeRightInfo();
|
||
ModeRightInfo.setNewRight(true);
|
||
ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), maxId);
|
||
}
|
||
}
|
||
return "";
|
||
}
|
||
|
||
/**
|
||
* 联特 获取人员明细工资表数据
|
||
* @param salaryMonthDate 期间
|
||
* @param isJt 是否是计提
|
||
* @return
|
||
*/
|
||
private List<LtRymxgzDTO> listLtRymxgzInfo(Date salaryMonthDate, boolean isJt, Map<Long, String> xmhMap) {
|
||
if (salaryMonthDate == null) {
|
||
return Collections.emptyList();
|
||
}
|
||
String yearMonthStr = SalaryDateUtil.getFormatYearMonth(salaryMonthDate);
|
||
List<LtRymxgzDTO> resultList = new ArrayList<>();
|
||
RecordSet rs = new RecordSet();
|
||
if (isJt) {
|
||
// 计提表取数
|
||
rs.execute("select xm,yfgz,ydjx,jdjx,nzj from uf_mxgzbjt where qj = '" + yearMonthStr + "'");
|
||
while (rs.next()) {
|
||
resultList.add(LtRymxgzDTO.builder()
|
||
.key(Utils.null2String(xmhMap.get(SalaryEntityUtil.string2LongDefault0(rs.getString("xm")))))
|
||
.xmh(Utils.null2String(xmhMap.get(SalaryEntityUtil.string2LongDefault0(rs.getString("xm")))))
|
||
.xm(SalaryEntityUtil.string2LongDefault0(rs.getString("xm")))
|
||
.gz(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yfgz")))
|
||
.jx(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ydjx")))
|
||
.jdjx(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("jdjx")))
|
||
.nzj(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("nzj")))
|
||
.build());
|
||
}
|
||
} else {
|
||
// 实发表取数
|
||
rs.execute("select xm,yfgz,ydjx,jdjx,nzj from uf_rymxgzsf where qj = '" + yearMonthStr + "'");
|
||
while (rs.next()) {
|
||
resultList.add(LtRymxgzDTO.builder()
|
||
.key(Utils.null2String(xmhMap.get(SalaryEntityUtil.string2LongDefault0(rs.getString("xm")))))
|
||
.xmh(Utils.null2String(xmhMap.get(SalaryEntityUtil.string2LongDefault0(rs.getString("xm")))))
|
||
.xm(SalaryEntityUtil.string2LongDefault0(rs.getString("xm")))
|
||
.gz(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yfgz")))
|
||
.jx(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ydjx")))
|
||
.jdjx(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("jdjx")))
|
||
.nzj(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("nzj")))
|
||
.build());
|
||
}
|
||
}
|
||
return resultList;
|
||
}
|
||
|
||
/**
|
||
* 联特表5 - 部门项目工资分摊表-计提
|
||
* @param salaryMonth
|
||
* @return
|
||
*/
|
||
@Override
|
||
public String ltGenBmyfxmgzftbjt(String salaryMonth) {
|
||
if (!SalaryDateUtil.checkYearMonth(salaryMonth)) {
|
||
throw new SalaryRunTimeException("年月错误");
|
||
}
|
||
Date salaryMonthDate = SalaryDateUtil.dateStrToLocalYearMonth(salaryMonth);
|
||
BaseBean baseBean = new BaseBean();
|
||
RecordSet rs = new RecordSet();
|
||
// 获取研发工时表对应数据
|
||
List<LtYfgsPO> yfgsList = getLtYfgsList(salaryMonthDate);
|
||
Map<Long, String> groupMap = SalaryEntityUtil.convert2Map(yfgsList, LtYfgsPO::getXm, po -> po.getCbzx() + "_split" + po.getXmh() + "_split" + po.getXmszsyb());
|
||
// 获取需要统计赋值哪些字(人员明细工资计提表 和 部门项目工资分摊表-计提 这些字段的数据库字段名需保持一致)
|
||
List<String> fieldList = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "bmxmgzftbjt_sum_fields").split(",")).filter(key -> StringUtils.isNotBlank(key)).collect(Collectors.toList());
|
||
List<String> selectFieldList = new ArrayList<>();
|
||
selectFieldList.addAll(fieldList);
|
||
selectFieldList.add("yldw");
|
||
selectFieldList.add("yldwbj");
|
||
selectFieldList.add("gsdw");
|
||
selectFieldList.add("gsdwbj");
|
||
selectFieldList.add("sydw");
|
||
selectFieldList.add("sydwbj");
|
||
selectFieldList.add("yldw1");
|
||
selectFieldList.add("yldwbj1");
|
||
selectFieldList.add("gjjdw");
|
||
selectFieldList.add("gjjdwbj");
|
||
// 获取对应期间人员明细工资计提表
|
||
rs.execute("select xm,"+ StringUtils.join(selectFieldList,",")+" from uf_mxgzbjt where qj ='" + SalaryDateUtil.getFormatYearMonth(salaryMonthDate) +"'");
|
||
HashMap<String, List<Map<String, String>>> listGroupByXmh = new HashMap<>();
|
||
while (rs.next()) {
|
||
Long xm = SalaryEntityUtil.string2LongDefault0(rs.getString("xm"));
|
||
String groupKey = SalaryEntityUtil.null2String(groupMap.get(xm));
|
||
List<Map<String, String>> groupKeyList = listGroupByXmh.computeIfAbsent(groupKey, k -> new ArrayList<>());
|
||
Map<String, String> singleEmpValueMap = new HashMap<>();
|
||
for (String field : fieldList) {
|
||
singleEmpValueMap.put(field, Utils.null2String(rs.getString(field)));
|
||
}
|
||
// 5个写死的逻辑
|
||
BigDecimal yldw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldwbj")));
|
||
singleEmpValueMap.put("ylbxdw", yldw.toPlainString());
|
||
BigDecimal gsdw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gsdw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gsdwbj")));
|
||
singleEmpValueMap.put("gsbxdw", gsdw.toPlainString());
|
||
BigDecimal sydw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("sydw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("sydwbj")));
|
||
singleEmpValueMap.put("sybxdw", sydw.toPlainString());
|
||
BigDecimal yldw1 = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldw1")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldwbj1")));
|
||
singleEmpValueMap.put("ylbxdw1", yldw1.toPlainString());
|
||
BigDecimal gjjdw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gjjdw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gjjdwbj")));
|
||
singleEmpValueMap.put("zfgjjdw", gjjdw.toPlainString());
|
||
groupKeyList.add(singleEmpValueMap);
|
||
}
|
||
|
||
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
|
||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||
String currTime = String.format("'%s'", sdf.format(new Date()));
|
||
// 获取建模模块id
|
||
String modeId = baseBean.getPropValue("ltSalaryReport", "bmxmgzftbjt_mode_id");
|
||
// 入库前先删除
|
||
rs.execute("delete from uf_bmxmgzftbjt where qj ='" + salaryMonth +"'");
|
||
fieldList.add("ylbxdw");
|
||
fieldList.add("gsbxdw");
|
||
fieldList.add("sybxdw");
|
||
fieldList.add("ylbxdw1");
|
||
fieldList.add("zfgjjdw");
|
||
for (Map.Entry<String, List<Map<String, String>>> entry : listGroupByXmh.entrySet()) {
|
||
List<Map<String, String>> valueList = entry.getValue();
|
||
Map<String, String> sumValueMap = new HashMap<>();
|
||
for(String fieldKey : fieldList) {
|
||
BigDecimal sumVal = valueList.stream().map(valueMap -> valueMap.get(fieldKey))
|
||
.filter(NumberUtils::isCreatable)
|
||
.map(BigDecimal::new)
|
||
.reduce(new BigDecimal("0"), BigDecimal::add);
|
||
sumValueMap.put(fieldKey, sumVal.toPlainString());
|
||
}
|
||
|
||
String[] split = entry.getKey().split("_split");
|
||
String cbzx = split != null && split.length > 0 ? split[0] : "";
|
||
String xmh = split != null && split.length > 1 ? split[1] : "";
|
||
String xmszsyb = split != null && split.length > 2 ? split[2] : "";
|
||
// 入库
|
||
StringBuilder insertSqlSb = new StringBuilder("insert into uf_bmxmgzftbjt (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,qj,cbzx,xmh,xmszsyb,"+StringUtils.join(fieldList, ",")+")VALUES(")
|
||
.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'").append(salaryMonth).append("','").append(cbzx).append("','").append(xmh).append("','").append(xmszsyb).append("',");
|
||
for (String fieldKey : fieldList) {
|
||
insertSqlSb.append(SalaryEntityUtil.string2BigDecimalDefault0(sumValueMap.get(fieldKey)).toPlainString()).append(",");
|
||
}
|
||
insertSqlSb.append(")");
|
||
insertSqlSb.deleteCharAt(insertSqlSb.lastIndexOf(","));
|
||
rs.execute(insertSqlSb.toString());
|
||
// 权限重构
|
||
// 获取最大值 作为权限重构的起始id
|
||
rs.execute("select max(id) from uf_bmxmgzftbjt");
|
||
int maxId = 0;
|
||
if (rs.next()) {
|
||
maxId = rs.getInt(1);
|
||
}
|
||
if (modeId != null && NumberUtils.isCreatable(modeId)) {
|
||
ModeRightInfo ModeRightInfo = new ModeRightInfo();
|
||
ModeRightInfo.setNewRight(true);
|
||
ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), maxId);
|
||
}
|
||
}
|
||
return "";
|
||
}
|
||
|
||
/**
|
||
* 联特表5 - 部门项目工资分摊表-实发
|
||
* @param salaryMonth
|
||
* @return
|
||
*/
|
||
@Override
|
||
public String ltGenBmyfxmgzftbsf(String salaryMonth) {
|
||
if (!SalaryDateUtil.checkYearMonth(salaryMonth)) {
|
||
throw new SalaryRunTimeException("年月错误");
|
||
}
|
||
Date salaryMonthDate = SalaryDateUtil.dateStrToLocalYearMonth(salaryMonth);
|
||
BaseBean baseBean = new BaseBean();
|
||
RecordSet rs = new RecordSet();
|
||
// 获取研发工时表对应数据
|
||
List<LtYfgsPO> yfgsList = getLtYfgsList(salaryMonthDate);
|
||
Map<Long, String> groupMap = SalaryEntityUtil.convert2Map(yfgsList, LtYfgsPO::getXm, po -> po.getCbzx() + "_split" + po.getXmh() + "_split" + po.getXmszsyb());
|
||
// 获取需要统计赋值哪些字(人员明细工资实发表 和 部门项目工资分摊表-实发 这些字段的数据库字段名需保持一致)
|
||
List<String> fieldList = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "bmxmgzftbsf_sum_fields").split(",")).filter(key -> StringUtils.isNotBlank(key)).collect(Collectors.toList());
|
||
List<String> selectFieldList = new ArrayList<>();
|
||
selectFieldList.addAll(fieldList);
|
||
selectFieldList.add("yldw");
|
||
selectFieldList.add("yldwbj");
|
||
selectFieldList.add("gsdw");
|
||
selectFieldList.add("gsdwbj");
|
||
selectFieldList.add("sydw");
|
||
selectFieldList.add("sydwbj");
|
||
selectFieldList.add("yldw1");
|
||
selectFieldList.add("yldwbj1");
|
||
selectFieldList.add("gjjdw");
|
||
selectFieldList.add("gjjdwbj");
|
||
// 获取对应期间人员明细工资实发表
|
||
rs.execute("select xm,"+ StringUtils.join(selectFieldList,",")+" from uf_rymxgzsf where qj ='" + SalaryDateUtil.getFormatYearMonth(salaryMonthDate) +"'");
|
||
HashMap<String, List<Map<String, String>>> listGroupByXmh = new HashMap<>();
|
||
while (rs.next()) {
|
||
Long xm = SalaryEntityUtil.string2LongDefault0(rs.getString("xm"));
|
||
String groupKey = SalaryEntityUtil.null2String(groupMap.get(xm));
|
||
List<Map<String, String>> groupKeyList = listGroupByXmh.computeIfAbsent(groupKey, k -> new ArrayList<>());
|
||
Map<String, String> singleEmpValueMap = new HashMap<>();
|
||
for (String field : fieldList) {
|
||
singleEmpValueMap.put(field, Utils.null2String(rs.getString(field)));
|
||
}
|
||
// 5个写死的逻辑
|
||
BigDecimal yldw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldwbj")));
|
||
singleEmpValueMap.put("ylbxdw", yldw.toPlainString());
|
||
BigDecimal gsdw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gsdw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gsdwbj")));
|
||
singleEmpValueMap.put("gsbxdw", gsdw.toPlainString());
|
||
BigDecimal sydw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("sydw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("sydwbj")));
|
||
singleEmpValueMap.put("sybxdw", sydw.toPlainString());
|
||
BigDecimal yldw1 = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldw1")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldwbj1")));
|
||
singleEmpValueMap.put("ylbxdw1", yldw1.toPlainString());
|
||
BigDecimal gjjdw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gjjdw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gjjdwbj")));
|
||
singleEmpValueMap.put("zfgjjdw", gjjdw.toPlainString());
|
||
groupKeyList.add(singleEmpValueMap);
|
||
}
|
||
|
||
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
|
||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||
String currTime = String.format("'%s'", sdf.format(new Date()));
|
||
// 获取建模模块id
|
||
String modeId = baseBean.getPropValue("ltSalaryReport", "bmxmgzftbsf_mode_id");
|
||
// 入库前先删除
|
||
rs.execute("delete from uf_bmxmgzftbsf where qj ='" + salaryMonth +"'");
|
||
fieldList.add("ylbxdw");
|
||
fieldList.add("gsbxdw");
|
||
fieldList.add("sybxdw");
|
||
fieldList.add("ylbxdw1");
|
||
fieldList.add("zfgjjdw");
|
||
for (Map.Entry<String, List<Map<String, String>>> entry : listGroupByXmh.entrySet()) {
|
||
List<Map<String, String>> valueList = entry.getValue();
|
||
Map<String, String> sumValueMap = new HashMap<>();
|
||
for(String fieldKey : fieldList) {
|
||
BigDecimal sumVal = valueList.stream().map(valueMap -> valueMap.get(fieldKey))
|
||
.filter(NumberUtils::isCreatable)
|
||
.map(BigDecimal::new)
|
||
.reduce(new BigDecimal("0"), BigDecimal::add);
|
||
sumValueMap.put(fieldKey, sumVal.toPlainString());
|
||
}
|
||
|
||
String[] split = entry.getKey().split("_split");
|
||
String cbzx = split != null && split.length > 0 ? split[0] : "";
|
||
String xmh = split != null && split.length > 1 ? split[1] : "";
|
||
String xmszsyb = split != null && split.length > 2 ? split[2] : "";
|
||
// 入库
|
||
StringBuilder insertSqlSb = new StringBuilder("insert into uf_bmxmgzftbsf (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,qj,cbzx,xmh,xmszsyb,"+StringUtils.join(fieldList, ",")+")VALUES(")
|
||
.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'").append(salaryMonth).append("','").append(cbzx).append("','").append(xmh).append("','").append(xmszsyb).append("',");
|
||
for (String fieldKey : fieldList) {
|
||
insertSqlSb.append(SalaryEntityUtil.string2BigDecimalDefault0(sumValueMap.get(fieldKey)).toPlainString()).append(",");
|
||
}
|
||
insertSqlSb.append(")");
|
||
insertSqlSb.deleteCharAt(insertSqlSb.lastIndexOf(","));
|
||
rs.execute(insertSqlSb.toString());
|
||
// 权限重构
|
||
// 获取最大值 作为权限重构的起始id
|
||
rs.execute("select max(id) from uf_bmxmgzftbsf");
|
||
int maxId = 0;
|
||
if (rs.next()) {
|
||
maxId = rs.getInt(1);
|
||
}
|
||
if (modeId != null && NumberUtils.isCreatable(modeId)) {
|
||
ModeRightInfo ModeRightInfo = new ModeRightInfo();
|
||
ModeRightInfo.setNewRight(true);
|
||
ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), maxId);
|
||
}
|
||
}
|
||
return "";
|
||
}
|
||
|
||
@Override
|
||
public String ltGenBmxmgzftb(String salaryMonth) {
|
||
if (!SalaryDateUtil.checkYearMonth(salaryMonth)) {
|
||
throw new SalaryRunTimeException("年月错误");
|
||
}
|
||
Date salaryMonthDate = SalaryDateUtil.dateStrToLocalYearMonth(salaryMonth);
|
||
BaseBean baseBean = new BaseBean();
|
||
RecordSet rs = new RecordSet();
|
||
// 获取研发工时表对应数据
|
||
List<LtYfgsPO> yfgsList = getLtYfgsList(salaryMonthDate);
|
||
Map<Long, String> groupMap = SalaryEntityUtil.convert2Map(yfgsList, LtYfgsPO::getXm, po -> po.getCbzx() + "_split" + po.getXmh() + "_split" + po.getXmszsyb());
|
||
|
||
// 获取对应的上月、当月对应的计提、实发 的人员明细工资表数据
|
||
Date lastMonthDate = SalaryDateUtil.localDateToDate(SalaryDateUtil.dateToLocalDate(salaryMonthDate).minusMonths(1));
|
||
// 本月计提数据
|
||
List<LtRymxgzDTO> thisMonthJtInfo = listLtRymxgzInfo(salaryMonthDate, true, groupMap);
|
||
Map<String, List<LtRymxgzDTO>> thisMonthJtInfoMap = SalaryEntityUtil.group2Map(thisMonthJtInfo, LtRymxgzDTO::getKey);
|
||
// 上月计提数据
|
||
List<LtRymxgzDTO> lastMonthJtInfo = listLtRymxgzInfo(lastMonthDate, true, groupMap);
|
||
Map<String, List<LtRymxgzDTO>> lastMonthJtInfoMap = SalaryEntityUtil.group2Map(lastMonthJtInfo, LtRymxgzDTO::getKey);
|
||
// 本月实发数据
|
||
List<LtRymxgzDTO> thisMonthSfInfo = listLtRymxgzInfo(salaryMonthDate, false, groupMap);
|
||
Map<String, List<LtRymxgzDTO>> thisMonthSfInfoMap = SalaryEntityUtil.group2Map(thisMonthSfInfo, LtRymxgzDTO::getKey);
|
||
// 上月实发数据
|
||
List<LtRymxgzDTO> lastMonthSfInfo = listLtRymxgzInfo(lastMonthDate, false, groupMap);
|
||
Map<String, List<LtRymxgzDTO>> lastMonthSfInfoMap = SalaryEntityUtil.group2Map(lastMonthSfInfo, LtRymxgzDTO::getKey);
|
||
|
||
// 获取所有的项目号
|
||
Set<String> keyList = new HashSet<>();
|
||
keyList.addAll(thisMonthJtInfoMap.keySet());
|
||
keyList.addAll(lastMonthJtInfoMap.keySet());
|
||
keyList.addAll(thisMonthSfInfoMap.keySet());
|
||
keyList.addAll(lastMonthSfInfoMap.keySet());
|
||
|
||
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
|
||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||
String currTime = String.format("'%s'", sdf.format(new Date()));
|
||
// 获取建模模块id
|
||
String modeId = baseBean.getPropValue("ltSalaryReport", "bmxmgzftb_mode_id");
|
||
// 入库前先删除
|
||
rs.execute("delete from uf_bmxmfzftb where qj ='" + salaryMonth +"'");
|
||
YearMonth yearMonth = SalaryDateUtil.String2YearMonth(salaryMonth);
|
||
int monthValue = yearMonth.getMonthValue();
|
||
for (String key : keyList) {
|
||
BigDecimal gz = new BigDecimal("0");
|
||
List<LtRymxgzDTO> thisMonthJtList = CollectionUtils.isEmpty(thisMonthJtInfoMap.get(key)) ? new ArrayList<>() : thisMonthJtInfoMap.get(key) ;
|
||
List<LtRymxgzDTO> lastMonthJtList = CollectionUtils.isEmpty(lastMonthJtInfoMap.get(key)) ? new ArrayList<>() : lastMonthJtInfoMap.get(key) ;
|
||
List<LtRymxgzDTO> thisMonthSfList = CollectionUtils.isEmpty(thisMonthSfInfoMap.get(key)) ? new ArrayList<>() : thisMonthSfInfoMap.get(key) ;
|
||
List<LtRymxgzDTO> lastMonthSfList = CollectionUtils.isEmpty(lastMonthSfInfoMap.get(key)) ? new ArrayList<>() : lastMonthSfInfoMap.get(key) ;
|
||
if (monthValue == 2 || monthValue == 3 || monthValue == 5 || monthValue == 6 || monthValue == 8 || monthValue == 9 || monthValue == 11) {
|
||
gz = gz.add(lastMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(lastMonthSfList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(thisMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getJx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
} else if (monthValue == 4 || monthValue == 7 || monthValue == 10) {
|
||
gz = gz.add(lastMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(lastMonthSfList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(thisMonthJtList.stream().map(LtRymxgzDTO::getJdjx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(thisMonthSfList.stream().map(LtRymxgzDTO::getJdjx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getJx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
} else if (monthValue == 12) {
|
||
gz = gz.add(lastMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(lastMonthSfList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(thisMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.subtract(thisMonthSfList.stream().map(LtRymxgzDTO::getNzj).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
} else {
|
||
gz = gz.add(lastMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(lastMonthSfList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(thisMonthJtList.stream().map(LtRymxgzDTO::getNzj).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.add(thisMonthSfList.stream().map(LtRymxgzDTO::getNzj).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getJx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add));
|
||
}
|
||
String[] split = key.split("_split");
|
||
String cbzx = split != null && split.length > 0 ? split[0] : "";
|
||
String xmh = split != null && split.length > 1 ? split[1] : "";
|
||
String xmszsyb = split != null && split.length > 2 ? split[2] : "";
|
||
// 入库
|
||
StringBuilder insertSqlSb = new StringBuilder("insert into uf_bmxmfzftb (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,qj,cbzx,xmh,xmszsyb,yfgz)VALUES(")
|
||
.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'").append(salaryMonth).append("','").append(cbzx).append("','").append(xmh).append("','").append(xmszsyb).append("',").append(gz.toPlainString()).append(")");
|
||
rs.execute(insertSqlSb.toString());
|
||
// 权限重构
|
||
// 获取最大值 作为权限重构的起始id
|
||
rs.execute("select max(id) from uf_bmxmfzftb");
|
||
int maxId = 0;
|
||
if (rs.next()) {
|
||
maxId = rs.getInt(1);
|
||
}
|
||
if (modeId != null && NumberUtils.isCreatable(modeId)) {
|
||
ModeRightInfo ModeRightInfo = new ModeRightInfo();
|
||
ModeRightInfo.setNewRight(true);
|
||
ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), maxId);
|
||
}
|
||
}
|
||
return "";
|
||
}
|
||
} |