富士达报表

This commit is contained in:
Harryxzy 2025-08-21 11:28:31 +08:00
parent d5c8bc7fb5
commit 73c7ff48b3
9 changed files with 449 additions and 0 deletions

View File

@ -0,0 +1,26 @@
package com.engine.salary.entity.salaryacct.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassName FsdReportQueryParam
* @author Harryxzy
* @date 2025/8/15 13:50
* @description 富士达报表获取薪资核算结果
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class FsdReportDTO {
// 人数
private Integer empNums;
// 薪资值
private String resultValue;
}

View File

@ -0,0 +1,34 @@
package com.engine.salary.entity.salaryacct.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* @ClassName FsdReportQueryParam
* @author Harryxzy
* @date 2025/8/15 13:50
* @description
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class FsdReportLssjDTO {
// 列别
private String lb;
// 薪资所属月
private String xzssy;
// 当月工资人数
private Integer dygzrs;
// 当月工资总额
private BigDecimal dygzze;
}

View File

@ -0,0 +1,25 @@
package com.engine.salary.entity.salaryacct.param;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassName FsdReportQueryParam
* @author Harryxzy
* @date 2025/8/15 13:50
* @description 富士达报表获取薪资核算结果参数
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class FsdReportBatchQueryParam {
// 日期
private String salaryMonth;
// 部门
private String param;
}

View File

