891 lines
52 KiB
Java
891 lines
52 KiB
Java
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();
|
||
}
|
||
}
|
||
}
|