Compare commits

...

3 Commits

Author SHA1 Message Date
Harryxzy 61cf337bde 薪资档案增加岗位,及报表接口调整 2025-08-22 17:14:26 +08:00
Harryxzy c08478befb 富士达报表 2025-08-21 14:24:58 +08:00
Harryxzy 73c7ff48b3 富士达报表 2025-08-21 11:28:31 +08:00
13 changed files with 512 additions and 4 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,49 @@
package com.engine.salary.entity.salaryacct.param;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @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 String key;
private List<FsdReportJSONParam> children;
// private Map<String, Object> resultValue;
private String thisMonthValue;
private String thisYearValue;
private String lastYearValue;
private String thisMonthEmpNums;
private String thisYearAveEmpNums;
private String lastYearAveEmpNums;
private String empNumsCy;
private String valueCy;
}

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

@ -78,6 +78,7 @@ public class SalaryArchiveBO {
columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"), "taxAgentName"));
columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86185, "分部"), "subcompanyName"));
columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86185, "部门"), "departmentName"));
columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86185, "岗位"), "jobtitle"));
columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86185, "工号"), "workcode"));
columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86186, "手机号"), "mobile"));
columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86186, "证件号码"), "idNo"));

View File

@ -61,6 +61,12 @@ public class SalaryArchiveListDTO {
@I18n
private String subcompanyName;
/**
* 岗位
*/
@I18n
private String jobtitle;
/**
* 部门
*/

View File

@ -104,6 +104,7 @@
,e.accounttype as accountType
, d.departmentname AS departmentName
, c.subcompanyname AS subcompanyName
, j.jobtitlename AS jobtitle
</sql>
@ -116,6 +117,7 @@
LEFT JOIN hrmresource e ON e.id = t.employee_id
LEFT JOIN hrmdepartment d ON d.id = e.departmentid
LEFT JOIN hrmsubcompany c ON c.id = e.subcompanyid1
LEFT JOIN hrmjobtitles j on e.jobtitle = j.id
WHERE t.delete_type = 0
and (t.employee_type is null or t.employee_type = 0)
and e.status not in (7)
@ -220,6 +222,7 @@
LEFT JOIN hrmresource e ON e.id = t.employee_id
LEFT JOIN hrmdepartment d ON d.id = e.departmentid
LEFT JOIN hrmsubcompany c ON c.id = e.subcompanyid1
LEFT JOIN hrmjobtitles j on e.jobtitle = j.id
WHERE t.delete_type = 0
and (t.employee_type is null or t.employee_type = 0)
and e.status not in (7)
@ -321,6 +324,7 @@
LEFT JOIN hrmresource e ON e.id = t.employee_id
LEFT JOIN hrmdepartment d ON d.id = e.departmentid
LEFT JOIN hrmsubcompany c ON c.id = e.subcompanyid1
LEFT JOIN hrmjobtitles j on e.jobtitle = j.id
WHERE t.delete_type = 0
and (t.employee_type is null or t.employee_type = 0)
and e.status not in (7)

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,10 @@
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.alibaba.fastjson.JSON;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.hrmelog.entity.dto.LoggerContext;
@ -20,6 +24,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 +53,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 +73,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;
@ -1109,11 +1118,11 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
List<SalaryAcctResultPO> result = new ArrayList<>();
partition.forEach(empIds -> {
SalaryAcctResultPO build = SalaryAcctResultPO.builder().salaryAcctEmpIds(empIds).salaryItemIds(salaryItemIds).build();
result.addAll(getSalaryAcctResultMapper().listSome(build));
List<SalaryAcctResultPO> acctResultList = getSalaryAcctResultMapper().listSome(build);
// 数据解密
encryptUtil.decryptList(acctResultList, SalaryAcctResultPO.class);
result.addAll(acctResultList);
});
// 数据解密
encryptUtil.decryptList(result, SalaryAcctResultPO.class);
return result;
}
@ -1360,4 +1369,309 @@ 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();
if (!CollectionUtils.isEmpty(childrenParamList)) {
BigDecimal sumEmpNum = new BigDecimal("0");
BigDecimal sumValue = new BigDecimal("0");
for (FsdReportJSONParam childrenParam : childrenParamList) {
Map<String, Object>valueMap = countFsdReportDTO(lssjMap, childrenParam, totalSalaryAcctEmployeeList, totalAcctResultPOList, itemIds, sumItemIds, ylaogrItemId, yliaogrItemId, gjjgrItemId);
String empNum = Utils.null2String(valueMap.get("empNum"));
String value = Utils.null2String(valueMap.get("value"));
childrenParam.setThisMonthEmpNums(empNum);
childrenParam.setThisMonthValue(value);
sumEmpNum = sumEmpNum.add(SalaryEntityUtil.string2BigDecimalDefault0(empNum));
sumValue = sumValue.add(SalaryEntityUtil.string2BigDecimalDefault0(value));
}
rangeParam.setThisMonthEmpNums(sumEmpNum.toString());
rangeParam.setThisMonthValue(sumValue.toString());
} else {
Map<String, Object> valueMap = countFsdReportDTO(lssjMap, rangeParam, totalSalaryAcctEmployeeList, totalAcctResultPOList, itemIds, sumItemIds, ylaogrItemId, yliaogrItemId, gjjgrItemId);
rangeParam.setThisMonthEmpNums(Utils.null2String(valueMap.get("empNum")));
rangeParam.setThisMonthValue(Utils.null2String(valueMap.get("value")));
}
}
// 本年数据
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);
}
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();
if (!CollectionUtils.isEmpty(childrenParamList)) {
BigDecimal sumEmpNums = new BigDecimal("0");
BigDecimal sumValue = new BigDecimal("0");
for (FsdReportJSONParam childrenParam : childrenParamList) {
Map<String, Object> valueMap = countFsdReportDTO(lssjMap, childrenParam, totalSalaryAcctEmployeeList, totalAcctResultPOList, itemIds, sumItemIds, ylaogrItemId, yliaogrItemId, gjjgrItemId);
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();
String value = Utils.null2String(valueMap.get("value"));
childrenParam.setThisYearAveEmpNums(avgEmpNums);
childrenParam.setThisYearValue(value);
sumEmpNums = sumEmpNums.add(SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(valueMap.get("empNum"))));
sumValue = sumValue.add(SalaryEntityUtil.string2BigDecimalDefault0(value));
}
rangeParam.setThisYearAveEmpNums(sumEmpNums.divide(new BigDecimal(monthValue), 2, RoundingMode.HALF_UP).toString());
rangeParam.setThisYearValue(sumValue.toString());
} else {
Map<String, Object> valueMap = countFsdReportDTO(lssjMap, rangeParam, totalSalaryAcctEmployeeList, totalAcctResultPOList, itemIds, sumItemIds, ylaogrItemId, yliaogrItemId, gjjgrItemId);
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();
rangeParam.setThisYearAveEmpNums(avgEmpNums);
rangeParam.setThisYearValue(Utils.null2String(valueMap.get("value")));
}
}
// 上年数据
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);
}
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();
if ( !CollectionUtils.isEmpty(childrenParamList)) {
BigDecimal sumLastYearEmpNums = new BigDecimal("0");
BigDecimal sumLastYearValue = new BigDecimal("0");
for (FsdReportJSONParam childrenParam : childrenParamList) {
Map<String, Object> valueMap = countFsdReportDTO(lssjMap, childrenParam, totalSalaryAcctEmployeeList, totalAcctResultPOList, itemIds, sumItemIds, ylaogrItemId, yliaogrItemId, gjjgrItemId);
BigDecimal avgEmpNumsVal = (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);
childrenParam.setLastYearAveEmpNums(avgEmpNumsVal.toString());
childrenParam.setLastYearValue(Utils.null2String(valueMap.get("value")));
// 获取今年平均人数和金额
BigDecimal thisYearAveEmpNums = SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(childrenParam.getThisYearAveEmpNums()));
BigDecimal thisYearValue = SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(childrenParam.getThisYearValue()));
BigDecimal lastYearValue = SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(valueMap.get("value")));
childrenParam.setEmpNumsCy(thisYearAveEmpNums.subtract(avgEmpNumsVal).toString());
childrenParam.setValueCy(thisYearValue.subtract(lastYearValue).toString());
sumLastYearEmpNums = sumLastYearEmpNums.add(SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(valueMap.get("empNum"))));
sumLastYearValue = sumLastYearValue.add(SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(valueMap.get("value"))));
}
BigDecimal lastYearAveEmpNums = sumLastYearEmpNums.divide(new BigDecimal(monthValue), 2, RoundingMode.HALF_UP);
rangeParam.setLastYearAveEmpNums(lastYearAveEmpNums.toString());
rangeParam.setLastYearValue(sumLastYearValue.toString());
// 获取今年平均人数和金额
BigDecimal thisYearAveEmpNums = SalaryEntityUtil.string2BigDecimalDefault0(rangeParam.getThisYearAveEmpNums());
BigDecimal thisYearValue = SalaryEntityUtil.string2BigDecimalDefault0(rangeParam.getThisYearValue());
rangeParam.setEmpNumsCy(thisYearAveEmpNums.subtract(lastYearAveEmpNums).toString());
rangeParam.setValueCy(thisYearValue.subtract(sumLastYearValue).toString());
} else {
Map<String, Object> valueMap = countFsdReportDTO(lssjMap, rangeParam, totalSalaryAcctEmployeeList, totalAcctResultPOList, itemIds, sumItemIds, ylaogrItemId, yliaogrItemId, gjjgrItemId);
BigDecimal avgEmpNumsVal = (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);
rangeParam.setLastYearAveEmpNums(avgEmpNumsVal.toString());
rangeParam.setLastYearValue(Utils.null2String(valueMap.get("value")));
// 获取今年平均人数和金额
BigDecimal thisYearAveEmpNums = SalaryEntityUtil.string2BigDecimalDefault0(rangeParam.getThisYearAveEmpNums());
BigDecimal thisYearValue = SalaryEntityUtil.string2BigDecimalDefault0(rangeParam.getThisYearValue());
BigDecimal lastYearValue = SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(valueMap.get("value")));
rangeParam.setEmpNumsCy(thisYearAveEmpNums.subtract(avgEmpNumsVal).toString());
rangeParam.setValueCy(thisYearValue.subtract(lastYearValue).toString());
}
}
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);
}
});
return JSON.toJSONString(fsdReportJSONParams);
}
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 (rule == null) {
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);
}
resultMap.put("empNum", lsEmps.toString());
resultMap.put("value", lsValSum.toString());
return resultMap;
}
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