@ -0,0 +1,36 @@
package com.engine.salary.entity.salaryacct.param;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Map;
/**
* @ClassName FsdReportQueryParam
* @author Harryxzy
* @date 2025/8/15 13:50
* @description 富士达报表获取薪资核算结果
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class FsdReportJSONParam {
private String xh;
private String name;
private FsdReportRuleJSONParam rule;
private String id;
private String type;
private List<FsdReportJSONParam> children;
private Map<String, Object> resultValue;
}

View File

@ -0,0 +1,30 @@
package com.engine.salary.entity.salaryacct.param;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author Harryxzy
* @ClassName FsdReportRuleJSONParam
* @date 2025/08/19 9:39
* @description
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class FsdReportRuleJSONParam {
private List<Long> nosubcomids;
private List<Long> nodeptids;
private List<Long> nojobtitleids;
private List<Long> deptids;
private List<Long> jobtitleids;
private List<Long> subcomids;
}

View File

@ -235,4 +235,7 @@ public interface SalaryAcctResultService {
List<SalaryAcctResultPO> listBySobSalaryMonth(Date salaryMonth, Long salarySobId, List<Long> employeeIds, List<Long> salaryItemIds);
void quote(SalaryAcctResultQuoteParam salaryAcctResultQuoteParam);
String result4FsdReportBatch(FsdReportBatchQueryParam param);
}

View File

@ -1,6 +1,9 @@
package com.engine.salary.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.hrmelog.entity.dto.LoggerContext;
@ -20,6 +23,7 @@ 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.ConsolidatedTaxDetailDTO;
import com.engine.salary.entity.salaryacct.dto.FsdReportLssjDTO;
import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultDetailDTO;
import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultListColumnDTO;
import com.engine.salary.entity.salaryacct.param.*;
@ -48,6 +52,7 @@ 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;
@ -67,10 +72,13 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.util.StopWatch;
import weaver.conn.RecordSet;
import weaver.general.BaseBean;
import weaver.hrm.User;
import weaver.wechat.util.Utils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.CountDownLatch;
@ -1360,4 +1368,278 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
batchSave(list);
}
}
public String result4FsdReportBatch(FsdReportBatchQueryParam param) {
Date salaryMonth = SalaryDateUtil.dateStrToLocalYearMonth(param.getSalaryMonth());
if (salaryMonth == null) {
throw new SalaryRunTimeException("日期不存在或格式错误正确格式yyyy-MM");
}
log.info("salaryReport salaryMonth{}", param.getSalaryMonth());
// 获取对应社保薪资项目id
BaseBean baseBean = new BaseBean();
Long ylaogrItemId = NumberUtils.isCreatable(baseBean.getPropValue("zhfsdSalary", "ylaogr_item_id")) ? Long.valueOf(baseBean.getPropValue("zhfsdSalary", "ylaogr_item_id")) : 0L;
Long yliaogrItemId = NumberUtils.isCreatable(baseBean.getPropValue("zhfsdSalary", "yliaogr_item_id")) ? Long.valueOf(baseBean.getPropValue("zhfsdSalary", "yliaogr_item_id")) : 0L;
Long gjjgrItemId = NumberUtils.isCreatable(baseBean.getPropValue("zhfsdSalary", "gjjgr_item_id")) ? Long.valueOf(baseBean.getPropValue("zhfsdSalary", "gjjgr_item_id")) : 0L;
List<Long> sumItemIds = Arrays.asList(baseBean.getPropValue("zhfsdSalary", "need_sum_salary_item_ids").split(",")).stream().filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
List<Long> itemIds = new ArrayList<>();
itemIds.addAll(sumItemIds);
itemIds.add(ylaogrItemId);
itemIds.add(yliaogrItemId);
itemIds.add(gjjgrItemId);
// 当月数据
// 获取薪资核算记录
LocalDateRange dateRange = LocalDateRange.builder().fromDate(salaryMonth).endDate(salaryMonth).build();
List<SalaryAcctRecordPO> acctRecordList = getSalaryAcctRecordService(user).listBySalaryMonth(dateRange);
// 过滤未归档的数据
acctRecordList = acctRecordList.stream().filter(record -> record.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).collect(Collectors.toList());
List<Long> salaryAcctRecordIds = acctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
// 查询薪资核算人员
List<SalaryAcctEmployeePO> totalSalaryAcctEmployeeList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(salaryAcctRecordIds)) {
totalSalaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds);
}
List<Long> totalSalaryAcctEmpIds = totalSalaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
log.info("salaryReport 当月核算人数{}", totalSalaryAcctEmpIds == null ? 0 : totalSalaryAcctEmpIds.size());
List<SalaryAcctResultPO> totalAcctResultPOList = listByAcctEmployeeIdsAndSalaryItemIds(totalSalaryAcctEmpIds, itemIds);
// 获取建模中的历史数据
RecordSet rs = new RecordSet();
List<FsdReportLssjDTO> lssjList = new ArrayList<FsdReportLssjDTO>();
rs.execute("select lb,xzssy,dygzrs,dygzze from uf_xcfxbzblssj where xzssy >= '"+ SalaryDateUtil.getFormatYearMonth(salaryMonth)+"' and xzssy <='"+ SalaryDateUtil.getFormatYearMonth(salaryMonth)+"'");
while (rs.next()) {
lssjList.add(FsdReportLssjDTO.builder()
.lb(rs.getString("lb"))
.xzssy(rs.getString("xzssy"))
.dygzrs(rs.getInt("dygzrs"))
.dygzze(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("dygzze")))
.build());
}
log.info("salaryReport 当月核算历史数据人数{}", lssjList == null ? 0 : lssjList.size());
Map<String, List<FsdReportLssjDTO>> lssjMap = SalaryEntityUtil.group2Map(lssjList, FsdReportLssjDTO::getLb);
List<FsdReportJSONParam> fsdReportJSONParams = JsonUtil.parseList(param.getParam(), FsdReportJSONParam.class);
for (FsdReportJSONParam rangeParam : fsdReportJSONParams) {
List<FsdReportJSONParam> childrenParamList = rangeParam.getChildren();
Map<String, Object> valueMap = countFsdReportDTO(lssjMap, rangeParam, totalSalaryAcctEmployeeList, totalAcctResultPOList, itemIds, sumItemIds, ylaogrItemId, yliaogrItemId, gjjgrItemId);
Map<String, Object> resultValueMap = new HashMap<>();
resultValueMap.put("thisMonthEmpNums", valueMap.get("empNum"));
resultValueMap.put("thisMonthValue", valueMap.get("value"));
rangeParam.setResultValue(resultValueMap);
if (!CollectionUtils.isEmpty(childrenParamList)) {
for (FsdReportJSONParam childrenParam : childrenParamList) {
valueMap = countFsdReportDTO(lssjMap, childrenParam, totalSalaryAcctEmployeeList, totalAcctResultPOList, itemIds, sumItemIds, ylaogrItemId, yliaogrItemId, gjjgrItemId);
resultValueMap = new HashMap<>();
resultValueMap.put("thisMonthEmpNums", valueMap.get("empNum"));
resultValueMap.put("thisMonthValue", valueMap.get("value"));
childrenParam.setResultValue(resultValueMap);
}
}
}
// 本年数据
Date thisYearStartDate = SalaryDateUtil.getFirstDayDateOfYear(salaryMonth);
// 获取薪资核算记录
LocalDateRange thisYearDateRange = LocalDateRange.builder().fromDate(thisYearStartDate).endDate(salaryMonth).build();
int monthValue = salaryMonth.getMonth() + 1;
acctRecordList = getSalaryAcctRecordService(user).listBySalaryMonth(thisYearDateRange);
// 过滤未归档的数据
acctRecordList = acctRecordList.stream().filter(record -> record.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).collect(Collectors.toList());
salaryAcctRecordIds = acctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
// 查询薪资核算人员
totalSalaryAcctEmployeeList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(salaryAcctRecordIds)) {
totalSalaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds);
}
totalSalaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds);
totalSalaryAcctEmpIds = totalSalaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
log.info("salaryReport 本年核算人数{}", totalSalaryAcctEmpIds == null ? 0 : totalSalaryAcctEmpIds.size());
totalAcctResultPOList = listByAcctEmployeeIdsAndSalaryItemIds(totalSalaryAcctEmpIds, itemIds);
// 获取建模中的历史数据
lssjList = new ArrayList<FsdReportLssjDTO>();
rs.execute("select lb,xzssy,dygzrs,dygzze from uf_xcfxbzblssj where xzssy >= '"+ SalaryDateUtil.getFormatYearMonth(thisYearStartDate)+"' and xzssy <='"+ SalaryDateUtil.getFormatYearMonth(salaryMonth)+"'");
while (rs.next()) {
lssjList.add(FsdReportLssjDTO.builder()
.lb(rs.getString("lb"))
.xzssy(rs.getString("xzssy"))
.dygzrs(rs.getInt("dygzrs"))
.dygzze(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("dygzze")))
.build());
}
log.info("salaryReport 本年核算历史数据人数{}", lssjList == null ? 0 : lssjList.size());
lssjMap = SalaryEntityUtil.group2Map(lssjList, FsdReportLssjDTO::getLb);
for (FsdReportJSONParam rangeParam : fsdReportJSONParams) {
List<FsdReportJSONParam> childrenParamList = rangeParam.getChildren();
Map<String, Object> valueMap = countFsdReportDTO(lssjMap, rangeParam, totalSalaryAcctEmployeeList, totalAcctResultPOList, itemIds, sumItemIds, ylaogrItemId, yliaogrItemId, gjjgrItemId);
Map<String, Object> resultValueMap = rangeParam.getResultValue();
String avgEmpNums = (NumberUtils.isCreatable(Utils.null2String(valueMap.get("empNum"))) ? new BigDecimal(Utils.null2String(valueMap.get("empNum"))) : new BigDecimal("0"))
.divide(new BigDecimal(monthValue), 2, RoundingMode.HALF_UP).toString();
resultValueMap.put("thisYearAveEmpNums", avgEmpNums);
resultValueMap.put("thisYearValue", valueMap.get("value"));
rangeParam.setResultValue(resultValueMap);
if (!CollectionUtils.isEmpty(childrenParamList)) {
for (FsdReportJSONParam childrenParam : childrenParamList) {
valueMap = countFsdReportDTO(lssjMap, childrenParam, totalSalaryAcctEmployeeList, totalAcctResultPOList, itemIds, sumItemIds, ylaogrItemId, yliaogrItemId, gjjgrItemId);
resultValueMap = childrenParam.getResultValue();
avgEmpNums = (NumberUtils.isCreatable(Utils.null2String(valueMap.get("empNum"))) ? new BigDecimal(Utils.null2String(valueMap.get("empNum"))) : new BigDecimal("0"))
.divide(new BigDecimal(monthValue), 2, RoundingMode.HALF_UP).toString();
resultValueMap.put("thisYearAveEmpNums", avgEmpNums);
resultValueMap.put("thisYearValue", valueMap.get("value"));
childrenParam.setResultValue(resultValueMap);
}
}
}
// 上年数据
DateTime lastYearStartDate = DateUtil.offset(thisYearStartDate, DateField.YEAR, -1);
DateTime lastYearEndDate = DateUtil.offset(salaryMonth, DateField.YEAR, -1);
// 获取薪资核算记录
LocalDateRange lastYearDateRange = LocalDateRange.builder().fromDate(lastYearStartDate).endDate(lastYearEndDate).build();
acctRecordList = getSalaryAcctRecordService(user).listBySalaryMonth(lastYearDateRange);
// 过滤未归档的数据
acctRecordList = acctRecordList.stream().filter(record -> record.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).collect(Collectors.toList());
salaryAcctRecordIds = acctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
// 查询薪资核算人员
totalSalaryAcctEmployeeList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(salaryAcctRecordIds)) {
totalSalaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds);
}
totalSalaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds);
totalSalaryAcctEmpIds = totalSalaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
log.info("salaryReport 去年核算人数{}", totalSalaryAcctEmpIds == null ? 0 : totalSalaryAcctEmpIds.size());
totalAcctResultPOList = listByAcctEmployeeIdsAndSalaryItemIds(totalSalaryAcctEmpIds, itemIds);
// 获取建模中的历史数据
lssjList = new ArrayList<FsdReportLssjDTO>();
rs.execute("select lb,xzssy,dygzrs,dygzze from uf_xcfxbzblssj where xzssy >= '"+ SalaryDateUtil.getFormatYearMonth(lastYearStartDate)+"' and xzssy <='"+ SalaryDateUtil.getFormatYearMonth(lastYearEndDate)+"'");
while (rs.next()) {
lssjList.add(FsdReportLssjDTO.builder()
.lb(rs.getString("lb"))
.xzssy(rs.getString("xzssy"))
.dygzrs(rs.getInt("dygzrs"))
.dygzze(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("dygzze")))
.build());
}
log.info("salaryReport 去年核算历史数据人数{}", lssjList == null ? 0 : lssjList.size());
lssjMap = SalaryEntityUtil.group2Map(lssjList, FsdReportLssjDTO::getLb);
for (FsdReportJSONParam rangeParam : fsdReportJSONParams) {
List<FsdReportJSONParam> childrenParamList = rangeParam.getChildren();
Map<String, Object> valueMap = countFsdReportDTO(lssjMap, rangeParam, totalSalaryAcctEmployeeList, totalAcctResultPOList, itemIds, sumItemIds, ylaogrItemId, yliaogrItemId, gjjgrItemId);
Map<String, Object> resultValueMap = rangeParam.getResultValue();
BigDecimal avgEmpNumsVal = (NumberUtils.isCreatable(Utils.null2String(valueMap.get("empNum"))) ? new BigDecimal(Utils.null2String(valueMap.get("empNum"))) : new BigDecimal("0"))
.divide(new BigDecimal("12"), 2, RoundingMode.HALF_UP);
resultValueMap.put("lastYearAveEmpNums", avgEmpNumsVal.toString());
resultValueMap.put("lastYearValue", valueMap.get("value"));
// 获取今年平均人数和金额
BigDecimal thisYearAveEmpNums = SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(resultValueMap.get("thisYearAveEmpNums")));
BigDecimal thisYearValue = SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(resultValueMap.get("thisYearValue")));
BigDecimal lastYearValue = SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(valueMap.get("value")));
resultValueMap.put("empNumsCy", thisYearAveEmpNums.subtract(avgEmpNumsVal).toString());
resultValueMap.put("valueCy", thisYearValue.subtract(lastYearValue).toString());
rangeParam.setResultValue(resultValueMap);
if ( !CollectionUtils.isEmpty(childrenParamList)) {
for (FsdReportJSONParam childrenParam : childrenParamList) {
valueMap = countFsdReportDTO(lssjMap, childrenParam, totalSalaryAcctEmployeeList, totalAcctResultPOList, itemIds, sumItemIds, ylaogrItemId, yliaogrItemId, gjjgrItemId);
resultValueMap = childrenParam.getResultValue();
avgEmpNumsVal = (NumberUtils.isCreatable(Utils.null2String(valueMap.get("empNum"))) ? new BigDecimal(Utils.null2String(valueMap.get("empNum"))) : new BigDecimal("0"))
.divide(new BigDecimal("12"), 2, RoundingMode.HALF_UP);
resultValueMap.put("lastYearAveEmpNums", avgEmpNumsVal.toString());
resultValueMap.put("lastYearValue", valueMap.get("value"));
// 获取今年平均人数和金额
thisYearAveEmpNums = SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(resultValueMap.get("thisYearAveEmpNums")));
thisYearValue = SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(resultValueMap.get("thisYearValue")));
lastYearValue = SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(valueMap.get("value")));
resultValueMap.put("empNumsCy", thisYearAveEmpNums.subtract(avgEmpNumsVal).toString());
resultValueMap.put("valueCy", thisYearValue.subtract(lastYearValue).toString());
childrenParam.setResultValue(resultValueMap);
}
}
}
fsdReportJSONParams.stream().forEach(p -> {
if (CollectionUtils.isEmpty(p.getChildren())) {
p.setRule(null);
} else {
List<FsdReportJSONParam> children = p.getChildren();
for (FsdReportJSONParam pa : children) {
pa.setRule(null);
}
p.setRule(null);
}
});
String s = JsonUtil.toJsonString(fsdReportJSONParams);
return s;
}
private Map<String, Object> countFsdReportDTO(Map<String, List<FsdReportLssjDTO>> lssjMap,FsdReportJSONParam rangeParam, List<SalaryAcctEmployeePO> totalSalaryAcctEmployeeList,
List<SalaryAcctResultPO> totalAcctResultPOList, List<Long> itemIds,
List<Long> sumItemIds, Long ylaogrItemId, Long yliaogrItemId , Long gjjgrItemId) {
List<SalaryAcctEmployeePO> salaryAcctEmployeeList = new ArrayList<>();
salaryAcctEmployeeList.addAll(totalSalaryAcctEmployeeList);
FsdReportRuleJSONParam rule = rangeParam.getRule();
// 根据条件过滤核算人员
if (CollectionUtils.isNotEmpty(rule.getSubcomids())) {
salaryAcctEmployeeList = salaryAcctEmployeeList.stream().filter(salaryAcctEmployee -> rule.getSubcomids().contains(salaryAcctEmployee.getSubcompanyId())).collect(Collectors.toList());
}
if (CollectionUtils.isNotEmpty(rule.getDeptids())) {
salaryAcctEmployeeList = salaryAcctEmployeeList.stream().filter(salaryAcctEmployee -> rule.getDeptids().contains(salaryAcctEmployee.getDepartmentId())).collect(Collectors.toList());
}
if (CollectionUtils.isNotEmpty(rule.getJobtitleids())) {
salaryAcctEmployeeList = salaryAcctEmployeeList.stream().filter(salaryAcctEmployee -> rule.getJobtitleids().contains(salaryAcctEmployee.getJobtitleId())).collect(Collectors.toList());
}
if (CollectionUtils.isNotEmpty(rule.getNosubcomids())) {
salaryAcctEmployeeList = salaryAcctEmployeeList.stream().filter(salaryAcctEmployee -> !rule.getNosubcomids().contains(salaryAcctEmployee.getSubcompanyId())).collect(Collectors.toList());
}
if (CollectionUtils.isNotEmpty(rule.getNodeptids())) {
salaryAcctEmployeeList = salaryAcctEmployeeList.stream().filter(salaryAcctEmployee -> !rule.getNodeptids().contains(salaryAcctEmployee.getDepartmentId())).collect(Collectors.toList());
}
if (CollectionUtils.isNotEmpty(rule.getNojobtitleids())) {
salaryAcctEmployeeList = salaryAcctEmployeeList.stream().filter(salaryAcctEmployee -> !rule.getNojobtitleids().contains(salaryAcctEmployee.getJobtitleId())).collect(Collectors.toList());
}
Map<String, Object> resultMap = new HashMap<>();
List<FsdReportLssjDTO> lssjList = lssjMap.get(rangeParam.getName());
Integer lsEmps = 0;
BigDecimal lsValSum = new BigDecimal("0");
if (CollectionUtils.isNotEmpty(lssjList)) {
lsEmps = lssjList.stream().map(ls -> ls.getDygzrs()).filter(rs -> rs != null).reduce(new Integer("0"), Integer::sum);
lsValSum = lssjList.stream().map(ls -> ls.getDygzze()).filter(val -> val != null).reduce(new BigDecimal("0"), BigDecimal::add);
}
if (CollectionUtils.isEmpty(salaryAcctEmployeeList)) {
resultMap.put("empNum", lsEmps.toString());
resultMap.put("value", lsValSum.toString());
return resultMap;
}
List<Long> salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
List<SalaryAcctResultPO> acctResultPOList = totalAcctResultPOList.stream().filter(result -> salaryAcctEmpIds.contains(result.getSalaryAcctEmpId())).collect(Collectors.toList());
Map<Long, List<SalaryAcctResultPO>> acctResultGroupByAcctEmpId = SalaryEntityUtil.group2Map(acctResultPOList, SalaryAcctResultPO::getSalaryAcctEmpId);
BigDecimal sumValue = new BigDecimal("0");
for (Map.Entry<Long, List<SalaryAcctResultPO>> entry : acctResultGroupByAcctEmpId.entrySet()) {
Map<Long, String> singleResultMap = SalaryEntityUtil.convert2Map(entry.getValue(), SalaryAcctResultPO::getSalaryItemId, result -> Utils.null2String(result.getResultValue()));
// 养老单位=养老个人/8%*16%
BigDecimal ylaogr = SalaryEntityUtil.string2BigDecimalDefault0(singleResultMap.get(ylaogrItemId));
BigDecimal ylaodw = ylaogr.divide(new BigDecimal("0.08"), 15, RoundingMode.HALF_UP).multiply(new BigDecimal("0.16")).setScale(2, BigDecimal.ROUND_HALF_UP);
// 医疗单位=医疗个人/2%*8%
BigDecimal yliaogr = SalaryEntityUtil.string2BigDecimalDefault0(singleResultMap.get(yliaogrItemId));
BigDecimal yliaodw = yliaogr.divide(new BigDecimal("0.02"), 15, RoundingMode.HALF_UP).multiply(new BigDecimal("0.08")).setScale(2, BigDecimal.ROUND_HALF_UP);
// 大额医疗=8元/ 有医疗保险个人的无医疗保险个人为0
String yliaogrStr = singleResultMap.get(yliaogrItemId);
BigDecimal deyl = new BigDecimal("0");
if (yliaogrStr != null && NumberUtils.isCreatable(yliaogrStr) && new BigDecimal(yliaogrStr).compareTo(new BigDecimal("0")) != 0) {
deyl = new BigDecimal("8");
}
// 失业单位=养老个人/8%*0.7%
BigDecimal syedw = ylaogr.divide(new BigDecimal("0.08"), 15, RoundingMode.HALF_UP).multiply(new BigDecimal("0.007")).setScale(2, BigDecimal.ROUND_HALF_UP);
// 工伤单位=养老个人/8%*0.56%
BigDecimal gsdw = ylaogr.divide(new BigDecimal("0.08"), 15, RoundingMode.HALF_UP).multiply(new BigDecimal("0.0056")).setScale(2, BigDecimal.ROUND_HALF_UP);
// 公积金单位=公积金个人/5%*12%
BigDecimal gjjgr = SalaryEntityUtil.string2BigDecimalDefault0(singleResultMap.get(gjjgrItemId));
BigDecimal gjjdw = gjjgr.divide(new BigDecimal("0.05"), 15, RoundingMode.HALF_UP).multiply(new BigDecimal("0.12")).setScale(2, BigDecimal.ROUND_HALF_UP);
sumValue = sumValue.add(ylaodw).add(yliaodw).add(deyl).add(syedw).add(gsdw).add(gjjdw);
for (Long itemId : sumItemIds) {
sumValue = sumValue.add(SalaryEntityUtil.string2BigDecimalDefault0(singleResultMap.get(itemId)));
}
}
resultMap.put("empNum", salaryAcctEmpIds.size()+lsEmps);
resultMap.put("value", sumValue.add(lsValSum).toString());
return resultMap;
}
}

View File

@ -937,4 +937,12 @@ public class SalaryAcctController {
}
/**********************************线下对比 end*********************************/
@POST
@Path("/result4FsdReportBatch")
@Produces(MediaType.APPLICATION_JSON)
public String result4FsdReportBatch(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody FsdReportBatchQueryParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<FsdReportBatchQueryParam, String>(user).run(getSalaryAcctResultWrapper(user)::result4FsdReportBatch, param);
}
}

View File

@ -283,6 +283,11 @@ public class SalaryAcctResultWrapper extends Service implements SalaryAcctResult
getSalaryAcctResultService(user).quote(salaryAcctResultQuoteParam);
}
public String result4FsdReportBatch(FsdReportBatchQueryParam param) {
return getSalaryAcctResultService(user).result4FsdReportBatch(param);
}
/**
* 薪资核算-校验
*