diff --git a/src/com/engine/salary/entity/salaryacct/dto/FsdReportDTO.java b/src/com/engine/salary/entity/salaryacct/dto/FsdReportDTO.java new file mode 100644 index 000000000..8b879ed45 --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/dto/FsdReportDTO.java @@ -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; + +} diff --git a/src/com/engine/salary/entity/salaryacct/dto/FsdReportLssjDTO.java b/src/com/engine/salary/entity/salaryacct/dto/FsdReportLssjDTO.java new file mode 100644 index 000000000..ae72b82bf --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/dto/FsdReportLssjDTO.java @@ -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; + +} diff --git a/src/com/engine/salary/entity/salaryacct/param/FsdReportBatchQueryParam.java b/src/com/engine/salary/entity/salaryacct/param/FsdReportBatchQueryParam.java new file mode 100644 index 000000000..e449a891e --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/param/FsdReportBatchQueryParam.java @@ -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; +} diff --git a/src/com/engine/salary/entity/salaryacct/param/FsdReportJSONParam.java b/src/com/engine/salary/entity/salaryacct/param/FsdReportJSONParam.java new file mode 100644 index 000000000..fc325c252 --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/param/FsdReportJSONParam.java @@ -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 children; + + private Map resultValue; +} diff --git a/src/com/engine/salary/entity/salaryacct/param/FsdReportRuleJSONParam.java b/src/com/engine/salary/entity/salaryacct/param/FsdReportRuleJSONParam.java new file mode 100644 index 000000000..43b9804c0 --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/param/FsdReportRuleJSONParam.java @@ -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 nosubcomids; + private List nodeptids; + private List nojobtitleids; + private List deptids; + private List jobtitleids; + private List subcomids; + + +} diff --git a/src/com/engine/salary/service/SalaryAcctResultService.java b/src/com/engine/salary/service/SalaryAcctResultService.java index caaae404e..e968c6570 100644 --- a/src/com/engine/salary/service/SalaryAcctResultService.java +++ b/src/com/engine/salary/service/SalaryAcctResultService.java @@ -235,4 +235,7 @@ public interface SalaryAcctResultService { List listBySobSalaryMonth(Date salaryMonth, Long salarySobId, List employeeIds, List salaryItemIds); void quote(SalaryAcctResultQuoteParam salaryAcctResultQuoteParam); + + + String result4FsdReportBatch(FsdReportBatchQueryParam param); } diff --git a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java index ec6c36d92..f72722928 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java @@ -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 sumItemIds = Arrays.asList(baseBean.getPropValue("zhfsdSalary", "need_sum_salary_item_ids").split(",")).stream().filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); + List 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 acctRecordList = getSalaryAcctRecordService(user).listBySalaryMonth(dateRange); + // 过滤未归档的数据 + acctRecordList = acctRecordList.stream().filter(record -> record.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).collect(Collectors.toList()); + List salaryAcctRecordIds = acctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList()); + // 查询薪资核算人员 + List totalSalaryAcctEmployeeList = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(salaryAcctRecordIds)) { + totalSalaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds); + } + List totalSalaryAcctEmpIds = totalSalaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); + log.info("salaryReport 当月核算人数{}", totalSalaryAcctEmpIds == null ? 0 : totalSalaryAcctEmpIds.size()); + List totalAcctResultPOList = listByAcctEmployeeIdsAndSalaryItemIds(totalSalaryAcctEmpIds, itemIds); + // 获取建模中的历史数据 + RecordSet rs = new RecordSet(); + List lssjList = new ArrayList(); + 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> lssjMap = SalaryEntityUtil.group2Map(lssjList, FsdReportLssjDTO::getLb); + List fsdReportJSONParams = JsonUtil.parseList(param.getParam(), FsdReportJSONParam.class); + for (FsdReportJSONParam rangeParam : fsdReportJSONParams) { + List childrenParamList = rangeParam.getChildren(); + Map valueMap = countFsdReportDTO(lssjMap, rangeParam, totalSalaryAcctEmployeeList, totalAcctResultPOList, itemIds, sumItemIds, ylaogrItemId, yliaogrItemId, gjjgrItemId); + Map 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(); + 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 childrenParamList = rangeParam.getChildren(); + Map valueMap = countFsdReportDTO(lssjMap, rangeParam, totalSalaryAcctEmployeeList, totalAcctResultPOList, itemIds, sumItemIds, ylaogrItemId, yliaogrItemId, gjjgrItemId); + Map 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(); + 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 childrenParamList = rangeParam.getChildren(); + Map valueMap = countFsdReportDTO(lssjMap, rangeParam, totalSalaryAcctEmployeeList, totalAcctResultPOList, itemIds, sumItemIds, ylaogrItemId, yliaogrItemId, gjjgrItemId); + Map 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 children = p.getChildren(); + for (FsdReportJSONParam pa : children) { + pa.setRule(null); + } + p.setRule(null); + } + }); + String s = JsonUtil.toJsonString(fsdReportJSONParams); + return s; + } + + private Map countFsdReportDTO(Map> lssjMap,FsdReportJSONParam rangeParam, List totalSalaryAcctEmployeeList, + List totalAcctResultPOList, List itemIds, + List sumItemIds, Long ylaogrItemId, Long yliaogrItemId , Long gjjgrItemId) { + List 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 resultMap = new HashMap<>(); + List 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 salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); + List acctResultPOList = totalAcctResultPOList.stream().filter(result -> salaryAcctEmpIds.contains(result.getSalaryAcctEmpId())).collect(Collectors.toList()); + Map> acctResultGroupByAcctEmpId = SalaryEntityUtil.group2Map(acctResultPOList, SalaryAcctResultPO::getSalaryAcctEmpId); + BigDecimal sumValue = new BigDecimal("0"); + for (Map.Entry> entry : acctResultGroupByAcctEmpId.entrySet()) { + Map 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; + } } \ No newline at end of file diff --git a/src/com/engine/salary/web/SalaryAcctController.java b/src/com/engine/salary/web/SalaryAcctController.java index 49d1f8cc2..2f76e6f92 100644 --- a/src/com/engine/salary/web/SalaryAcctController.java +++ b/src/com/engine/salary/web/SalaryAcctController.java @@ -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(user).run(getSalaryAcctResultWrapper(user)::result4FsdReportBatch, param); + } } diff --git a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java index 6519a0aab..dc479a694 100644 --- a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java @@ -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); + } + /** * 薪资核算-校验 *