weaver-hrm-salary/src/com/engine/salary/service/impl/LySalaryReportServiceImpl.java

891 lines
52 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.service.impl;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.salary.common.LocalDateRange;
import com.engine.salary.component.WeaTableColumnGroup;
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
import com.engine.salary.entity.ly.param.LySalaryReportQueryParam;
import com.engine.salary.entity.ly.po.LySalaryReportPO;
import com.engine.salary.entity.salaryacct.bo.SalaryAcctFormulaBO;
import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO;
import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO;
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salarysob.po.SalarySobEmpFieldPO;
import com.engine.salary.entity.salarysob.po.SalarySobItemPO;
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
import com.engine.salary.enums.UserStatusEnum;
import com.engine.salary.enums.ly.LyPushStatusEnum;
import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum;
import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.mapper.ly.LySalaryReportMapper;
import com.engine.salary.service.*;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.db.IdGenerator;
import com.engine.salary.util.db.MapperProxyFactory;
import com.engine.salary.util.excel.ExcelUtilPlus;
import com.engine.salary.util.page.PageInfo;
import com.engine.salary.util.page.SalaryPageUtil;
import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import weaver.conn.RecordSet;
import weaver.general.BaseBean;
import weaver.hrm.User;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author Harryxzy
* @ClassName LySalaryReportServiceImpl
* @date 2024/08/21 16:43
* @description
*/
public class LySalaryReportServiceImpl extends Service implements LySalaryReportService {
private LySalaryReportMapper getLySalaryReportMapper() {
return MapperProxyFactory.getProxy(LySalaryReportMapper.class);
}
private SalaryAcctRecordService getSalaryAcctRecordService(User user) {
return ServiceUtil.getService(SalaryAcctRecordServiceImpl.class, user);
}
private SalaryAcctEmployeeService getSalaryAcctEmployeeService(User user) {
return ServiceUtil.getService(SalaryAcctEmployeeServiceImpl.class, user);
}
private SalaryAcctResultService getSalaryAcctResultService(User user) {
return ServiceUtil.getService(SalaryAcctResultServiceImpl.class, user);
}
private SalaryItemService getSalaryItemService(User user) {
return ServiceUtil.getService(SalaryItemServiceImpl.class, user);
}
private TaxAgentService getTaxAgentService(User user) {
return ServiceUtil.getService(TaxAgentServiceImpl.class, user);
}
private SalaryEmployeeService getSalaryEmployeeService(User user) {
return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user);
}
private LySalaryReportService getLySalaryReportService(User user) {
return ServiceUtil.getService(LySalaryReportServiceImpl.class, user);
}
/**
* 查询所有记录
*
* @return 返回集合没有返回空List
*/
public List<LySalaryReportPO> listAll() {
return getLySalaryReportMapper().listAll();
}
@Override
public List<LySalaryReportPO> listByIds(List<Long> ids) {
if (CollectionUtils.isEmpty(ids)) {
return Collections.emptyList();
}
List<List<Long>> partition = Lists.partition(ids, 1000);
List<LySalaryReportPO> resultList = new ArrayList<>();
partition.forEach(part -> resultList.addAll(getLySalaryReportMapper().listSome(LySalaryReportPO.builder().ids(part).build())));
return resultList;
}
/**
* 根据主键查询
*
* @param id 主键
* @return 返回记录没有返回null
*/
public LySalaryReportPO getById(Long id) {
return getLySalaryReportMapper().getById(id);
}
/**
* 新增忽略null字段
*
* @param lySalaryReport 新增的记录
* @return 返回影响行数
*/
public int insertIgnoreNull(LySalaryReportPO lySalaryReport) {
return getLySalaryReportMapper().insertIgnoreNull(lySalaryReport);
}
/**
* 修改,修改所有字段
*
* @param lySalaryReport 修改的记录
* @return 返回影响行数
*/
public int update(LySalaryReportPO lySalaryReport) {
return getLySalaryReportMapper().update(lySalaryReport);
}
/**
* 修改忽略null字段
*
* @param lySalaryReport 修改的记录
* @return 返回影响行数
*/
public int updateIgnoreNull(LySalaryReportPO lySalaryReport) {
return getLySalaryReportMapper().updateIgnoreNull(lySalaryReport);
}
/**
* 删除记录
*
* @param lySalaryReport 待删除的记录
* @return 返回影响行数
*/
public int delete(LySalaryReportPO lySalaryReport) {
return getLySalaryReportMapper().delete(lySalaryReport);
}
public List<LySalaryReportPO> listSome(LySalaryReportPO param) {
return getLySalaryReportMapper().listSome(param);
}
public List<LySalaryReportPO> listBySalaryMonth(Date salaryMonth) {
if (salaryMonth == null) {
return Collections.emptyList();
}
return getLySalaryReportMapper().listSome(LySalaryReportPO.builder().salaryMonth(salaryMonth).build());
}
/**
* 生成报表数据
*
* @param param
*/
@Override
public void generateSalaryReport(LySalaryReportQueryParam param) {
if (StringUtils.isBlank(param.getSalaryMonth())) {
throw new SalaryRunTimeException("薪资所属月参数不能为空");
}
Date salaryMonthDate = SalaryDateUtil.dateStrToLocalYearMonth(param.getSalaryMonth());
if (salaryMonthDate == null) {
throw new SalaryRunTimeException("薪资所属月参数格式错误");
}
param.setSalaryMonthDate(salaryMonthDate);
// 获取本月是否已有报表数据
List<LySalaryReportPO> lySalaryReportPOS = listBySalaryMonth(salaryMonthDate);
if (CollectionUtils.isNotEmpty(lySalaryReportPOS)) {
throw new SalaryRunTimeException("本薪资所属月已生成薪资汇总报表,无法生成薪资报表数据");
}
BaseBean baseBean = new BaseBean();
// 获取薪资核算结果
List<SalaryAcctRecordPO> salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalaryMonth(LocalDateRange.builder().fromDate(salaryMonthDate).endDate(salaryMonthDate).build());
// 过滤账套及状态
// List<Long> salarySobIds = Arrays.stream(baseBean.getPropValue("lySalaryNCReport", "salary_sob_ids").split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
// salaryAcctRecordList = salaryAcctRecordList.stream().filter(record -> salarySobIds.contains(record.getSalarySobId()) && record.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).collect(Collectors.toList());
salaryAcctRecordList = salaryAcctRecordList.stream().filter(record -> record.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(salaryAcctRecordList)) {
List<Long> salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
// 获取薪资核算人员
List<SalaryAcctEmployeePO> salaryAcctEmployeePOList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds);
if (CollectionUtils.isNotEmpty(salaryAcctEmployeePOList)) {
String dataSourceStr = StringUtils.join(salaryAcctRecordIds, ",");
// 获取薪资项目id
List<Long> salaryItemIds = new ArrayList<>();
// 是职能还是项目
Long znxmlxItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_znxmlx_item_id");
salaryItemIds.add(znxmlxItemId);
// 发放公司全称
Long ffgsqcItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_ffgsqc_item_id");
salaryItemIds.add(ffgsqcItemId);
// 费用承担公司全称
Long fycdgsqcItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_fycdgsqc_item_id");
salaryItemIds.add(fycdgsqcItemId);
// 职能/项目名称
Long znxmmcItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_znxmmc_item_id");
salaryItemIds.add(znxmmcItemId);
// 应发合计
Long yfhjItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_byyf_yfhj_item_id");
salaryItemIds.add(yfhjItemId);
// 月度绩效
Long ydjxItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_byyf_ydjx_item_id");
salaryItemIds.add(ydjxItemId);
// 季度/年度绩效
Long jdndjxItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_byyf_jdndjx_item_id");
salaryItemIds.add(jdndjxItemId);
// 激励提成(经营)
Long jltcjyItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_byyf_jltcjy_item_id");
salaryItemIds.add(jltcjyItemId);
// 激励提成(市场)
Long jltcscItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_byyf_jltcsc_item_id");
salaryItemIds.add(jltcscItemId);
// 工资(含月度绩效)、福利等
Long gzfldItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_gzfld_jltcsc_item_id");
salaryItemIds.add(gzfldItemId);
// 个人社保
Long grsbItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_dsdj_grsb_item_id");
salaryItemIds.add(grsbItemId);
// 个人公积金
Long grgjjItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_dsdj_grgjj_item_id");
salaryItemIds.add(grgjjItemId);
// 个人所得税
Long grsdsItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_dsdj_grsds_item_id");
salaryItemIds.add(grsdsItemId);
// 工装
Long gzItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_shkcx_gz_item_id");
salaryItemIds.add(gzItemId);
// 水电费
Long sdfItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_shkcx_sdf_item_id");
salaryItemIds.add(sdfItemId);
// 爱心互助金
Long axhzjItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_shkcx_axhzj_item_id");
salaryItemIds.add(axhzjItemId);
// 停车费
Long tcfItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_shkcx_tcf_item_id");
salaryItemIds.add(tcfItemId);
// 个税调整
Long gstzItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_shkcx_gstz_item_id");
salaryItemIds.add(gstzItemId);
// 生育津贴
Long syjtItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_shkcx_syjt_item_id");
salaryItemIds.add(syjtItemId);
// 培训费
Long pxfItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_shkcx_pxf_item_id");
salaryItemIds.add(pxfItemId);
// 其他
Long qtItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_shkcx_qt_item_id");
salaryItemIds.add(qtItemId);
// 本月实发
Long bysfItemId = getPropLongValue(baseBean, "lySalaryNCReport", "salary_bysf_item_id");
salaryItemIds.add(bysfItemId);
List<SalaryItemPO> salaryItemList = getSalaryItemService(user).listByIds(salaryItemIds);
salaryItemIds = salaryItemList.stream().map(SalaryItemPO::getId).collect(Collectors.toList());
List<Long> salaryAcctEmpIds = salaryAcctEmployeePOList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
// 获取薪资核算结果
List<SalaryAcctResultPO> acctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, salaryItemIds);
List<SalarySobEmpFieldPO> salarySobEmpFields = new ArrayList<>();
salarySobEmpFields.add(SalarySobEmpFieldPO.builder().fieldCode("subcompanyId").build());
List<Map<String, Object>> resultMapList = buildData4LyReport(salaryItemList, salaryAcctEmployeePOList, salarySobEmpFields, acctResultList, false);
// 根据费用承担公司全称、职能/项目名称进行分组
Map<String, List<Map<String, Object>>> resultGroup = SalaryEntityUtil.group2Map(resultMapList, map -> (map.get(ffgsqcItemId.toString()) == null ? " " : map.get(ffgsqcItemId.toString()).toString())
+ "-split" + (map.get(fycdgsqcItemId.toString()) == null ? " " : map.get(fycdgsqcItemId.toString()).toString())
+ "-split" + (map.get(znxmmcItemId.toString()) == null ? " " : map.get(znxmmcItemId.toString()).toString()));
List<SalaryItemPO> numberItems = salaryItemList.stream().filter(item -> item.getDataType().equals(SalaryDataTypeEnum.NUMBER.getValue())).collect(Collectors.toList());
LinkedHashMap<String, Map<String, Object>> resultMap = getSumResultByGroup(resultGroup, Collections.emptyList(), numberItems, znxmlxItemId);
// 排序 - 根据key排序
LinkedHashMap<String, Map<String, Object>> sortedMap = new LinkedHashMap<>();
resultMap.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEachOrdered(x -> sortedMap.put(x.getKey(), x.getValue()));
resultMap = sortedMap;
Date now = new Date();
resultMap.forEach((key,valueMap) -> {
String[] split = key.split("-split");
String ffgsqc = split.length > 0 ? split[0] : "";
String fycdgsqc = split.length > 1 ? split[1] : "";
String znxmmc = split.length > 2 ? split[2] : "";
valueMap.put("ffgsqc", ffgsqc);
valueMap.put("fycdgsqc",fycdgsqc);
valueMap.put("znxmmc",znxmmc);
// 工资(含月度绩效)、福利等 = 应发合计-季度/年度绩效-激励提成(市场)-激励提成(经营) 0325修改 不扣经营了
String yfhjValueStr = valueMap.getOrDefault(yfhjItemId.toString(), "0").toString();
BigDecimal yfhjValue = NumberUtils.isCreatable(yfhjValueStr) ? new BigDecimal(yfhjValueStr) : BigDecimal.valueOf(0);
String jdndjxValueStr = valueMap.getOrDefault(jdndjxItemId.toString(), "0").toString();
BigDecimal jdndjxValue = NumberUtils.isCreatable(jdndjxValueStr) ? new BigDecimal(jdndjxValueStr) : BigDecimal.valueOf(0);
String jltcscValueStr = valueMap.getOrDefault(jltcscItemId.toString(), "0").toString();
BigDecimal jltcscValue = NumberUtils.isCreatable(jltcscValueStr) ? new BigDecimal(jltcscValueStr) : BigDecimal.valueOf(0);
String jltcjyValueStr = valueMap.getOrDefault(jltcjyItemId.toString(), "0").toString();
BigDecimal jltcjyValue = NumberUtils.isCreatable(jltcjyValueStr) ? new BigDecimal(jltcjyValueStr) : BigDecimal.valueOf(0);
valueMap.put(gzfldItemId.toString(),yfhjValue.subtract(jdndjxValue).subtract(jltcscValue));
LySalaryReportPO build = LySalaryReportPO.builder()
.id(IdGenerator.generate())
.salaryMonth(salaryMonthDate)
.znxmlx(valueMap.getOrDefault(znxmlxItemId.toString(), "").toString())
.subcompanyId(Long.valueOf(valueMap.getOrDefault("subcompanyId","0").toString()))
.ffgsqc(ffgsqc)
.fycdgsqc(fycdgsqc)
.znxmmc(znxmmc)
.empNum(Integer.valueOf(valueMap.getOrDefault("empNums", "0").toString()))
.byyfYfhj(valueMap.getOrDefault(yfhjItemId.toString(), "0").toString())
.byyfYdjx(valueMap.getOrDefault(ydjxItemId.toString(), "0").toString())
.byyfJdndjx(valueMap.getOrDefault(jdndjxItemId.toString(), "0").toString())
.byyfJltcjy(valueMap.getOrDefault(jltcjyItemId.toString(), "0").toString())
.byyfJltcsc(valueMap.getOrDefault(jltcscItemId.toString(), "0").toString())
.byyfGzfld(valueMap.getOrDefault(gzfldItemId.toString(), "0").toString())
.dsdjGrsb(valueMap.getOrDefault(grsbItemId.toString(), "0").toString())
.dsdjGrgjj(valueMap.getOrDefault(grgjjItemId.toString(), "0").toString())
.dsdjGrsds(valueMap.getOrDefault(grsdsItemId.toString(), "0").toString())
.shkcxGz(valueMap.getOrDefault(gzItemId.toString(), "0").toString())
.shkcxSdf(valueMap.getOrDefault(sdfItemId.toString(), "0").toString())
.shkcxAxhzj(valueMap.getOrDefault(axhzjItemId.toString(), "0").toString())
.shkcxTcf(valueMap.getOrDefault(tcfItemId.toString(), "0").toString())
.shkcxGstz(valueMap.getOrDefault(gstzItemId.toString(), "0").toString())
.shkcxSyjt(valueMap.getOrDefault(syjtItemId.toString(), "0").toString())
.shkcxPxf(valueMap.getOrDefault(pxfItemId.toString(), "0").toString())
.shkcxQt(valueMap.getOrDefault(qtItemId.toString(), "0").toString())
.bysf(valueMap.getOrDefault(bysfItemId.toString(), "0").toString())
.dataSorce(dataSourceStr)
.xzjtpzFlag(0)
.xzffpzFlag(0)
.sbjtpzFlag(0)
.sbffpzFlag(0)
.gjjjtpzFlag(0)
.gjjffpzFlag(0)
.creator(Long.valueOf(user.getUID()))
.createTime(now)
.updateTime(now)
.deleteType(0)
.build();
getLySalaryReportMapper().insertIgnoreNull(build);
});
}
}
}
List<Map<String, Object>> buildData4LyReport(List<SalaryItemPO> salaryItemList, List<SalaryAcctEmployeePO> salaryAcctEmployeeList, List<SalarySobEmpFieldPO> salarySobEmpFields, List<SalaryAcctResultPO> salaryAcctResult, boolean dynamicEmpInfo) {
List<Long> empIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).distinct().collect(Collectors.toList());
List<DataCollectionEmployee> employeeList = getSalaryEmployeeService(user).listByIds(empIds);
List<TaxAgentPO> taxAgentPOS = getTaxAgentService(user).listAll();
return buildData4Ly(salaryItemList, salarySobEmpFields, employeeList, salaryAcctEmployeeList, salaryAcctResult, taxAgentPOS, dynamicEmpInfo);
}
public static List<Map<String, Object>> buildData4Ly(List<SalaryItemPO> salaryItems,
List<SalarySobEmpFieldPO> salarySobEmpFields,
List<DataCollectionEmployee> simpleEmployees,
List<SalaryAcctEmployeePO> salaryAcctEmployees,
List<SalaryAcctResultPO> salaryAccountingResults,
List<TaxAgentPO> taxAgents,
boolean dynamicEmpInfo) {
if (CollectionUtils.isEmpty(salaryAcctEmployees)) {
return Collections.emptyList();
}
SalaryI18nUtil.i18nList(salaryAcctEmployees);
Map<Long, DataCollectionEmployee> employeeMap = SalaryEntityUtil.convert2Map(simpleEmployees, DataCollectionEmployee::getEmployeeId);
Map<Long, List<SalaryAcctResultPO>> acctResultMap = SalaryEntityUtil.group2Map(salaryAccountingResults, SalaryAcctResultPO::getSalaryAcctEmpId);
Map<Long, String> taxAgentNameMap = SalaryEntityUtil.convert2Map(taxAgents, TaxAgentPO::getId, TaxAgentPO::getName);
return salaryAcctEmployees.stream().map(e -> {
Map<Long, Object> resultValueMap = SalaryEntityUtil.convert2Map(acctResultMap.getOrDefault(e.getId(), Collections.emptyList()),
SalaryAcctResultPO::getSalaryItemId, SalaryAcctResultPO::getResultValue);
// 薪资项目的值
Map<String, Object> map = SalaryEntityUtil.convert2Map(salaryItems, o -> "" + o.getId(), o -> resultValueMap.getOrDefault(o.getId(), StringUtils.EMPTY));
// 人员信息字段的值
Map<String, String> fieldValueMap = SalaryAcctFormulaBO.convert2FormulaEmployee(employeeMap.get(e.getEmployeeId()), e, true);
for (SalarySobEmpFieldPO salarySobEmpField : salarySobEmpFields) {
// 员工信息字段的字段类型
if (dynamicEmpInfo) {
map.put(salarySobEmpField.getFieldCode(), fieldValueMap.get(salarySobEmpField.getFieldCode()));
} else {
if ("departmentName".equals(salarySobEmpField.getFieldCode())) {
map.put("departmentName", e.getDepartmentName());
} else if ("departmentId".equals(salarySobEmpField.getFieldCode())) {
map.put("departmentId", e.getDepartmentId());
} else if ("subcompanyId".equals(salarySobEmpField.getFieldCode())) {
map.put("subcompanyId", e.getSubcompanyId() == null ? 0 : e.getSubcompanyId());
} else if ("subcompanyName".equals(salarySobEmpField.getFieldCode())) {
map.put("subcompanyName", e.getSubcompanyName());
} else if ("jobcall".equals(salarySobEmpField.getFieldCode())) {
map.put("jobcall", e.getJobcall());
} else if ("jobcallId".equals(salarySobEmpField.getFieldCode())) {
map.put("jobcallId", e.getJobcallId());
} else if ("jobtitleName".equals(salarySobEmpField.getFieldCode())) {
map.put("jobtitleName", e.getJobtitleName());
} else if ("jobtitleId".equals(salarySobEmpField.getFieldCode())) {
map.put("jobtitleId", e.getJobtitleId());
} else if ("status".equals(salarySobEmpField.getFieldCode())) {
map.put("status", e.getStatus());
} else if ("statusName".equals(salarySobEmpField.getFieldCode())) {
map.put("statusName", UserStatusEnum.getDefaultLabelByValue(new Integer(e.getStatus())));
} else {
map.put(salarySobEmpField.getFieldCode(), fieldValueMap.get(salarySobEmpField.getFieldCode()));
}
}
map.put(salarySobEmpField.getFieldCode() + "_type", SalaryDataTypeEnum.STRING.getValue());
}
// 主键id
map.put("id", e.getId());
//人员id
map.put("employeeId", e.getEmployeeId());
map.put("userName", fieldValueMap.get("username"));
// 个税扣缴义务人
String taxAgentName = taxAgentNameMap.getOrDefault(e.getTaxAgentId(), StringUtils.EMPTY);
map.put("taxAgentName", taxAgentName);
map.put("taxAgentId", e.getTaxAgentId());
return map;
}).collect(Collectors.toList());
}
private LinkedHashMap<String, Map<String, Object>> getSumResultByGroup(Map<String, List<Map<String, Object>>> groupBy,
List<SalarySobItemPO> salarySobItemPOS,
List<SalaryItemPO> numberItems,
Long ffgsztItemId) {
LinkedHashMap<String, Map<String, Object>> result = new LinkedHashMap<>();
// 本次薪资核算所用的薪资账套下的薪资项目
Map<Long, SalarySobItemPO> salaryItemIdKeySalarySobItemPOMap = SalaryEntityUtil.convert2Map(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
for(Map.Entry<String, List<Map<String, Object>>> entrySet : groupBy.entrySet()){
// 每个分类中的核算数据
List<Map<String, Object>> value = entrySet.getValue();
Map<String, Object> itemSum = new HashMap<>();
numberItems.forEach(item -> {
List<String> itemValue = value.stream().filter(v -> v.get(item.getId().toString()) != null).map(v -> (String)v.get(item.getId().toString())).collect(Collectors.toList());
BigDecimal sum = itemValue
.stream()
.filter(NumberUtils::isCreatable)
.map(BigDecimal::new)
.reduce(BigDecimal.ZERO, BigDecimal::add);
itemSum.put( item.getId().toString(), SalaryAcctFormulaBO.roundResultValue(sum.toString(), item, Collections.emptyList(), Collections.emptyMap(), salaryItemIdKeySalarySobItemPOMap) );
});
itemSum.put("empNums", entrySet.getValue().size());
itemSum.put("userName", CollectionUtils.isEmpty(value) ? "" : value.get(0).get("userName"));
itemSum.put("employeeId", CollectionUtils.isEmpty(value) ? "" : value.get(0).get("employeeId"));
itemSum.put("subcompanyId", CollectionUtils.isEmpty(value) ? "" : value.get(0).get("subcompanyId") == null ? "0" : value.get(0).get("subcompanyId"));
if (ffgsztItemId != null) {
Map<String, Object> map = value.get(0);
String rylb = map.get(ffgsztItemId.toString()) == null ? "" : map.get(ffgsztItemId.toString()).toString();
itemSum.put(ffgsztItemId.toString(), rylb);
}
result.put(entrySet.getKey(), itemSum);
}
return result;
}
private Long getPropLongValue (BaseBean baseBean, String propFileName, String key ){
return NumberUtils.isCreatable(baseBean.getPropValue(propFileName, key))
? Long.valueOf(baseBean.getPropValue(propFileName, key)) : 0L;
}
@Override
public Map<String, Object> listSalaryReport(LySalaryReportQueryParam param) {
if (StringUtils.isBlank(param.getSalaryMonth())) {
throw new SalaryRunTimeException("薪资所属月参数不能为空");
}
Date salaryMonthDate = SalaryDateUtil.dateStrToLocalYearMonth(param.getSalaryMonth());
if (salaryMonthDate == null) {
throw new SalaryRunTimeException("薪资所属月参数格式错误");
}
param.setSalaryMonthDate(salaryMonthDate);
// 获取本月是否已有报表数据
List<LySalaryReportPO> lySalaryReportPOS = listBySalaryMonth(salaryMonthDate);
// 分权
// 是否是薪酬总管理员
boolean isChief = getTaxAgentService(user).isChief((long) user.getUID());
if (!isChief) {
List<String> canManageFrztByUid = getCanManageFrztByUid(user);
// 获取当前用户能够查看哪些分部的数据
List<Long> canManageSubCompanyIds = getCanManageSubCompanyIdsByUid(Long.valueOf(user.getUID()));
lySalaryReportPOS = lySalaryReportPOS.stream()
.filter(po -> canManageFrztByUid.contains(po.getFfgsqc()) || canManageSubCompanyIds.contains(po.getSubcompanyId()))
.collect(Collectors.toList());
}
if (CollectionUtils.isNotEmpty(param.getFfgsqc())) {
lySalaryReportPOS = lySalaryReportPOS.stream().filter(lySalaryReportPO -> param.getFfgsqc().contains(lySalaryReportPO.getFfgsqc())).collect(Collectors.toList());
}
// 费用承担公司
if (CollectionUtils.isNotEmpty(param.getFycdgsqc())) {
lySalaryReportPOS = lySalaryReportPOS.stream().filter(lySalaryReportPO -> param.getFycdgsqc().contains(lySalaryReportPO.getFycdgsqc())).collect(Collectors.toList());
}
// 根据状态过滤
if (CollectionUtils.isNotEmpty(param.getJtStatus())) {
lySalaryReportPOS = lySalaryReportPOS.stream().filter(lySalaryReportPO -> param.getJtStatus().contains(lySalaryReportPO.getXzjtpzFlag())).collect(Collectors.toList());
}
if (CollectionUtils.isNotEmpty(param.getFfStatus())) {
lySalaryReportPOS = lySalaryReportPOS.stream().filter(lySalaryReportPO -> param.getFfStatus().contains(lySalaryReportPO.getXzffpzFlag())).collect(Collectors.toList());
}
PageInfo<LySalaryReportPO> pageInfo = SalaryPageUtil.buildPage(param.getCurrent(), param.getPageSize());
if (param.isExport()) {
// 是导出
pageInfo.setList(lySalaryReportPOS);
} else {
pageInfo.setTotal(lySalaryReportPOS.size());
pageInfo.setList(SalaryPageUtil.subList(param.getCurrent(), param.getPageSize(), lySalaryReportPOS));
}
pageInfo.getList().stream().forEach(po -> {
po.setXzjtpzFlagStr(LyPushStatusEnum.getDefaultLabelByValue(po.getXzjtpzFlag()));
po.setXzffpzFlagStr(LyPushStatusEnum.getDefaultLabelByValue(po.getXzffpzFlag()));
});
List<WeaTableColumnGroup> columns = new ArrayList<>();
columns.add(new WeaTableColumnGroup("150px", "发放公司全称", "ffgsqc"));
columns.add(new WeaTableColumnGroup("150px", "费用承担公司全称", "fycdgsqc"));
columns.add(new WeaTableColumnGroup("150px", "职能/项目名称", "znxmmc"));
columns.add(new WeaTableColumnGroup("150px", "发放人数", "empNum"));
columns.add(new WeaTableColumnGroup("150px", "计提状态", "xzjtpzFlagStr"));
columns.add(new WeaTableColumnGroup("150px", "发放状态", "xzffpzFlagStr"));
WeaTableColumnGroup byyfGroup = new WeaTableColumnGroup("150px", "本月应发", "本月应发");
List<WeaTableColumnGroup> byyfChildList = new ArrayList<>();
byyfChildList.add(new WeaTableColumnGroup("150px", "应发合计", "byyfYfhj"));
byyfChildList.add(new WeaTableColumnGroup("150px", "月度绩效", "byyfYdjx"));
byyfChildList.add(new WeaTableColumnGroup("150px", "季度/年度绩效", "byyfJdndjx"));
byyfChildList.add(new WeaTableColumnGroup("150px", "激励提成", "byyfJltcjy"));
byyfChildList.add(new WeaTableColumnGroup("150px", "工资(含月度绩效)、福利等", "byyfGzfld"));
byyfGroup.setChildren(byyfChildList);
columns.add(byyfGroup);
WeaTableColumnGroup dsdjGroup = new WeaTableColumnGroup("150px", "代收代缴", "代收代缴");
List<WeaTableColumnGroup> dsdjChildList = new ArrayList<>();
dsdjChildList.add(new WeaTableColumnGroup("150px", "个人社保", "dsdjGrsb"));
dsdjChildList.add(new WeaTableColumnGroup("150px", "个人公积金", "dsdjGrgjj"));
dsdjChildList.add(new WeaTableColumnGroup("150px", "社保/公积金补发补扣", "byyfJltcsc"));
dsdjChildList.add(new WeaTableColumnGroup("150px", "个人所得税", "dsdjGrsds"));
dsdjGroup.setChildren(dsdjChildList);
columns.add(dsdjGroup);
WeaTableColumnGroup shkcxGroup = new WeaTableColumnGroup("150px", "税后扣除项", "税后扣除项");
List<WeaTableColumnGroup> shkcxChildList = new ArrayList<>();
shkcxChildList.add(new WeaTableColumnGroup("150px", "工装", "shkcxGz"));
shkcxChildList.add(new WeaTableColumnGroup("150px", "水电费", "shkcxSdf"));
shkcxChildList.add(new WeaTableColumnGroup("150px", "爱心互助金", "shkcxAxhzj"));
shkcxChildList.add(new WeaTableColumnGroup("150px", "停车费", "shkcxTcf"));
shkcxChildList.add(new WeaTableColumnGroup("150px", "个税调整", "shkcxGstz"));
shkcxChildList.add(new WeaTableColumnGroup("150px", "生育津贴", "shkcxSyjt"));
shkcxChildList.add(new WeaTableColumnGroup("150px", "培训费", "shkcxPxf"));
shkcxChildList.add(new WeaTableColumnGroup("150px", "其他", "shkcxQt"));
shkcxGroup.setChildren(shkcxChildList);
columns.add(shkcxGroup);
columns.add(new WeaTableColumnGroup("150px", "本月实发", "bysf"));
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("data", pageInfo);
resultMap.put("columns", columns);
// 导出包含合计行
if(param.isExport()) {
LySalaryReportPO sumData = buildSumData(pageInfo.getList());
resultMap.put("sum", sumData);
}
return resultMap;
}
public List<Long> getCanManageSubCompanyIdsByUid(Long uid) {
List<Long> resultList = new ArrayList<>();
if (uid == null) {
return resultList;
}
RecordSet rs = new RecordSet();
String sql = "select subcomid,ncbbckqxry from hrmsubcompanydefined where ncbbckqxry is not null and ncbbckqxry != ''";
rs.executeQuery(sql);
while (rs.next()) {
String ncbbckqxryStr = rs.getString("ncbbckqxry");
List<Long> empIds = Arrays.stream(ncbbckqxryStr.split(","))
.filter(NumberUtils::isCreatable)
.map(Long::valueOf)
.collect(Collectors.toList());
if (empIds.contains(uid)) {
resultList.add(Long.valueOf(rs.getInt("subcomid")));
}
}
return resultList;
}
@Override
public Map<String, Object> salaryReportFfgsList(LySalaryReportQueryParam param) {
if (StringUtils.isBlank(param.getSalaryMonth())) {
throw new SalaryRunTimeException("薪资所属月参数不能为空");
}
Date salaryMonthDate = SalaryDateUtil.dateStrToLocalYearMonth(param.getSalaryMonth());
if (salaryMonthDate == null) {
throw new SalaryRunTimeException("薪资所属月参数格式错误");
}
param.setSalaryMonthDate(salaryMonthDate);
// 获取本月是否已有报表数据
List<LySalaryReportPO> lySalaryReportPOS = listBySalaryMonth(salaryMonthDate);
// 分权
// 是否是薪酬总管理员
boolean isChief = getTaxAgentService(user).isChief((long) user.getUID());
if (!isChief) {
List<String> canManageFrztByUid = getCanManageFrztByUid(user);
// 获取当前用户能够查看哪些分部的数据
List<Long> canManageSubCompanyIds = getLySalaryReportService(user).getCanManageSubCompanyIdsByUid(Long.valueOf(user.getUID()));
lySalaryReportPOS = lySalaryReportPOS.stream()
.filter(po -> canManageFrztByUid.contains(po.getFfgsqc()) || canManageSubCompanyIds.contains(po.getSubcompanyId()))
.collect(Collectors.toList());
}
// 获取所有能够管理的发放公司
List<Map<String, Object>> ffgsList = lySalaryReportPOS.stream()
.map(LySalaryReportPO::getFfgsqc)
.distinct()
.filter(ffgsqc -> StringUtils.isNotBlank(ffgsqc))
.map(ffgsqc -> {
Map<String, Object> map = new HashMap<>(2);
map.put("id", ffgsqc);
map.put("content", ffgsqc);
return map;
}).collect(Collectors.toList());
// 获取对应的费用承担公司
List<Map<String, Object>> fycdgsList = lySalaryReportPOS.stream()
.map(LySalaryReportPO::getFycdgsqc)
.distinct()
.filter(fycdgs -> StringUtils.isNotBlank(fycdgs))
.map(fycdgs -> {
Map<String, Object> map = new HashMap<>(2);
map.put("id", fycdgs);
map.put("content", fycdgs);
return map;
}).collect(Collectors.toList());
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("ffgs", ffgsList);
resultMap.put("fycdgs", fycdgsList);
return resultMap;
}
@Override
public void deleteSalaryReport(List<Long> salaryReportIds) {
if (CollectionUtils.isEmpty(salaryReportIds)) {
return;
}
List<LySalaryReportPO> lySalaryReportPOS = getLySalaryReportMapper().listSome(LySalaryReportPO.builder().ids(salaryReportIds).build());
List<LySalaryReportPO> canNotDeleteList = lySalaryReportPOS.stream().filter(report -> report.getXzjtpzFlag().equals(NumberUtils.INTEGER_ONE) || report.getXzffpzFlag().equals(NumberUtils.INTEGER_ONE)).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(canNotDeleteList)) {
throw new SalaryRunTimeException("当前所选记录中,已生成凭证数据,请联系系统管理员删除相关数据");
}
deleteByIds(salaryReportIds);
}
@Override
public void deleteAllSalaryReport(LySalaryReportQueryParam queryParam) {
Date salaryMonth = SalaryDateUtil.dateStrToLocalYearMonth(queryParam.getSalaryMonth());
List<LySalaryReportPO> lySalaryReportPOS = listBySalaryMonth(salaryMonth);
if (CollectionUtils.isNotEmpty(lySalaryReportPOS)) {
List<Long> idList = lySalaryReportPOS.stream().map(LySalaryReportPO::getId).collect(Collectors.toList());
deleteSalaryReport(idList);
}
}
@Override
public LySalaryReportPO sumRow(LySalaryReportQueryParam param) {
if (StringUtils.isBlank(param.getSalaryMonth())) {
throw new SalaryRunTimeException("薪资所属月参数不能为空");
}
Date salaryMonthDate = SalaryDateUtil.dateStrToLocalYearMonth(param.getSalaryMonth());
if (salaryMonthDate == null) {
throw new SalaryRunTimeException("薪资所属月参数格式错误");
}
param.setSalaryMonthDate(salaryMonthDate);
// 获取本月是否已有报表数据
List<LySalaryReportPO> lySalaryReportPOS = listBySalaryMonth(salaryMonthDate);
if (CollectionUtils.isNotEmpty(param.getFfgsqc())) {
lySalaryReportPOS = lySalaryReportPOS.stream().filter(lySalaryReportPO -> param.getFfgsqc().contains(lySalaryReportPO.getFfgsqc())).collect(Collectors.toList());
}
// 分权
// 是否是薪酬总管理员
boolean isChief = getTaxAgentService(user).isChief((long) user.getUID());
if (!isChief) {
List<String> canManageFrztByUid = getCanManageFrztByUid(user);
// 获取当前用户能够查看哪些分部的数据
List<Long> canManageSubCompanyIds = getCanManageSubCompanyIdsByUid(Long.valueOf(user.getUID()));
lySalaryReportPOS = lySalaryReportPOS.stream()
.filter(po -> canManageFrztByUid.contains(po.getFfgsqc()) || canManageSubCompanyIds.contains(po.getSubcompanyId()))
.collect(Collectors.toList());
}
// 费用承担公司
if (CollectionUtils.isNotEmpty(param.getFycdgsqc())) {
lySalaryReportPOS = lySalaryReportPOS.stream().filter(lySalaryReportPO -> param.getFycdgsqc().contains(lySalaryReportPO.getFycdgsqc())).collect(Collectors.toList());
}
// 根据状态过滤
if (CollectionUtils.isNotEmpty(param.getJtStatus())) {
lySalaryReportPOS = lySalaryReportPOS.stream().filter(lySalaryReportPO -> param.getJtStatus().contains(lySalaryReportPO.getXzjtpzFlag())).collect(Collectors.toList());
}
if (CollectionUtils.isNotEmpty(param.getFfStatus())) {
lySalaryReportPOS = lySalaryReportPOS.stream().filter(lySalaryReportPO -> param.getFfStatus().contains(lySalaryReportPO.getXzffpzFlag())).collect(Collectors.toList());
}
return buildSumData(lySalaryReportPOS);
}
private LySalaryReportPO buildSumData (List<LySalaryReportPO> lySalaryReportPOS ) {
Map<String, BigDecimal> map = new HashMap<>();
lySalaryReportPOS.stream().forEach(reportPO -> {
BigDecimal empNum = reportPO.getEmpNum() == null ? BigDecimal.ZERO : new BigDecimal(reportPO.getEmpNum()) ;
map.put("empNum" ,map.getOrDefault("empNum", BigDecimal.valueOf(0)).add(empNum));
BigDecimal byyfYfhj = NumberUtils.isCreatable(reportPO.getByyfYfhj()) ? new BigDecimal(reportPO.getByyfYfhj()) : BigDecimal.ZERO;
map.put("byyfYfhj" ,map.getOrDefault("byyfYfhj", BigDecimal.valueOf(0)).add(byyfYfhj));
BigDecimal byyfYdjx = NumberUtils.isCreatable(reportPO.getByyfYdjx()) ? new BigDecimal(reportPO.getByyfYdjx()) : BigDecimal.ZERO;
map.put("byyfYdjx" ,map.getOrDefault("byyfYdjx", BigDecimal.valueOf(0)).add(byyfYdjx));
BigDecimal byyfJdndjx = NumberUtils.isCreatable(reportPO.getByyfJdndjx()) ? new BigDecimal(reportPO.getByyfJdndjx()) : BigDecimal.ZERO;
map.put("byyfJdndjx" ,map.getOrDefault("byyfJdndjx", BigDecimal.valueOf(0)).add(byyfJdndjx));
BigDecimal byyfJltcjy = NumberUtils.isCreatable(reportPO.getByyfJltcjy()) ? new BigDecimal(reportPO.getByyfJltcjy()) : BigDecimal.ZERO;
map.put("byyfJltcjy" ,map.getOrDefault("byyfJltcjy", BigDecimal.valueOf(0)).add(byyfJltcjy));
BigDecimal byyfJltcsc = NumberUtils.isCreatable(reportPO.getByyfJltcsc()) ? new BigDecimal(reportPO.getByyfJltcsc()) : BigDecimal.ZERO;
map.put("byyfJltcsc" ,map.getOrDefault("byyfJltcsc", BigDecimal.valueOf(0)).add(byyfJltcsc));
BigDecimal byyfGzfld = NumberUtils.isCreatable(reportPO.getByyfGzfld()) ? new BigDecimal(reportPO.getByyfGzfld()) : BigDecimal.ZERO;
map.put("byyfGzfld" ,map.getOrDefault("byyfGzfld", BigDecimal.valueOf(0)).add(byyfGzfld));
BigDecimal dsdjGrsb = NumberUtils.isCreatable(reportPO.getDsdjGrsb()) ? new BigDecimal(reportPO.getDsdjGrsb()) : BigDecimal.ZERO;
map.put("dsdjGrsb" ,map.getOrDefault("dsdjGrsb", BigDecimal.valueOf(0)).add(dsdjGrsb));
BigDecimal dsdjGrgjj = NumberUtils.isCreatable(reportPO.getDsdjGrgjj()) ? new BigDecimal(reportPO.getDsdjGrgjj()) : BigDecimal.ZERO;
map.put("dsdjGrgjj" ,map.getOrDefault("dsdjGrgjj", BigDecimal.valueOf(0)).add(dsdjGrgjj));
BigDecimal dsdjGrsds = NumberUtils.isCreatable(reportPO.getDsdjGrsds()) ? new BigDecimal(reportPO.getDsdjGrsds()) : BigDecimal.ZERO;
map.put("dsdjGrsds" ,map.getOrDefault("dsdjGrsds", BigDecimal.valueOf(0)).add(dsdjGrsds));
BigDecimal shkcxGz = NumberUtils.isCreatable(reportPO.getShkcxGz()) ? new BigDecimal(reportPO.getShkcxGz()) : BigDecimal.ZERO;
map.put("shkcxGz" ,map.getOrDefault("shkcxGz", BigDecimal.valueOf(0)).add(shkcxGz));
BigDecimal shkcxSdf = NumberUtils.isCreatable(reportPO.getShkcxSdf()) ? new BigDecimal(reportPO.getShkcxSdf()) : BigDecimal.ZERO;
map.put("shkcxSdf" ,map.getOrDefault("shkcxSdf", BigDecimal.valueOf(0)).add(shkcxSdf));
BigDecimal shkcxAxhzj = NumberUtils.isCreatable(reportPO.getShkcxAxhzj()) ? new BigDecimal(reportPO.getShkcxAxhzj()) : BigDecimal.ZERO;
map.put("shkcxAxhzj" ,map.getOrDefault("shkcxAxhzj", BigDecimal.valueOf(0)).add(shkcxAxhzj));
BigDecimal shkcxTcf = NumberUtils.isCreatable(reportPO.getShkcxTcf()) ? new BigDecimal(reportPO.getShkcxTcf()) : BigDecimal.ZERO;
map.put("shkcxTcf" ,map.getOrDefault("shkcxTcf", BigDecimal.valueOf(0)).add(shkcxTcf));
BigDecimal shkcxGstz = NumberUtils.isCreatable(reportPO.getShkcxGstz()) ? new BigDecimal(reportPO.getShkcxGstz()) : BigDecimal.ZERO;
map.put("shkcxGstz" ,map.getOrDefault("shkcxGstz", BigDecimal.valueOf(0)).add(shkcxGstz));
BigDecimal shkcxSyjt = NumberUtils.isCreatable(reportPO.getShkcxSyjt()) ? new BigDecimal(reportPO.getShkcxSyjt()) : BigDecimal.ZERO;
map.put("shkcxSyjt" ,map.getOrDefault("shkcxSyjt", BigDecimal.valueOf(0)).add(shkcxSyjt));
BigDecimal shkcxPxf = NumberUtils.isCreatable(reportPO.getShkcxPxf()) ? new BigDecimal(reportPO.getShkcxPxf()) : BigDecimal.ZERO;
map.put("shkcxPxf" ,map.getOrDefault("shkcxPxf", BigDecimal.valueOf(0)).add(shkcxPxf));
BigDecimal shkcxQt = NumberUtils.isCreatable(reportPO.getShkcxQt()) ? new BigDecimal(reportPO.getShkcxQt()) : BigDecimal.ZERO;
map.put("shkcxQt" ,map.getOrDefault("shkcxQt", BigDecimal.valueOf(0)).add(shkcxQt));
BigDecimal bysf = NumberUtils.isCreatable(reportPO.getBysf()) ? new BigDecimal(reportPO.getBysf()) : BigDecimal.ZERO;
map.put("bysf" ,map.getOrDefault("bysf", BigDecimal.valueOf(0)).add(bysf));
});
return LySalaryReportPO.builder()
.empNum(map.getOrDefault("empNum", BigDecimal.ZERO).intValue())
.byyfYfhj(map.getOrDefault("byyfYfhj", BigDecimal.ZERO).toString())
.byyfYdjx(map.getOrDefault("byyfYdjx", BigDecimal.ZERO).toString())
.byyfJdndjx(map.getOrDefault("byyfJdndjx", BigDecimal.ZERO).toString())
.byyfJltcjy(map.getOrDefault("byyfJltcjy", BigDecimal.ZERO).toString())
.byyfJltcsc(map.getOrDefault("byyfJltcsc", BigDecimal.ZERO).toString())
.byyfGzfld(map.getOrDefault("byyfGzfld", BigDecimal.ZERO).toString())
.dsdjGrsb(map.getOrDefault("dsdjGrsb", BigDecimal.ZERO).toString())
.dsdjGrgjj(map.getOrDefault("dsdjGrgjj", BigDecimal.ZERO).toString())
.dsdjGrsds(map.getOrDefault("dsdjGrsds", BigDecimal.ZERO).toString())
.shkcxGz(map.getOrDefault("shkcxGz", BigDecimal.ZERO).toString())
.shkcxSdf(map.getOrDefault("shkcxSdf", BigDecimal.ZERO).toString())
.shkcxAxhzj(map.getOrDefault("shkcxAxhzj", BigDecimal.ZERO).toString())
.shkcxTcf(map.getOrDefault("shkcxTcf", BigDecimal.ZERO).toString())
.shkcxGstz(map.getOrDefault("shkcxGstz", BigDecimal.ZERO).toString())
.shkcxSyjt(map.getOrDefault("shkcxSyjt", BigDecimal.ZERO).toString())
.shkcxPxf(map.getOrDefault("shkcxPxf", BigDecimal.ZERO).toString())
.shkcxQt(map.getOrDefault("shkcxQt", BigDecimal.ZERO).toString())
.bysf(map.getOrDefault("bysf", BigDecimal.ZERO).toString())
.build();
}
private void deleteByIds(List<Long> salaryReportIds) {
if (CollectionUtils.isEmpty(salaryReportIds)) {
return;
}
getLySalaryReportMapper().deleteByIds(salaryReportIds);
}
@Override
public XSSFWorkbook exportSalaryReport(LySalaryReportQueryParam param) {
param.setExport(true);
Map<String, Object> resultMap = listSalaryReport(param);
List<LySalaryReportPO> dataList = ((PageInfo<LySalaryReportPO>)resultMap.get("data")).getList();
List<WeaTableColumnGroup> columns = (List<WeaTableColumnGroup>)resultMap.get("columns");
LySalaryReportPO sum = (LySalaryReportPO)resultMap.get("sum");
sum.setFfgsqc("合计");
dataList.add(sum);
List<Object> headerList = new ArrayList<>(columns);
List<List<Object>> rows = new ArrayList<>();
rows.add(headerList);
for (LySalaryReportPO lySalaryReportPO : dataList) {
List<Object> row = Lists.newArrayList();
row.add(lySalaryReportPO.getFfgsqc() == null ? "" : lySalaryReportPO.getFfgsqc().toString());
row.add(lySalaryReportPO.getFycdgsqc() == null ? "" : lySalaryReportPO.getFycdgsqc().toString());
row.add(lySalaryReportPO.getZnxmmc() == null ? "" : lySalaryReportPO.getZnxmmc().toString());
row.add(lySalaryReportPO.getEmpNum() == null ? "" : lySalaryReportPO.getEmpNum().toString());
row.add(lySalaryReportPO.getXzjtpzFlagStr() == null ? "" : lySalaryReportPO.getXzjtpzFlagStr().toString());
row.add(lySalaryReportPO.getXzffpzFlagStr() == null ? "" : lySalaryReportPO.getXzffpzFlagStr().toString());
row.add(lySalaryReportPO.getByyfYfhj() == null ? "" : lySalaryReportPO.getByyfYfhj());
row.add(lySalaryReportPO.getByyfYdjx() == null ? "" : lySalaryReportPO.getByyfYdjx());
row.add(lySalaryReportPO.getByyfJdndjx() == null ? "" : lySalaryReportPO.getByyfJdndjx());
row.add(lySalaryReportPO.getByyfJltcjy() == null ? "" : lySalaryReportPO.getByyfJltcjy());
row.add(lySalaryReportPO.getByyfGzfld() == null ? "" : lySalaryReportPO.getByyfGzfld());
row.add(lySalaryReportPO.getDsdjGrsb() == null ? "" : lySalaryReportPO.getDsdjGrsb());
row.add(lySalaryReportPO.getDsdjGrgjj() == null ? "" : lySalaryReportPO.getDsdjGrgjj());
row.add(lySalaryReportPO.getByyfJltcsc() == null ? "" : lySalaryReportPO.getByyfJltcsc());
row.add(lySalaryReportPO.getDsdjGrsds() == null ? "" : lySalaryReportPO.getDsdjGrsds());
row.add(lySalaryReportPO.getShkcxGz() == null ? "" : lySalaryReportPO.getShkcxGz());
row.add(lySalaryReportPO.getShkcxSdf() == null ? "" : lySalaryReportPO.getShkcxSdf());
row.add(lySalaryReportPO.getShkcxAxhzj() == null ? "" : lySalaryReportPO.getShkcxAxhzj());
row.add(lySalaryReportPO.getShkcxTcf() == null ? "" : lySalaryReportPO.getShkcxTcf());
row.add(lySalaryReportPO.getShkcxGstz() == null ? "" : lySalaryReportPO.getShkcxGstz());
row.add(lySalaryReportPO.getShkcxSyjt() == null ? "" : lySalaryReportPO.getShkcxSyjt());
row.add(lySalaryReportPO.getShkcxPxf() == null ? "" : lySalaryReportPO.getShkcxPxf());
row.add(lySalaryReportPO.getShkcxQt() == null ? "" : lySalaryReportPO.getShkcxQt());
row.add(lySalaryReportPO.getBysf() == null ? "" : lySalaryReportPO.getBysf());
rows.add(row);
}
//获取excel
return ExcelUtilPlus.genWorkbookWithChildTitleColumn(rows, "薪酬统计报表", true);
}
@Override
public Boolean lyReportPermission(User user) {
List<String> canManageFrztByUid = getCanManageFrztByUid(user);
if (CollectionUtils.isNotEmpty(canManageFrztByUid)) {
return true;
} else {
return false;
}
}
public List<String> getCanManageFrztByUid(User user) {
if (user == null) {
return Collections.emptyList();
}
RecordSet rs = new RecordSet();
rs.execute("select frzt,ncbbqxry from uf_frzt ");
HashMap<String, List<Long>> frztInfoMap = new HashMap<>();
while (rs.next()) {
String frzt = rs.getString("frzt");
String ncbbqxry = rs.getString("ncbbqxry");
if (StringUtils.isNotBlank(frzt) && StringUtils.isNotBlank(ncbbqxry)) {
List<Long> ryList = Arrays.stream(ncbbqxry.split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(ryList)) {
frztInfoMap.put(frzt, ryList);
}
}
}
// 获取当前用户能够管理哪些法人主体下的数据
Long uid = Long.valueOf(user.getUID());
List<String> resultList = new ArrayList<>();
for(Map.Entry<String, List<Long>> entry : frztInfoMap.entrySet()) {
List<Long> ryList = entry.getValue();
if (ryList.contains(uid)) {
resultList.add(entry.getKey());
}
}
return resultList;
}
@Override
public List<LySalaryReportPO> getByIds(List<Long> ids) {
if (CollectionUtils.isNotEmpty(ids)) {
return getLySalaryReportMapper().listSome(LySalaryReportPO.builder().ids(ids).build());
} else {
return Collections.emptyList();
}
}
}