@ -489,6 +489,7 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe
map.put("subcompanyName", e.getSubcompanyName());
map.put("departmentName", e.getDepartmentName());
map.put("jobtitle", e.getJobtitle());
map.put("mobile", e.getMobile());
map.put("workcode", e.getWorkcode());
map.put("idNo", e.getIdNo());
@ -520,6 +521,7 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe
new WeaTableColumnGroup("150px", SalaryI18nUtil.getI18nLabel(85429, "姓名"), "", "", 0),
new WeaTableColumnGroup("150px", SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"), "", "", 0),
new WeaTableColumnGroup("150px", SalaryI18nUtil.getI18nLabel(86185, "部门"), "", "", 0),
new WeaTableColumnGroup("150px", SalaryI18nUtil.getI18nLabel(86185, "岗位"), "", "", 0),
new WeaTableColumnGroup("150px", SalaryI18nUtil.getI18nLabel(86176, "工号"), "", "", 0),
new WeaTableColumnGroup("150px", SalaryI18nUtil.getI18nLabel(86186, "手机号"), "", "", 0),
new WeaTableColumnGroup("150px", SalaryI18nUtil.getI18nLabel(86186, "证件号码"), "", "", 0),
@ -559,6 +561,7 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe
row.add(Util.null2String(e.get("username")));
row.add(Util.null2String(e.get("taxAgentName")));
row.add(Util.null2String(e.get("departmentName")));
row.add(Util.null2String(e.get("jobtitle")));
row.add(Util.null2String(e.get("workcode")));
row.add(Util.null2String(e.get("mobile")));
row.add(Util.null2String(e.get("idNo")));

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);
}
/**
* 薪资核算-校验
*