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; /** * 薪资核算结果 *

Copyright: Copyright (c) 2022

*

Company: 泛微软件

* * @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 listBySalaryAcctRecordIds(Collection salaryAcctRecordIds) { if (CollectionUtils.isEmpty(salaryAcctRecordIds)) { return Collections.emptyList(); } List salaryAcctResultPOS = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctRecordIds(salaryAcctRecordIds).build()); encryptUtil.decryptList(salaryAcctResultPOS, SalaryAcctResultPO.class); return salaryAcctResultPOS; } @Override public List listBySalaryAcctEmployeeId(Long salaryAcctEmployeeId) { List salaryAcctResultPOS = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctEmpId(salaryAcctEmployeeId).build()); encryptUtil.decryptList(salaryAcctResultPOS, SalaryAcctResultPO.class); // 解密 return salaryAcctResultPOS; } @Override public List listBySalaryAcctEmployeeIds(Collection salaryAcctEmployeeIds) { if (CollectionUtils.isEmpty(salaryAcctEmployeeIds)) { return Collections.emptyList(); } List> partition = Lists.partition((List) salaryAcctEmployeeIds, 500); List salaryAcctResultPOS = new ArrayList<>(); partition.forEach(empIds -> { List resultPOS = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctEmpIds(empIds).build()); encryptUtil.decryptList(resultPOS, SalaryAcctResultPO.class); salaryAcctResultPOS.addAll(resultPOS); }); // 解密 return salaryAcctResultPOS; } @Override public List listBySalaryAcctRecordIdsAndEmployeeIds(Collection salaryAcctRecordIds, Collection employeeIds) { if (CollectionUtils.isEmpty(salaryAcctRecordIds) || CollectionUtils.isEmpty(employeeIds)) { return Collections.emptyList(); } List> partition = Lists.partition((List) employeeIds, 500); List 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 salarySobItemGroupPOS = salaryAcctConfig.getSalarySobItemGroups(); // 过滤关闭显示的薪资项目分类 salarySobItemGroupPOS = salarySobItemGroupPOS.stream().filter(group -> group.getItemHide() == null || group.getItemHide().equals(0L)).collect(Collectors.toList()); // 获取薪资项目分类ID List salarySobItemGroupIds = salarySobItemGroupPOS.stream().map(SalarySobItemGroupPO::getId).collect(Collectors.toList()); //加上未分类 salarySobItemGroupIds.add(0L); // 查询薪资账套的薪资项目副本(已经过滤关闭分类显示按钮的薪资项目) List salarySobItemPOS = salaryAcctConfig.getSalarySobItems(); // 过滤薪资项目 salarySobItemPOS = salarySobItemPOS.stream().filter(item -> item.getItemHide() == null || item.getItemHide().equals(0L)).collect(Collectors.toList()); // 查询已发补发薪资项目 List salarySobBackItemPOList = Collections.emptyList(); List salaryBackItemPOS = Collections.emptyList(); // key:账套中回算薪资项目的薪资项目id value:账套中回算薪资项目所对应的公式内容 Map salaryBackItemFormula = new HashMap<>(); if (isBackCal) { salarySobBackItemPOList = salaryAcctConfig.getSalarySobBackItems(); Set salarySobBackItemIds = SalaryEntityUtil.properties(salarySobBackItemPOList, SalarySobBackItemPO::getSalaryItemId); salaryBackItemPOS = getSalaryItemService(user).listByIds(salarySobBackItemIds); // 查询薪资账套中已发补发的公式内容 List expressFormulas = getSalaryFormulaService(user).listExpressFormula(SalaryEntityUtil.properties(salarySobBackItemPOList, SalarySobBackItemPO::getFormulaId)); Map 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 salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId); List salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds); // 查询薪资核算所用薪资账套的人员信息字段 List salarySobEmpFieldPOS = salaryAcctConfig.getSalarySobEmpFields(); // 查询人员信息 DataCollectionEmployee simpleEmployee = getSalaryEmployeeService(user).getEmployeeById(salaryAcctEmployeePO.getEmployeeId()); // 查询薪资核算结果 List salaryAcctResultPOS = listBySalaryAcctEmployeeId(salaryAcctEmployeeId); // 查询个税扣缴义务人 TaxAgentPO taxAgent = getTaxAgentService(user).getById(salaryAcctEmployeePO.getTaxAgentId()); // 查询公式 Map formulaContentMap = getSalaryAcctResultService(user).getColumnBySalaryAcctRecordId(salaryAcctEmployeePO.getSalaryAcctRecordId()); List 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> listPageByParam(SalaryAcctResultQueryParam queryParam) { PageInfo page = null; //其他条件 List otherConditions = queryParam.getOtherConditions(); if (CollectionUtils.isNotEmpty(otherConditions)) { List items = SalaryEntityUtil.properties(otherConditions, SalaryAcctResultQueryParam.OtherCondition::getItemId, Collectors.toList()); List 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 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 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> data = listBySalaryAcctEmployees(page.getList(), queryParam); // 薪资核算结果的分页结果 PageInfo> resultPage = new PageInfo<>(); resultPage.setList(data); resultPage.setTotal(page.getTotal()); resultPage.setPageNum(page.getPageNum()); resultPage.setPageSize(page.getPageSize()); return resultPage; } @Override public Map sumRow(SalaryAcctResultQueryParam queryParam) { //其他条件 List otherConditions = queryParam.getOtherConditions(); if (CollectionUtils.isNotEmpty(otherConditions)) { List items = SalaryEntityUtil.properties(otherConditions, SalaryAcctResultQueryParam.OtherCondition::getItemId, Collectors.toList()); List 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 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 salaryAcctEmpId = SalaryEntityUtil.properties(list, SalaryAcctResultPO::getSalaryAcctEmpId, Collectors.toList()); if (CollectionUtils.isEmpty(salaryAcctEmpId)) { //条件不满足直接返回空列表 return new HashMap<>(); } else { queryParam.setIds(salaryAcctEmpId); } } // 查询薪资核算人员 List 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 salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); Map salaryItemIdKeySalarySobItemPOMap = SalaryEntityUtil.convert2Map(salarySobItemPOS, SalarySobItemPO::getSalaryItemId); Set salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId); if (Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), NumberUtils.INTEGER_ONE)) { // 是回算,获取回算项 List salarySobBackItemPOS = getSalarySobBackItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); salaryItemIds.addAll(salarySobBackItemPOS.stream().map(SalarySobBackItemPO::getSalaryItemId).collect(Collectors.toList())); } List salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds); // 查询薪资核算结果 List salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId, Collectors.toList()); List salaryAcctResultPOS = listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds); Map map = new HashMap<>(); Map> 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> listByParam(SalaryAcctResultQueryParam queryParam) { // 查询薪资核算人员 List salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listByResultQueryParam(queryParam); // 查询薪资核算结果 return listBySalaryAcctEmployees(salaryAcctEmployeePOS, queryParam); } /** * 根据薪资核算人员查询薪资核算结果 * * @param salaryAcctEmployeePOS 薪资核算人员 * @param queryParam 列表查询条件 * @return */ private List> listBySalaryAcctEmployees(List 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 salarySobEmpFieldPOS = salaryAcctConfig.getSalarySobEmpFields(); // 查询薪资核算所用薪资账套的薪资项目 List salarySobItemPOS = salaryAcctConfig.getSalarySobItems(); Set salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId); // 是否是回算 List salarySobBackItemPOList = Collections.emptyList(); if (isBackCalc) { // 根据薪资账套获取回算信息项 salarySobBackItemPOList = getSalarySobBackItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); salaryItemIds.addAll(salarySobBackItemPOList.stream().map(SalarySobBackItemPO::getSalaryItemId).collect(Collectors.toList())); } List salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds); // 查询薪资核算结果 List salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId, Collectors.toList()); List salaryAcctResultPOS = listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds); // 查询人员信息 List employeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getEmployeeId, Collectors.toList()); List simpleEmployees = getSalaryEmployeeService(user).getEmployeeByIdsAll(employeeIds); simpleEmployees.forEach(e -> { UserStatusEnum userStatusEnum = UserStatusEnum.parseByValue(Integer.parseInt(e.getStatus())); if (userStatusEnum != null) { e.setStatusName(userStatusEnum.getDefaultLabel()); } }); // 查询个税扣缴义务人 Set taxAgentIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getTaxAgentId); List taxAgentPOS = getTaxAgentService(user).listByIds(taxAgentIds); // 判断是否存在合并计税 Set 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 salaryAcctEmployeePOS4ConsolidatedTax = getSalaryAcctEmployeeService(user).listByParam4ConsolidatedTax(accEmployeeQueryParam); salaryAcctEmployeeIds4ConsolidatedTax = SalaryEntityUtil.properties(salaryAcctEmployeePOS4ConsolidatedTax, SalaryAcctEmployeePO::getId); } // 查询公式详情 Set formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId); // 获取回算公式 if (isBackCalc) { formulaIds.addAll(salarySobBackItemPOList.stream().map(SalarySobBackItemPO::getFormulaId).collect(Collectors.toList())); } List expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds); Map expressFormulaMap = SalaryEntityUtil.convert2Map(expressFormulas, ExpressFormula::getId, ExpressFormula::getFormula); Map customParameters = SalaryEntityUtil.convert2Map(salarySobItemPOS, SalarySobItemPO::getSalaryItemId, salarySobItemPO -> { if (salarySobItemPO.getFormulaId() <= 0) { return SalaryI18nUtil.getI18nLabel(92004, "输入/导入"); } return expressFormulaMap.getOrDefault(salarySobItemPO.getFormulaId(), StringUtils.EMPTY); }); // 回算公式内容转换 Map 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 salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salarySobPO.getId()); List salaryAcctRecordPOS = Collections.singletonList(salaryAcctRecordPO); List salaryAcctEmployeePOS = Collections.singletonList(salaryAcctEmployeePO); // 如果当前薪资核算记录所用的薪资账套的薪资类型是工资薪金,代表可能存在合并计税 if (Objects.equals(salarySobPO.getIncomeCategory(), IncomeCategoryEnum.WAGES_AND_SALARIES.getValue())) { // 查询所有薪资类型为工资薪金的账套 List salarySobPOS = getSalarySobService(user).listByIncomeCategory(IncomeCategoryEnum.WAGES_AND_SALARIES); // 查询相同税款所属期内的薪资类型为工资薪金的账套的所有核算记录 Set salarySobIds = SalaryEntityUtil.properties(salarySobPOS, SalarySobPO::getId); LocalDateRange taxCycleDateRange = SalaryDateUtil.localDate2Range(salaryAcctRecordPO.getTaxCycle()); salaryAcctRecordPOS = getSalaryAcctRecordService(user).listBySalarySobIdsAndTaxCycle(salarySobIds, taxCycleDateRange); // 查询当前薪资核算人员所涉及的合并计税的所有薪资核算人员 Set salaryAcctRecordIds = SalaryEntityUtil.properties(salaryAcctRecordPOS, SalaryAcctRecordPO::getId); salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listByRecordIdsAndEmpIdAndTaxAgentId(salaryAcctRecordIds, salaryAcctEmployeePO.getEmployeeId(), salaryAcctEmployeePO.getTaxAgentId()); } // 查询薪资核算人员的薪资核算结果 List salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId, Collectors.toList()); List salaryAcctResultPOS = listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds); // 查询薪资核算人员所有合并计税的薪资核算记录所用的账套 Set salarySobIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getSalarySobId); List salarySobPOS = getSalarySobService(user).listByIds(salarySobIds); // 查询薪资项目所引用的薪资项目 List salarySobItemPOS = getSalarySobItemService(user).listBySalarySobIds(salarySobIds); // 查询薪资项目 Set salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId); List salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds); // 转换成合并计税详情dto return SalaryAcctResultBO.convert2ConsolidatedTaxDetailDTO(simpleEmployee, taxAgentPO, salarySobEmpFieldPOS, salaryItemPOS, salaryAcctEmployeePOS, salarySobPOS, salaryAcctRecordPOS, salaryAcctResultPOS); } @Override public Map getColumnBySalaryAcctRecordId(Long salaryAcctRecordId) { SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryAcctRecordId); if (Objects.isNull(salaryAcctRecordPO)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除")); } Map 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 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 dataCollectionEmployees = getSalaryEmployeeService(user).listAllForReport(); Map 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 salaryAcctResultPOSOld = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctEmpId(saveParam.getSalaryAcctEmpId()).build()); // 解密 encryptUtil.decryptList(salaryAcctResultPOSOld, SalaryAcctResultPO.class); // 保存参数转换成薪资核算结果po List 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 needLockItems = new HashSet<>(); Map 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 salarySobBackItemIds = getSalarySobBackItemService(user).listBySalarySobId(byId.getSalarySobId()).stream().map(SalarySobBackItemPO::getSalaryItemId).collect(Collectors.toList()); // // 获取已发待发的薪资核算结果 // List salarySobBackItemResultPO = salaryAcctResultPOSOld.stream().filter(po -> salarySobBackItemIds.contains(po.getSalaryItemId())).collect(Collectors.toList()); // salaryAcctResultPOS.addAll(salarySobBackItemResultPO); // } // 删除原来的薪资核算结果 List 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> partition = Lists.partition(salaryAcctResultPOS, 100); partition.forEach(getSalaryAcctResultMapper()::batchInsert); } //报表 // getSalaryAcctReportService(user).deleteByAcctEmployeeIdsAndSalaryItemIds(Collections.singletonList(saveParam.getSalaryAcctEmpId()), saveItemIds); // List 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 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 salaryAcctResultPOSOld, List salaryAcctResultPOS) { // 对比核算结果提取修改了哪些薪资项目 List editItems = new ArrayList<>(); Map 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 needInsertList = SalaryAcctResultLogBO.buildSalaryAcctResultLog(editItems, Long.valueOf(user.getUID()), SalaryAcctResultDataSourceEnum.EDIT); getSalaryAcctResultLogService(user).batchInsert(needInsertList); } @Override public void batchSave(List salaryAcctResultPOS) { if (CollectionUtils.isNotEmpty(salaryAcctResultPOS)) { // 数据加密 encryptUtil.encryptList(salaryAcctResultPOS, SalaryAcctResultPO.class); List> partition = Lists.partition(salaryAcctResultPOS, 100); partition.forEach(getSalaryAcctResultMapper()::batchInsert); } } public void batchUpdate(List salaryAcctResultPOS) { if (CollectionUtils.isNotEmpty(salaryAcctResultPOS)) { // 数据加密 encryptUtil.encryptList(salaryAcctResultPOS, SalaryAcctResultPO.class); List> partition = Lists.partition(salaryAcctResultPOS, 100); partition.forEach(getSalaryAcctResultMapper()::batchUpdate); } } @Override public void deleteBySalaryAcctEmployeeIds(Collection salaryAcctEmployeeIds) { getSalaryAcctResultMapper().deleteBySalaryAcctEmpIds(salaryAcctEmployeeIds); } @Override public void deleteByAcctEmployeeIdsAndSalaryItemIds(List salaryAcctEmployeeIds, Collection salaryItemIds) { List> partition = Lists.partition(salaryAcctEmployeeIds, 300); partition.forEach(part -> getSalaryAcctResultMapper().deleteByAcctEmpIdsAndSalaryItemIds(part, salaryItemIds)); } @Override public void deleteBySalaryAcctRecordIds(Collection 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 salarySobItemPOS = salaryAcctSobConfig.getSalarySobItems(); if (CollectionUtils.isEmpty(salarySobItemPOS)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99151, "当前所用的薪资账套未选择任何薪资项目,无法核算")); } // 回算薪资项目 List salarySobBackItems = Collections.emptyList(); if (Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), 1)) { salarySobBackItems = salaryAcctSobConfig.getSalarySobBackItems(); } // 4、查询当前租户的所有薪资项目 List salaryItemPOS = getSalaryItemService(user).listAll(); // 5、查询薪资核算记录所用薪资账套的调薪计薪规则 List salarySobAdjustRulePOS = getSalarySobAdjustRuleService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); // 6、查询社保福利的所有字段 Map welfareColumns = getSIAccountService(user).welfareColumns(); // 7、查询考勤引用的所有字段 List attendQuoteFieldListDTOS = getAttendQuoteFieldService(user).listAll(); List variableItemPOS = getVariableItemService(user).listAll(); // 8、查询公式详情 Set formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId); formulaIds.addAll(SalaryEntityUtil.properties(salaryItemPOS, SalaryItemPO::getFormulaId)); formulaIds.addAll(SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getFormulaId)); List expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds); // 本次运算的回算薪资项目所涉及的变量 Set issuedFieldIds = getIssuedFieldIds(salarySobBackItems); // 9、计算薪资项目的运算优先级 List salarySobItemsWithPriority = sortItems(salarySobItemPOS, salarySobBackItems, salaryItemPOS, expressFormulas); //账套中配置的个税字段,不需要系统算 List salarySobTaxRulePOS = getSalarySobTaxRuleService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); List taxIds = SalaryEntityUtil.properties(salarySobTaxRulePOS, SalarySobTaxRulePO::getSalaryItemId, Collectors.toList()); // 10、根据id查询其他合并计税的薪资核算记录 List otherSalaryAcctRecordPOS = getSalaryAcctRecordService(user).listById4OtherConsolidatedTax(salaryAcctRecordPO.getId()); // 11、查询本次核算人员 List 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> partition = Lists.partition(salaryAcctEmployeePOS, size); // 12.1、监控子线程的任务执行 CountDownLatch childMonitor = new CountDownLatch(partition.size()); // 12.2、记录子线程的执行结果 BlockingDeque 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 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 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 ids = calculateParam.getIds(); if (CollectionUtils.isNotEmpty(ids)) { targetName += ids; } LoggerContext 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 salarySobItemPOS = salaryAcctSobConfig.getSalarySobItems(); if (CollectionUtils.isEmpty(salarySobItemPOS)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99151, "当前所用的薪资账套未选择任何薪资项目,无法核算")); } // 回算薪资项目 List salarySobBackItems = Collections.emptyList(); if (Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), 1)) { salarySobBackItems = salaryAcctSobConfig.getSalarySobBackItems(); } // 4、查询当前租户的所有薪资项目 List salaryItemPOS = getSalaryItemService(user).listAll(); // 5、查询薪资核算记录所用薪资账套的调薪计薪规则 List salarySobAdjustRulePOS = getSalarySobAdjustRuleService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); // 6、查询社保福利的所有字段 Map welfareColumns = getSIAccountService(user).welfareColumns(); // 7、查询考勤引用的所有字段 List attendQuoteFieldListDTOS = getAttendQuoteFieldService(user).listAll(); List variableItemPOS = getVariableItemService(user).listAll(); // 8、查询公式详情 Set formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId); formulaIds.addAll(SalaryEntityUtil.properties(salaryItemPOS, SalaryItemPO::getFormulaId)); formulaIds.addAll(SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getFormulaId)); List expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds); // 本次运算的回算薪资项目所涉及的变量 Set issuedFieldIds = getIssuedFieldIds(salarySobBackItems); // 9、计算薪资项目的运算优先级 List salarySobItemsWithPriority = sortItems(salarySobItemPOS, salarySobBackItems, salaryItemPOS, expressFormulas); //账套中配置的个税字段,不需要系统算 List salarySobTaxRulePOS = getSalarySobTaxRuleService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); List 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 otherSalaryAcctRecordPOS = getSalaryAcctRecordService(user).listById4OtherConsolidatedTax(salaryAcctRecordPO.getId()); // 11、查询本次核算人员 List 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> partition = Lists.partition(salaryAcctEmployeePOS, 100); // 12.1、监控子线程的任务执行 CountDownLatch childMonitor = new CountDownLatch(partition.size()); // 12.2、记录子线程的执行结果 BlockingDeque calculateResults = new LinkedBlockingDeque<>(partition.size()); // 12.3、生成本次运算的key String calculateKey = UUID.randomUUID().toString(); // 12.4、是否采用系统算税 TaxDeclarationFunctionEnum taxDeclarationFunction = getSalarySysConfService(user).getTaxDeclaration(); // 12.5、多线程运算,运算结果存放在临时表中 for (List 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 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 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 sortItems(List salarySobItemPOS, List salarySobBackItems, List salaryItemPOS, List expressFormulas) { List 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 salaryCalcItems = salaryCalcItemGraph.sort(); return SalaryEntityUtil.properties(salaryCalcItems, SalaryCalcItem::getSalaryItemId, Collectors.toList()); } /** * 获取回算变量 * * @param salarySobBackItems * @return */ @NotNull private Set getIssuedFieldIds(List salarySobBackItems) { Set issuedFieldIds; Set issuedFormulaIds = SalaryEntityUtil.properties(salarySobBackItems, SalarySobBackItemPO::getFormulaId); List expressFormulas1 = getSalaryFormulaService(user).listExpressFormula(issuedFormulaIds); List 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 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 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 afterTaxItemIds) { // 查询薪资核算结果的临时存储 List salaryAcctResultTempPOS = getSalaryAcctResultTempService(user).listByCalculateKey(calculateKey); // 删除原来的薪资核算结果 getSalaryAcctResultMapper().deleteBySalaryAcctRecordIdAndSalaryItemIds(salaryAcctRecordId, afterTaxItemIds); // 保存薪资的薪资核算结果 List salaryAcctResultPOS = SalaryAcctResultBO.convert2ResultPO(salaryAcctResultTempPOS); batchSave(salaryAcctResultPOS); // 删除薪资核算临时存储表中的数据 getSalaryAcctResultTempService(user).deleteByCalculateKey(calculateKey); } @Override public List listBySalaryAcctRecordIdsAndTaxAgentIds(Collection salaryAcctRecordIds, Collection 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 querySalaryAcctEmployee(SalaryAcctResultListContext salaryAcctResultListContext, SalaryAcctResultQueryParam queryParam, SalaryAcctRecordPO salaryAcctRecord) { // // 构建薪资核算人员的查询参数 // SalaryAcctEmployeeQueryParam salaryAcctEmployeeListQueryParam = new SalaryAcctEmployeeQueryParam(); // BeanUtils.copyProperties(queryParam, salaryAcctEmployeeListQueryParam); // // 查询薪资核算人员 // List salaryAcctEmployees = getSalaryAcctEmployeeService(user).listByParam(salaryAcctEmployeeListQueryParam); // // 查询相同税款所属期内的薪资核算人员 // List sameTaxCycleSalaryAcctEmployees = salaryAcctEmployeeService // .listSameTaxCycle(salaryAcctEmployees, SalaryDateUtil.getFormatYearMonth(salaryAcctRecord.getTaxCycle())); // Set 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 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 salaryAcctEmployees = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(updateParam.getSalaryAcctRecordId()); if (CollectionUtils.isEmpty(salaryAcctEmployees)) { return; } Set salaryItemIds; if (CollectionUtils.isNotEmpty(updateParam.getSalaryItemIds())) { salaryItemIds = updateParam.getSalaryItemIds(); } else { salaryItemIds = Collections.singleton(updateParam.getSalaryItemId()); } salaryAcctEmployees.forEach(salaryAcctEmployeePO -> { List 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 salaryAcctResultPOS = getSalaryAcctResultMapper().listSome(build); // 回算前的薪资核算结果 salaryAcctResultPOS.forEach(salaryAcctResult -> salaryAcctResult.setOriginResultValue(salaryAcctResult.getResultValue())); // 批量更新 batchUpdateOriginResultValue(salaryAcctResultPOS); } @Override public List listBySalaryAcctRecordIdsAndSalaryItemIds(Collection salaryAcctRecordIds, Collection salaryItemIds) { if (CollectionUtils.isEmpty(salaryAcctRecordIds) || CollectionUtils.isEmpty(salaryItemIds)) { return Collections.emptyList(); } List list = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctRecordIds(salaryAcctRecordIds).salaryItemIds(salaryItemIds).build()); return encryptUtil.decryptList(list, SalaryAcctResultPO.class); } @Override public List listByAcctEmployeeIdsAndSalaryItemIds(List salaryAcctEmployeeIds, Collection salaryItemIds) { if (CollectionUtils.isEmpty(salaryAcctEmployeeIds)) { return Collections.emptyList(); } List> partition = Lists.partition(salaryAcctEmployeeIds, 200); List 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 salaryAcctResultValues) { int batchSize = 500; List> partition = Lists.partition(salaryAcctResultValues, batchSize); for (List subSalaryAcctResultValues : partition) { getSalaryAcctResultMapper().batchUpdateOriginResultValue(subSalaryAcctResultValues); } } @Override public List listAcctEmpIdByAcctEmpId(List salaryAcctEmployeeIds) { if (CollectionUtils.isEmpty(salaryAcctEmployeeIds)) { return Collections.emptyList(); } List> partition = Lists.partition((List) salaryAcctEmployeeIds, 1000); List 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 adminTaxAgentList = getTaxAgentAdminService(user).listByEmployeeId((long) user.getUID()); // Optional 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 salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); // 薪资账套中包含的薪资项目 List salarySobItemIds = salarySobItemPOS.stream().map(SalarySobItemPO::getSalaryItemId).collect(Collectors.toList()); if (!salarySobItemIds.contains(param.getSalaryItemId())) { throw new SalaryRunTimeException("该账套不包含该薪资项目或已被删除,请先检查账套"); } // 获取需要更新的核算人员信息 List 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 salaryAcctEmployeeIdList = SalaryEntityUtil.properties(salaryAcctEmployeePOList, SalaryAcctEmployeePO::getId, Collectors.toList()); // 查询薪资核算结果 List resultPOS = listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmployeeIdList, Collections.singleton(param.getSalaryItemId())); Map salaryAcctResultPOMap = SalaryEntityUtil.convert2Map(resultPOS, SalaryAcctResultPO::getSalaryAcctEmpId); List dataCollectionEmployees = getSalaryEmployeeService(user).listAllForReport(); Map emps = SalaryEntityUtil.convert2Map(dataCollectionEmployees, DataCollectionEmployee::getEmployeeId); List needUpdateList = new ArrayList<>(); List needInsertList = new ArrayList<>(); Date now = new Date(); List 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> 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 listBySobSalaryMonth(Date salaryMonth, Long salarySobId, List employeeIds) { List salaryAcctRecordPOS = getSalaryAcctRecordService(user).listSome(SalaryAcctRecordPO.builder().salarySobId(salarySobId).salaryMonth(salaryMonth).build()); List recordIds = SalaryEntityUtil.properties(salaryAcctRecordPOS, SalaryAcctRecordPO::getId, Collectors.toList()); if (CollUtil.isEmpty(recordIds)) { return new ArrayList<>(); } List salaryAcctResultPOS = new ArrayList<>(); SalaryAcctResultPO resultParam = SalaryAcctResultPO.builder().salaryAcctRecordIds(recordIds).build(); if (CollUtil.isNotEmpty(employeeIds)) { List> partition = Lists.partition(employeeIds, 500); for (List ids : partition){ resultParam.setEmployeeIds(ids); List 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 newResultValueMap, SalaryLogOperateTypeEnum operateType) { LoggerContext> 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 configs = JsonUtil.parseList(configStr, LtSalaryReportConfigDTO.class); List variableItemIds = configs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList()); // 获取浮动档案 List> variableMapList = getVariableArchiveService(user).listBySalaryMonthAndItems(yearMonth, variableItemIds); // 过滤数据,不能所有值为0或空 List 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 empIds = variableMapList.stream().map(map -> Utils.null2String(map.get("employeeId"))).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); // Map employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).listByIds(empIds), DataCollectionEmployee::getEmployeeId); // 查询快照表中人员信息 Map 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 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>> 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 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 configs = JsonUtil.parseList(configStr, LtSalaryReportConfigDTO.class); List variableItemIds = configs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList()); // 获取浮动档案 List> variableMapList = getVariableArchiveService(user).listBySalaryMonthAndItems(yearMonth, variableItemIds); // 过滤数据,不能所有值为0或空 List 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 empIds = variableMapList.stream().map(map -> Utils.null2String(map.get("employeeId"))).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); // Map employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).listByIds(empIds), DataCollectionEmployee::getEmployeeId); // 查询快照表中人员信息 Map 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 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>> 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 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 configs = JsonUtil.parseList(configStr, LtSalaryReportConfigDTO.class); String gjjConfigStr = baseBean.getPropValue("ltSalaryReport", "bmgjjmxb_ys_config"); configs.addAll(JsonUtil.parseList(gjjConfigStr, LtSalaryReportConfigDTO.class)); List variableItemIds = configs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList()); // 获取浮动档案 List> 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 needExcludeWorkCodeList = new ArrayList<>(); while (extRs.next()) { needExcludeWorkCodeList.add(extRs.getString("user_code")); } if (CollectionUtils.isNotEmpty(needExcludeWorkCodeList)) { // 获取需要去除的人员id List 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 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 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 reportConfigs = JsonUtil.parseList(reportConfigStr, LtSalaryReportConfigDTO.class); List salaryItemIds = reportConfigs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList()); List salaryItemList = getSalaryItemService(user).listByIds(salaryItemIds); // 查询薪资核算结果(包含未归档) Date salaryMonthDate = SalaryDateUtil.localDateToDate(yearMonth.atDay(1)); List salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalaryMonth(LocalDateRange.builder().fromDate(salaryMonthDate).endDate(salaryMonthDate).build()); // 账套范围 List 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 salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList()); List salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIdsAndEmployeeIds(salaryAcctRecordIds, employeeIdList); List employeeList = getSalaryEmployeeService(user).listByIds(employeeIdList); // 查询薪资核算结果 List salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); List acctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, salaryItemIds); List taxAgentPOS = getTaxAgentService(user).listAll(); List> acctResultMap = SalaryAcctResultBO.buildTableData(salaryItemList, Collections.emptyList(), employeeList, salaryAcctEmployeeList, acctResultList, taxAgentPOS, Collections.emptySet(), Collections.emptyMap(), Collections.emptyMap(), false); Map> acctResultMapByEmpId = SalaryEntityUtil.convert2Map(acctResultMap, m -> Utils.null2String(m.get("employeeId"))); // 查询员工薪资档案 List salaryArchiveList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().employeeIds(employeeIdList).build()); Map archiveIdMap = SalaryEntityUtil.convert2Map(salaryArchiveList, archive -> archive.getTaxAgentId() + "_" + archive.getEmployeeId(), archive -> archive.getId()); List 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 salaryArchiveItemCurrentList = getSalaryArchiveItemService(user).getEffectiveItemListBySalaryMonth(salaryArchiveIds, Collections.singletonList(jdjxItemId), lastDayOfMonth); Map archiveItemByArchiveId = SalaryEntityUtil.convert2Map(salaryArchiveItemCurrentList, archive -> archive.getSalaryArchiveId()); // 查询快照表中人员信息 Map 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 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 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>> partition = Lists.partition(variableMapList, 500); for (List> 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 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 configs = JsonUtil.parseList(configStr, LtSalaryReportConfigDTO.class); String gjjConfigStr = baseBean.getPropValue("ltSalaryReport", "bmgjjmxb_ys_config"); configs.addAll(JsonUtil.parseList(gjjConfigStr, LtSalaryReportConfigDTO.class)); List variableItemIds = configs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList()); // 获取浮动档案 List> 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 needExcludeWorkCodeList = new ArrayList<>(); while (extRs.next()) { needExcludeWorkCodeList.add(extRs.getString("user_code")); } if (CollectionUtils.isNotEmpty(needExcludeWorkCodeList)) { // 获取需要去除的人员id List 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 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 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 reportConfigs = JsonUtil.parseList(reportConfigStr, LtSalaryReportConfigDTO.class); List salaryItemIds = reportConfigs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList()); List salaryItemList = getSalaryItemService(user).listByIds(salaryItemIds); // 查询薪资核算结果(包含未归档) Date salaryMonthDate = SalaryDateUtil.localDateToDate(yearMonth.atDay(1)); List salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalaryMonth(LocalDateRange.builder().fromDate(salaryMonthDate).endDate(salaryMonthDate).build()); // 账套范围 List 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 salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList()); List salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIdsAndEmployeeIds(salaryAcctRecordIds, employeeIdList); List employeeList = getSalaryEmployeeService(user).listByIds(employeeIdList); // 查询薪资核算结果 List salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); List acctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, salaryItemIds); List taxAgentPOS = getTaxAgentService(user).listAll(); List> acctResultMap = SalaryAcctResultBO.buildTableData(salaryItemList, Collections.emptyList(), employeeList, salaryAcctEmployeeList, acctResultList, taxAgentPOS, Collections.emptySet(), Collections.emptyMap(), Collections.emptyMap(), false); Map> acctResultMapByEmpId = SalaryEntityUtil.convert2Map(acctResultMap, m -> Utils.null2String(m.get("employeeId"))); // 查询员工薪资档案 List salaryArchiveList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().employeeIds(employeeIdList).build()); Map archiveIdMap = SalaryEntityUtil.convert2Map(salaryArchiveList, archive -> archive.getTaxAgentId() + "_" + archive.getEmployeeId(), archive -> archive.getId()); List 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 salaryArchiveItemCurrentList = getSalaryArchiveItemService(user).getEffectiveItemListBySalaryMonth(salaryArchiveIds, Collections.singletonList(jdjxItemId), lastDayOfMonth); Map archiveItemByArchiveId = SalaryEntityUtil.convert2Map(salaryArchiveItemCurrentList, archive -> archive.getSalaryArchiveId()); // 查询快照表中人员信息 Map 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 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 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>> partition = Lists.partition(variableMapList, 500); for (List> 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 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 reportConfigs = JsonUtil.parseList(reportConfigStr, LtSalaryReportConfigDTO.class); List salaryItemIds = reportConfigs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList()); List salaryItemList = getSalaryItemService(user).listByIds(salaryItemIds); // 查询薪资核算结果(包含未归档) Date salaryMonthDate = SalaryDateUtil.localDateToDate(yearMonth.atDay(1)); List salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalaryMonth(LocalDateRange.builder().fromDate(salaryMonthDate).endDate(salaryMonthDate).build()); // 账套范围 List 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 salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList()); List salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds); List employeeIdList = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).distinct().collect(Collectors.toList()); List employeeList = getSalaryEmployeeService(user).listByIds(employeeIdList); // 查询薪资核算结果 List salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); List acctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, salaryItemIds); List taxAgentPOS = getTaxAgentService(user).listAll(); List> acctResultMap = SalaryAcctResultBO.buildTableData(salaryItemList, Collections.emptyList(), employeeList, salaryAcctEmployeeList, acctResultList, taxAgentPOS, Collections.emptySet(), Collections.emptyMap(), Collections.emptyMap(), false); Map> acctResultMapByAcctEmpId = SalaryEntityUtil.convert2Map(acctResultMap, m -> Utils.null2String(m.get("id"))); // 查询员工薪资档案 List salaryArchiveList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().employeeIds(employeeIdList).build()); Map archiveIdMap = SalaryEntityUtil.convert2Map(salaryArchiveList, archive -> archive.getTaxAgentId() + "_" + archive.getEmployeeId(), archive -> archive.getId()); List 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 archiveItemIds = Arrays.asList(jdItemId, bndItemId, nzjItemId); Date lastDayOfMonth = SalaryDateUtil.getLastDayOfMonth(salaryMonthDate); List salaryArchiveItemCurrentList = getSalaryArchiveItemService(user).getEffectiveItemListBySalaryMonth(salaryArchiveIds, archiveItemIds, lastDayOfMonth); Map> archiveItemGroupByArchiveId = SalaryEntityUtil.group2Map(salaryArchiveItemCurrentList, archive -> archive.getSalaryArchiveId()); // 查询快照表中人员信息 Map 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 salaryArchiveItemList = archiveItemGroupByArchiveId.get(archiveId == null ? 0L : archiveId); String jx = "0"; String jdjx = "0"; String bndjx = "0"; String nzj = "0"; if (CollectionUtils.isNotEmpty(salaryArchiveItemList)) { Map 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 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> partition = Lists.partition(salaryAcctEmployeeList, 500); for (List 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 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 reportConfigs = JsonUtil.parseList(reportConfigStr, LtSalaryReportConfigDTO.class); List salaryItemIds = reportConfigs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList()); List salaryItemList = getSalaryItemService(user).listByIds(salaryItemIds); // 查询薪资核算结果(包含未归档) Date salaryMonthDate = SalaryDateUtil.localDateToDate(yearMonth.atDay(1)); List salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalaryMonth(LocalDateRange.builder().fromDate(salaryMonthDate).endDate(salaryMonthDate).build()); // 月薪账套范围 List 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 salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList()); List salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds); List employeeIdList = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).distinct().collect(Collectors.toList()); List employeeList = getSalaryEmployeeService(user).listByIds(employeeIdList); // 查询薪资核算结果 List salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); List acctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, salaryItemIds); List taxAgentPOS = getTaxAgentService(user).listAll(); List> acctResultMap = SalaryAcctResultBO.buildTableData(salaryItemList, Collections.emptyList(), employeeList, salaryAcctEmployeeList, acctResultList, taxAgentPOS, Collections.emptySet(), Collections.emptyMap(), Collections.emptyMap(), false); Map> acctResultMapByKey = SalaryEntityUtil.convert2Map(acctResultMap, m -> Utils.null2String(m.get("taxAgentId")) + "_split" +Utils.null2String(m.get("employeeId"))); List keyList = new ArrayList<>(); Set totalEmpIds = new HashSet<>(); keyList.addAll(acctResultMapByKey.keySet()); totalEmpIds.addAll(employeeIdList); int monthValue = yearMonth.getMonthValue(); List allRecordList = getSalaryAcctRecordService(user).listBySalaryMonth(LocalDateRange.builder().fromDate(salaryMonthDate).endDate(salaryMonthDate).build()); // 处理季度绩效账套 Map> jdAcctResultMapByKey = new HashMap<>(); Long jdjxItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_jdjxgz_item_id")); if (monthValue == 3 || monthValue == 6 || monthValue == 9) { List jdSobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_jdjx_sob_ids").split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); List jdRecordList = allRecordList.stream().filter(sob -> jdSobIds.contains(sob.getSalarySobId())).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(jdRecordList)) { SalaryItemPO jdSalaryItemPO = getSalaryItemService(user).getById(jdjxItemId); List jdRecordIds = jdRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList()); List jdAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(jdRecordIds); List jdEmployeeIdList = jdAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).distinct().collect(Collectors.toList()); List jdEmployeeList = getSalaryEmployeeService(user).listByIds(jdEmployeeIdList); // 查询薪资核算结果 List jdSalaryAcctEmpIds = jdAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); List jdAcctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(jdSalaryAcctEmpIds, Collections.singletonList(jdjxItemId)); List> 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> bndAcctResultMapByKey = new HashMap<>(); Long bndItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_bndjxgz_item_id")); if (monthValue == 6) { List bndSobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_bndjx_sob_ids").split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); List bndRecordList = allRecordList.stream().filter(sob -> bndSobIds.contains(sob.getSalarySobId())).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(bndRecordList)) { SalaryItemPO bndSalaryItemPO = getSalaryItemService(user).getById(bndItemId); List bndRecordIds = bndRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList()); List bndAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(bndRecordIds); List bndEmployeeIdList = bndAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).distinct().collect(Collectors.toList()); List bndEmployeeList = getSalaryEmployeeService(user).listByIds(bndEmployeeIdList); // 查询薪资核算结果 List bndSalaryAcctEmpIds = bndAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); List bndAcctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(bndSalaryAcctEmpIds, Collections.singletonList(bndItemId)); List> 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> nzjAcctResultMapByKey = new HashMap<>(); List nzjSobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_nz_sob_ids").split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); List 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 nzjRecordIds = nzjRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList()); List nzjAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(nzjRecordIds); List nzjEmployeeIdList = nzjAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).distinct().collect(Collectors.toList()); List nzjEmployeeList = getSalaryEmployeeService(user).listByIds(nzjEmployeeIdList); // 查询薪资核算结果 List nzjSalaryAcctEmpIds = nzjAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); List nzjAcctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(nzjSalaryAcctEmpIds, Collections.singletonList(nzjItemId)); List> 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 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 singleAcctResultMap = acctResultMapByKey.getOrDefault(key, new HashMap<>()); Map singleJdAcctResultMap = jdAcctResultMapByKey.getOrDefault(key, new HashMap<>()); String jdjx = NumberUtils.isCreatable(Utils.null2String(singleJdAcctResultMap.get(jdjxItemId.toString()))) ? Utils.null2String(singleJdAcctResultMap.get(jdjxItemId.toString())) : "0"; Map singleBndAcctResultMap = bndAcctResultMapByKey.getOrDefault(key, new HashMap<>()); String bndjx = NumberUtils.isCreatable(Utils.null2String(singleBndAcctResultMap.get(bndItemId.toString()))) ? Utils.null2String(singleBndAcctResultMap.get(bndItemId.toString())) : "0"; Map 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> partition = Lists.partition(keyList, 500); for (List 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 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> ltYsList = getLtYsList(year, Collections.singletonList(subcompanyId), fdSum); // 获取对应的还原预算数据 List> ltHyysList = getLtBmhyysList(year, Collections.singletonList(subcompanyId)); // 获取旗下人力成本分析对应薪酬数据 List> ltSalaryList = new ArrayList<>(); // 循环yearMonth当年1月到12月 List yearMonths = IntStream.rangeClosed(1, 12) .mapToObj(month -> YearMonth.of(year, month)) .collect(Collectors.toList()); for (YearMonth date : yearMonths) { // 获取薪资核算数据 List 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 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 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 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 getSalaryData4Qxrlcbfx(YearMonth yearMonth, List subcompanyIds) { BaseBean baseBean = new BaseBean(); List 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 salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(salarySobIds, dateRange); List salaryAcctRecordIds = salaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).map(SalaryAcctRecordPO::getId).collect(Collectors.toList()); // 获取薪资核算人员 List 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 salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); // 获取薪资核算结果 List needSumSalaryItemIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_sum_salary_item_ids").split(",")) .filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); List acctResultPOList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, needSumSalaryItemIds); Map> acctResultMap = SalaryEntityUtil.group2Map(acctResultPOList, SalaryAcctResultPO::getSalaryAcctEmpId); // 查询员工薪资档案 List employeeIdList = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).collect(Collectors.toList()); List salaryArchiveList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().employeeIds(employeeIdList).build()); Map archiveIdMap = SalaryEntityUtil.convert2Map(salaryArchiveList, archive -> archive.getTaxAgentId() + "_" + archive.getEmployeeId(), archive -> archive.getId()); List 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 archiveItemIds = Arrays.asList(jdItemId, bndItemId, nzjItemId); Date lastDayOfMonth = SalaryDateUtil.getLastDayOfMonth(SalaryDateUtil.toDate(yearMonth, 1)); List salaryArchiveItemCurrentList = getSalaryArchiveItemService(user).getEffectiveItemListBySalaryMonth(salaryArchiveIds, archiveItemIds, lastDayOfMonth); Map> archiveItemGroupByArchiveId = SalaryEntityUtil.group2Map(salaryArchiveItemCurrentList, archive -> archive.getSalaryArchiveId()); // 如果是12月还要获取年终奖账套数据 Map> nzAcctResultMap = new HashMap<>(); if (yearMonth.getMonthValue() == 12) { List 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 nzSalaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(nzjSobIds, yearDateRange); List 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 nzSalaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(Collections.singletonList(nzSalaryAcctRecordId)); nzSalaryAcctEmployeeList = nzSalaryAcctEmployeeList.stream().filter(salaryAcctEmp -> subcompanyIds.contains(salaryAcctEmp.getSubcompanyId())).collect(Collectors.toList()); List nzSalaryAcctEmpIds = nzSalaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); // 获取薪资核算结果 List nzNeedSumSalaryItemIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_nz_sum_salary_item_ids").split(",")) .filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); List 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 resultList = new ArrayList<>(); for (SalaryAcctEmployeePO salaryAcctEmp : salaryAcctEmployeeList) { BigDecimal sumVal = new BigDecimal("0"); List 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 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 salaryArchiveItemPOList = archiveItemGroupByArchiveId.get(archiveId); if (CollectionUtils.isNotEmpty(salaryArchiveItemPOList)) { Map 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> getSalaryData4QxrlcbfxGroupByDept(YearMonth yearMonth, List subcompanyIds) { BaseBean baseBean = new BaseBean(); List 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 salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(salarySobIds, dateRange); List salaryAcctRecordIds = salaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).map(SalaryAcctRecordPO::getId).collect(Collectors.toList()); // 获取薪资核算人员 List 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 salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); // 获取薪资核算结果 List needSumSalaryItemIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_sum_salary_item_ids").split(",")) .filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); List acctResultPOList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, needSumSalaryItemIds); Map> acctResultMap = SalaryEntityUtil.group2Map(acctResultPOList, SalaryAcctResultPO::getSalaryAcctEmpId); // 查询员工薪资档案 List employeeIdList = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).collect(Collectors.toList()); List salaryArchiveList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().employeeIds(employeeIdList).build()); Map archiveIdMap = SalaryEntityUtil.convert2Map(salaryArchiveList, archive -> archive.getTaxAgentId() + "_" + archive.getEmployeeId(), archive -> archive.getId()); List 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 archiveItemIds = Arrays.asList(jdItemId, bndItemId, nzjItemId); Date lastDayOfMonth = SalaryDateUtil.getLastDayOfMonth(SalaryDateUtil.toDate(yearMonth, 1)); List salaryArchiveItemCurrentList = getSalaryArchiveItemService(user).getEffectiveItemListBySalaryMonth(salaryArchiveIds, archiveItemIds, lastDayOfMonth); Map> archiveItemGroupByArchiveId = SalaryEntityUtil.group2Map(salaryArchiveItemCurrentList, archive -> archive.getSalaryArchiveId()); // 如果是12月还要获取年终奖账套数据 Map> nzAcctResultMap = new HashMap<>(); if (yearMonth.getMonthValue() == 12) { List 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 nzSalaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(nzjSobIds, yearDateRange); List 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 nzSalaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(Collections.singletonList(nzSalaryAcctRecordId)); nzSalaryAcctEmployeeList = nzSalaryAcctEmployeeList.stream().filter(salaryAcctEmp -> subcompanyIds.contains(salaryAcctEmp.getSubcompanyId())).collect(Collectors.toList()); List nzSalaryAcctEmpIds = nzSalaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); // 获取薪资核算结果 List nzNeedSumSalaryItemIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_nz_sum_salary_item_ids").split(",")) .filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); List 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 resultList = new ArrayList<>(); Map> resultMap = new HashMap<>(); for (SalaryAcctEmployeePO salaryAcctEmp : salaryAcctEmployeeList) { BigDecimal sumVal = new BigDecimal("0"); List 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 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 salaryArchiveItemPOList = archiveItemGroupByArchiveId.get(archiveId); if (CollectionUtils.isNotEmpty(salaryArchiveItemPOList)) { Map 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 resultList = resultMap.computeIfAbsent(salaryAcctEmp.getDepartmentId(), k -> new ArrayList<>()); resultList.add(sumVal.toPlainString()); } return resultMap; } private Map> getSalaryData4QxrlcbfxGroupByFylx(YearMonth yearMonth, List subcompanyIds, Map fylxMap) { BaseBean baseBean = new BaseBean(); List 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 salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(salarySobIds, dateRange); List salaryAcctRecordIds = salaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).map(SalaryAcctRecordPO::getId).collect(Collectors.toList()); // 获取薪资核算人员 List 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 salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); // 获取薪资核算结果 List needSumSalaryItemIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_sum_salary_item_ids").split(",")) .filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); List acctResultPOList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, needSumSalaryItemIds); Map> acctResultMap = SalaryEntityUtil.group2Map(acctResultPOList, SalaryAcctResultPO::getSalaryAcctEmpId); // 获取直接人员名单 List zjEmpCodes = new ArrayList<>(); List 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 employeeIdList = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).collect(Collectors.toList()); List salaryArchiveList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().employeeIds(employeeIdList).build()); Map archiveIdMap = SalaryEntityUtil.convert2Map(salaryArchiveList, archive -> archive.getTaxAgentId() + "_" + archive.getEmployeeId(), archive -> archive.getId()); List 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 archiveItemIds = Arrays.asList(jdItemId, bndItemId, nzjItemId); Date lastDayOfMonth = SalaryDateUtil.getLastDayOfMonth(SalaryDateUtil.toDate(yearMonth, 1)); List salaryArchiveItemCurrentList = getSalaryArchiveItemService(user).getEffectiveItemListBySalaryMonth(salaryArchiveIds, archiveItemIds, lastDayOfMonth); Map> archiveItemGroupByArchiveId = SalaryEntityUtil.group2Map(salaryArchiveItemCurrentList, archive -> archive.getSalaryArchiveId()); // 如果是12月还要获取年终奖账套数据 Map> nzAcctResultMap = new HashMap<>(); if (yearMonth.getMonthValue() == 12) { List 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 nzSalaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(nzjSobIds, yearDateRange); List 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 nzSalaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(Collections.singletonList(nzSalaryAcctRecordId)); nzSalaryAcctEmployeeList = nzSalaryAcctEmployeeList.stream().filter(salaryAcctEmp -> subcompanyIds.contains(salaryAcctEmp.getSubcompanyId())).collect(Collectors.toList()); List nzSalaryAcctEmpIds = nzSalaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); // 获取薪资核算结果 List nzNeedSumSalaryItemIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_nz_sum_salary_item_ids").split(",")) .filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); List 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 resultList = new ArrayList<>(); Map> resultMap = new HashMap<>(); for (SalaryAcctEmployeePO salaryAcctEmp : salaryAcctEmployeeList) { BigDecimal sumVal = new BigDecimal("0"); List 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 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 salaryArchiveItemPOList = archiveItemGroupByArchiveId.get(archiveId); if (CollectionUtils.isNotEmpty(salaryArchiveItemPOList)) { Map 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 resultList = resultMap.computeIfAbsent(fylx + "_split" + salaryAcctEmp.getDepartmentId() + "_split" + yglx, k -> new ArrayList<>()); resultList.add(sumVal.toPlainString()); } return resultMap; } /** * 联特人事口径 - 生成旗下人力成本分析 获取部门还原预算数据 */ private List> getLtBmhyysList(int year, List subcompanyIds) { RecordSet rs = new RecordSet(); BaseBean baseBean = new BaseBean(); List> resultList = new ArrayList<>(); if (CollectionUtils.isEmpty(subcompanyIds)) { return resultList; } // 获取分部下有哪些部门 List departmentIds = getSalaryEmployeeService(user).listDepartmentIdBySubcompanyIds(subcompanyIds); List 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 singleList = new ArrayList<>(); for (String field : ysMonthFields) { singleList.add(rs.getString(field)); } resultList.add(singleList); } return resultList; } private Map>> getLtBmhyysListGroupByDept(int year, List subcompanyIds) { RecordSet rs = new RecordSet(); BaseBean baseBean = new BaseBean(); Map>> resultMap = new HashMap<>(); if (CollectionUtils.isEmpty(subcompanyIds)) { return resultMap; } // 获取分部下有哪些部门 List departmentIds = getSalaryEmployeeService(user).listDepartmentIdBySubcompanyIds(subcompanyIds); List 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 singleList = new ArrayList<>(); List> 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>> getLtBmhyysListGroupByFylx(int year, List subcompanyIds) { RecordSet rs = new RecordSet(); BaseBean baseBean = new BaseBean(); Map>> resultMap = new HashMap<>(); if (CollectionUtils.isEmpty(subcompanyIds)) { return resultMap; } // 获取分部下有哪些部门 List departmentIds = getSalaryEmployeeService(user).listDepartmentIdBySubcompanyIds(subcompanyIds); List 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 singleList = new ArrayList<>(); List> 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> getLtYsList(int year, List subcompanyIds, BigDecimal[] fdbSum ) { RecordSet rs = new RecordSet(); BaseBean baseBean = new BaseBean(); List> resultList = new ArrayList<>(); if (CollectionUtils.isEmpty(subcompanyIds)) { return resultList; } List 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 singleList = new ArrayList<>(); for (String field : ysMonthFields) { singleList.add(rs.getString(field)); } resultList.add(singleList); } // 获取分部下有哪些部门 List 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>> getLtYsListGroupByDept(int year, List subcompanyIds, BigDecimal[] fdbSum ) { RecordSet rs = new RecordSet(); BaseBean baseBean = new BaseBean(); Map>> resultMap = new HashMap<>(); if (CollectionUtils.isEmpty(subcompanyIds)) { return resultMap; } List 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 singleList = new ArrayList<>(); List> singleMonthList = resultMap.computeIfAbsent(Long.valueOf(rs.getInt("bm")), k -> new ArrayList<>()); for (String field : ysMonthFields) { singleList.add(rs.getString(field)); } singleMonthList.add(singleList); } // 获取分部下有哪些部门 List 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>> getLtYsListGroupByFylx(int year, List subcompanyIds, BigDecimal[] fdbSum ) { RecordSet rs = new RecordSet(); BaseBean baseBean = new BaseBean(); Map>> resultMap = new HashMap<>(); if (CollectionUtils.isEmpty(subcompanyIds)) { return resultMap; } List 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 singleList = new ArrayList<>(); List> 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 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 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>> ltYsMap = getLtYsListGroupByDept(year, Collections.singletonList(subcompanyId), fdSum); // 获取对应的还原预算数据 Map>> ltHyysMap = getLtBmhyysListGroupByDept(year, Collections.singletonList(subcompanyId)); // 获取旗下人力成本分析对应薪酬数据 List>> ltSalaryList = new ArrayList<>(); // 循环yearMonth当年1月到12月 List yearMonths = IntStream.rangeClosed(1, 12) .mapToObj(month -> YearMonth.of(year, month)) .collect(Collectors.toList()); for (YearMonth date : yearMonths) { // 获取薪资核算数据 Map> salaryDataMap = getSalaryData4QxrlcbfxGroupByDept(date, Collections.singletonList(subcompanyId)); ltSalaryList.add(salaryDataMap); } // 一共有多少部门 List 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 existDataMap = new HashMap<>(); while (rs.next()) { existDataMap.put(Long.valueOf(rs.getInt("bm")), rs.getInt("id")); } List 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> 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> 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> salaryResultListMap = ltSalaryList.get(finalI); List 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> 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> 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> salaryResultListMap = ltSalaryList.get(finalI); List 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 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>> ltYsMap = getLtYsListGroupByFylx(year, Collections.singletonList(subcompanyId), fdSum); // 获取对应的还原预算数据 Map>> ltHyysMap = getLtBmhyysListGroupByFylx(year, Collections.singletonList(subcompanyId)); // 获取旗下人力成本分析对应薪酬数据 List>> ltSalaryList = new ArrayList<>(); // 循环yearMonth当年1月到12月 List yearMonths = IntStream.rangeClosed(1, 12) .mapToObj(month -> YearMonth.of(year, month)) .collect(Collectors.toList()); // 获取部门和费用类型的关系 Map 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> salaryDataMap = getSalaryData4QxrlcbfxGroupByFylx(date, Collections.singletonList(subcompanyId), fylxMap); ltSalaryList.add(salaryDataMap); } // 一共有哪些key List 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 existDataMap = new HashMap<>(); while (rs.next()) { existDataMap.put(rs.getString("fylx") + "_split" + rs.getString("bm")+ "_split" + rs.getString("yglx"), rs.getInt("id")); } List 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> 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> 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> salaryResultListMap = ltSalaryList.get(finalI); List 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> 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> 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> salaryResultListMap = ltSalaryList.get(finalI); List 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 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 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 yearList = ltNdhzReportDTOS.stream().map(dto -> dto.getYear()).filter(y -> y != null).distinct().sorted().collect(Collectors.toList()); Map> group2Map = SalaryEntityUtil.group2Map(ltNdhzReportDTOS, LtNdhzReportDTO::getDepartmentId); // 获取部门信息 List departmentIds = ltNdhzReportDTOS.stream().map(dto -> dto.getDepartmentId()).distinct().sorted().collect(Collectors.toList()); List deptInfoList = getSalaryEmployeeService(user).getDeptInfoList(departmentIds); List> resultList = new ArrayList<>(); Map sumValueMap = new HashMap<>(); for (DeptInfo deptInfo: deptInfoList) { List list = group2Map.get(deptInfo.getId()); if (CollectionUtils.isNotEmpty(list)) { Map 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 columns = new ArrayList<>(); columns.add(new Column("项目","departmentName","departmentName")); for (Integer year : yearList) { columns.add(new Column(year+"年",year.toString(),year.toString())); } Map 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 snapshotTime = getHrmSnapshotMapper().getSnapshotTime(startDate, endDate); BigDecimal empNums = new BigDecimal("0"); if (CollectionUtils.isNotEmpty(snapshotTime)) { Date date = snapshotTime.get(0); // 需要统计哪些人事状态的 List 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 yfgsList = getLtYfgsList(salaryMonthDate); Map xmhMap = SalaryEntityUtil.convert2Map(yfgsList, LtYfgsPO::getXm, LtYfgsPO::getXmh); // 获取需要统计赋值哪些字段(人员明细工资计提表 和 研发项目工资分摊表-当月计提 这些字段的数据库字段名需保持一致) List fieldList = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "yfxmgzftbdyjt_sum_fields").split(",")).filter(key -> StringUtils.isNotBlank(key)).collect(Collectors.toList()); List 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>> listGroupByXmh = new HashMap<>(); while (rs.next()) { Long xm = SalaryEntityUtil.string2LongDefault0(rs.getString("xm")); String xmh = SalaryEntityUtil.null2String(xmhMap.get(xm)); List> xmhList = listGroupByXmh.computeIfAbsent(xmh, k -> new ArrayList<>()); Map 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>> entry : listGroupByXmh.entrySet()) { List> valueList = entry.getValue(); Map 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 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 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 yfgsList = getLtYfgsList(salaryMonthDate); Map xmhMap = SalaryEntityUtil.convert2Map(yfgsList, LtYfgsPO::getXm, LtYfgsPO::getXmh); // 获取需要统计赋值哪些字段(人员明细工资实发表 和 研发项目工资分摊表-当月实发 这些字段的数据库字段名需保持一致) List fieldList = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "yfxmgzftbdysf_sum_fields").split(",")).filter(key -> StringUtils.isNotBlank(key)).collect(Collectors.toList()); List 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>> listGroupByXmh = new HashMap<>(); while (rs.next()) { Long xm = SalaryEntityUtil.string2LongDefault0(rs.getString("xm")); String xmh = SalaryEntityUtil.null2String(xmhMap.get(xm)); List> xmhList = listGroupByXmh.computeIfAbsent(xmh, k -> new ArrayList<>()); Map 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>> entry : listGroupByXmh.entrySet()) { List> valueList = entry.getValue(); Map 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 yfgsList = getLtYfgsList(salaryMonthDate); Map xmhMap = SalaryEntityUtil.convert2Map(yfgsList, LtYfgsPO::getXm, LtYfgsPO::getXmh); // 获取对应的上月、当月对应的计提、实发 的人员明细工资表数据 Date lastMonthDate = SalaryDateUtil.localDateToDate(SalaryDateUtil.dateToLocalDate(salaryMonthDate).minusMonths(1)); // 本月计提数据 List thisMonthJtInfo = listLtRymxgzInfo(salaryMonthDate, true, xmhMap); Map> thisMonthJtInfoMap = SalaryEntityUtil.group2Map(thisMonthJtInfo, LtRymxgzDTO::getXmh); // 上月计提数据 List lastMonthJtInfo = listLtRymxgzInfo(lastMonthDate, true, xmhMap); Map> lastMonthJtInfoMap = SalaryEntityUtil.group2Map(lastMonthJtInfo, LtRymxgzDTO::getXmh); // 本月实发数据 List thisMonthSfInfo = listLtRymxgzInfo(salaryMonthDate, false, xmhMap); Map> thisMonthSfInfoMap = SalaryEntityUtil.group2Map(thisMonthSfInfo, LtRymxgzDTO::getXmh); // 上月实发数据 List lastMonthSfInfo = listLtRymxgzInfo(lastMonthDate, false, xmhMap); Map> lastMonthSfInfoMap = SalaryEntityUtil.group2Map(lastMonthSfInfo, LtRymxgzDTO::getXmh); // 获取所有的项目号 Set 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 thisMonthJtList = CollectionUtils.isEmpty(thisMonthJtInfoMap.get(xmh)) ? new ArrayList<>() : thisMonthJtInfoMap.get(xmh) ; List lastMonthJtList = CollectionUtils.isEmpty(lastMonthJtInfoMap.get(xmh)) ? new ArrayList<>() : lastMonthJtInfoMap.get(xmh) ; List thisMonthSfList = CollectionUtils.isEmpty(thisMonthSfInfoMap.get(xmh)) ? new ArrayList<>() : thisMonthSfInfoMap.get(xmh) ; List 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 listLtRymxgzInfo(Date salaryMonthDate, boolean isJt, Map xmhMap) { if (salaryMonthDate == null) { return Collections.emptyList(); } String yearMonthStr = SalaryDateUtil.getFormatYearMonth(salaryMonthDate); List 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 yfgsList = getLtYfgsList(salaryMonthDate); Map groupMap = SalaryEntityUtil.convert2Map(yfgsList, LtYfgsPO::getXm, po -> po.getCbzx() + "_split" + po.getXmh() + "_split" + po.getXmszsyb()); // 获取需要统计赋值哪些字(人员明细工资计提表 和 部门项目工资分摊表-计提 这些字段的数据库字段名需保持一致) List fieldList = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "bmxmgzftbjt_sum_fields").split(",")).filter(key -> StringUtils.isNotBlank(key)).collect(Collectors.toList()); List 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>> listGroupByXmh = new HashMap<>(); while (rs.next()) { Long xm = SalaryEntityUtil.string2LongDefault0(rs.getString("xm")); String groupKey = SalaryEntityUtil.null2String(groupMap.get(xm)); List> groupKeyList = listGroupByXmh.computeIfAbsent(groupKey, k -> new ArrayList<>()); Map 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>> entry : listGroupByXmh.entrySet()) { List> valueList = entry.getValue(); Map 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 yfgsList = getLtYfgsList(salaryMonthDate); Map groupMap = SalaryEntityUtil.convert2Map(yfgsList, LtYfgsPO::getXm, po -> po.getCbzx() + "_split" + po.getXmh() + "_split" + po.getXmszsyb()); // 获取需要统计赋值哪些字(人员明细工资实发表 和 部门项目工资分摊表-实发 这些字段的数据库字段名需保持一致) List fieldList = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "bmxmgzftbsf_sum_fields").split(",")).filter(key -> StringUtils.isNotBlank(key)).collect(Collectors.toList()); List 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>> listGroupByXmh = new HashMap<>(); while (rs.next()) { Long xm = SalaryEntityUtil.string2LongDefault0(rs.getString("xm")); String groupKey = SalaryEntityUtil.null2String(groupMap.get(xm)); List> groupKeyList = listGroupByXmh.computeIfAbsent(groupKey, k -> new ArrayList<>()); Map 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>> entry : listGroupByXmh.entrySet()) { List> valueList = entry.getValue(); Map 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 yfgsList = getLtYfgsList(salaryMonthDate); Map 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 thisMonthJtInfo = listLtRymxgzInfo(salaryMonthDate, true, groupMap); Map> thisMonthJtInfoMap = SalaryEntityUtil.group2Map(thisMonthJtInfo, LtRymxgzDTO::getKey); // 上月计提数据 List lastMonthJtInfo = listLtRymxgzInfo(lastMonthDate, true, groupMap); Map> lastMonthJtInfoMap = SalaryEntityUtil.group2Map(lastMonthJtInfo, LtRymxgzDTO::getKey); // 本月实发数据 List thisMonthSfInfo = listLtRymxgzInfo(salaryMonthDate, false, groupMap); Map> thisMonthSfInfoMap = SalaryEntityUtil.group2Map(thisMonthSfInfo, LtRymxgzDTO::getKey); // 上月实发数据 List lastMonthSfInfo = listLtRymxgzInfo(lastMonthDate, false, groupMap); Map> lastMonthSfInfoMap = SalaryEntityUtil.group2Map(lastMonthSfInfo, LtRymxgzDTO::getKey); // 获取所有的项目号 Set 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 thisMonthJtList = CollectionUtils.isEmpty(thisMonthJtInfoMap.get(key)) ? new ArrayList<>() : thisMonthJtInfoMap.get(key) ; List lastMonthJtList = CollectionUtils.isEmpty(lastMonthJtInfoMap.get(key)) ? new ArrayList<>() : lastMonthJtInfoMap.get(key) ; List thisMonthSfList = CollectionUtils.isEmpty(thisMonthSfInfoMap.get(key)) ? new ArrayList<>() : thisMonthSfInfoMap.get(key) ; List 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 ""; } }