weaver-hrm-salary/src/com/engine/salary/entity/siaccount/bo/InsuranceComparisonResultBO...

361 lines
22 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.engine.salary.entity.siaccount.bo;
import com.alibaba.fastjson.JSON;
import com.engine.salary.entity.salaryacct.po.ExcelAcctResultPO;
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
import com.engine.salary.entity.salarysob.dto.SalarySobEmpFieldDTO;
import com.engine.salary.entity.sicategory.po.ICategoryPO;
import com.engine.salary.entity.siexport.po.AccountExportPO;
import com.engine.salary.entity.siexport.po.ExcelAccountExportPO;
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum;
import com.engine.salary.mapper.sicategory.ICategoryMapper;
import com.engine.salary.mapper.taxagent.TaxAgentMapper;
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.google.common.collect.Lists;
import com.google.common.collect.Maps;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import static com.engine.salary.enums.UserStatusEnum.getDefaultLabelByValue;
/**
* @Author: sy
* @Description: 福利核算线上线下对比结果
* @Date: 2022/9/28
**/
public class InsuranceComparisonResultBO {
/**
* 数据类型的后缀标识
* 为了展示千分位,福利核算结果列表、线上线下对比结果列表需要返回给前端列表字段的数据类型,字段索引+后缀标识
*/
private static final String DATA_TYPE_SUFFIX = "_type";
/**
* 构建福利核算结果列表的表头(线下对比)
*
*/
public static List<Column> buildTableColumns4ComparisonResult(Set<Long> insuranceBaseSet, Set<Long> insurancePerPaySet, Set<Long> insuranceComPaySet) {
List<ICategoryPO> listAll = MapperProxyFactory.getProxy(ICategoryMapper.class).listAll();
List<ICategoryPO> socialWelfareList = listAll.stream().filter(e -> e.getWelfareType() == 1 && e.getIsUse() == 1 && insuranceBaseSet.contains(e.getId())).collect(Collectors.toList());
List<ICategoryPO> fundWelfareList = listAll.stream().filter(e -> e.getWelfareType() == 2 && e.getIsUse() == 1 && insuranceBaseSet.contains(e.getId())).collect(Collectors.toList());
List<ICategoryPO> otherWelfareList = listAll.stream().filter(e -> e.getWelfareType() == 3 && e.getIsUse() == 1 && insuranceBaseSet.contains(e.getId())).collect(Collectors.toList());
List<ICategoryPO> socialWelPerList = listAll.stream().filter(e -> e.getWelfareType() == 1 && e.getIsUse() == 1 && insurancePerPaySet.contains(e.getId())).collect(Collectors.toList());
List<ICategoryPO> fundWelPerList = listAll.stream().filter(e -> e.getWelfareType() == 2 && e.getIsUse() == 1 && insurancePerPaySet.contains(e.getId())).collect(Collectors.toList());
List<ICategoryPO> otherWelPerList = listAll.stream().filter(e -> e.getWelfareType() == 3 && e.getIsUse() == 1 && insurancePerPaySet.contains(e.getId())).collect(Collectors.toList());
List<ICategoryPO> socialWelComList = listAll.stream().filter(e -> e.getWelfareType() == 1 && e.getIsUse() == 1 && insuranceComPaySet.contains(e.getId())).collect(Collectors.toList());
List<ICategoryPO> fundWelComList = listAll.stream().filter(e -> e.getWelfareType() == 2 && e.getIsUse() == 1 && insuranceComPaySet.contains(e.getId())).collect(Collectors.toList());
List<ICategoryPO> otherWelComList = listAll.stream().filter(e -> e.getWelfareType() == 3 && e.getIsUse() == 1 && insuranceComPaySet.contains(e.getId())).collect(Collectors.toList());
List<Column> columns = Lists.newArrayList();
// 员工信息字段
columns.add(new Column("姓名", "userName", "userName"));
columns.add(new Column("部门", "department", "department"));
columns.add(new Column("手机号", "mobile", "mobile"));
columns.add(new Column("工号", "workcode", "workcode"));
columns.add(new Column("员工状态", "employeeStatus", "employeeStatus"));
columns.add(new Column("数据来源", "sourceFrom", "sourceFrom"));
columns.add(new Column("个税扣缴义务人", "socialPayOrg", "socialPayOrg"));
columns.add(new Column("社保账号", "socialAccount", "socialAccount"));
columns.add(new Column("社保方案名称", "socialSchemeName", "socialSchemeName"));
//组装社保基数
for (ICategoryPO po : socialWelfareList) {
columns.add(new Column(po.getInsuranceName() + "申报基数", po.getId() + "socialBase", po.getId() + "socialBase"));
}
columns.add(new Column("公积金账号", "fundAccount", "fundAccount"));
columns.add(new Column("公积金方案名称", "fundSchemeName", "fundSchemeName"));
//组装公积金基数
for (ICategoryPO po : fundWelfareList) {
columns.add(new Column(po.getInsuranceName() + "申报基数", po.getId() + "fundBase", po.getId() + "fundBase"));
}
columns.add(new Column("补充公积金账号", "supplementFundAccount", "supplementFundAccount"));
columns.add(new Column("其他福利方案名称", "otherSchemeName", "otherSchemeName"));
//组装其他福利基数
for (ICategoryPO po : otherWelfareList) {
columns.add(new Column(po.getInsuranceName() + "申报基数", po.getId() + "otherBase", po.getId() + "otherBase"));
}
//社保个人(生育保险个人、工伤保险个人、失业保险个人、养老保险个人、医疗保险个人)
for (ICategoryPO po : socialWelPerList) {
columns.add(new Column(po.getInsuranceName() + "个人", po.getId() + "socialPer", po.getId() + "socialPer"));
}
columns.add(new Column("社保个人合计", "socialPerSum", "socialPerSum"));
//住房公积金个人、补充住房公积金个人
for (ICategoryPO po : fundWelPerList) {
columns.add(new Column(po.getInsuranceName() + "个人", po.getId() + "fundPer", po.getId() + "fundPer"));
}
columns.add(new Column("公积金个人合计", "fundPerSum", "fundPerSum"));
//其他个人(比如企业年金个人)
for (ICategoryPO po : otherWelPerList) {
columns.add(new Column(po.getInsuranceName() + "个人", po.getId() + "otherPer", po.getId() + "otherPer"));
}
columns.add(new Column("其他福利个人合计", "otherPerSum", "otherPerSum"));
columns.add(new Column("个人合计", "perSum", "perSum"));
//社保单位(生育保险单位、工伤保险单位、失业保险单位、养老保险单位、医疗保险单位)
for (ICategoryPO po : socialWelComList) {
columns.add(new Column(po.getInsuranceName() + "单位", po.getId() + "socialCom", po.getId() + "socialCom"));
}
columns.add(new Column("社保单位合计", "socialComSum", "socialComSum"));
//住房公积金单位、补充住房公积金单位
for (ICategoryPO po : fundWelComList) {
columns.add(new Column(po.getInsuranceName() + "单位", po.getId() + "fundCom", po.getId() + "fundCom"));
}
columns.add(new Column("公积金单位合计", "fundComSum", "fundComSum"));
//其他单位(比如企业年金单位)
for (ICategoryPO po : otherWelComList) {
columns.add(new Column(po.getInsuranceName() + "单位", po.getId() + "otherCom", po.getId() + "otherCom"));
}
columns.add(new Column("其他福利单位合计", "otherComSum", "otherComSum"));
columns.add(new Column("单位合计", "comSum", "comSum"));
columns.add(new Column("社保合计", "socialSum", "socialSum"));
columns.add(new Column("公积金合计", "fundSum", "fundSum"));
columns.add(new Column("其他福利合计", "otherSum", "otherSum"));
columns.add(new Column("合计", "total", "total"));
return columns;
}
/**
* 构建福利核算线下对比结果
*
*/
public static List<Map<String, Object>> buildComparisonTableData(List<AccountExportPO> accountExportPOS, List<ExcelAccountExportPO> excelAccountExportPOS, Map<Long, String> schemeIdNameMap) {
Map<String, List<ExcelAccountExportPO>> excelResultMap = SalaryEntityUtil.group2Map(excelAccountExportPOS, ExcelAccountExportPO::getWorkcode);
// Map<String, List<AccountExportPO>> acctResultMap = SalaryEntityUtil.group2Map(accountExportPOS, AccountExportPO::getWorkcode);
List<TaxAgentPO> paymentList = MapperProxyFactory.getProxy(TaxAgentMapper.class).listAll();
Map<Long, TaxAgentPO> paymentMap = paymentList.stream().collect(Collectors.toMap(TaxAgentPO::getId, Function.identity()));
List<Map<String, Object>> resultList = Lists.newArrayListWithExpectedSize(accountExportPOS.size());
//遍历线上数据
for (AccountExportPO accountExportPO : accountExportPOS) {
Map<String, Object> map = Maps.newHashMap();
// 记录线下值和系统值之间是否存在差异
map.put("different", "false");
//设置基本字段信息和类型
map.put("userName", accountExportPO.getUserName());
map.put("userName" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
map.put("department", accountExportPO.getDepartmentName());
map.put("department" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
map.put("mobile", accountExportPO.getTelephone());
map.put("mobile" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
map.put("workcode", accountExportPO.getWorkcode());
map.put("workcode" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
map.put("employeeStatus", accountExportPO.getUserStatus() == null ? "" : getDefaultLabelByValue(accountExportPO.getUserStatus()));
map.put("employeeStatus" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
map.put("socialPayOrg", paymentMap.get(accountExportPO.getSocialPayOrg()) == null ? "" : paymentMap.get(accountExportPO.getSocialPayOrg()).getName());
map.put("socialPayOrg" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
//社保账号、公积金账号、补充公积金账号
map.put("fundAccount", accountExportPO.getFundAccount());
map.put("fundAccount" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
map.put("socialAccount", accountExportPO.getSocialAccount());
map.put("socialAccount" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
map.put("supplementFundAccount", accountExportPO.getSupplementFundAccount());
map.put("supplementFundAccount" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
//福利方案名称
map.put("socialSchemeName", schemeIdNameMap.get(accountExportPO.getSocialSchemeId()));
map.put("fundSchemeName", schemeIdNameMap.get(accountExportPO.getFundSchemeId()));
map.put("otherSchemeName", schemeIdNameMap.get(accountExportPO.getOtherSchemeId()));
//线下值
List<ExcelAccountExportPO> excelResultValueList = excelResultMap.get(accountExportPO.getWorkcode());
ExcelAccountExportPO excelAccountExportPO = new ExcelAccountExportPO();
if (excelResultValueList != null && excelResultValueList.size() == 1) {
excelAccountExportPO = excelResultValueList.get(0);
}
//社保基数socialPaymentBaseString
welfareElementCompare(map, accountExportPO.getSocialPaymentBaseString(), excelAccountExportPO.getSocialPaymentBaseString(), "Base", 1);
//公积金基数fundPaymentBaseString
welfareElementCompare(map, accountExportPO.getFundPaymentBaseString(), excelAccountExportPO.getFundPaymentBaseString(), "Base", 2);
//其他福利基数otherPaymentBaseString
welfareElementCompare(map, accountExportPO.getOtherPaymentBaseString(), excelAccountExportPO.getOtherPaymentBaseString(), "Base", 3);
//社保个人socialPerJson
welfareElementCompare(map, accountExportPO.getSocialPerJson(), excelAccountExportPO.getSocialPerJson(), "Per", 1);
//公积金个人fundPerJson
welfareElementCompare(map, accountExportPO.getFundPerJson(), excelAccountExportPO.getFundPerJson(), "Per", 2);
//其他个人otherPerJson
welfareElementCompare(map, accountExportPO.getOtherPerJson(), excelAccountExportPO.getOtherPerJson(), "Per", 3);
//社保单位socialComJson
welfareElementCompare(map, accountExportPO.getSocialComJson(), excelAccountExportPO.getSocialComJson(), "Com", 1);
//公积金单位fundComJson
welfareElementCompare(map, accountExportPO.getFundComJson(), excelAccountExportPO.getFundComJson(), "Com", 2);
//其他单位otherComJson
welfareElementCompare(map, accountExportPO.getOtherComJson(), excelAccountExportPO.getOtherComJson(), "Com", 3);
//各种合计
welfareSumCompare(map, accountExportPO, excelAccountExportPO);
resultList.add(map);
}
return resultList;
}
private static Map<String, Object> welfareElementCompare(Map<String, Object> map, String accountJson, String excelAccountJson, String welfareStand, Integer welfareType) {
List<ICategoryPO> listAll = MapperProxyFactory.getProxy(ICategoryMapper.class).listAll();
List<ICategoryPO> accountWelfareList = listAll.stream().filter(e -> e.getWelfareType().equals(welfareType)).collect(Collectors.toList());
String baseTypeInfo = welfareType.equals(1) ? "social" : (welfareType.equals(2) ? "fund" : "other");
Map<String, String> accountMap = JSON.parseObject(accountJson, HashMap.class);
Map<String, String> excelAccountMap = JSON.parseObject(excelAccountJson, HashMap.class);
for (ICategoryPO welfare : accountWelfareList) {
Map<String, Object> temp = Maps.newHashMap();
if (accountMap != null && accountMap.get(welfare.getId().toString()) != null) {
temp.put("acctResultValue", dealNull(accountMap.get(welfare.getId().toString())));
} else {
temp.put("acctResultValue", "");
}
if (excelAccountMap != null && excelAccountMap.get(welfare.getId().toString()) != null) {
temp.put("excelResultValue", dealNull(excelAccountMap.get(welfare.getId().toString())));
}else {
temp.put("excelResultValue", "");
}
map.put(welfare.getId() + baseTypeInfo + welfareStand, temp);
// 薪资项目字段的字段类型
map.put(welfare.getId() + baseTypeInfo + welfareStand + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
if (map.get("different").equals("false") && !temp.get("acctResultValue").equals(temp.get("excelResultValue"))) {
map.put("different", "true");
}
}
return map;
}
private static Map<String, Object> welfareSumCompare(Map<String, Object> map, AccountExportPO accountExportPO, ExcelAccountExportPO excelAccountExportPO) {
//社保个人合计、公积金个人合计、其他福利个人合计、个人合计
Map<String, Object> socialPerSumTemp = Maps.newHashMap();
socialPerSumTemp.put("acctResultValue", dealNull(accountExportPO.getSocialPerSum()));
socialPerSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getSocialPerSum()));
map.put("socialPerSum", socialPerSumTemp);
map.put("socialPerSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
if (map.get("different").equals("false") && !socialPerSumTemp.get("acctResultValue").equals(socialPerSumTemp.get("excelResultValue"))) {
map.put("different", "true");
}
Map<String, Object> fundPerSumTemp = Maps.newHashMap();
fundPerSumTemp.put("acctResultValue", dealNull(accountExportPO.getFundPerSum()));
fundPerSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getFundPerSum()));
map.put("fundPerSum", fundPerSumTemp);
map.put("fundPerSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
if (map.get("different").equals("false") && !fundPerSumTemp.get("acctResultValue").equals(fundPerSumTemp.get("excelResultValue"))) {
map.put("different", "true");
}
Map<String, Object> otherPerSumTemp = Maps.newHashMap();
otherPerSumTemp.put("acctResultValue", dealNull(accountExportPO.getOtherPerSum()));
otherPerSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getOtherPerSum()));
map.put("otherPerSum", otherPerSumTemp);
map.put("otherPerSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
if (map.get("different").equals("false") && !otherPerSumTemp.get("acctResultValue").equals(otherPerSumTemp.get("excelResultValue"))) {
map.put("different", "true");
}
Map<String, Object> perSumTemp = Maps.newHashMap();
perSumTemp.put("acctResultValue", dealNull(accountExportPO.getPerSum()));
perSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getPerSum()));
map.put("perSum", perSumTemp);
map.put("perSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
if (map.get("different").equals("false") && !perSumTemp.get("acctResultValue").equals(perSumTemp.get("excelResultValue"))) {
map.put("different", "true");
}
//社保单位合计、公积金单位合计、其他福利单位合计、单位合计
Map<String, Object> socialComSumTemp = Maps.newHashMap();
socialComSumTemp.put("acctResultValue", dealNull(accountExportPO.getSocialComSum()));
socialComSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getSocialComSum()));
map.put("socialComSum", socialComSumTemp);
map.put("socialComSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
if (map.get("different").equals("false") && !socialComSumTemp.get("acctResultValue").equals(socialComSumTemp.get("excelResultValue"))) {
map.put("different", "true");
}
Map<String, Object> fundComSumTemp = Maps.newHashMap();
fundComSumTemp.put("acctResultValue", dealNull(accountExportPO.getFundComSum()));
fundComSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getFundComSum()));
map.put("fundComSum", fundComSumTemp);
map.put("fundComSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
if (map.get("different").equals("false") && !fundComSumTemp.get("acctResultValue").equals(fundComSumTemp.get("excelResultValue"))) {
map.put("different", "true");
}
Map<String, Object> otherComSumTemp = Maps.newHashMap();
otherComSumTemp.put("acctResultValue", dealNull(accountExportPO.getOtherComSum()));
otherComSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getOtherComSum()));
map.put("otherComSum", otherComSumTemp);
map.put("otherComSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
if (map.get("different").equals("false") && !otherComSumTemp.get("acctResultValue").equals(otherComSumTemp.get("excelResultValue"))) {
map.put("different", "true");
}
Map<String, Object> perComTemp = Maps.newHashMap();
perComTemp.put("acctResultValue", dealNull(accountExportPO.getComSum()));
perComTemp.put("excelResultValue", dealNull(excelAccountExportPO.getComSum()));
map.put("comSum", perComTemp);
map.put("comSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
if (map.get("different").equals("false") && !perComTemp.get("acctResultValue").equals(perComTemp.get("excelResultValue"))) {
map.put("different", "true");
}
//社保合计、公积金合计、其他福利合计、合计
Map<String, Object> socialSumTemp = Maps.newHashMap();
socialSumTemp.put("acctResultValue", dealNull(accountExportPO.getSocialSum()));
socialSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getSocialSum()));
map.put("socialSum", socialSumTemp);
map.put("socialSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
if (map.get("different").equals("false") && !socialSumTemp.get("acctResultValue").equals(socialSumTemp.get("excelResultValue"))) {
map.put("different", "true");
}
Map<String, Object> fundSumTemp = Maps.newHashMap();
fundSumTemp.put("acctResultValue", dealNull(accountExportPO.getFundSum()));
fundSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getFundSum()));
map.put("fundSum", fundSumTemp);
map.put("fundSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
if (map.get("different").equals("false") && !fundSumTemp.get("acctResultValue").equals(fundSumTemp.get("excelResultValue"))) {
map.put("different", "true");
}
Map<String, Object> otherSumTemp = Maps.newHashMap();
otherSumTemp.put("acctResultValue", dealNull(accountExportPO.getOtherSum()));
otherSumTemp.put("excelResultValue", dealNull(excelAccountExportPO.getOtherSum()));
map.put("otherSum", otherSumTemp);
map.put("otherSum" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
if (map.get("different").equals("false") && !otherSumTemp.get("acctResultValue").equals(otherSumTemp.get("excelResultValue"))) {
map.put("different", "true");
}
Map<String, Object> totalTemp = Maps.newHashMap();
totalTemp.put("acctResultValue", dealNull(accountExportPO.getTotal()));
totalTemp.put("excelResultValue", dealNull(excelAccountExportPO.getTotal()));
map.put("total", totalTemp);
map.put("total" + DATA_TYPE_SUFFIX, SalaryDataTypeEnum.STRING.getValue());
if (map.get("different").equals("false") && !totalTemp.get("acctResultValue").equals(totalTemp.get("excelResultValue"))) {
map.put("different", "true");
}
return map;
}
private static String dealNull(String data) {
if (data == null || "0".equals(data) || "0.00".equals(data)) {
return "";
}
return data;
}
}